@decaf-ts/core 0.5.13 → 0.5.15
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.
- package/dist/core.cjs +21 -6
- package/dist/core.esm.cjs +21 -8
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/model/BaseModel.js +4 -4
- package/lib/esm/model/decorators.d.ts +2 -0
- package/lib/esm/model/decorators.js +8 -2
- package/lib/esm/persistence/Adapter.d.ts +1 -0
- package/lib/esm/persistence/Adapter.js +10 -3
- package/lib/esm/ram/RamAdapter.js +4 -3
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/model/BaseModel.cjs +4 -4
- package/lib/model/decorators.cjs +9 -1
- package/lib/model/decorators.d.ts +2 -0
- package/lib/persistence/Adapter.cjs +10 -3
- package/lib/persistence/Adapter.d.ts +1 -0
- package/lib/ram/RamAdapter.cjs +3 -2
- package/package.json +1 -1
package/dist/core.cjs
CHANGED
@@ -525,13 +525,19 @@
|
|
525
525
|
decoratorValidation.Decoration.setFlavourResolver((obj) => {
|
526
526
|
try {
|
527
527
|
return (Adapter.flavourOf(decoratorValidation.Model.isModel(obj) ? obj.constructor : obj) ||
|
528
|
-
|
528
|
+
Adapter.currentFlavour ||
|
529
529
|
decoratorValidation.DefaultFlavour);
|
530
530
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
531
531
|
}
|
532
|
+
catch (e) {
|
533
|
+
// return DefaultFlavour;
|
534
|
+
}
|
535
|
+
try {
|
536
|
+
return Adapter.currentFlavour || decoratorValidation.DefaultFlavour;
|
537
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
538
|
+
}
|
532
539
|
catch (e) {
|
533
540
|
return decoratorValidation.DefaultFlavour;
|
534
|
-
// return Adapter.current?.alias || DefaultFlavour;
|
535
541
|
}
|
536
542
|
});
|
537
543
|
/**
|
@@ -1056,6 +1062,7 @@
|
|
1056
1062
|
throw new dbDecorators.InternalError(e);
|
1057
1063
|
}
|
1058
1064
|
}
|
1065
|
+
static decoration() { }
|
1059
1066
|
}
|
1060
1067
|
tslib.__decorate([
|
1061
1068
|
final(),
|
@@ -3364,6 +3371,12 @@
|
|
3364
3371
|
.define(dbDecorators.onCreateUpdate(createdByOnCreateUpdate), decoratorValidation.propMetadata(key, {}))
|
3365
3372
|
.apply();
|
3366
3373
|
}
|
3374
|
+
function createdAt() {
|
3375
|
+
return dbDecorators.timestamp([dbDecorators.OperationKeys.CREATE]);
|
3376
|
+
}
|
3377
|
+
function updatedAt() {
|
3378
|
+
return dbDecorators.timestamp();
|
3379
|
+
}
|
3367
3380
|
/**
|
3368
3381
|
* @description Defines a one-to-one relationship between models
|
3369
3382
|
* @summary Decorator that establishes a one-to-one relationship between the current model and another model
|
@@ -3707,11 +3720,11 @@
|
|
3707
3720
|
}
|
3708
3721
|
}
|
3709
3722
|
tslib.__decorate([
|
3710
|
-
|
3723
|
+
createdAt(),
|
3711
3724
|
tslib.__metadata("design:type", Date)
|
3712
3725
|
], BaseModel.prototype, "createdOn", void 0);
|
3713
3726
|
tslib.__decorate([
|
3714
|
-
|
3727
|
+
updatedAt(),
|
3715
3728
|
tslib.__metadata("design:type", Date)
|
3716
3729
|
], BaseModel.prototype, "updatedOn", void 0);
|
3717
3730
|
|
@@ -4026,7 +4039,7 @@
|
|
4026
4039
|
* @const VERSION
|
4027
4040
|
* @memberOf module:core
|
4028
4041
|
*/
|
4029
|
-
const VERSION = "0.5.
|
4042
|
+
const VERSION = "0.5.15";
|
4030
4043
|
|
4031
4044
|
exports.Adapter = Adapter;
|
4032
4045
|
exports.AuthorizationError = AuthorizationError;
|
@@ -4054,6 +4067,7 @@
|
|
4054
4067
|
exports.cacheModelForPopulate = cacheModelForPopulate;
|
4055
4068
|
exports.column = column;
|
4056
4069
|
exports.createOrUpdate = createOrUpdate;
|
4070
|
+
exports.createdAt = createdAt;
|
4057
4071
|
exports.createdBy = createdBy;
|
4058
4072
|
exports.createdByOnCreateUpdate = createdByOnCreateUpdate;
|
4059
4073
|
exports.final = final;
|
@@ -4080,8 +4094,9 @@
|
|
4080
4094
|
exports.table = table;
|
4081
4095
|
exports.unique = unique;
|
4082
4096
|
exports.uniqueOnCreateUpdate = uniqueOnCreateUpdate;
|
4097
|
+
exports.updatedAt = updatedAt;
|
4083
4098
|
exports.updatedBy = updatedBy;
|
4084
4099
|
exports.uses = uses;
|
4085
4100
|
|
4086
4101
|
}));
|
4087
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXBvc2l0b3J5L2NvbnN0YW50cy50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9jb25zdGFudHMudHMiLCIuLi9zcmMvdXRpbHMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy91dGlscy9lcnJvcnMudHMiLCIuLi9zcmMvcGVyc2lzdGVuY2UvZXJyb3JzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL0Rpc3BhdGNoLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL09ic2VydmVySGFuZGxlci50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9BZGFwdGVyLnRzIiwiLi4vc3JjL2lkZW50aXR5L3V0aWxzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL1NlcXVlbmNlLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9SZXBvc2l0b3J5LnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L2Vycm9ycy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L3V0aWxzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvaW5qZWN0YWJsZXMudHMiLCIuLi9zcmMvaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnMudHMiLCIuLi9zcmMvcXVlcnkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3F1ZXJ5L2Vycm9ycy50cyIsIi4uL3NyYy9xdWVyeS9Db25kaXRpb24udHMiLCIuLi9zcmMvbW9kZWwvY29uc3RydWN0aW9uLnRzIiwiLi4vc3JjL21vZGVsL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvaWRlbnRpdHkvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9tb2RlbC9CYXNlTW9kZWwudHMiLCIuLi9zcmMvcXVlcnkvUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3F1ZXJ5L1N0YXRlbWVudC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDYXNjYWRlTWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBzb3J0IGRpcmVjdGlvbnMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBhdmFpbGFibGUgc29ydCBkaXJlY3Rpb25zIGZvciBvcmRlcmluZyBxdWVyeSByZXN1bHRzLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIE9yZGVyRGlyZWN0aW9uIHtcbiAgLyoqIEFzY2VuZGluZyBvcmRlciAoQSB0byBaLCAwIHRvIDkpICovXG4gIEFTQyA9IFwiYXNjXCIsXG5cbiAgLyoqIERlc2NlbmRpbmcgb3JkZXIgKFogdG8gQSwgOSB0byAwKSAqL1xuICBEU0MgPSBcImRlc2NcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW51bWVyYXRpb24gb2YgY2FzY2FkZSBvcGVyYXRpb24gdHlwZXMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBhdmFpbGFibGUgY2FzY2FkZSBiZWhhdmlvcnMgZm9yIGVudGl0eSByZWxhdGlvbnNoaXBzLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIENhc2NhZGUge1xuICAvKiogUGVyZm9ybSBjYXNjYWRlIG9wZXJhdGlvbiBvbiByZWxhdGVkIGVudGl0aWVzICovXG4gIENBU0NBREUgPSBcImNhc2NhZGVcIixcbiAgLyoqIERvIG5vdCBwZXJmb3JtIGNhc2NhZGUgb3BlcmF0aW9uIG9uIHJlbGF0ZWQgZW50aXRpZXMgKi9cbiAgTk9ORSA9IFwibm9uZVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNhc2NhZGUgY29uZmlndXJhdGlvbiBmb3IgZW50aXR5IHJlbGF0aW9uc2hpcHMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyB0aGUgZGVmYXVsdCBjYXNjYWRlIGJlaGF2aW9yIHdoZXJlIHVwZGF0ZXMgY2FzY2FkZSBidXQgZGVsZXRlcyBkbyBub3QuXG4gKiBAdHlwZSB7Q2FzY2FkZU1ldGFkYXRhfVxuICogQGNvbnN0IERlZmF1bHRDYXNjYWRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBQZXJzaXN0ZW5jZS1yZWxhdGVkIGNvbnN0YW50IGtleXNcbiAqIEBzdW1tYXJ5IEVudW0gY29udGFpbmluZyBzdHJpbmcgY29uc3RhbnRzIHVzZWQgdGhyb3VnaG91dCB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIgZm9yIG1ldGFkYXRhLCByZWxhdGlvbnMsIGFuZCBvdGhlciBwZXJzaXN0ZW5jZS1yZWxhdGVkIG9wZXJhdGlvbnNcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZW51bSBQZXJzaXN0ZW5jZUtleXMge1xuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgaW5kZXggbWV0YWRhdGEgKi9cbiAgSU5ERVggPSBcImluZGV4XCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHVuaXF1ZSBjb25zdHJhaW50IG1ldGFkYXRhICovXG4gIFVOSVFVRSA9IFwidW5pcXVlXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGFkYXB0ZXIgbWV0YWRhdGEgKi9cbiAgQURBUFRFUiA9IFwiYWRhcHRlclwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gVGVtcGxhdGUgZm9yIGluamVjdGFibGUgYWRhcHRlciBuYW1lcyAqL1xuICBJTkpFQ1RBQkxFID0gXCJkZWNhZl97MH1fYWRhcHRlcl9mb3JfezF9XCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHRhYmxlIG5hbWUgbWV0YWRhdGEgKi9cbiAgVEFCTEUgPSBcInRhYmxlXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGNvbHVtbiBuYW1lIG1ldGFkYXRhICovXG4gIENPTFVNTiA9IFwiY29sdW1uXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGdlbmVyYWwgbWV0YWRhdGEgc3RvcmFnZSAqL1xuICBNRVRBREFUQSA9IFwiX19tZXRhZGF0YVwiLFxuXG4gIC8vIE93bmVyc2hpcFxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgY3JlYXRlZC1ieSBvd25lcnNoaXAgbWV0YWRhdGEgKi9cbiAgT1dORVJTSElQID0gXCJvd25lcnNoaXBcIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgY3JlYXRlZC1ieSBvd25lcnNoaXAgbWV0YWRhdGEgKi9cbiAgQ1JFQVRFRF9CWSA9IGAke09XTkVSU0hJUH0uY3JlYXRlZC1ieWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHVwZGF0ZWQtYnkgb3duZXJzaGlwIG1ldGFkYXRhICovXG4gIFVQREFURURfQlkgPSBgJHtPV05FUlNISVB9LnVwZGF0ZWQtYnlgLFxuXG4gIC8vIFJlbGF0aW9uc1xuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciByZWxhdGlvbnMgbWV0YWRhdGEgc3RvcmFnZSAqL1xuICBSRUxBVElPTlMgPSBcIl9fcmVsYXRpb25zXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHJlbGF0aW9ucyBtZXRhZGF0YSBzdG9yYWdlICovXG4gIFJFTEFUSU9OID0gXCJyZWxhdGlvblwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBvbmUtdG8tb25lIHJlbGF0aW9uIG1ldGFkYXRhICovXG4gIE9ORV9UT19PTkUgPSBgJHtSRUxBVElPTn0ub25lLXRvLW9uZWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIG9uZS10by1tYW55IHJlbGF0aW9uIG1ldGFkYXRhICovXG4gIE9ORV9UT19NQU5ZID0gYCR7UkVMQVRJT059Lm9uZS10by1tYW55YCxcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgbWFueS10by1vbmUgcmVsYXRpb24gbWV0YWRhdGEgKi9cbiAgTUFOWV9UT19PTkUgPSBgJHtSRUxBVElPTn0ubWFueS10by1vbmVgLFxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgbWFueS10by1vbmUgcmVsYXRpb24gbWV0YWRhdGEgKi9cbiAgTUFOWV9UT19NQU5ZID0gYCR7UkVMQVRJT059Lm1hbnktdG8tbWFueWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHBvcHVsYXRlIG1ldGFkYXRhICovXG4gIFBPUFVMQVRFID0gXCJwb3B1bGF0ZVwiLFxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IG1ha2VzIGEgbWV0aG9kIG5vbi1jb25maWd1cmFibGVcbiAqIEBzdW1tYXJ5IFRoaXMgZGVjb3JhdG9yIHByZXZlbnRzIGEgbWV0aG9kIGZyb20gYmVpbmcgb3ZlcnJpZGRlbiBieSBtYWtpbmcgaXQgbm9uLWNvbmZpZ3VyYWJsZS5cbiAqIEl0IHRocm93cyBhbiBlcnJvciBpZiB1c2VkIG9uIGFueXRoaW5nIG90aGVyIHRoYW4gYSBtZXRob2QuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBtZXRob2RzXG4gKiBAZnVuY3Rpb24gZmluYWxcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWwoKSB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuICApID0+IHtcbiAgICBpZiAoIWRlc2NyaXB0b3IpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbCBkZWNvcmF0b3IgY2FuIG9ubHkgYmUgdXNlZCBvbiBtZXRob2RzXCIpO1xuICAgIGlmIChkZXNjcmlwdG9yPy5jb25maWd1cmFibGUpIHtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgdXNlciBpcyBub3QgYXV0aG9yaXplZCB0byBwZXJmb3JtIGFuIGFjdGlvblxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhIHVzZXIgYXR0ZW1wdHMgdG8gYWNjZXNzIGEgcmVzb3VyY2Ugb3IgcGVyZm9ybSBhbiBhY3Rpb24gd2l0aG91dCBwcm9wZXIgYXV0aGVudGljYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEBjbGFzcyBBdXRob3JpemF0aW9uRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIHRocm93aW5nIGFuIEF1dGhvcml6YXRpb25FcnJvclxuICogaWYgKCF1c2VyLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gKiAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoJ1VzZXIgbm90IGF1dGhlbnRpY2F0ZWQnKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvbkVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKEF1dGhvcml6YXRpb25FcnJvci5uYW1lLCBtc2csIDQwMSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYSB1c2VyIGlzIGZvcmJpZGRlbiBmcm9tIGFjY2Vzc2luZyBhIHJlc291cmNlXG4gKiBAc3VtbWFyeSBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIGFuIGF1dGhlbnRpY2F0ZWQgdXNlciBhdHRlbXB0cyB0byBhY2Nlc3MgYSByZXNvdXJjZSBvciBwZXJmb3JtIGFuIGFjdGlvbiB0aGV5IGRvbid0IGhhdmUgcGVybWlzc2lvbiBmb3JcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRm9yYmlkZGVuRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIHRocm93aW5nIGEgRm9yYmlkZGVuRXJyb3JcbiAqIGlmICghdXNlci5oYXNQZXJtaXNzaW9uKCdhZG1pbicpKSB7XG4gKiAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignVXNlciBkb2VzIG5vdCBoYXZlIGFkbWluIHBlcm1pc3Npb25zJyk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcmJpZGRlbkVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKEZvcmJpZGRlbkVycm9yLm5hbWUsIG1zZywgNDAzKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhIGNvbm5lY3Rpb24gdG8gYSBzZXJ2aWNlIGZhaWxzXG4gKiBAc3VtbWFyeSBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIHRoZSBhcHBsaWNhdGlvbiBmYWlscyB0byBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIGEgcmVxdWlyZWQgc2VydmljZSBvciByZXNvdXJjZVxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBDb25uZWN0aW9uRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIHRocm93aW5nIGEgQ29ubmVjdGlvbkVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBkYXRhYmFzZS5jb25uZWN0KCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICB0aHJvdyBuZXcgQ29ubmVjdGlvbkVycm9yKCdGYWlsZWQgdG8gY29ubmVjdCB0byBkYXRhYmFzZScpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoQ29ubmVjdGlvbkVycm9yLm5hbWUsIG1zZywgNTAzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGFuIHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWRcbiAqIEBzdW1tYXJ5IFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIHJlcXVlc3RlZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRcbiAqIHBlcnNpc3RlbmNlIGFkYXB0ZXIgb3IgY29uZmlndXJhdGlvbi4gSXQgZXh0ZW5kcyB0aGUgQmFzZUVycm9yIGNsYXNzIGFuZCBzZXRzIGEgNTAwIHN0YXR1cyBjb2RlLlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIGFuIEVycm9yIG9iamVjdCB0byB3cmFwXG4gKiBAY2xhc3MgVW5zdXBwb3J0ZWRFcnJvclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFRocm93aW5nIGFuIFVuc3VwcG9ydGVkRXJyb3JcbiAqIGlmICghYWRhcHRlci5zdXBwb3J0c1RyYW5zYWN0aW9ucygpKSB7XG4gKiAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdUcmFuc2FjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhZGFwdGVyJyk7XG4gKiB9XG4gKiBcbiAqIC8vIENhdGNoaW5nIGFuIFVuc3VwcG9ydGVkRXJyb3JcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IGFkYXB0ZXIuYmVnaW5UcmFuc2FjdGlvbigpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ09wZXJhdGlvbiBub3Qgc3VwcG9ydGVkOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoVW5zdXBwb3J0ZWRFcnJvci5uYW1lLCBtc2csIDUwMCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRXZlbnRJZHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEaXNwYXRjaGVzIGRhdGFiYXNlIG9wZXJhdGlvbiBldmVudHMgdG8gb2JzZXJ2ZXJzXG4gKiBAc3VtbWFyeSBUaGUgRGlzcGF0Y2ggY2xhc3MgaW1wbGVtZW50cyB0aGUgT2JzZXJ2YWJsZSBpbnRlcmZhY2UgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBpbnRlcmNlcHRpbmdcbiAqIGRhdGFiYXNlIG9wZXJhdGlvbnMgZnJvbSBhbiBBZGFwdGVyIGFuZCBub3RpZnlpbmcgb2JzZXJ2ZXJzIHdoZW4gY2hhbmdlcyBvY2N1ci4gSXQgdXNlcyBwcm94aWVzIHRvXG4gKiB3cmFwIHRoZSBhZGFwdGVyJ3MgQ1JVRCBtZXRob2RzIGFuZCBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgb2JzZXJ2ZXIgdXBkYXRlcyBhZnRlciBvcGVyYXRpb25zIGNvbXBsZXRlLlxuICogQHRlbXBsYXRlIFkgLSBUaGUgbmF0aXZlIGRhdGFiYXNlIGRyaXZlciB0eXBlXG4gKiBAcGFyYW0ge3ZvaWR9IC0gTm8gY29uc3RydWN0b3IgcGFyYW1ldGVyc1xuICogQGNsYXNzIERpc3BhdGNoXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRpbmcgYW5kIHVzaW5nIGEgRGlzcGF0Y2ggaW5zdGFuY2VcbiAqIGNvbnN0IGRpc3BhdGNoID0gbmV3IERpc3BhdGNoPFBvc3RncmVzRHJpdmVyPigpO1xuICpcbiAqIC8vIENvbm5lY3QgaXQgdG8gYW4gYWRhcHRlclxuICogY29uc3QgYWRhcHRlciA9IG5ldyBQb3N0Z3Jlc0FkYXB0ZXIoY29ubmVjdGlvbik7XG4gKiBkaXNwYXRjaC5vYnNlcnZlKGFkYXB0ZXIpO1xuICpcbiAqIC8vIE5vdyBhbnkgQ1JVRCBvcGVyYXRpb25zIG9uIHRoZSBhZGFwdGVyIHdpbGwgYXV0b21hdGljYWxseVxuICogLy8gdHJpZ2dlciBvYnNlcnZlciBub3RpZmljYXRpb25zXG4gKiBhd2FpdCBhZGFwdGVyLmNyZWF0ZSgndXNlcnMnLCAxMjMsIHVzZXJNb2RlbCk7XG4gKiAvLyBPYnNlcnZlcnMgd2lsbCBiZSBub3RpZmllZCBhYm91dCB0aGUgY3JlYXRpb25cbiAqXG4gKiAvLyBXaGVuIGRvbmUsIHlvdSBjYW4gZGlzY29ubmVjdFxuICogZGlzcGF0Y2gudW5PYnNlcnZlKGFkYXB0ZXIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXNwYXRjaDxZPiBpbXBsZW1lbnRzIE9ic2VydmFibGUge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBhZGFwdGVyIGJlaW5nIG9ic2VydmVkXG4gICAqIEBzdW1tYXJ5IFJlZmVyZW5jZSB0byB0aGUgZGF0YWJhc2UgYWRhcHRlciB3aG9zZSBvcGVyYXRpb25zIGFyZSBiZWluZyBtb25pdG9yZWRcbiAgICovXG4gIHByb3RlY3RlZCBhZGFwdGVyPzogQWRhcHRlcjxZLCBhbnksIGFueSwgYW55PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBuYXRpdmUgZGF0YWJhc2UgZHJpdmVyXG4gICAqIEBzdW1tYXJ5IFJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSBkcml2ZXIgZnJvbSB0aGUgYWRhcHRlclxuICAgKi9cbiAgcHJvdGVjdGVkIG5hdGl2ZT86IFk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0IG9mIG1vZGVsIGNvbnN0cnVjdG9yc1xuICAgKiBAc3VtbWFyeSBBcnJheSBvZiBtb2RlbCBjb25zdHJ1Y3RvcnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBhZGFwdGVyXG4gICAqL1xuICBwcm90ZWN0ZWQgbW9kZWxzITogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgTG9nZ2VyIGZvciByZWNvcmRpbmcgZGlzcGF0Y2ggYWN0aXZpdGllc1xuICAgKi9cbiAgcHJpdmF0ZSBsb2dnZXIhOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBY2Nlc3NvciBmb3IgdGhlIGxvZ2dlclxuICAgKiBAc3VtbWFyeSBHZXRzIG9yIGluaXRpYWxpemVzIHRoZSBsb2dnZXIgZm9yIHRoaXMgZGlzcGF0Y2ggaW5zdGFuY2VcbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgbG9nZ2VyIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGxvZygpIHtcbiAgICBpZiAoIXRoaXMubG9nZ2VyKVxuICAgICAgdGhpcy5sb2dnZXIgPSBMb2dnaW5nLmZvcih0aGlzIGFzIGFueSkuZm9yKHRoaXMuYWRhcHRlciBhcyBhbnkpO1xuICAgIHJldHVybiB0aGlzLmxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBEaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBEaXNwYXRjaCBpbnN0YW5jZSB3aXRob3V0IGFueSBhZGFwdGVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgZGlzcGF0Y2ggYnkgcHJveHlpbmcgYWRhcHRlciBtZXRob2RzXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgcHJveGllcyBvbiB0aGUgYWRhcHRlcidzIENSVUQgbWV0aG9kcyB0byBpbnRlcmNlcHQgb3BlcmF0aW9ucyBhbmQgbm90aWZ5IG9ic2VydmVycy5cbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiBhZGFwdGVyIGlzIG9ic2VydmVkLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IERpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFByb3h5XG4gICAqXG4gICAqICAgRGlzcGF0Y2gtPj5EaXNwYXRjaDogaW5pdGlhbGl6ZSgpXG4gICAqICAgRGlzcGF0Y2gtPj5EaXNwYXRjaDogQ2hlY2sgaWYgYWRhcHRlciBleGlzdHNcbiAgICogICBhbHQgTm8gYWRhcHRlclxuICAgKiAgICAgRGlzcGF0Y2gtLT4+RGlzcGF0Y2g6IFRocm93IEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICpcbiAgICogICBsb29wIEZvciBlYWNoIENSVUQgbWV0aG9kXG4gICAqICAgICBEaXNwYXRjaC0+PkFkYXB0ZXI6IENoZWNrIGlmIG1ldGhvZCBleGlzdHNcbiAgICogICAgIGFsdCBNZXRob2QgZG9lc24ndCBleGlzdFxuICAgKiAgICAgICBEaXNwYXRjaC0tPj5EaXNwYXRjaDogVGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgICAgZW5kXG4gICAqXG4gICAqICAgICBEaXNwYXRjaC0+PkFkYXB0ZXI6IEdldCBwcm9wZXJ0eSBkZXNjcmlwdG9yXG4gICAqICAgICBsb29wIFdoaWxlIGRlc2NyaXB0b3Igbm90IGZvdW5kXG4gICAqICAgICAgIERpc3BhdGNoLT4+QWRhcHRlcjogQ2hlY2sgcHJvdG90eXBlIGNoYWluXG4gICAqICAgICBlbmRcbiAgICpcbiAgICogICAgIGFsdCBEZXNjcmlwdG9yIG5vdCBmb3VuZCBvciBub3Qgd3JpdGFibGVcbiAgICogICAgICAgRGlzcGF0Y2gtPj5EaXNwYXRjaDogTG9nIGVycm9yIGFuZCBjb250aW51ZVxuICAgKiAgICAgZWxzZSBEZXNjcmlwdG9yIGZvdW5kIGFuZCB3cml0YWJsZVxuICAgKiAgICAgICBEaXNwYXRjaC0+PlByb3h5OiBDcmVhdGUgcHJveHkgZm9yIG1ldGhvZFxuICAgKiAgICAgICBEaXNwYXRjaC0+PkFkYXB0ZXI6IFJlcGxhY2UgbWV0aG9kIHdpdGggcHJveHlcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyIGFzIEFkYXB0ZXI8WSwgYW55LCBhbnksIGFueT47XG4gICAgKFxuICAgICAgW1xuICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLFxuICAgICAgXSBhcyAoa2V5b2YgQWRhcHRlcjxZLCBhbnksIGFueSwgYW55PilbXVxuICAgICkuZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gICAgICBpZiAoIWFkYXB0ZXJbbWV0aG9kXSlcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE1ldGhvZCAke21ldGhvZH0gbm90IGZvdW5kIGluICR7YWRhcHRlci5hbGlhc30gYWRhcHRlciB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYWRhcHRlciwgbWV0aG9kKTtcbiAgICAgIGxldCBwcm90bzogYW55ID0gYWRhcHRlcjtcbiAgICAgIHdoaWxlICghZGVzY3JpcHRvciAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgICAgIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBtZXRob2QpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgIWRlc2NyaXB0b3Iud3JpdGFibGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGhvZCAke21ldGhvZH0gdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gYnVsa1RvU2luZ2xlKG1ldGhvZDogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkNSRUFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuVVBEQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5ERUxFVEU7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGVyZSBhcmUgcmVhZCBvbmx5IHByb3BlcnRpZXNcbiAgICAgIGFkYXB0ZXJbbWV0aG9kXSA9IG5ldyBQcm94eShhZGFwdGVyW21ldGhvZF0sIHtcbiAgICAgICAgYXBwbHk6IGFzeW5jICh0YXJnZXQ6IGFueSwgdGhpc0FyZywgYXJnQXJyYXk6IGFueVtdKSA9PiB7XG4gICAgICAgICAgY29uc3QgW3RhYmxlTmFtZSwgaWRzXSA9IGFyZ0FycmF5O1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5hcHBseSh0aGlzQXJnLCBhcmdBcnJheSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGVOYW1lLCBidWxrVG9TaW5nbGUobWV0aG9kKSwgaWRzIGFzIEV2ZW50SWRzKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvZy52ZXJib3NlKFxuICAgICAgICAgICAgICAgIGBPYnNlcnZlciByZWZyZXNoIGRpc3BhdGNoZWQgYnkgJHttZXRob2R9IGZvciAke3RhYmxlTmFtZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBwa3M6ICR7aWRzfWApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZTogdW5rbm93bikgPT5cbiAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBkaXNwYXRjaCBvYnNlcnZlciByZWZyZXNoIGZvciAke21ldGhvZH0gb24gJHt0YWJsZU5hbWV9OiAke2V9YFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xvc2VzIHRoZSBkaXNwYXRjaFxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAgd2hlbiB0aGUgZGlzcGF0Y2ggaXMgbm8gbG9uZ2VyIG5lZWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGNsb3NpbmcgaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIC8vIHRvIG5vdGhpbmcgaW4gdGhpcyBpbnN0YW5jZSBidXQgbWF5IGJlIHJlcXVpcmVkIGZvciBjbG9zaW5nIGNvbm5lY3Rpb25zXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXJ0cyBvYnNlcnZpbmcgYW4gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBDb25uZWN0cyB0aGlzIGRpc3BhdGNoIHRvIGFuIGFkYXB0ZXIgdG8gbW9uaXRvciBpdHMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0ge0FkYXB0ZXI8WSwgYW55LCBhbnksIGFueT59IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gb2JzZXJ2ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb2JzZXJ2ZShvYnNlcnZlcjogQWRhcHRlcjxZLCBhbnksIGFueSwgYW55Pik6IHZvaWQge1xuICAgIGlmICghKG9ic2VydmVyIGluc3RhbmNlb2YgQWRhcHRlcikpXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcIk9ubHkgQWRhcHRlcnMgY2FuIGJlIG9ic2VydmVkIGJ5IGRpc3BhdGNoXCIpO1xuICAgIHRoaXMuYWRhcHRlciA9IG9ic2VydmVyO1xuICAgIHRoaXMubmF0aXZlID0gb2JzZXJ2ZXIubmF0aXZlO1xuICAgIHRoaXMubW9kZWxzID0gQWRhcHRlci5tb2RlbHModGhpcy5hZGFwdGVyLmFsaWFzKTtcbiAgICB0aGlzLmluaXRpYWxpemUoKS50aGVuKCgpID0+XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKFxuICAgICAgICBgRGlzcGF0Y2ggaW5pdGlhbGl6ZWQgZm9yICR7dGhpcy5hZGFwdGVyIS5hbGlhc30gYWRhcHRlcmBcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdG9wcyBvYnNlcnZpbmcgYW4gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBEaXNjb25uZWN0cyB0aGlzIGRpc3BhdGNoIGZyb20gYW4gYWRhcHRlclxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBhZGFwdGVyIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWRhcHRlciAhPT0gb2JzZXJ2ZXIpXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgXCJPbmx5IHRoZSBhZGFwdGVyIHRoYXQgd2FzIHVzZWQgdG8gb2JzZXJ2ZSBjYW4gYmUgdW5vYnNlcnZlZFwiXG4gICAgICApO1xuICAgIHRoaXMuYWRhcHRlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHNcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLnJlZnJlc2godGFibGUsIGV2ZW50LCBpZCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIGRpc3BhdGNoOiAke2V9YCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBPYnNlcnZhYmxlLCBPYnNlcnZlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBFdmVudElkcywgT2JzZXJ2ZXJGaWx0ZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiBvYnNlcnZlcnMgZm9yIGRhdGFiYXNlIGV2ZW50c1xuICogQHN1bW1hcnkgVGhlIE9ic2VydmVySGFuZGxlciBjbGFzcyBpbXBsZW1lbnRzIHRoZSBPYnNlcnZhYmxlIGludGVyZmFjZSBhbmQgcHJvdmlkZXMgYSBjZW50cmFsaXplZFxuICogd2F5IHRvIG1hbmFnZSBtdWx0aXBsZSBvYnNlcnZlcnMuIEl0IGFsbG93cyByZWdpc3RlcmluZyBvYnNlcnZlcnMgd2l0aCBvcHRpb25hbCBmaWx0ZXJzIHRvIGNvbnRyb2xcbiAqIHdoaWNoIGV2ZW50cyB0aGV5IHJlY2VpdmUgbm90aWZpY2F0aW9ucyBmb3IsIGFuZCBoYW5kbGVzIHRoZSBwcm9jZXNzIG9mIG5vdGlmeWluZyBhbGwgcmVsZXZhbnRcbiAqIG9ic2VydmVycyB3aGVuIGRhdGFiYXNlIGV2ZW50cyBvY2N1ci5cbiAqIEBjbGFzcyBPYnNlcnZlckhhbmRsZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYW4gb2JzZXJ2ZXIgaGFuZGxlclxuICogY29uc3QgaGFuZGxlciA9IG5ldyBPYnNlcnZlckhhbmRsZXIoKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhbiBvYnNlcnZlclxuICogY29uc3QgbXlPYnNlcnZlciA9IHtcbiAqICAgcmVmcmVzaDogYXN5bmMgKHRhYmxlLCBldmVudCwgaWQpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZyhgQ2hhbmdlIGluICR7dGFibGV9OiAke2V2ZW50fSBmb3IgSUQgJHtpZH1gKTtcbiAqICAgfVxuICogfTtcbiAqXG4gKiAvLyBBZGQgb2JzZXJ2ZXIgd2l0aCBhIGZpbHRlciBmb3Igb25seSB1c2VyIHRhYmxlIGV2ZW50c1xuICogaGFuZGxlci5vYnNlcnZlKG15T2JzZXJ2ZXIsICh0YWJsZSwgZXZlbnQsIGlkKSA9PiB0YWJsZSA9PT0gJ3VzZXJzJyk7XG4gKlxuICogLy8gTm90aWZ5IG9ic2VydmVycyBhYm91dCBhbiBldmVudFxuICogYXdhaXQgaGFuZGxlci51cGRhdGVPYnNlcnZlcnMobG9nZ2VyLCAndXNlcnMnLCAnQ1JFQVRFJywgMTIzKTtcbiAqXG4gKiAvLyBSZW1vdmUgYW4gb2JzZXJ2ZXIgd2hlbiBubyBsb25nZXIgbmVlZGVkXG4gKiBoYW5kbGVyLnVuT2JzZXJ2ZShteU9ic2VydmVyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZXJIYW5kbGVyIGltcGxlbWVudHMgT2JzZXJ2YWJsZSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29sbGVjdGlvbiBvZiByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKiBAc3VtbWFyeSBBcnJheSBvZiBvYnNlcnZlciBvYmplY3RzIGFsb25nIHdpdGggdGhlaXIgb3B0aW9uYWwgZmlsdGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9ic2VydmVyczoge1xuICAgIG9ic2VydmVyOiBPYnNlcnZlcjtcbiAgICBmaWx0ZXI/OiBPYnNlcnZlckZpbHRlcjtcbiAgfVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY291bnQgb2Ygb2JzZXJ2ZXJzIGN1cnJlbnRseSByZWdpc3RlcmVkIHdpdGggdGhpcyBoYW5kbGVyXG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKi9cbiAgY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgbmV3IG9ic2VydmVyXG4gICAqIEBzdW1tYXJ5IEFkZHMgYW4gb2JzZXJ2ZXIgdG8gdGhlIGNvbGxlY3Rpb24gd2l0aCBhbiBvcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtPYnNlcnZlckZpbHRlcn0gW2ZpbHRlcl0gLSBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGV2ZW50cyB0aGUgb2JzZXJ2ZXIgcmVjZWl2ZXNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyLCBmaWx0ZXI/OiBPYnNlcnZlckZpbHRlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMubWFwKChvKSA9PiBvLm9ic2VydmVyKS5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk9ic2VydmVyIGFscmVhZHkgcmVnaXN0ZXJlZFwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5wdXNoKHsgb2JzZXJ2ZXI6IG9ic2VydmVyLCBmaWx0ZXI6IGZpbHRlciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgYW4gb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhbiBvYnNlcnZlciBmcm9tIHRoZSBjb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHVucmVnaXN0ZXJcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMub2JzZXJ2ZXJzLm1hcCgobykgPT4gby5vYnNlcnZlcikuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBPYnNlcnZlclwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgcmVsZXZhbnQgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgRmlsdGVycyBvYnNlcnZlcnMgYmFzZWQgb24gdGhlaXIgZmlsdGVyIGZ1bmN0aW9ucyBhbmQgY2FsbHMgcmVmcmVzaCBvbiBlYWNoIG1hdGNoaW5nIG9ic2VydmVyXG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBsb2cgLSBMb2dnZXIgZm9yIHJlY29yZGluZyBub3RpZmljYXRpb24gYWN0aXZpdGllc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgb2JzZXJ2ZXJzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgT2JzZXJ2ZXJIYW5kbGVyXG4gICAqICAgcGFydGljaXBhbnQgT2JzZXJ2ZXJcbiAgICpcbiAgICogICBDbGllbnQtPj5PYnNlcnZlckhhbmRsZXI6IHVwZGF0ZU9ic2VydmVycyhsb2csIHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpXG4gICAqXG4gICAqICAgT2JzZXJ2ZXJIYW5kbGVyLT4+T2JzZXJ2ZXJIYW5kbGVyOiBGaWx0ZXIgb2JzZXJ2ZXJzXG4gICAqXG4gICAqICAgbG9vcCBGb3IgZWFjaCBvYnNlcnZlciB3aXRoIG1hdGNoaW5nIGZpbHRlclxuICAgKiAgICAgYWx0IE9ic2VydmVyIGhhcyBmaWx0ZXJcbiAgICogICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+T2JzZXJ2ZXI6IEFwcGx5IGZpbHRlcih0YWJsZSwgZXZlbnQsIGlkKVxuICAgKiAgICAgICBhbHQgRmlsdGVyIHRocm93cyBlcnJvclxuICAgKiAgICAgICAgIE9ic2VydmVySGFuZGxlci0+PkxvZ2dlcjogTG9nIGVycm9yXG4gICAqICAgICAgICAgT2JzZXJ2ZXJIYW5kbGVyLS0+Pk9ic2VydmVySGFuZGxlcjogU2tpcCBvYnNlcnZlclxuICAgKiAgICAgICBlbHNlIEZpbHRlciByZXR1cm5zIHRydWVcbiAgICogICAgICAgICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlcjogcmVmcmVzaCh0YWJsZSwgZXZlbnQsIGlkLCAuLi5hcmdzKVxuICAgKiAgICAgICBlbHNlIEZpbHRlciByZXR1cm5zIGZhbHNlXG4gICAqICAgICAgICAgT2JzZXJ2ZXJIYW5kbGVyLS0+Pk9ic2VydmVySGFuZGxlcjogU2tpcCBvYnNlcnZlclxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVsc2UgTm8gZmlsdGVyXG4gICAqICAgICAgIE9ic2VydmVySGFuZGxlci0+Pk9ic2VydmVyOiByZWZyZXNoKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlckhhbmRsZXI6IFByb2Nlc3MgcmVzdWx0c1xuICAgKiAgIGxvb3AgRm9yIGVhY2ggcmVzdWx0XG4gICAqICAgICBhbHQgUmVzdWx0IGlzIHJlamVjdGVkXG4gICAqICAgICAgIE9ic2VydmVySGFuZGxlci0+PkxvZ2dlcjogTG9nIGVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBPYnNlcnZlckhhbmRsZXItLT4+Q2xpZW50OiBSZXR1cm5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICBsb2c6IExvZ2dlcixcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdGhpcy5vYnNlcnZlcnNcbiAgICAgICAgLmZpbHRlcigobykgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZmlsdGVyIH0gPSBvO1xuICAgICAgICAgIGlmICghZmlsdGVyKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcih0YWJsZSwgZXZlbnQsIGlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gZmlsdGVyIG9ic2VydmVyICR7by5vYnNlcnZlci50b1N0cmluZygpfTogJHtlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAubWFwKChvKSA9PiB7XG4gICAgICAgICAgby5vYnNlcnZlci5yZWZyZXNoKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpO1xuICAgICAgICB9KVxuICAgICk7XG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpXG4gICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSBvYnNlcnZhYmxlICR7dGhpcy5vYnNlcnZlcnNbaV0udG9TdHJpbmcoKX06ICR7cmVzdWx0LnJlYXNvbn1gXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgREJLZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBDb250ZXh0LFxuICBPcGVyYXRpb25LZXlzLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG4gIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MsXG4gIENvbnRleHR1YWwsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgbW9kZWxUb1RyYW5zaWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIERlZmF1bHRGbGF2b3VyLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgTW9kZWxSZWdpc3RyeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBSYXdFeGVjdXRvciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1Jhd0V4ZWN1dG9yXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2YWJsZVwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi9TZXF1ZW5jZVwiO1xuaW1wb3J0IHsgRXJyb3JQYXJzZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU3RhdGVtZW50IH0gZnJvbSBcIi4uL3F1ZXJ5L1N0YXRlbWVudFwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgRGlzcGF0Y2ggfSBmcm9tIFwiLi9EaXNwYXRjaFwiO1xuaW1wb3J0IHsgdHlwZSBFdmVudElkcywgdHlwZSBPYnNlcnZlckZpbHRlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBPYnNlcnZlckhhbmRsZXIgfSBmcm9tIFwiLi9PYnNlcnZlckhhbmRsZXJcIjtcblxuRGVjb3JhdGlvbi5zZXRGbGF2b3VyUmVzb2x2ZXIoKG9iajogb2JqZWN0KSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIEFkYXB0ZXIuZmxhdm91ck9mKE1vZGVsLmlzTW9kZWwob2JqKSA/IG9iai5jb25zdHJ1Y3RvciA6IChvYmogYXMgYW55KSkgfHxcbiAgICAgIC8vIEFkYXB0ZXIuY3VycmVudD8uYWxpYXMgfHxcbiAgICAgIERlZmF1bHRGbGF2b3VyXG4gICAgKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG4gICAgLy8gcmV0dXJuIEFkYXB0ZXIuY3VycmVudD8uYWxpYXMgfHwgRGVmYXVsdEZsYXZvdXI7XG4gIH1cbn0pO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBkYXRhYmFzZSBhZGFwdGVyc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIGZvdW5kYXRpb24gZm9yIGFsbCBkYXRhYmFzZSBhZGFwdGVycyBpbiB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIuIFRoaXMgY2xhc3NcbiAqIGltcGxlbWVudHMgc2V2ZXJhbCBpbnRlcmZhY2VzIHRvIHByb3ZpZGUgYSBjb25zaXN0ZW50IEFQSSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucywgb2JzZXJ2ZXJcbiAqIHBhdHRlcm4gc3VwcG9ydCwgYW5kIGVycm9yIGhhbmRsaW5nLiBJdCBtYW5hZ2VzIGFkYXB0ZXIgcmVnaXN0cmF0aW9uLCBDUlVEIG9wZXJhdGlvbnMsIGFuZFxuICogb2JzZXJ2ZXIgbm90aWZpY2F0aW9ucy5cbiAqIEB0ZW1wbGF0ZSBZIC0gVGhlIHVuZGVybHlpbmcgZGF0YWJhc2UgZHJpdmVyIHR5cGVcbiAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHF1ZXJ5IG9iamVjdCB0eXBlIHVzZWQgYnkgdGhlIGFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlXG4gKiBAcGFyYW0ge1l9IF9uYXRpdmUgLSBUaGUgdW5kZXJseWluZyBkYXRhYmFzZSBkcml2ZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgYWRhcHRlciB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ30gW19hbGlhc10gLSBPcHRpb25hbCBhbHRlcm5hdGl2ZSBuYW1lIGZvciB0aGlzIGFkYXB0ZXJcbiAqIEBjbGFzcyBBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW1wbGVtZW50aW5nIGEgY29uY3JldGUgYWRhcHRlclxuICogY2xhc3MgUG9zdGdyZXNBZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxwZy5DbGllbnQsIHBnLlF1ZXJ5LCBQb3N0Z3Jlc0ZsYWdzLCBQb3N0Z3Jlc0NvbnRleHQ+IHtcbiAqICAgY29uc3RydWN0b3IoY2xpZW50OiBwZy5DbGllbnQpIHtcbiAqICAgICBzdXBlcihjbGllbnQsICdwb3N0Z3JlcycpO1xuICogICB9XG4gKlxuICogICBhc3luYyBpbml0aWFsaXplKCkge1xuICogICAgIC8vIFNldCB1cCB0aGUgYWRhcHRlclxuICogICAgIGF3YWl0IHRoaXMubmF0aXZlLmNvbm5lY3QoKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKSB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIGNyZWF0aW5nIHJlY29yZHNcbiAqICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LmtleXMobW9kZWwpLmpvaW4oJywgJyk7XG4gKiAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhtb2RlbCk7XG4gKiAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gdmFsdWVzLm1hcCgoXywgaSkgPT4gYCQke2krMX1gKS5qb2luKCcsICcpO1xuICpcbiAqICAgICBjb25zdCBxdWVyeSA9IGBJTlNFUlQgSU5UTyAke3RhYmxlTmFtZX0gKCR7Y29sdW1uc30pIFZBTFVFUyAoJHtwbGFjZWhvbGRlcnN9KSBSRVRVUk5JTkcgKmA7XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5uYXRpdmUucXVlcnkocXVlcnksIHZhbHVlcyk7XG4gKiAgICAgcmV0dXJuIHJlc3VsdC5yb3dzWzBdO1xuICogICB9XG4gKlxuICogICAvLyBPdGhlciByZXF1aXJlZCBtZXRob2QgaW1wbGVtZW50YXRpb25zLi4uXG4gKiB9XG4gKlxuICogLy8gVXNpbmcgdGhlIGFkYXB0ZXJcbiAqIGNvbnN0IHBnQ2xpZW50ID0gbmV3IHBnLkNsaWVudChjb25uZWN0aW9uU3RyaW5nKTtcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9zdGdyZXNBZGFwdGVyKHBnQ2xpZW50KTtcbiAqIGF3YWl0IGFkYXB0ZXIuaW5pdGlhbGl6ZSgpO1xuICpcbiAqIC8vIFNldCBhcyB0aGUgZGVmYXVsdCBhZGFwdGVyXG4gKiBBZGFwdGVyLnNldEN1cnJlbnQoJ3Bvc3RncmVzJyk7XG4gKlxuICogLy8gUGVyZm9ybSBvcGVyYXRpb25zXG4gKiBjb25zdCB1c2VyID0gYXdhaXQgYWRhcHRlci5jcmVhdGUoJ3VzZXJzJywgMSwgeyBuYW1lOiAnSm9obicsIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScgfSk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgQWRhcHRlciB7XG4gKiAgICAgK1kgbmF0aXZlXG4gKiAgICAgK3N0cmluZyBmbGF2b3VyXG4gKiAgICAgK3N0cmluZyBhbGlhc1xuICogICAgICtjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gKiAgICAgK3JlYWQodGFibGVOYW1lLCBpZClcbiAqICAgICArdXBkYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICogICAgICtkZWxldGUodGFibGVOYW1lLCBpZClcbiAqICAgICArb2JzZXJ2ZShvYnNlcnZlciwgZmlsdGVyKVxuICogICAgICt1bk9ic2VydmUob2JzZXJ2ZXIpXG4gKiAgICAgK3N0YXRpYyBjdXJyZW50XG4gKiAgICAgK3N0YXRpYyBnZXQoZmxhdm91cilcbiAqICAgICArc3RhdGljIHNldEN1cnJlbnQoZmxhdm91cilcbiAqICAgfVxuICpcbiAqICAgY2xhc3MgUmF3RXhlY3V0b3Ige1xuICogICAgICtyYXcocXVlcnkpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE9ic2VydmFibGUge1xuICogICAgICtvYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpXG4gKiAgICAgK3VuT2JzZXJ2ZShvYnNlcnZlcilcbiAqICAgICArdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE9ic2VydmVyIHtcbiAqICAgICArcmVmcmVzaCh0YWJsZSwgZXZlbnQsIGlkKVxuICogICB9XG4gKlxuICogICBjbGFzcyBFcnJvclBhcnNlciB7XG4gKiAgICAgK3BhcnNlRXJyb3IoZXJyKVxuICogICB9XG4gKlxuICogICBBZGFwdGVyIC0tfD4gUmF3RXhlY3V0b3JcbiAqICAgQWRhcHRlciAtLXw+IE9ic2VydmFibGVcbiAqICAgQWRhcHRlciAtLXw+IE9ic2VydmVyXG4gKiAgIEFkYXB0ZXIgLS18PiBFcnJvclBhcnNlclxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWRhcHRlcjxcbiAgICBZLFxuICAgIFEsXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbiAgPlxuICBpbXBsZW1lbnRzIFJhd0V4ZWN1dG9yPFE+LCBDb250ZXh0dWFsPEYsIEM+LCBPYnNlcnZhYmxlLCBPYnNlcnZlciwgRXJyb3JQYXJzZXJcbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2N1cnJlbnRGbGF2b3VyOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhdGljIF9jYWNoZTogUmVjb3JkPHN0cmluZywgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+PiA9IHt9O1xuXG4gIHByaXZhdGUgbG9nZ2VyITogTG9nZ2VyO1xuXG4gIHByb3RlY3RlZCBkaXNwYXRjaD86IERpc3BhdGNoPFk+O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBvYnNlcnZlckhhbmRsZXI/OiBPYnNlcnZlckhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgYWNjZXNzb3JcbiAgICogQHN1bW1hcnkgR2V0cyBvciBpbml0aWFsaXplcyB0aGUgbG9nZ2VyIGZvciB0aGlzIGFkYXB0ZXIgaW5zdGFuY2VcbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgbG9nZ2VyIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGxvZygpIHtcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB0aGlzLmxvZ2dlciA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KTtcbiAgICByZXR1cm4gdGhpcy5sb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG5hdGl2ZSBkYXRhYmFzZSBkcml2ZXJcbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIGRyaXZlciBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtZfSBUaGUgbmF0aXZlIGRhdGFiYXNlIGRyaXZlclxuICAgKi9cbiAgZ2V0IG5hdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmF0aXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBhZGFwdGVyJ3MgYWxpYXMgb3IgZmxhdm9yIG5hbWVcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgYWxpYXMgaWYgc2V0LCBvdGhlcndpc2UgcmV0dXJucyB0aGUgZmxhdm9yIG5hbWVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWRhcHRlcidzIGlkZW50aWZpZXJcbiAgICovXG4gIGdldCBhbGlhcygpIHtcbiAgICByZXR1cm4gdGhpcy5fYWxpYXMgfHwgdGhpcy5mbGF2b3VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIHJlcG9zaXRvcmllcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGFkYXB0ZXJcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3RvcjxSZXBvc2l0b3J5PE0sIFEsIEFkYXB0ZXI8WSwgUSwgRiwgQz4sIEYsIEM+Pn0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3JcbiAgICovXG4gIHJlcG9zaXRvcnk8TSBleHRlbmRzIE1vZGVsPHRydWUgfCBmYWxzZT4+KCk6IENvbnN0cnVjdG9yPFxuICAgIFJlcG9zaXRvcnk8TSwgUSwgQWRhcHRlcjxZLCBRLCBGLCBDPiwgRiwgQz5cbiAgPiB7XG4gICAgcmV0dXJuIFJlcG9zaXRvcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyB0aGUgYWRhcHRlciB3aXRoIHRoZSBuYXRpdmUgZHJpdmVyIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIGFkYXB0ZXIgY2FjaGVcbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9uYXRpdmU6IFksXG4gICAgcmVhZG9ubHkgZmxhdm91cjogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2FsaWFzPzogc3RyaW5nXG4gICkge1xuICAgIGlmICh0aGlzLmZsYXZvdXIgaW4gQWRhcHRlci5fY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYCR7dGhpcy5hbGlhc30gcGVyc2lzdGVuY2UgYWRhcHRlciAke3RoaXMuX2FsaWFzID8gYCgke3RoaXMuZmxhdm91cn0pIGAgOiBcIlwifSBhbHJlYWR5IHJlZ2lzdGVyZWRgXG4gICAgICApO1xuICAgIEFkYXB0ZXIuX2NhY2hlW3RoaXMuYWxpYXNdID0gdGhpcztcbiAgICB0aGlzLmxvZy5pbmZvKFxuICAgICAgYENyZWF0ZWQgJHt0aGlzLmFsaWFzfSBwZXJzaXN0ZW5jZSBhZGFwdGVyICR7dGhpcy5fYWxpYXMgPyBgKCR7dGhpcy5mbGF2b3VyfSkgYCA6IFwiXCJ9IHBlcnNpc3RlbmNlIGFkYXB0ZXJgXG4gICAgKTtcbiAgICBpZiAoIUFkYXB0ZXIuX2N1cnJlbnRGbGF2b3VyKSB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKGBEZWZpbmVkICR7dGhpcy5hbGlhc30gcGVyc2lzdGVuY2UgYWRhcHRlciBhcyBjdXJyZW50YCk7XG4gICAgICBBZGFwdGVyLl9jdXJyZW50Rmxhdm91ciA9IHRoaXMuYWxpYXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHN0YXRlbWVudCBidWlsZGVyIGZvciBhIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBzdGF0ZW1lbnQgYnVpbGRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBxdWVyaWVzIGZvciBhIHNwZWNpZmljIG1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHJldHVybiB7U3RhdGVtZW50fSBBIHN0YXRlbWVudCBidWlsZGVyIGZvciB0aGUgbW9kZWxcbiAgICovXG4gIGFic3RyYWN0IFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KCk6IFN0YXRlbWVudDxRLCBNLCBhbnk+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBkaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBkaXNwYXRjaCBpbnN0YW5jZSBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge0Rpc3BhdGNoPFk+fSBBIG5ldyBkaXNwYXRjaCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIERpc3BhdGNoKCk6IERpc3BhdGNoPFk+IHtcbiAgICByZXR1cm4gbmV3IERpc3BhdGNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXIgaGFuZGxlclxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYW4gb2JzZXJ2ZXIgaGFuZGxlciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge09ic2VydmVySGFuZGxlcn0gQSBuZXcgb2JzZXJ2ZXIgaGFuZGxlciBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIE9ic2VydmVySGFuZGxlcigpOiBPYnNlcnZlckhhbmRsZXIge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZFxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gYXR0cmlidXRlIG5hbWUgaXMgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlc2VydmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByb3RlY3RlZCBpc1Jlc2VydmVkKGF0dHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhYXR0cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgZGF0YWJhc2UgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBlcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBkYXRhYmFzZS1zcGVjaWZpYyBlcnJvcnMgaW50byBzdGFuZGFyZGl6ZWQgYXBwbGljYXRpb24gZXJyb3JzXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVyciAtIFRoZSBvcmlnaW5hbCBkYXRhYmFzZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IEEgc3RhbmRhcmRpemVkIGVycm9yXG4gICAqL1xuICBhYnN0cmFjdCBwYXJzZUVycm9yKGVycjogRXJyb3IpOiBCYXNlRXJyb3I7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhbnkgbmVjZXNzYXJ5IHNldHVwIGZvciB0aGUgYWRhcHRlciwgc3VjaCBhcyBlc3RhYmxpc2hpbmcgY29ubmVjdGlvbnNcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEluaXRpYWxpemF0aW9uIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhYnN0cmFjdCBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzZXF1ZW5jZSBnZW5lcmF0b3JcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgc2VxdWVuY2UgZ2VuZXJhdG9yIGZvciBnZW5lcmF0aW5nIHNlcXVlbnRpYWwgdmFsdWVzXG4gICAqIEBwYXJhbSB7U2VxdWVuY2VPcHRpb25zfSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHJldHVybiB7UHJvbWlzZTxTZXF1ZW5jZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgbmV3IHNlcXVlbmNlIGluc3RhbmNlXG4gICAqL1xuICBhYnN0cmFjdCBTZXF1ZW5jZShvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpOiBQcm9taXNlPFNlcXVlbmNlPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgcmVwb3NpdG9yeSBmbGFncyBmb3IgYW4gb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIHNldCBvZiBmbGFncyB0aGF0IGRlc2NyaWJlIGEgZGF0YWJhc2Ugb3BlcmF0aW9uLCBjb21iaW5pbmcgZGVmYXVsdCBmbGFncyB3aXRoIG92ZXJyaWRlc1xuICAgKiBAdGVtcGxhdGUgRiAtIFRoZSBSZXBvc2l0b3J5IEZsYWdzIHR5cGVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBmbGFncyAtIEN1c3RvbSBmbGFnIG92ZXJyaWRlc1xuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxGPn0gVGhlIGNvbXBsZXRlIHNldCBvZiBmbGFnc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBmbGFnczogUGFydGlhbDxGPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGPiB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MsIGZsYWdzLCB7XG4gICAgICBhZmZlY3RlZFRhYmxlczogUmVwb3NpdG9yeS50YWJsZShtb2RlbCksXG4gICAgICB3cml0ZU9wZXJhdGlvbjogb3BlcmF0aW9uICE9PSBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICB9KSBhcyBGO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY29udGV4dCBjb25zdHJ1Y3RvciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJlZmVyZW5jZSB0byB0aGUgY29udGV4dCBjbGFzcyBjb25zdHJ1Y3RvciB1c2VkIGJ5IHRoaXMgYWRhcHRlclxuICAgKi9cbiAgcHJvdGVjdGVkIENvbnRleHQgPSBDb250ZXh0PEY+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGNvbnRleHQgZm9yIGEgZGF0YWJhc2Ugb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIGNvbnRleHQgb2JqZWN0IHRoYXQgZGVzY3JpYmVzIGEgZGF0YWJhc2Ugb3BlcmF0aW9uLCB1c2VkIGZvciB0cmFja2luZyBhbmQgYXVkaXRpbmdcbiAgICogQHRlbXBsYXRlIEYgLSBUaGUgUmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzLkNSRUFURXxPcGVyYXRpb25LZXlzLlJFQUR8T3BlcmF0aW9uS2V5cy5VUERBVEV8T3BlcmF0aW9uS2V5cy5ERUxFVEV9IG9wZXJhdGlvbiAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvblxuICAgKiBAcGFyYW0ge1BhcnRpYWw8Rj59IG92ZXJyaWRlcyAtIEN1c3RvbSBmbGFnIG92ZXJyaWRlc1xuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxDPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRleHQgb2JqZWN0XG4gICAqL1xuICBAZmluYWwoKVxuICBhc3luYyBjb250ZXh0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOlxuICAgICAgfCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEY+LFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEM+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jb250ZXh0KTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ3JlYXRpbmcgbmV3IGNvbnRleHQgZm9yICR7b3BlcmF0aW9ufSBvcGVyYXRpb24gb24gJHttb2RlbC5uYW1lfSBtb2RlbCB3aXRoIGZsYWcgb3ZlcnJpZGVzOiAke0pTT04uc3RyaW5naWZ5KG92ZXJyaWRlcyl9YFxuICAgICk7XG4gICAgY29uc3QgZmxhZ3MgPSBhd2FpdCB0aGlzLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIG92ZXJyaWRlcywgLi4uYXJncyk7XG4gICAgcmV0dXJuIG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKGZsYWdzKSBhcyB1bmtub3duIGFzIEM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHBlcnNpc3RlbmNlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGF0YWJhc2Ugc3RvcmFnZSxcbiAgICogaGFuZGxpbmcgY29sdW1uIG1hcHBpbmcgYW5kIHNlcGFyYXRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgZGF0YVxuICAgKi9cbiAgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIHBrOiBrZXlvZiBNXG4gICk6IHtcbiAgICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgaWQ6IHN0cmluZztcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5wcmVwYXJlKTtcbiAgICBjb25zdCBzcGxpdCA9IG1vZGVsVG9UcmFuc2llbnQobW9kZWwpO1xuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5lbnRyaWVzKHNwbGl0Lm1vZGVsKS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBhY2N1bTtcbiAgICAgICAgY29uc3QgbWFwcGVkUHJvcCA9IFJlcG9zaXRvcnkuY29sdW1uKG1vZGVsLCBrZXkpO1xuICAgICAgICBpZiAodGhpcy5pc1Jlc2VydmVkKG1hcHBlZFByb3ApKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBQcm9wZXJ0eSBuYW1lICR7bWFwcGVkUHJvcH0gaXMgcmVzZXJ2ZWRgKTtcbiAgICAgICAgYWNjdW1bbWFwcGVkUHJvcF0gPSB2YWw7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gICAgaWYgKChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0pIHtcbiAgICAgIGxvZy5zaWxseShcbiAgICAgICAgYFBhc3NpbmcgYWxvbmcgcGVyc2lzdGVuY2UgbWV0YWRhdGEgZm9yICR7KG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVjb3JkOiByZXN1bHQsXG4gICAgICBpZDogbW9kZWxbcGtdIGFzIHN0cmluZyxcbiAgICAgIHRyYW5zaWVudDogc3BsaXQudHJhbnNpZW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGRhdGFiYXNlIGRhdGEgYmFjayBpbnRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgUmVjb25zdHJ1Y3RzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSBkYXRhYmFzZSBkYXRhLCBoYW5kbGluZyBjb2x1bW4gbWFwcGluZ1xuICAgKiBhbmQgcmVhdHRhY2hpbmcgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0gb2JqIC0gVGhlIGRhdGFiYXNlIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ3xDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgbW9kZWwgY2xhc3Mgb3IgbmFtZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBwcmltYXJ5IGtleSB2YWx1ZVxuICAgKiBAcGFyYW0gW3RyYW5zaWVudF0gLSBUcmFuc2llbnQgcHJvcGVydGllcyB0byByZWF0dGFjaFxuICAgKiBAcmV0dXJuIHtNfSBUaGUgcmVjb25zdHJ1Y3RlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPixcbiAgICBwazoga2V5b2YgTSxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogTSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmV2ZXJ0KTtcbiAgICBjb25zdCBvYjogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIG9iW3BrIGFzIHN0cmluZ10gPSBpZDtcbiAgICBjb25zdCBtID0gKFxuICAgICAgdHlwZW9mIGNsYXp6ID09PSBcInN0cmluZ1wiID8gTW9kZWwuYnVpbGQob2IsIGNsYXp6KSA6IG5ldyBjbGF6eihvYilcbiAgICApIGFzIE07XG4gICAgbG9nLnNpbGx5KGBSZWJ1aWxkaW5nIG1vZGVsICR7bS5jb25zdHJ1Y3Rvci5uYW1lfSBpZCAke2lkfWApO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gb2JqW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV07XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMobSkucmVkdWNlKChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBwaykgcmV0dXJuIGFjY3VtO1xuICAgICAgKGFjY3VtIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV0gPSBvYmpbUmVwb3NpdG9yeS5jb2x1bW4oYWNjdW0sIGtleSldO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIG0pO1xuXG4gICAgaWYgKHRyYW5zaWVudCkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGByZS1hZGRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXM6ICR7T2JqZWN0LmtleXModHJhbnNpZW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudCkuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIHJlc3VsdClcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBUcmFuc2llbnQgcHJvcGVydHkgJHtrZXl9IGFscmVhZHkgZXhpc3RzIG9uIG1vZGVsICR7bS5jb25zdHJ1Y3Rvci5uYW1lfS4gc2hvdWxkIGJlIGltcG9zc2libGVgXG4gICAgICAgICAgKTtcbiAgICAgICAgcmVzdWx0W2tleSBhcyBrZXlvZiBNXSA9IHZhbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyAke3RoaXMuZmxhdm91cn0gcGVyc2lzdGVuY2UgbWV0YWRhdGEgZm9yICR7bS5jb25zdHJ1Y3Rvci5uYW1lfSBpZCAke2lkfTogJHttZXRhZGF0YX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBtZXRhZGF0YSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIGEgbmV3IHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBpbnNlcnQgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBuZXcgcmVjb3JkXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBkYXRhIHRvIGluc2VydFxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEluc2VydHMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgYW5kIGRhdGEgaW50byB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gaW5zZXJ0IGludG9cbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkZW50aWZpZXJzIGZvciB0aGUgbmV3IHJlY29yZHNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIGRhdGEgdG8gaW5zZXJ0IGZvciBlYWNoIHJlY29yZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBjcmVhdGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNyZWF0ZUFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMuY3JlYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5hcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZWNvcmQgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byByZWFkIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBhYnN0cmFjdCByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcmVhZCBmcm9tXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXRyaWV2ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJlYWRBbGwpO1xuICAgIGxvZy52ZXJib3NlKGBSZWFkaW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChpZC5tYXAoKGkpID0+IHRoaXMucmVhZCh0YWJsZU5hbWUsIGksIC4uLmFyZ3MpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSByZWNvcmQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IE1vZGlmaWVzIGFuIGV4aXN0aW5nIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gIG1vZGVsIC0gVGhlIG5ldyBkYXRhIGZvciB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgYWJzdHJhY3QgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgTW9kaWZpZXMgbXVsdGlwbGUgZXhpc3RpbmcgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgaW4gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byB1cGRhdGVcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG5ldyBkYXRhIGZvciBlYWNoIHJlY29yZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiB1cGRhdGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnVwZGF0ZUFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYFVwZGF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMudXBkYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5hcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gZGVsZXRlIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBtdWx0aXBsZSByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBkZWxldGUgZnJvbVxuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWRlbnRpZmllcnMgb2YgdGhlIHJlY29yZHMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGRlbGV0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY3JlYXRlQWxsKTtcbiAgICBsb2cudmVyYm9zZShgRGVsZXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwa3M6ICR7aWR9YCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGlkLm1hcCgoaSkgPT4gdGhpcy5kZWxldGUodGFibGVOYW1lLCBpLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBbGxvd3MgZXhlY3V0aW5nIGRhdGFiYXNlLXNwZWNpZmljIHF1ZXJpZXMgZGlyZWN0bHlcbiAgICogQHRlbXBsYXRlIFEgLSBUaGUgcmF3IHF1ZXJ5IHR5cGVcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHF1ZXJ5XG4gICAqIEBwYXJhbSB7UX0gcmF3SW5wdXQgLSBUaGUgcXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKi9cbiAgYWJzdHJhY3QgcmF3PFI+KHJhd0lucHV0OiBRLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Uj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb2JzZXJ2ZXIgZm9yIGRhdGFiYXNlIGV2ZW50c1xuICAgKiBAc3VtbWFyeSBBZGRzIGFuIG9ic2VydmVyIHRvIGJlIG5vdGlmaWVkIGFib3V0IGRhdGFiYXNlIGNoYW5nZXMuIFRoZSBvYnNlcnZlciBjYW4gb3B0aW9uYWxseVxuICAgKiBwcm92aWRlIGEgZmlsdGVyIGZ1bmN0aW9uIHRvIHJlY2VpdmUgb25seSBzcGVjaWZpYyBldmVudHMuXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJGaWx0ZXJ9IFtmaWx0ZXJdIC0gT3B0aW9uYWwgZmlsdGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBldmVudHMgdGhlIG9ic2VydmVyIHJlY2VpdmVzXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBAZmluYWwoKVxuICBvYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlciwgZmlsdGVyPzogT2JzZXJ2ZXJGaWx0ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwib2JzZXJ2ZXJIYW5kbGVyXCIsIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuT2JzZXJ2ZXJIYW5kbGVyKCksXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyIS5vYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpO1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMub2JzZXJ2ZSlcbiAgICAgIC52ZXJib3NlKGBSZWdpc3RlcmluZyBuZXcgb2JzZXJ2ZXIgJHtvYnNlcnZlci50b1N0cmluZygpfWApO1xuICAgIGlmICghdGhpcy5kaXNwYXRjaCkge1xuICAgICAgdGhpcy5sb2cuZm9yKHRoaXMub2JzZXJ2ZSkuaW5mbyhgQ3JlYXRpbmcgZGlzcGF0Y2ggZm9yICR7dGhpcy5hbGlhc31gKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2ggPSB0aGlzLkRpc3BhdGNoKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoLm9ic2VydmUodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbnJlZ2lzdGVycyBhbiBvYnNlcnZlclxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIG9ic2VydmVyIHNvIGl0IG5vIGxvbmdlciByZWNlaXZlcyBkYXRhYmFzZSBldmVudCBub3RpZmljYXRpb25zXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHVucmVnaXN0ZXJcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIEBmaW5hbCgpXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgdGhpcy5vYnNlcnZlckhhbmRsZXIudW5PYnNlcnZlKG9ic2VydmVyKTtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLnVuT2JzZXJ2ZSlcbiAgICAgIC52ZXJib3NlKGBPYnNlcnZlciAke29ic2VydmVyLnRvU3RyaW5nKCl9IHJlbW92ZWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIG9ic2VydmVycyBhYm91dCBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IFNlbmRzIG5vdGlmaWNhdGlvbnMgdG8gYWxsIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzIGFib3V0IGEgY2hhbmdlIGluIHRoZSBkYXRhYmFzZSxcbiAgICogZmlsdGVyaW5nIGJhc2VkIG9uIGVhY2ggb2JzZXJ2ZXIncyBmaWx0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy51cGRhdGVPYnNlcnZlcnMpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYFVwZGF0aW5nICR7dGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKX0gb2JzZXJ2ZXJzIGZvciBhZGFwdGVyICR7dGhpcy5hbGlhc31gXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLm9ic2VydmVySGFuZGxlci51cGRhdGVPYnNlcnZlcnMoXG4gICAgICB0aGlzLmxvZyxcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBpZCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZyZXNoZXMgZGF0YSBiYXNlZCBvbiBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IEltcGxlbWVudGF0aW9uIG9mIHRoZSBPYnNlcnZlciBpbnRlcmZhY2UgbWV0aG9kIHRoYXQgZGVsZWdhdGVzIHRvIHVwZGF0ZU9ic2VydmVyc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBpZGVudGlmaWVyKHMpIG9mIHRoZSBhZmZlY3RlZCByZWNvcmQocylcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHJlbGF0ZWQgdG8gdGhlIGV2ZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHJlZnJlc2ggaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIHJlZnJlc2goXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFkYXB0ZXJcbiAgICovXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmZsYXZvdXJ9IHBlcnNpc3RlbmNlIEFkYXB0ZXJgO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBhZGFwdGVyIGZsYXZvciBhc3NvY2lhdGVkIHdpdGggYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGFkYXB0ZXIgZmxhdm9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGEgc3BlY2lmaWMgbW9kZWwgY2xhc3NcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZGFwdGVyIGZsYXZvciBuYW1lXG4gICAqL1xuICBzdGF0aWMgZmxhdm91ck9mPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IENvbnN0cnVjdG9yPE0+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YSh0aGlzLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIG1vZGVsKSB8fFxuICAgICAgdGhpcy5jdXJyZW50Py5mbGF2b3VyXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgY3VycmVudEZsYXZvdXIoKSB7XG4gICAgaWYgKCFBZGFwdGVyLl9jdXJyZW50Rmxhdm91cilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcGVyc2lzdGVuY2UgZmxhdm91ciBzZXQuIFBsZWFzZSBpbml0aWFsaXplIHlvdXIgYWRhcHRlcmBcbiAgICAgICk7XG4gICAgcmV0dXJuIEFkYXB0ZXIuX2N1cnJlbnRGbGF2b3VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjdXJyZW50IGRlZmF1bHQgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGFkYXB0ZXIgdGhhdCBpcyBjdXJyZW50bHkgc2V0IGFzIHRoZSBkZWZhdWx0IGZvciBvcGVyYXRpb25zXG4gICAqIEByZXR1cm4ge0FkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pn0gVGhlIGN1cnJlbnQgYWRhcHRlclxuICAgKi9cbiAgc3RhdGljIGdldCBjdXJyZW50KCk6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIEFkYXB0ZXIuZ2V0KHRoaXMuY3VycmVudEZsYXZvdXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFuIGFkYXB0ZXIgYnkgZmxhdm9yXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHJlZ2lzdGVyZWQgYWRhcHRlciBieSBpdHMgZmxhdm9yIG5hbWVcbiAgICogQHRlbXBsYXRlIFkgLSBUaGUgZGF0YWJhc2UgZHJpdmVyIHR5cGVcbiAgICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgdHlwZVxuICAgKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGVcbiAgICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGZsYXZvciBuYW1lIG9mIHRoZSBhZGFwdGVyIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4ge0FkYXB0ZXI8WSwgUSwgRiwgQz4gfCB1bmRlZmluZWR9IFRoZSBhZGFwdGVyIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIHN0YXRpYyBnZXQ8WSwgUSwgQyBleHRlbmRzIENvbnRleHQ8Rj4sIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3M+KFxuICAgIGZsYXZvdXI/OiBhbnlcbiAgKTogQWRhcHRlcjxZLCBRLCBGLCBDPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFmbGF2b3VyKSByZXR1cm4gQWRhcHRlci5nZXQodGhpcy5fY3VycmVudEZsYXZvdXIpO1xuICAgIGlmIChmbGF2b3VyIGluIHRoaXMuX2NhY2hlKSByZXR1cm4gdGhpcy5fY2FjaGVbZmxhdm91cl07XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIEFkYXB0ZXIgcmVnaXN0ZXJlZCB1bmRlciAke2ZsYXZvdXJ9LmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBjdXJyZW50IGRlZmF1bHQgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBDaGFuZ2VzIHdoaWNoIGFkYXB0ZXIgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3Igb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBmbGF2b3IgbmFtZSBvZiB0aGUgYWRhcHRlciB0byBzZXQgYXMgY3VycmVudFxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldEN1cnJlbnQoZmxhdm91cjogc3RyaW5nKSB7XG4gICAgdGhpcy5fY3VycmVudEZsYXZvdXIgPSBmbGF2b3VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbWV0YWRhdGEga2V5XG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIHN0YW5kYXJkaXplZCBtZXRhZGF0YSBrZXkgZm9yIHBlcnNpc3RlbmNlLXJlbGF0ZWQgbWV0YWRhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBiYXNlIGtleSBuYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBtZXRhZGF0YSBrZXlcbiAgICovXG4gIHN0YXRpYyBrZXkoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gUmVwb3NpdG9yeS5rZXkoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhbGwgbW9kZWxzIGFzc29jaWF0ZWQgd2l0aCBhbiBhZGFwdGVyIGZsYXZvclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYWxsIG1vZGVsIGNvbnN0cnVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIHRvIHVzZSBhIHNwZWNpZmljIGFkYXB0ZXIgZmxhdm9yXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgYWRhcHRlciBmbGF2b3IgdG8gZmluZCBtb2RlbHMgZm9yXG4gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgbW9kZWwgY29uc3RydWN0b3JzXG4gICAqL1xuICBzdGF0aWMgbW9kZWxzPE0gZXh0ZW5kcyBNb2RlbD4oZmxhdm91cjogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gKE1vZGVsIGFzIGFueSkuZ2V0UmVnaXN0cnkoKSBhcyBNb2RlbFJlZ2lzdHJ5PGFueT47XG4gICAgICBjb25zdCBjYWNoZSA9IChcbiAgICAgICAgcmVnaXN0cnkgYXMgdW5rbm93biBhcyB7IGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvbnN0cnVjdG9yPGFueT4+IH1cbiAgICAgICkuY2FjaGU7XG4gICAgICBjb25zdCBtYW5hZ2VkTW9kZWxzOiBNb2RlbENvbnN0cnVjdG9yPGFueT5bXSA9IE9iamVjdC52YWx1ZXMoY2FjaGUpXG4gICAgICAgIC5tYXAoKG06IE1vZGVsQ29uc3RydWN0b3I8TT4pID0+IHtcbiAgICAgICAgICBsZXQgZiA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGYgJiYgZiA9PT0gZmxhdm91cikgcmV0dXJuIG07XG4gICAgICAgICAgaWYgKCFmKSB7XG4gICAgICAgICAgICBjb25zdCByZXBvID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgUmVwb3NpdG9yeS5rZXkoREJLZXlzLlJFUE9TSVRPUlkpLFxuICAgICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghcmVwbykgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgcmVwb3NpdG9yeSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobSk7XG5cbiAgICAgICAgICAgIGYgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICAgIHJlcG9zaXRvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICEhbSk7XG4gICAgICByZXR1cm4gbWFuYWdlZE1vZGVscztcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgdGFibGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggYSBtb2RlbCBieSBjaGVja2luZyBtZXRhZGF0YSBvciBmYWxsaW5nIGJhY2sgdG8gdGhlIGNvbnN0cnVjdG9yIG5hbWVcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEBwYXJhbSB7TSB8IENvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjb25zdHJ1Y3RvciB0byBnZXQgdGhlIHRhYmxlIG5hbWUgZm9yXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lIGZvciB0aGUgbW9kZWxcbiAqIEBmdW5jdGlvbiBnZXRUYWJsZU5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVOYW1lPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT5cbik6IHN0cmluZyB7XG4gIGNvbnN0IG9iaiA9IG1vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IG1vZGVsO1xuXG4gIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcbiAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuVEFCTEUpLFxuICAgIG9ialxuICApO1xuICBpZiAobWV0YWRhdGEpIHtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cbiAgaWYgKG1vZGVsIGluc3RhbmNlb2YgTW9kZWwpIHtcbiAgICByZXR1cm4gbW9kZWwuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuICByZXR1cm4gbW9kZWwubmFtZTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgc2VxdWVuY2UgbmFtZSBmb3IgYSBtb2RlbFxuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBzZXF1ZW5jZSBuYW1lIGJ5IGNvbWJpbmluZyB0aGUgdGFibGUgbmFtZSB3aXRoIGFkZGl0aW9uYWwgYXJndW1lbnRzXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgdGhlIHNlcXVlbmNlIG5hbWUgZm9yXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gYXJncyAtIEFkZGl0aW9uYWwgc3RyaW5nIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhlIHNlcXVlbmNlIG5hbWVcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBzZXF1ZW5jZSBuYW1lXG4gKiBAZnVuY3Rpb24gc2VxdWVuY2VOYW1lRm9yTW9kZWxcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VOYW1lRm9yTW9kZWw8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgLi4uYXJnczogc3RyaW5nW11cbikge1xuICByZXR1cm4gW2dldFRhYmxlTmFtZShtb2RlbCksIC4uLmFyZ3NdLmpvaW4oXCJfXCIpO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgc2VxdWVuY2VOYW1lRm9yTW9kZWwgfSBmcm9tIFwiLi4vaWRlbnRpdHkvdXRpbHNcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1NlcXVlbmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHNlcXVlbmNlIGdlbmVyYXRpb25cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBnZW5lcmF0aW5nIHNlcXVlbnRpYWwgdmFsdWVzIChsaWtlIHByaW1hcnkga2V5cykgaW4gdGhlIHBlcnNpc3RlbmNlIGxheWVyLlxuICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgY2xhc3MgaGFuZGxlIHRoZSBzcGVjaWZpY3Mgb2YgaG93IHNlcXVlbmNlcyBhcmUgc3RvcmVkIGFuZCBpbmNyZW1lbnRlZCBpbiBkaWZmZXJlbnRcbiAqIGRhdGFiYXNlIHN5c3RlbXMuXG4gKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlIGdlbmVyYXRvclxuICogQGNsYXNzIFNlcXVlbmNlXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSBzcGVjaWZpYyBkYXRhYmFzZVxuICogY2xhc3MgUG9zdGdyZXNTZXF1ZW5jZSBleHRlbmRzIFNlcXVlbmNlIHtcbiAqICAgY29uc3RydWN0b3Iob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKSB7XG4gKiAgICAgc3VwZXIob3B0aW9ucyk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIG5leHQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiB0byBnZXQgbmV4dCB2YWx1ZSBmcm9tIFBvc3RncmVTUUwgc2VxdWVuY2VcbiAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZXhlY3V0b3IucmF3KGBTRUxFQ1QgbmV4dHZhbCgnJHt0aGlzLm9wdGlvbnMubmFtZX0nKWApO1xuICogICAgIHJldHVybiBwYXJzZUludChyZXN1bHQucm93c1swXS5uZXh0dmFsKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgY3VycmVudCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICogICAgIC8vIEltcGxlbWVudGF0aW9uIHRvIGdldCBjdXJyZW50IHZhbHVlIGZyb20gUG9zdGdyZVNRTCBzZXF1ZW5jZVxuICogICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3B0aW9ucy5leGVjdXRvci5yYXcoYFNFTEVDVCBjdXJydmFsKCcke3RoaXMub3B0aW9ucy5uYW1lfScpYCk7XG4gKiAgICAgcmV0dXJuIHBhcnNlSW50KHJlc3VsdC5yb3dzWzBdLmN1cnJ2YWwpO1xuICogICB9XG4gKlxuICogICBhc3luYyByYW5nZShjb3VudDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICogICAgIC8vIEltcGxlbWVudGF0aW9uIHRvIGdldCBhIHJhbmdlIG9mIHZhbHVlc1xuICogICAgIGNvbnN0IHZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAqICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAqICAgICAgIHZhbHVlcy5wdXNoKGF3YWl0IHRoaXMubmV4dCgpKTtcbiAqICAgICB9XG4gKiAgICAgcmV0dXJuIHZhbHVlcztcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIFVzYWdlXG4gKiBjb25zdCBzZXF1ZW5jZSA9IG5ldyBQb3N0Z3Jlc1NlcXVlbmNlKHtcbiAqICAgbmFtZTogJ3VzZXJfaWRfc2VxJyxcbiAqICAgZXhlY3V0b3I6IGRiRXhlY3V0b3JcbiAqIH0pO1xuICpcbiAqIGNvbnN0IG5leHRJZCA9IGF3YWl0IHNlcXVlbmNlLm5leHQoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2VxdWVuY2Uge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ2dlciBpbnN0YW5jZSBmb3IgdGhpcyBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBMYXppbHkgaW5pdGlhbGl6ZWQgbG9nZ2VyIGZvciB0aGUgc2VxdWVuY2UgaW5zdGFuY2VcbiAgICovXG4gIHByaXZhdGUgbG9nZ2VyITogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWNjZXNzb3IgZm9yIHRoZSBsb2dnZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgR2V0cyBvciBpbml0aWFsaXplcyB0aGUgbG9nZ2VyIGZvciB0aGlzIHNlcXVlbmNlXG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gVGhlIGxvZ2dlciBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB0aGlzLmxvZ2dlciA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KTtcbiAgICByZXR1cm4gdGhpcy5sb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgc2VxdWVuY2UgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgUHJvdGVjdGVkIGNvbnN0cnVjdG9yIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHNlcXVlbmNlIHdpdGggdGhlIHByb3ZpZGVkIG9wdGlvbnNcbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgb3B0aW9uczogU2VxdWVuY2VPcHRpb25zKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBuZXh0IHZhbHVlIGZyb20gdGhlIHNlcXVlbmNlLCBpbmNyZW1lbnRpbmcgaXQgaW4gdGhlIHByb2Nlc3NcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAgICovXG4gIGFic3RyYWN0IG5leHQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZXF1ZW5jZSB3aXRob3V0IGluY3JlbWVudGluZyBpdFxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSBzZXF1ZW5jZVxuICAgKi9cbiAgYWJzdHJhY3QgY3VycmVudCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgcmFuZ2Ugb2Ygc2VxdWVudGlhbCB2YWx1ZXNcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIG11bHRpcGxlIHNlcXVlbnRpYWwgdmFsdWVzIGF0IG9uY2UsIHdoaWNoIGNhbiBiZSBtb3JlIGVmZmljaWVudCB0aGFuIGNhbGxpbmcgbmV4dCgpIG11bHRpcGxlIHRpbWVzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFRoZSBudW1iZXIgb2Ygc2VxdWVudGlhbCB2YWx1ZXMgdG8gcmV0cmlldmVcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBzZXF1ZW50aWFsIHZhbHVlc1xuICAgKi9cbiAgYWJzdHJhY3QgcmFuZ2UoY291bnQ6IG51bWJlcik6IFByb21pc2U8KG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBwcmltYXJ5IGtleSBzZXF1ZW5jZSBuYW1lIGZvciBhIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFV0aWxpdHkgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgc3RhbmRhcmRpemVkIHNlcXVlbmNlIG5hbWUgZm9yIGEgbW9kZWwncyBwcmltYXJ5IGtleVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7TXxDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3JcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc2VxdWVuY2UgbmFtZSBmb3IgdGhlIG1vZGVsJ3MgcHJpbWFyeSBrZXlcbiAgICovXG4gIHN0YXRpYyBwazxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4pIHtcbiAgICByZXR1cm4gc2VxdWVuY2VOYW1lRm9yTW9kZWwobW9kZWwsIFwicGtcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIHNlcXVlbmNlIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgc2VxdWVuY2UgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCB0eXBlIChOdW1iZXIgb3IgQmlnSW50KVxuICAgKiBAcGFyYW0ge1wiTnVtYmVyXCJ8XCJCaWdJbnRcInx1bmRlZmluZWR9IHR5cGUgLSBUaGUgdGFyZ2V0IHR5cGUgdG8gY29udmVydCB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0XG4gICAqIEByZXR1cm4ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBUaGUgY29udmVydGVkIHZhbHVlXG4gICAqL1xuICBzdGF0aWMgcGFyc2VWYWx1ZShcbiAgICB0eXBlOiBcIk51bWJlclwiIHwgXCJCaWdJbnRcIiB8IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICk6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiTnVtYmVyXCI6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IHBhcnNlSW50KHZhbHVlKVxuICAgICAgICAgIDogdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiXG4gICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICA6IEJpZ0ludCh2YWx1ZSk7XG4gICAgICBjYXNlIFwiQmlnSW50XCI6XG4gICAgICAgIHJldHVybiBCaWdJbnQodmFsdWUpO1xuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgIGBVbnN1cHBvcnRlZCBzZXF1ZW5jZSB0eXBlOiAke3R5cGV9IGZvciBhZGFwdGVyICR7dGhpc31gXG4gICAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuL0FkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHdoaWNoIHBlcnNpc3RlbmNlIGFkYXB0ZXIgZmxhdm9yIGEgbW9kZWwgc2hvdWxkIHVzZVxuICogQHN1bW1hcnkgVGhpcyBkZWNvcmF0b3IgYXBwbGllcyBtZXRhZGF0YSB0byBhIG1vZGVsIGNsYXNzIHRvIGluZGljYXRlIHdoaWNoIHBlcnNpc3RlbmNlIGFkYXB0ZXIgZmxhdm9yXG4gKiBzaG91bGQgYmUgdXNlZCB3aGVuIHBlcmZvcm1pbmcgZGF0YWJhc2Ugb3BlcmF0aW9ucyBvbiBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLiBUaGUgZmxhdm9yIGlzIGEgc3RyaW5nXG4gKiBpZGVudGlmaWVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSByZWdpc3RlcmVkIGFkYXB0ZXIgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFkYXB0ZXIgZmxhdm9yIHRvIHVzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBtb2RlbCBjbGFzc1xuICogQGZ1bmN0aW9uIHVzZXNcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VzKGZsYXZvdXI6IHN0cmluZykge1xuICByZXR1cm4gZnVuY3Rpb24gdXNlcyhvcmlnaW5hbDogYW55KSB7XG4gICAgcmV0dXJuIGFwcGx5KG1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgZmxhdm91cikpKFxuICAgICAgb3JpZ2luYWxcbiAgICApO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBDb250ZXh0LFxuICBEQktleXMsXG4gIERlZmF1bHRTZXBhcmF0b3IsXG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBJUmVwb3NpdG9yeSxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUmVwb3NpdG9yeSBhcyBSZXAsXG4gIFJlcG9zaXRvcnlGbGFncyxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICB3cmFwTWV0aG9kV2l0aENvbnRleHQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmFibGVcIjtcbmltcG9ydCB7IHR5cGUgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZlclwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPcmRlckRpcmVjdGlvbiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBRdWVyaWFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9RdWVyaWFibGVcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvU2VxdWVuY2VcIjtcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9Db25kaXRpb25cIjtcbmltcG9ydCB7IFdoZXJlT3B0aW9uIH0gZnJvbSBcIi4uL3F1ZXJ5L29wdGlvbnNcIjtcbmltcG9ydCB7IE9yZGVyQnlTZWxlY3RvciwgU2VsZWN0U2VsZWN0b3IgfSBmcm9tIFwiLi4vcXVlcnkvc2VsZWN0b3JzXCI7XG5pbXBvcnQgeyBnZXRUYWJsZU5hbWUgfSBmcm9tIFwiLi4vaWRlbnRpdHkvdXRpbHNcIjtcbmltcG9ydCB7IHVzZXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBPYnNlcnZlckhhbmRsZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvT2JzZXJ2ZXJIYW5kbGVyXCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBFdmVudElkcywgT2JzZXJ2ZXJGaWx0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZSBhbGlhcyBmb3IgUmVwb3NpdG9yeSBjbGFzcyB3aXRoIHNpbXBsaWZpZWQgZ2VuZXJpYyBwYXJhbWV0ZXJzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBtb3JlIGNvbmNpc2Ugd2F5IHRvIHJlZmVyZW5jZSB0aGUgUmVwb3NpdG9yeSBjbGFzcyB3aXRoIGl0cyBnZW5lcmljIHBhcmFtZXRlcnMuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHF1ZXJ5IHR5cGUuXG4gKiBAdGVtcGxhdGUgQSAtIFRoZSBhZGFwdGVyIHR5cGUuXG4gKiBAdHlwZWRlZiBSZXBvXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IHR5cGUgUmVwbzxcbiAgTSBleHRlbmRzIE1vZGVsPHRydWUgfCBmYWxzZT4sXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBhbnksXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gYW55LFxuICBRID0gYW55LFxuICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIFEsIEYsIEM+ID0gYW55LFxuPiA9IFJlcG9zaXRvcnk8TSwgUSwgQSwgRiwgQz47XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvcmUgcmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucyBvbiBtb2RlbHMgb24gYSB0YWJsZSBieSB0YWJsZSB3YXkuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBDUlVEIG9wZXJhdGlvbnMsIHF1ZXJ5aW5nIGNhcGFiaWxpdGllcywgYW5kIG9ic2VydmVyIHBhdHRlcm4gaW1wbGVtZW50YXRpb24gZm9yIG1vZGVsIHBlcnNpc3RlbmNlLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlIHVzZWQgYnkgdGhlIGFkYXB0ZXIuXG4gKiBAdGVtcGxhdGUgQSAtIFRoZSBhZGFwdGVyIHR5cGUgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMuXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUuXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZm9yIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge0F9IFthZGFwdGVyXSAtIE9wdGlvbmFsIGFkYXB0ZXIgaW5zdGFuY2UgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBbY2xhenpdIC0gT3B0aW9uYWwgY29uc3RydWN0b3IgZm9yIHRoZSBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7Li4uYW55W119IFthcmdzXSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciByZXBvc2l0b3J5IGluaXRpYWxpemF0aW9uLlxuICogQGNsYXNzIFJlcG9zaXRvcnlcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGluZyBhIHJlcG9zaXRvcnkgZm9yIFVzZXIgbW9kZWxcbiAqIGNvbnN0IHVzZXJSZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbChVc2VyKTtcbiAqXG4gKiAvLyBVc2luZyB0aGUgcmVwb3NpdG9yeSBmb3IgQ1JVRCBvcGVyYXRpb25zXG4gKiBjb25zdCB1c2VyID0gYXdhaXQgdXNlclJlcG8uY3JlYXRlKG5ldyBVc2VyKHsgbmFtZTogJ0pvaG4nIH0pKTtcbiAqIGNvbnN0IHJldHJpZXZlZFVzZXIgPSBhd2FpdCB1c2VyUmVwby5yZWFkKHVzZXIuaWQpO1xuICogdXNlci5uYW1lID0gJ0phbmUnO1xuICogYXdhaXQgdXNlclJlcG8udXBkYXRlKHVzZXIpO1xuICogYXdhaXQgdXNlclJlcG8uZGVsZXRlKHVzZXIuaWQpO1xuICpcbiAqIC8vIFF1ZXJ5aW5nIHdpdGggY29uZGl0aW9uc1xuICogY29uc3QgdXNlcnMgPSBhd2FpdCB1c2VyUmVwb1xuICogICAuc2VsZWN0KClcbiAqICAgLndoZXJlKHsgbmFtZTogJ0phbmUnIH0pXG4gKiAgIC5vcmRlckJ5KCdjcmVhdGVkQXQnLCBPcmRlckRpcmVjdGlvbi5EU0MpXG4gKiAgIC5saW1pdCgxMClcbiAqICAgLmV4ZWN1dGUoKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnQgQ29kZVxuICogICBwYXJ0aWNpcGFudCBSIGFzIFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgQSBhcyBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JzZXJ2ZXJzXG4gKlxuICogICBDLT4+K1I6IGNyZWF0ZShtb2RlbClcbiAqICAgUi0+PlI6IGNyZWF0ZVByZWZpeChtb2RlbClcbiAqICAgUi0+PitBOiBwcmVwYXJlKG1vZGVsKVxuICogICBBLS0+Pi1SOiBwcmVwYXJlZCBkYXRhXG4gKiAgIFItPj4rQTogY3JlYXRlKHRhYmxlLCBpZCwgcmVjb3JkKVxuICogICBBLT4+K0RCOiBJbnNlcnQgT3BlcmF0aW9uXG4gKiAgIERCLS0+Pi1BOiBSZXN1bHRcbiAqICAgQS0tPj4tUjogcmVjb3JkXG4gKiAgIFItPj4rQTogcmV2ZXJ0KHJlY29yZClcbiAqICAgQS0tPj4tUjogbW9kZWwgaW5zdGFuY2VcbiAqICAgUi0+PlI6IGNyZWF0ZVN1ZmZpeChtb2RlbClcbiAqICAgUi0+PitPOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIENSRUFURSwgaWQpXG4gKiAgIE8tLT4+LVI6IE5vdGlmaWNhdGlvbiBjb21wbGV0ZVxuICogICBSLS0+Pi1DOiBjcmVhdGVkIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXBvc2l0b3J5PFxuICAgIE0gZXh0ZW5kcyBNb2RlbDx0cnVlIHwgZmFsc2U+LFxuICAgIFEsXG4gICAgQSBleHRlbmRzIEFkYXB0ZXI8YW55LCBRLCBGLCBDPixcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbiAgPlxuICBleHRlbmRzIFJlcDxNLCBGLCBDPlxuICBpbXBsZW1lbnRzIE9ic2VydmFibGUsIE9ic2VydmVyLCBRdWVyaWFibGU8TT4sIElSZXBvc2l0b3J5PE0sIEYsIEM+XG57XG4gIHByaXZhdGUgc3RhdGljIF9jYWNoZTogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBDb25zdHJ1Y3RvcjxSZXBvPE1vZGVsPj4gfCBSZXBvPE1vZGVsPlxuICA+ID0ge307XG5cbiAgcHJvdGVjdGVkIG9ic2VydmVyczogT2JzZXJ2ZXJbXSA9IFtdO1xuXG4gIHByb3RlY3RlZCBvYnNlcnZlckhhbmRsZXI/OiBPYnNlcnZlckhhbmRsZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYWRhcHRlciE6IEE7XG4gIHByaXZhdGUgX3RhYmxlTmFtZSE6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9vdmVycmlkZXM/OiBQYXJ0aWFsPEY+O1xuXG4gIHByaXZhdGUgbG9nZ2VyITogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9nZ2VyIGluc3RhbmNlIGZvciB0aGlzIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbG9nZ2VyIGZvciB0aGlzIHJlcG9zaXRvcnkgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gVGhlIGxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB0aGlzLmxvZ2dlciA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KTtcbiAgICByZXR1cm4gdGhpcy5sb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkYXB0ZXIgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYWRhcHRlciBpbnN0YW5jZSBmb3IgdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAdGVtcGxhdGUgQSAtIFRoZSBhZGFwdGVyIHR5cGUuXG4gICAqIEByZXR1cm4ge0F9IFRoZSBhZGFwdGVyIGluc3RhbmNlLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBhZGFwdGVyIGlzIGZvdW5kLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBhZGFwdGVyKCk6IEEge1xuICAgIGlmICghdGhpcy5fYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gYWRhcHRlciBmb3VuZCBmb3IgdGhpcyByZXBvc2l0b3J5LiBkaWQgeW91IHVzZSB0aGUgQHVzZXMgZGVjb3JhdG9yIG9yIHBhc3MgaXQgaW4gdGhlIGNvbnN0cnVjdG9yP2BcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRhYmxlIG5hbWUgZm9yIHRoaXMgcmVwb3NpdG9yeSdzIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcG9zaXRvcnkncyBtb2RlbC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgdGFibGUgbmFtZS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgdGFibGVOYW1lKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLl90YWJsZU5hbWUpIHRoaXMuX3RhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUodGhpcy5jbGFzcyk7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJpbWFyeSBrZXkgcHJvcGVydGllcyBmb3IgdGhpcyByZXBvc2l0b3J5J3MgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEdldHMgdGhlIHNlcXVlbmNlIG9wdGlvbnMgY29udGFpbmluZyBwcmltYXJ5IGtleSBpbmZvcm1hdGlvbi5cbiAgICogQHJldHVybiB7U2VxdWVuY2VPcHRpb25zfSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydGllcy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXQgcGtQcm9wcygpOiBTZXF1ZW5jZU9wdGlvbnMge1xuICAgIHJldHVybiBzdXBlci5wa1Byb3BzO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyPzogQSwgY2xheno/OiBDb25zdHJ1Y3RvcjxNPiwgLi4uYXJnczogYW55W10pIHtcbiAgICBzdXBlcihjbGF6eik7XG4gICAgaWYgKGFkYXB0ZXIpIHRoaXMuX2FkYXB0ZXIgPSBhZGFwdGVyO1xuICAgIGlmIChjbGF6eikge1xuICAgICAgUmVwb3NpdG9yeS5yZWdpc3RlcihjbGF6eiwgdGhpcywgdGhpcy5hZGFwdGVyLmFsaWFzKTtcbiAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgIGNvbnN0IGZsYXZvdXIgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICBjbGF6elxuICAgICAgICApO1xuICAgICAgICBpZiAoZmxhdm91ciAmJiBmbGF2b3VyICE9PSBhZGFwdGVyLmZsYXZvdXIpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJbmNvbXBhdGlibGUgZmxhdm91cnNcIik7XG4gICAgICAgIHVzZXMoYWRhcHRlci5mbGF2b3VyKShjbGF6eik7XG4gICAgICB9XG4gICAgfVxuICAgIFt0aGlzLmNyZWF0ZUFsbCwgdGhpcy5yZWFkQWxsLCB0aGlzLnVwZGF0ZUFsbCwgdGhpcy5kZWxldGVBbGxdLmZvckVhY2goXG4gICAgICAobSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gbS5uYW1lO1xuICAgICAgICB3cmFwTWV0aG9kV2l0aENvbnRleHQoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW25hbWUgKyBcIlByZWZpeFwiXSxcbiAgICAgICAgICBtLFxuICAgICAgICAgICh0aGlzIGFzIGFueSlbbmFtZSArIFwiU3VmZml4XCJdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHByb3h5IHdpdGggb3ZlcnJpZGRlbiByZXBvc2l0b3J5IGZsYWdzLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgcHJveHkgb2YgdGhpcyByZXBvc2l0b3J5IHdpdGggdGhlIHNwZWNpZmllZCBmbGFncyBvdmVycmlkZGVuLlxuICAgKiBAcGFyYW0ge1BhcnRpYWw8Rj59IGZsYWdzIC0gVGhlIGZsYWdzIHRvIG92ZXJyaWRlLlxuICAgKiBAcmV0dXJuIHtSZXBvc2l0b3J5fSBBIHByb3h5IG9mIHRoaXMgcmVwb3NpdG9yeSB3aXRoIG92ZXJyaWRkZW4gZmxhZ3MuXG4gICAqL1xuICBvdmVycmlkZShmbGFnczogUGFydGlhbDxGPik6IFJlcG9zaXRvcnk8TSwgUSwgQSwgRiwgQz4ge1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMub3ZlcnJpZGUpXG4gICAgICAuZGVidWcoYE92ZXJyaWRpbmcgcmVwb3NpdG9yeSBmbGFncyB3aXRoICR7SlNPTi5zdHJpbmdpZnkoZmxhZ3MpfWApO1xuICAgIHJldHVybiBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0OiAodGFyZ2V0OiB0eXBlb2YgdGhpcywgcDogc3RyaW5nIHwgc3ltYm9sLCByZWNlaXZlcjogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgICBpZiAocCAhPT0gXCJfb3ZlcnJpZGVzXCIpIHJldHVybiByZXN1bHQ7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCByZXN1bHQsIGZsYWdzKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXIgaGFuZGxlci5cbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIG9ic2VydmVyIGhhbmRsZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge09ic2VydmVySGFuZGxlcn0gQSBuZXcgb2JzZXJ2ZXIgaGFuZGxlciBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmVySGFuZGxlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciBjcmVhdGlvbi5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoZSBtb2RlbCBhbmQgcHJlcGFyZXMgaXQgZm9yIGNyZWF0aW9uIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIG1vZGVsID0gbmV3IHRoaXMuY2xhc3MobW9kZWwpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIG1vZGVsLmhhc0Vycm9ycyhcbiAgICAgICAgLi4uKGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdKVxuICAgICAgKVxuICAgICk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gW21vZGVsLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG1vZGVsIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgYSBtb2RlbCBpbnN0YW5jZSB0byB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBjcmVhdGVkIG1vZGVsIHdpdGggdXBkYXRlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlKHRoaXMudGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5hcmdzKTtcbiAgICBsZXQgYzogQyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYXJncy5sZW5ndGgpIGMgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gYXMgQztcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihcbiAgICAgIHJlY29yZCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICB0aGlzLnBrLFxuICAgICAgaWQsXG4gICAgICBjICYmIGMuZ2V0KFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikgPyB0cmFuc2llbnQgOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQb3N0LWNyZWF0aW9uIGhvb2suXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIGFmdGVyIGEgbW9kZWwgaXMgY3JlYXRlZCB0byBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucy5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBjcmVhdGVkIG1vZGVsLlxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBwcm9jZXNzZWQgbW9kZWwuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVTdWZmaXgobW9kZWw6IE0sIGNvbnRleHQ6IEMpOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gc3VwZXIuY3JlYXRlU3VmZml4KG1vZGVsLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgdG8gdGhlIGRhdGFiYXNlIGluIGEgYmF0Y2ggb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgY3JlYXRlZCBtb2RlbHMgd2l0aCB1cGRhdGVkIHByb3BlcnRpZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy50YWJsZU5hbWUsXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIHJlY29yZHMsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkc1tpXSBhcyBzdHJpbmcgfCBudW1iZXIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgbW9kZWxzIGZvciBjcmVhdGlvbi5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIG11bHRpcGxlIG1vZGVscyBhbmQgcHJlcGFyZXMgdGhlbSBmb3IgY3JlYXRpb24gaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiBhbnkgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgICBjb25zdCBvcHRzID0gUmVwb3NpdG9yeS5nZXRTZXF1ZW5jZU9wdGlvbnMobW9kZWxzWzBdKTtcbiAgICBsZXQgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHwgdW5kZWZpbmVkKVtdID0gW107XG4gICAgaWYgKG9wdHMudHlwZSkge1xuICAgICAgaWYgKCFvcHRzLm5hbWUpIG9wdHMubmFtZSA9IFNlcXVlbmNlLnBrKG1vZGVsc1swXSk7XG4gICAgICBpZHMgPSBhd2FpdCAoYXdhaXQgdGhpcy5hZGFwdGVyLlNlcXVlbmNlKG9wdHMpKS5yYW5nZShtb2RlbHMubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRzID0gbW9kZWxzLm1hcCgobSwgaSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1bdGhpcy5wa10gPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgUHJpbWFyeSBrZXkgaXMgbm90IGRlZmluZWQgZm9yIG1vZGVsIGluIHBvc2l0aW9uICR7aX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG1bdGhpcy5wa10gYXMgc3RyaW5nO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbW9kZWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtLCBpKSA9PiB7XG4gICAgICAgIG0gPSBuZXcgdGhpcy5jbGFzcyhtKTtcbiAgICAgICAgaWYgKG9wdHMudHlwZSkgbVt0aGlzLnBrXSA9IGlkc1tpXSBhcyBNW2tleW9mIE1dO1xuICAgICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBpZ25vcmVkUHJvcHMgPVxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW107XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0pID0+IFByb21pc2UucmVzb2x2ZShtLmhhc0Vycm9ycyguLi5pZ25vcmVkUHJvcHMpKSlcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IGVycm9ycy5yZWR1Y2UoKGFjY3VtOiBzdHJpbmcgfCB1bmRlZmluZWQsIGUsIGkpID0+IHtcbiAgICAgIGlmIChlKVxuICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgdHlwZW9mIGFjY3VtID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IGFjY3VtICsgYFxcbiAtICR7aX06ICR7ZS50b1N0cmluZygpfWBcbiAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgdW5kZWZpbmVkKTtcblxuICAgIGlmIChlcnJvck1lc3NhZ2VzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9yTWVzc2FnZXMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIHJlYWRpbmcgYSBtb2RlbCBieSBJRC5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIGNvbnRleHQgYW5kIGVuZm9yY2VzIGRlY29yYXRvcnMgYmVmb3JlIHJlYWRpbmcgYSBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXkgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHJlYWRQcmVmaXgoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgbW9kZWw6IE0gPSBuZXcgdGhpcy5jbGFzcygpO1xuICAgIG1vZGVsW3RoaXMucGtdID0ga2V5IGFzIE1ba2V5b2YgTV07XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgbW9kZWwgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIGFzeW5jIHJlYWQoaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQodGhpcy50YWJsZU5hbWUsIGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciByZWFkaW5nIG11bHRpcGxlIG1vZGVscyBieSBJRHMuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSByZWFkaW5nIG11bHRpcGxlIG1vZGVscy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIGtleXMgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGxQcmVmaXgoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGtleXMubWFwKGFzeW5jIChrKSA9PiB7XG4gICAgICAgIGNvbnN0IG0gPSBuZXcgdGhpcy5jbGFzcygpO1xuICAgICAgICBtW3RoaXMucGtdID0gayBhcyBNW2tleW9mIE1dO1xuICAgICAgICByZXR1cm4gZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBba2V5cywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIG11bHRpcGxlIG1vZGVscyBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRHMuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBrZXlzIC0gVGhlIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgcmV0cmlldmVkIG1vZGVsIGluc3RhbmNlcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGwoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbCh0aGlzLnRhYmxlTmFtZSwga2V5cywgLi4uYXJncyk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSBtb2RlbCBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBzdW1tYXJ5IFBlcnNpc3RzIGNoYW5nZXMgdG8gYW4gZXhpc3RpbmcgbW9kZWwgaW5zdGFuY2UgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgdXBkYXRlZCBtb2RlbCB3aXRoIHJlZnJlc2hlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlKHRoaXMudGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZWNvcmQsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkLCB0cmFuc2llbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciB1cGRhdGUuXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGUgbW9kZWwgYW5kIHByZXBhcmVzIGl0IGZvciB1cGRhdGUgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBwcmVwYXJlZCBtb2RlbCBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBtb2RlbCBoYXMgbm8gcHJpbWFyeSBrZXkgdmFsdWUuXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgdGhlIG1vZGVsIGZhaWxzIHZhbGlkYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlUHJlZml4KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8W00sIC4uLmFyZ3M6IGFueVtdXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgcGsgPSBtb2RlbFt0aGlzLnBrXSBhcyBzdHJpbmc7XG4gICAgaWYgKCFwaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gdmFsdWUgZm9yIHRoZSBJZCBpcyBkZWZpbmVkIHVuZGVyIHRoZSBwcm9wZXJ0eSAke3RoaXMucGsgYXMgc3RyaW5nfWBcbiAgICAgICk7XG4gICAgY29uc3Qgb2xkTW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQocGssIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIG1vZGVsID0gdGhpcy5tZXJnZShvbGRNb2RlbCwgbW9kZWwpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OLFxuICAgICAgb2xkTW9kZWxcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgbW9kZWwuaGFzRXJyb3JzKFxuICAgICAgICBvbGRNb2RlbCxcbiAgICAgICAgLi4uUmVwb3NpdG9yeS5yZWxhdGlvbnModGhpcy5jbGFzcyksXG4gICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgIClcbiAgICApO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLnRvU3RyaW5nKCkpO1xuICAgIGlmIChSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsKSkge1xuICAgICAgaWYgKCFSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG1vZGVsKSlcbiAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtb2RlbCwgUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbCkpO1xuICAgIH1cbiAgICByZXR1cm4gW21vZGVsLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSBtb2RlbHMgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBjaGFuZ2VzIHRvIG11bHRpcGxlIGV4aXN0aW5nIG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgZGF0YWJhc2UgaW4gYSBiYXRjaCBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSB1cGRhdGVkIG1vZGVscyB3aXRoIHJlZnJlc2hlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIucmVjb3JkKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB1cGRhdGVkLm1hcCgodSwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSBtb2RlbHMgZm9yIHVwZGF0ZS5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIG11bHRpcGxlIG1vZGVscyBhbmQgcHJlcGFyZXMgdGhlbSBmb3IgdXBkYXRlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55W10+fSBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgYW55IG1vZGVsIGhhcyBubyBwcmltYXJ5IGtleSB2YWx1ZS5cbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiBhbnkgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGxQcmVmaXgoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgY29uc3QgaWRzID0gbW9kZWxzLm1hcCgobSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBtW3RoaXMucGtdIGFzIHN0cmluZztcbiAgICAgIGlmICghaWQpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwibWlzc2luZyBpZCBvbiB1cGRhdGUgb3BlcmF0aW9uXCIpO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH0pO1xuICAgIGNvbnN0IG9sZE1vZGVscyA9IGF3YWl0IHRoaXMucmVhZEFsbChpZHMsIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIG1vZGVscyA9IG1vZGVscy5tYXAoKG0sIGkpID0+IHtcbiAgICAgIG0gPSB0aGlzLm1lcmdlKG9sZE1vZGVsc1tpXSwgbSk7XG4gICAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKSB7XG4gICAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtKSlcbiAgICAgICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG0sIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbTtcbiAgICB9KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgICAgICBvbGRNb2RlbHNbaV1cbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBpZ25vcmVkUHJvcHMgPVxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW107XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShtLmhhc0Vycm9ycyhvbGRNb2RlbHNbaV0sIG0sIC4uLmlnbm9yZWRQcm9wcykpXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBlcnJvcnMucmVkdWNlKChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICBpZiAoZSlcbiAgICAgICAgYWNjdW0gPVxuICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoZXJyb3JNZXNzYWdlcykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvck1lc3NhZ2VzKTtcblxuICAgIG1vZGVscy5mb3JFYWNoKChtLCBpKSA9PiB7XG4gICAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKSB7XG4gICAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtKSlcbiAgICAgICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG0sIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgZGVsZXRpbmcgYSBtb2RlbCBieSBJRC5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIGNvbnRleHQgYW5kIGVuZm9yY2VzIGRlY29yYXRvcnMgYmVmb3JlIGRlbGV0aW5nIGEgbW9kZWwuXG4gICAqIEBwYXJhbSB7YW55fSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXkgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZVByZWZpeChrZXk6IGFueSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKGtleSwgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuICAgIHJldHVybiBba2V5LCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIG1vZGVsIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElELlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgaXRzIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBkZWxldGVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGUodGhpcy50YWJsZU5hbWUsIGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciBkZWxldGluZyBtdWx0aXBsZSBtb2RlbHMgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgY29udGV4dCBhbmQgZW5mb3JjZXMgZGVjb3JhdG9ycyBiZWZvcmUgZGVsZXRpbmcgbXVsdGlwbGUgbW9kZWxzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBrZXlzIC0gVGhlIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXlzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVBbGxQcmVmaXgoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IHRoaXMucmVhZEFsbChrZXlzLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgcmV0dXJuIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBba2V5cywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgbW9kZWxzIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElEcy5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBrZXlzIC0gVGhlIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBkZWxldGVkIG1vZGVsIGluc3RhbmNlcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNlbGVjdCBxdWVyeSB3aXRob3V0IHNwZWNpZnlpbmcgZmllbGRzLlxuICAgKiBAc3VtbWFyeSBTdGFydHMgYnVpbGRpbmcgYSBxdWVyeSB0aGF0IHdpbGwgcmV0dXJuIGFsbCBmaWVsZHMgb2YgdGhlIG1vZGVsLlxuICAgKiBAdGVtcGxhdGUgUyAtIFRoZSBhcnJheSB0eXBlIG9mIHNlbGVjdCBzZWxlY3RvcnMuXG4gICAqIEByZXR1cm4gQSBxdWVyeSBidWlsZGVyIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzZWxlY3Q8XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIFMgZXh0ZW5kcyByZWFkb25seSBTZWxlY3RTZWxlY3RvcjxNPltdLFxuICA+KCk6IFdoZXJlT3B0aW9uPE0sIE1bXT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2VsZWN0IHF1ZXJ5IHdpdGggc3BlY2lmaWMgZmllbGRzLlxuICAgKiBAc3VtbWFyeSBTdGFydHMgYnVpbGRpbmcgYSBxdWVyeSB0aGF0IHdpbGwgcmV0dXJuIG9ubHkgdGhlIHNwZWNpZmllZCBmaWVsZHMgb2YgdGhlIG1vZGVsLlxuICAgKiBAdGVtcGxhdGUgUyAtIFRoZSBhcnJheSB0eXBlIG9mIHNlbGVjdCBzZWxlY3RvcnMuXG4gICAqIEBwYXJhbSBzZWxlY3RvciAtIFRoZSBmaWVsZHMgdG8gc2VsZWN0LlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlciBmb3IgdGhlIHNlbGVjdGVkIGZpZWxkcy5cbiAgICovXG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I6IHJlYWRvbmx5IFsuLi5TXVxuICApOiBXaGVyZU9wdGlvbjxNLCBQaWNrPE0sIFNbbnVtYmVyXT5bXT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VsZWN0IG1ldGhvZC5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSBtb2RlbCB3aXRoIG9wdGlvbmFsIGZpZWxkIHNlbGVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcGFyYW0gW3NlbGVjdG9yXSAtIE9wdGlvbmFsIGZpZWxkcyB0byBzZWxlY3QuXG4gICAqIEByZXR1cm4gQSBxdWVyeSBidWlsZGVyLlxuICAgKi9cbiAgc2VsZWN0PFMgZXh0ZW5kcyByZWFkb25seSBTZWxlY3RTZWxlY3RvcjxNPltdPihcbiAgICBzZWxlY3Rvcj86IHJlYWRvbmx5IFsuLi5TXVxuICApOiBXaGVyZU9wdGlvbjxNLCBNW10+IHwgV2hlcmVPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+IHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyXG4gICAgICAuU3RhdGVtZW50PE0+KClcbiAgICAgIC5zZWxlY3Qoc2VsZWN0b3IgYXMgcmVhZG9ubHkgWy4uLlNdKVxuICAgICAgLmZyb20odGhpcy5jbGFzcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcXVlcnkgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbnMgYW5kIG9wdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgc2ltcGxpZmllZCB3YXkgdG8gcXVlcnkgdGhlIGRhdGFiYXNlIHdpdGggY29tbW9uIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIGZpbHRlciByZWNvcmRzLlxuICAgKiBAcGFyYW0gb3JkZXJCeSAtIFRoZSBmaWVsZCB0byBvcmRlciByZXN1bHRzIGJ5LlxuICAgKiBAcGFyYW0ge09yZGVyRGlyZWN0aW9ufSBbb3JkZXI9T3JkZXJEaXJlY3Rpb24uQVNDXSAtIFRoZSBzb3J0IGRpcmVjdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gLSBPcHRpb25hbCBtYXhpbXVtIG51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtza2lwXSAtIE9wdGlvbmFsIG51bWJlciBvZiByZXN1bHRzIHRvIHNraXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHF1ZXJ5IHJlc3VsdHMgYXMgbW9kZWwgaW5zdGFuY2VzLlxuICAgKi9cbiAgYXN5bmMgcXVlcnkoXG4gICAgY29uZGl0aW9uOiBDb25kaXRpb248TT4sXG4gICAgb3JkZXJCeToga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5BU0MsXG4gICAgbGltaXQ/OiBudW1iZXIsXG4gICAgc2tpcD86IG51bWJlclxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHNvcnQ6IE9yZGVyQnlTZWxlY3RvcjxNPiA9IFtvcmRlckJ5LCBvcmRlciBhcyBPcmRlckRpcmVjdGlvbl07XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNlbGVjdCgpLndoZXJlKGNvbmRpdGlvbikub3JkZXJCeShzb3J0KTtcbiAgICBpZiAobGltaXQpIHF1ZXJ5LmxpbWl0KGxpbWl0KTtcbiAgICBpZiAoc2tpcCkgcXVlcnkub2Zmc2V0KHNraXApO1xuICAgIHJldHVybiBxdWVyeS5leGVjdXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhbiBvYnNlcnZlciBmb3IgdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBBZGRzIGFuIG9ic2VydmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCBvZiBjaGFuZ2VzIHRvIG1vZGVscyBpbiB0aGlzIHJlcG9zaXRvcnkuXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHJlZ2lzdGVyLlxuICAgKiBAcGFyYW0ge09ic2VydmVyRmlsdGVyfSBbZmlsdGVyXSAtIE9wdGlvbmFsIGZpbHRlciB0byBsaW1pdCB3aGljaCBldmVudHMgdGhlIG9ic2VydmVyIHJlY2VpdmVzLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAc2VlIHtPYnNlcnZhYmxlI29ic2VydmV9XG4gICAqL1xuICBAZmluYWwoKVxuICBvYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlciwgZmlsdGVyPzogT2JzZXJ2ZXJGaWx0ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwib2JzZXJ2ZXJIYW5kbGVyXCIsIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuT2JzZXJ2ZXJIYW5kbGVyKCksXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLm9ic2VydmUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUodGhpcy5jbGFzcyk7XG4gICAgdGhpcy5hZGFwdGVyLm9ic2VydmUodGhpcywgKHRhYmxlOiBzdHJpbmcpID0+IHRhYmxlTmFtZSA9PT0gdGFibGUpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYG5vdyBvYnNlcnZpbmcgJHt0aGlzLmFkYXB0ZXJ9IGZpbHRlcmluZyBvbiB0YWJsZSA9PT0gJHt0YWJsZU5hbWV9YFxuICAgICk7XG4gICAgdGhpcy5vYnNlcnZlckhhbmRsZXIhLm9ic2VydmUob2JzZXJ2ZXIsIGZpbHRlcik7XG4gICAgbG9nLnZlcmJvc2UoYFJlZ2lzdGVyZWQgbmV3IG9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgYW4gb2JzZXJ2ZXIgZnJvbSB0aGlzIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYW4gb2JzZXJ2ZXIgc28gaXQgd2lsbCBubyBsb25nZXIgcmVjZWl2ZSBub3RpZmljYXRpb25zIG9mIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBvYnNlcnZlciBoYW5kbGVyIGlzIG5vdCBpbml0aWFsaXplZC5cbiAgICogQHNlZSB7T2JzZXJ2YWJsZSN1bk9ic2VydmV9XG4gICAqL1xuICBAZmluYWwoKVxuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy51bk9ic2VydmUpXG4gICAgICAudmVyYm9zZShgT2JzZXJ2ZXIgJHtvYnNlcnZlci50b1N0cmluZygpfSByZW1vdmVkYCk7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpKSB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKFxuICAgICAgICBgTm8gbW9yZSBvYnNlcnZlcnMgcmVnaXN0ZXJlZCBmb3IgJHt0aGlzLmFkYXB0ZXJ9LCB1bnN1YnNjcmliaW5nYFxuICAgICAgKTtcbiAgICAgIHRoaXMuYWRhcHRlci51bk9ic2VydmUodGhpcyk7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKGBObyBsb25nZXIgb2JzZXJ2aW5nIGFkYXB0ZXIgJHt0aGlzLmFkYXB0ZXIuZmxhdm91cn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5vdGlmaWVzIGFsbCBvYnNlcnZlcnMgb2YgYW4gZXZlbnQuXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYWxsIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgYSBkYXRhYmFzZSBldmVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlIG5hbWUgd2hlcmUgdGhlIGV2ZW50IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBldmVudCB0aGF0IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBJRCBvciBJRHMgb2YgdGhlIGFmZmVjdGVkIHJlY29yZHMuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlIG9ic2VydmVyIGhhbmRsZXIgaXMgbm90IGluaXRpYWxpemVkLlxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLnVwZGF0ZU9ic2VydmVycylcbiAgICAgIC52ZXJib3NlKFxuICAgICAgICBgVXBkYXRpbmcgJHt0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpfSBvYnNlcnZlcnMgZm9yICR7dGhpc31gXG4gICAgICApO1xuICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIHRoaXMubG9nLFxuICAgICAgdGFibGUsXG4gICAgICBldmVudCxcbiAgICAgIEFycmF5LmlzQXJyYXkoaWQpXG4gICAgICAgID8gaWQubWFwKChpKSA9PiBTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMucGtQcm9wcy50eXBlLCBpKSBhcyBzdHJpbmcpXG4gICAgICAgIDogKFNlcXVlbmNlLnBhcnNlVmFsdWUodGhpcy5wa1Byb3BzLnR5cGUsIGlkKSBhcyBzdHJpbmcpLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsaWFzIGZvciB1cGRhdGVPYnNlcnZlcnMuXG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIGFsbCBvYnNlcnZlcnMgb2YgYW4gZXZlbnQgKGFsaWFzIGZvciB1cGRhdGVPYnNlcnZlcnMpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUgbmFtZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgb2NjdXJyZWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIElEIG9yIElEcyBvZiB0aGUgYWZmZWN0ZWQgcmVjb3Jkcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLlxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaChcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgb3IgcmV0cmlldmVzIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCByZXR1cm5zIGEgcmVwb3NpdG9yeSBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBtb2RlbC5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSB0aGF0IGV4dGVuZHMgUmVwbzxNPi5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgZGVmYXVsdCBhZGFwdGVyIGZsYXZvdXIgaWYgbm90IHNwZWNpZmllZCBvbiB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IFthcmdzXSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge1J9IEEgcmVwb3NpdG9yeSBpbnN0YW5jZSBmb3IgdGhlIG1vZGVsLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBhZGFwdGVyIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBmbGF2b3VyLlxuICAgKi9cbiAgc3RhdGljIGZvck1vZGVsPE0gZXh0ZW5kcyBNb2RlbCwgUiBleHRlbmRzIFJlcG88TT4+KFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBhbGlhcz86IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBSIHtcbiAgICBsZXQgcmVwbzogUiB8IENvbnN0cnVjdG9yPFI+IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgX2FsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgYWxpYXMgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBtb2RlbCkgfHxcbiAgICAgIEFkYXB0ZXIuY3VycmVudEZsYXZvdXI7XG4gICAgdHJ5IHtcbiAgICAgIHJlcG8gPSB0aGlzLmdldChtb2RlbCwgX2FsaWFzKSBhcyBDb25zdHJ1Y3RvcjxSPiB8IFI7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICByZXBvID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChyZXBvIGluc3RhbmNlb2YgUmVwb3NpdG9yeSkgcmV0dXJuIHJlcG8gYXMgUjtcblxuICAgIGNvbnN0IGZsYXZvdXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9XG4gICAgICBhbGlhcyB8fFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIG1vZGVsKSB8fFxuICAgICAgKHJlcG8gJiZcbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIHJlcG8pKSB8fFxuICAgICAgQWRhcHRlci5jdXJyZW50Rmxhdm91cjtcbiAgICBjb25zdCBhZGFwdGVyOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4gfCB1bmRlZmluZWQgPSBmbGF2b3VyXG4gICAgICA/IEFkYXB0ZXIuZ2V0KGZsYXZvdXIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcmVnaXN0ZXJlZCBwZXJzaXN0ZW5jZSBhZGFwdGVyIGZvdW5kIGZsYXZvdXIgJHtmbGF2b3VyfWBcbiAgICAgICk7XG5cbiAgICByZXBvID0gcmVwbyB8fCAoYWRhcHRlci5yZXBvc2l0b3J5KCkgYXMgQ29uc3RydWN0b3I8Uj4pO1xuICAgIHJldHVybiBuZXcgcmVwbyhhZGFwdGVyLCBtb2RlbCwgLi4uYXJncykgYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbCBmcm9tIHRoZSBjYWNoZS5cbiAgICogQHN1bW1hcnkgR2V0cyBhIHJlcG9zaXRvcnkgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZWwgZnJvbSB0aGUgaW50ZXJuYWwgY2FjaGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gLSBUaGUgYWRhcHRlciBhbGlhcy5cbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+fSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZS5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gcmVwb3NpdG9yeSBpcyByZWdpc3RlcmVkIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKTogQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+IHtcbiAgICBsZXQgbmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGlmIChhbGlhcykge1xuICAgICAgbmFtZSA9IFtuYW1lLCBhbGlhc10uam9pbihEZWZhdWx0U2VwYXJhdG9yKTtcbiAgICB9XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5fY2FjaGUpXG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVbbmFtZV0gYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxSZXBvPE0+PiB8IFJlcG88TT47XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgQ291bGQgbm90IGZpbmQgcmVwb3NpdG9yeSByZWdpc3RlcmVkIHVuZGVyICR7bmFtZX1gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgQXNzb2NpYXRlcyBhIHJlcG9zaXRvcnkgY29uc3RydWN0b3Igb3IgaW5zdGFuY2Ugd2l0aCBhIG1vZGVsIGluIHRoZSBpbnRlcm5hbCBjYWNoZS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPn0gcmVwbyAtIFRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBhIHJlcG9zaXRvcnkgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXI8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgcmVwbzogQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+LFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICkge1xuICAgIGxldCBuYW1lID0gUmVwb3NpdG9yeS50YWJsZShtb2RlbCk7XG4gICAgaWYgKGFsaWFzKSB7XG4gICAgICBuYW1lID0gW25hbWUsIGFsaWFzXS5qb2luKERlZmF1bHRTZXBhcmF0b3IpO1xuICAgIH1cbiAgICBpZiAobmFtZSBpbiB0aGlzLl9jYWNoZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGAke25hbWV9IGFscmVhZHkgcmVnaXN0ZXJlZCBhcyBhIHJlcG9zaXRvcnlgKTtcbiAgICB0aGlzLl9jYWNoZVtuYW1lXSA9IHJlcG8gYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIG1ldGFkYXRhIG9uIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEF0dGFjaGVzIG1ldGFkYXRhIHRvIGEgbW9kZWwgaW5zdGFuY2UgdXNpbmcgYSBub24tZW51bWVyYWJsZSBwcm9wZXJ0eS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7YW55fSBtZXRhZGF0YSAtIFRoZSBtZXRhZGF0YSB0byBhdHRhY2ggdG8gdGhlIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIHNldE1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0sIG1ldGFkYXRhOiBhbnkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogbWV0YWRhdGEsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgbWV0YWRhdGEgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgcHJldmlvdXNseSBhdHRhY2hlZCBtZXRhZGF0YSBmcm9tIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHthbnl9IFRoZSBtZXRhZGF0YSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kLlxuICAgKi9cbiAgc3RhdGljIGdldE1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgIG1vZGVsLFxuICAgICAgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXG4gICAgKTtcbiAgICByZXR1cm4gZGVzY3JpcHRvciA/IGRlc2NyaXB0b3IudmFsdWUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgbWV0YWRhdGEgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBEZWxldGVzIHRoZSBtZXRhZGF0YSBwcm9wZXJ0eSBmcm9tIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIHJlbW92ZU1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgIG1vZGVsLFxuICAgICAgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXG4gICAgKTtcbiAgICBpZiAoZGVzY3JpcHRvcikgZGVsZXRlIChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgc2VxdWVuY2Ugb3B0aW9ucyBmb3IgYSBtb2RlbCdzIHByaW1hcnkga2V5LlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHNlcXVlbmNlIGNvbmZpZ3VyYXRpb24gZm9yIGEgbW9kZWwncyBwcmltYXJ5IGtleSBmcm9tIG1ldGFkYXRhLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7U2VxdWVuY2VPcHRpb25zfSBUaGUgc2VxdWVuY2Ugb3B0aW9ucyBmb3IgdGhlIG1vZGVsJ3MgcHJpbWFyeSBrZXkuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIHNlcXVlbmNlIG9wdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoZSBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBnZXRTZXF1ZW5jZU9wdGlvbnM8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSkge1xuICAgIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkobW9kZWwpLmlkO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIFJlcG9zaXRvcnkua2V5KERCS2V5cy5JRCksXG4gICAgICBtb2RlbCxcbiAgICAgIHBrIGFzIHN0cmluZ1xuICAgICk7XG4gICAgaWYgKCFtZXRhZGF0YSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk5vIHNlcXVlbmNlIG9wdGlvbnMgZGVmaW5lZCBmb3IgbW9kZWwuIGRpZCB5b3UgdXNlIHRoZSBAcGsgZGVjb3JhdG9yP1wiXG4gICAgICApO1xuICAgIHJldHVybiBtZXRhZGF0YSBhcyBTZXF1ZW5jZU9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYWxsIGluZGV4ZXMgZGVmaW5lZCBvbiBhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYWxsIGluZGV4IG1ldGFkYXRhIGZyb20gYSBtb2RlbCdzIHByb3BlcnR5IGRlY29yYXRvcnMuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEluZGV4TWV0YWRhdGE+Pn0gQSBuZXN0ZWQgcmVjb3JkIG9mIHByb3BlcnR5IG5hbWVzIHRvIGluZGV4IG1ldGFkYXRhLlxuICAgKi9cbiAgc3RhdGljIGluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgY29uc3QgaW5kZXhEZWNvcmF0b3JzID0gUmVmbGVjdGlvbi5nZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwgOiBuZXcgbW9kZWwoKSxcbiAgICAgIERCS2V5cy5SRUZMRUNUXG4gICAgKTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoaW5kZXhEZWNvcmF0b3JzIHx8IHt9KS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEluZGV4TWV0YWRhdGE+PiwgW2ssIHZhbF0pID0+IHtcbiAgICAgICAgY29uc3QgZGVjcyA9IHZhbC5maWx0ZXIoKHYpID0+IHYua2V5LnN0YXJ0c1dpdGgoUGVyc2lzdGVuY2VLZXlzLklOREVYKSk7XG4gICAgICAgIGlmIChkZWNzICYmIGRlY3MubGVuZ3RoKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBkZWMgb2YgZGVjcykge1xuICAgICAgICAgICAgY29uc3QgeyBrZXksIHByb3BzIH0gPSBkZWM7XG4gICAgICAgICAgICBhY2N1bVtrXSA9IGFjY3VtW2tdIHx8IHt9O1xuICAgICAgICAgICAgYWNjdW1ba11ba2V5XSA9IHByb3BzIGFzIEluZGV4TWV0YWRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYWxsIHJlbGF0aW9uIHByb3BlcnRpZXMgZGVmaW5lZCBvbiBhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG5hbWVzIG9mIGFsbCBwcm9wZXJ0aWVzIG1hcmtlZCBhcyByZWxhdGlvbnMgaW4gdGhlIG1vZGVsIGhpZXJhcmNoeS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TSB8IENvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjb25zdHJ1Y3Rvci5cbiAgICogQHJldHVybiB7c3RyaW5nW119IEFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgYXJlIHJlbGF0aW9ucy5cbiAgICovXG4gIHN0YXRpYyByZWxhdGlvbnM8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcHJvdG90eXBlID1cbiAgICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWxcbiAgICAgICAgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWwpXG4gICAgICAgIDogKG1vZGVsIGFzIGFueSkucHJvdG90eXBlO1xuICAgIHdoaWxlIChwcm90b3R5cGUgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcHJvcHM6IHN0cmluZ1tdID0gcHJvdG90eXBlW1BlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlNdO1xuICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnByb3BzKTtcbiAgICAgIH1cbiAgICAgIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0YWJsZSBuYW1lIGZvciBhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIGEgbW9kZWwuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRhYmxlIG5hbWUgZm9yIHRoZSBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyB0YWJsZTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4pOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRUYWJsZU5hbWUobW9kZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjb2x1bW4gbmFtZSBmb3IgYSBtb2RlbCBhdHRyaWJ1dGUuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgZGF0YWJhc2UgY29sdW1uIG5hbWUgZm9yIGEgbW9kZWwgcHJvcGVydHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIC0gVGhlIGF0dHJpYnV0ZS9wcm9wZXJ0eSBuYW1lLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb2x1bW4gbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZS5cbiAgICovXG4gIHN0YXRpYyBjb2x1bW48TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSwgYXR0cmlidXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pLFxuICAgICAgbW9kZWwsXG4gICAgICBhdHRyaWJ1dGVcbiAgICApO1xuICAgIHJldHVybiBtZXRhZGF0YSA/IG1ldGFkYXRhIDogYXR0cmlidXRlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tIFwiQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgREJLZXlzLCBJUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCwgTW9kZWxLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuL1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGRlY29yYXRvciBmb3IgbW9kZWwgY2xhc3Nlcy5cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYW5kIHJlZ2lzdGVycyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwgY2xhc3MuIENhbiBiZSB1c2VkIGFzIGJvdGggYSBwcm9wZXJ0eSBkZWNvcmF0b3IgYW5kIGEgY2xhc3MgZGVjb3JhdG9yLlxuICogQHRlbXBsYXRlIFQgLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPFQ+fSBtb2RlbCAtIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWVPdmVycmlkZV0gLSBPcHRpb25hbCBuYW1lIG92ZXJyaWRlIGZvciB0aGUgcmVwb3NpdG9yeS5cbiAqIEByZXR1cm4ge2FueX0gLSBUaGUgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICogQGZ1bmN0aW9uIHJlcG9zaXRvcnlcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnQgQ29kZVxuICogICBwYXJ0aWNpcGFudCBEIGFzIERlY29yYXRvclxuICogICBwYXJ0aWNpcGFudCBSIGFzIFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNZXRhZGF0YVxuICpcbiAqICAgQy0+PkQ6IEFwcGx5IEByZXBvc2l0b3J5KE1vZGVsKVxuICogICBhbHQgUHJvcGVydHkgRGVjb3JhdG9yXG4gKiAgICAgRC0+PkQ6IENoZWNrIGlmIHByb3BlcnR5S2V5IGV4aXN0c1xuICogICAgIEQtPj4rQzogUmV0dXJuIGluamVjdChuYW1lKSBkZWNvcmF0b3JcbiAqICAgZWxzZSBDbGFzcyBEZWNvcmF0b3JcbiAqICAgICBELT4+TTogU2V0IHJlcG9zaXRvcnkgbWV0YWRhdGEgb24gbW9kZWxcbiAqICAgICBELT4+UjogUmVnaXN0ZXIgbW9kZWwgd2l0aCBSZXBvc2l0b3J5XG4gKiAgICAgRC0+PitDOiBSZXR1cm4gaW5qZWN0YWJsZSBkZWNvcmF0b3Igd2l0aCBjb25maWdcbiAqICAgICBDLT4+QzogRGVmaW5lIERCS2V5cy5DTEFTUyBwcm9wZXJ0eVxuICogICBlbmRcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvc2l0b3J5PFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxUPixcbiAgZmxhdm91cj86IHN0cmluZ1xuKTogYW55IHtcbiAgcmV0dXJuICgob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBpZiAocHJvcGVydHlLZXkpIHtcbiAgICAgIHJldHVybiBpbmplY3QobW9kZWxbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgbW9kZWxdIHx8IG1vZGVsKShcbiAgICAgICAgb3JpZ2luYWwsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cblxuICAgIG1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5SRVBPU0lUT1JZKSwgb3JpZ2luYWwubmFtZSkobW9kZWwpO1xuICAgIGZsYXZvdXIgPVxuICAgICAgZmxhdm91ciB8fFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIG9yaWdpbmFsKTtcbiAgICBSZXBvc2l0b3J5LnJlZ2lzdGVyKFxuICAgICAgbW9kZWxbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgbW9kZWxdIHx8IG1vZGVsLFxuICAgICAgb3JpZ2luYWwsXG4gICAgICBmbGF2b3VyXG4gICAgKTtcbiAgICByZXR1cm4gaW5qZWN0YWJsZShcbiAgICAgIG1vZGVsW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSB8fCBtb2RlbCxcbiAgICAgIChpbnN0YW5jZTogSVJlcG9zaXRvcnk8VD4pID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlLCBEQktleXMuQ0xBU1MsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogbW9kZWwsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICkob3JpZ2luYWwpO1xuICB9KSBhcyBhbnk7XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gb2JzZXJ2ZXIgY29tbXVuaWNhdGlvbiBmYWlscy5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIG9ic2VydmVyIGNvbW11bmljYXRpb24gYmV0d2VlbiByZXBvc2l0b3JpZXMuXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0LlxuICogQGNsYXNzIE9ic2VydmVyRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiB0cnkge1xuICogICAvLyBTb21lIHJlcG9zaXRvcnkgb2JzZXJ2ZXIgb3BlcmF0aW9uXG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBPYnNlcnZlckVycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcignT2JzZXJ2ZXIgY29tbXVuaWNhdGlvbiBmYWlsZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGNsYXNzIE9ic2VydmVyRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoT2JzZXJ2ZXJFcnJvci5uYW1lLCBtc2csIDUwMCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBzZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSB1bmlxdWUgaW5qZWN0YWJsZSBuYW1lIGZvciBhIHJlcG9zaXRvcnkuXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIG5hbWUgZm9yIHJlcG9zaXRvcnkgaW5qZWN0YWJsZXMgYmFzZWQgb24gbW9kZWwgYW5kIGFkYXB0ZXIgZmxhdm91ci5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxUPiB8IFR9IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyXSAtIE9wdGlvbmFsIGFkYXB0ZXIgZmxhdm91ci4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBtb2RlbCBtZXRhZGF0YS5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBpbmplY3RhYmxlIG5hbWUuXG4gKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBmbGF2b3VyIGlzIHByb3ZpZGVkIGFuZCBub25lIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbW9kZWwuXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVJbmplY3RhYmxlTmFtZUZvclJlcG9zaXRvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJbmplY3RhYmxlTmFtZUZvclJlcG9zaXRvcnk8VCBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPFQ+IHwgVCxcbiAgZmxhdm91cj86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgaWYgKCFmbGF2b3VyKSB7XG4gICAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpO1xuICAgIGZsYXZvdXIgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAga2V5LFxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsLmNvbnN0cnVjdG9yIDogbW9kZWxcbiAgICApO1xuICAgIGlmICghZmxhdm91cilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldHJpZXZlIGZsYXZvdXIgZnJvbSBtb2RlbCAke21vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lIDogbW9kZWwubmFtZX1gXG4gICAgICApO1xuICB9XG4gIHJldHVybiBzZihQZXJzaXN0ZW5jZUtleXMuSU5KRUNUQUJMRSwgZmxhdm91ciwgUmVwb3NpdG9yeS50YWJsZShtb2RlbCkpO1xufVxuIiwiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wLFxuICBJbmplY3RhYmxlcyxcbn0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9SZXBvc2l0b3J5XCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsQ29uc3RydWN0b3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5IH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RyeSBmb3IgaW5qZWN0YWJsZSByZXBvc2l0b3JpZXMuXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIGluamVjdGFibGUgcmVnaXN0cnkgdG8gcHJvdmlkZSBhdXRvbWF0aWMgcmVwb3NpdG9yeSByZXNvbHV0aW9uIGZvciBtb2RlbHMuXG4gKiBAcGFyYW0ge3ZvaWR9IC0gTm8gY29uc3RydWN0b3IgcGFyYW1ldGVycyByZXF1aXJlZC5cbiAqIEBjbGFzcyBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKiBAZXhhbXBsZVxuICogY29uc3QgcmVnaXN0cnkgPSBuZXcgSW5qZWN0YWJsZXNSZWdpc3RyeSgpO1xuICogY29uc3QgdXNlclJlcG8gPSByZWdpc3RyeS5nZXQ8VXNlclJlcG9zaXRvcnk+KCdVc2VyJyk7XG4gKiAvLyBJZiBVc2VyUmVwb3NpdG9yeSBleGlzdHMsIGl0IHdpbGwgYmUgcmV0dXJuZWRcbiAqIC8vIElmIG5vdCwgYnV0IFVzZXIgbW9kZWwgZXhpc3RzLCBhIHJlcG9zaXRvcnkgd2lsbCBiZSBjcmVhdGVkIGZvciBpdFxuICovXG5leHBvcnQgY2xhc3MgSW5qZWN0YWJsZXNSZWdpc3RyeSBleHRlbmRzIEluamVjdGFibGVSZWdpc3RyeUltcCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYW4gaW5qZWN0YWJsZSBieSBuYW1lIHdpdGggcmVwb3NpdG9yeSBhdXRvLXJlc29sdXRpb24uXG4gICAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGJhc2UgZ2V0IG1ldGhvZCB0byBhdXRvbWF0aWNhbGx5IHJlc29sdmUgcmVwb3NpdG9yaWVzIGZvciBtb2RlbHMgd2hlbiBub3QgZm91bmQgZGlyZWN0bHkuXG4gICAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgaW5qZWN0YWJsZSB0byByZXR1cm4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGluamVjdGFibGUgdG8gcmV0cmlldmUuXG4gICAqIEByZXR1cm4ge1QgfCB1bmRlZmluZWR9IC0gVGhlIGluamVjdGFibGUgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cbiAgICovXG4gIG92ZXJyaWRlIGdldDxUPihcbiAgICBuYW1lOiBzeW1ib2wgfCBDb25zdHJ1Y3RvcjxUPixcbiAgICBmbGF2b3VyPzogc3RyaW5nXG4gICk6IFQgfCB1bmRlZmluZWQge1xuICAgIGxldCBpbmplY3RhYmxlID0gc3VwZXIuZ2V0KG5hbWUpO1xuICAgIGlmICghaW5qZWN0YWJsZSlcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBtID0gbmFtZTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiIHx8IHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgbSA9IE1vZGVsLmdldChuYW1lLnRvU3RyaW5nKCkpIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobSlcbiAgICAgICAgICBpbmplY3RhYmxlID0gUmVwb3NpdG9yeS5mb3JNb2RlbChtIGFzIENvbnN0cnVjdG9yPGFueT4sIGZsYXZvdXIpIGFzIFQ7XG4gICAgICAgIGlmIChpbmplY3RhYmxlKSB7XG4gICAgICAgICAgaWYgKGluamVjdGFibGUgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSByZXR1cm4gaW5qZWN0YWJsZSBhcyBUO1xuICAgICAgICAgIGZsYXZvdXIgPVxuICAgICAgICAgICAgZmxhdm91ciB8fFxuICAgICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgICAgICBpbmplY3RhYmxlLmNvbnN0cnVjdG9yXG4gICAgICAgICAgICApIHx8XG4gICAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICAgIG0gYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIEluamVjdGFibGVzLnJlZ2lzdGVyKFxuICAgICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICAgIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5KFxuICAgICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICAgICAgICAgICAgZmxhdm91clxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgcmV0dXJuIGluamVjdGFibGUgYXMgVCB8IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gSW50ZXJmYWNlIGZvciBzZXF1ZW5jZSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIHNlcXVlbmNlc1xuICogQGludGVyZmFjZSBTZXF1ZW5jZU9wdGlvbnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcXVlbmNlT3B0aW9uczxcbiAgVFlQRSA9IFwiTnVtYmVyXCIgfCBcIkJpZ0ludFwiIHwgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT3B0aW9uYWwgbmFtZSBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcblxuICBnZW5lcmF0ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGRhdGEgdHlwZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHNlcXVlbmNlIGdlbmVyYXRlcyBOdW1iZXIgb3IgQmlnSW50IHZhbHVlc1xuICAgKi9cbiAgdHlwZTogVFlQRTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBUaGUgdmFsdWUgdGhhdCB0aGUgc2VxdWVuY2Ugc3RhcnRzIHdpdGhcbiAgICovXG4gIHN0YXJ0V2l0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluY3JlbWVudCB2YWx1ZSBmb3IgZWFjaCBzdGVwIGluIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBzZXF1ZW5jZSBpbmNyZWFzZXMgd2l0aCBlYWNoIGNhbGxcbiAgICovXG4gIGluY3JlbWVudEJ5OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBPcHRpb25hbCBtaW5pbXVtIHZhbHVlIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgVGhlIGxvd2VzdCB2YWx1ZSB0aGF0IHRoZSBzZXF1ZW5jZSBjYW4gZ2VuZXJhdGVcbiAgICovXG4gIG1pblZhbHVlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT3B0aW9uYWwgbWF4aW11bSB2YWx1ZSBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFRoZSBoaWdoZXN0IHZhbHVlIHRoYXQgdGhlIHNlcXVlbmNlIGNhbiBnZW5lcmF0ZVxuICAgKi9cbiAgbWF4VmFsdWU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRoZSBzZXF1ZW5jZSBzaG91bGQgY3ljbGUgd2hlbiByZWFjaGluZyBpdHMgbGltaXRzXG4gICAqIEBzdW1tYXJ5IElmIHRydWUsIHRoZSBzZXF1ZW5jZSB3aWxsIHJlc3RhcnQgZnJvbSBtaW5WYWx1ZSB3aGVuIHJlYWNoaW5nIG1heFZhbHVlXG4gICAqL1xuICBjeWNsZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBvcHRpb25zIGZvciBzZXF1ZW5jZXNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmb3IgbnVtYmVyIHNlcXVlbmNlcyBzdGFydGluZyBhdCAwIGFuZCBpbmNyZW1lbnRpbmcgYnkgMVxuICogQGNvbnN0IE5vbmVTZXF1ZW5jZU9wdGlvbnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgTm9uZVNlcXVlbmNlT3B0aW9uczogU2VxdWVuY2VPcHRpb25zID0ge1xuICB0eXBlOiB1bmRlZmluZWQsXG4gIGdlbmVyYXRlZDogZmFsc2UsXG4gIHN0YXJ0V2l0aDogMCxcbiAgaW5jcmVtZW50Qnk6IDEsXG4gIGN5Y2xlOiBmYWxzZSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgb3B0aW9ucyBmb3Igc2VxdWVuY2VzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZm9yIG51bWJlciBzZXF1ZW5jZXMgc3RhcnRpbmcgYXQgMCBhbmQgaW5jcmVtZW50aW5nIGJ5IDFcbiAqIEBjb25zdCBEZWZhdWx0U2VxdWVuY2VPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRTZXF1ZW5jZU9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyA9IE5vbmVTZXF1ZW5jZU9wdGlvbnM7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByZWRlZmluZWQgb3B0aW9ucyBmb3IgbnVtZXJpYyBzZXF1ZW5jZXNcbiAqIEBzdW1tYXJ5IENvbmZpZ3VyYXRpb24gZm9yIHN0YW5kYXJkIG51bWJlciBzZXF1ZW5jZXMgc3RhcnRpbmcgYXQgMCBhbmQgaW5jcmVtZW50aW5nIGJ5IDFcbiAqIEBjb25zdCBOdW1lcmljU2VxdWVuY2VcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgTnVtZXJpY1NlcXVlbmNlOiBTZXF1ZW5jZU9wdGlvbnMgPSB7XG4gIHR5cGU6IFwiTnVtYmVyXCIsXG4gIGdlbmVyYXRlZDogdHJ1ZSxcbiAgc3RhcnRXaXRoOiAwLFxuICBpbmNyZW1lbnRCeTogMSxcbiAgY3ljbGU6IGZhbHNlLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJlZGVmaW5lZCBvcHRpb25zIGZvciBCaWdJbnQgc2VxdWVuY2VzXG4gKiBAc3VtbWFyeSBDb25maWd1cmF0aW9uIGZvciBCaWdJbnQgc2VxdWVuY2VzIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlbWVudGluZyBieSAxXG4gKiBAY29uc3QgQmlnSW50U2VxdWVuY2VcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgQmlnSW50U2VxdWVuY2U6IFNlcXVlbmNlT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gIHt9LFxuICBOdW1lcmljU2VxdWVuY2UsXG4gIHtcbiAgICB0eXBlOiBcIkJpZ0ludFwiLFxuICB9XG4pO1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcGFyaXNvbiBvcGVyYXRvcnMgZm9yIHF1ZXJ5IGNvbmRpdGlvbnNcbiAqIEBzdW1tYXJ5IEVudW0gZGVmaW5pbmcgdGhlIGF2YWlsYWJsZSBvcGVyYXRvcnMgZm9yIGNvbXBhcmluZyB2YWx1ZXMgaW4gZGF0YWJhc2UgcXVlcmllc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIE9wZXJhdG9yIHtcbiAgLyoqIEVxdWFsIGNvbXBhcmlzb24gKD0pICovXG4gIEVRVUFMID0gXCJFUVVBTFwiLFxuICAvKiogTm90IGVxdWFsIGNvbXBhcmlzb24gKCE9KSAqL1xuICBESUZGRVJFTlQgPSBcIkRJRkZFUkVOVFwiLFxuICAvKiogR3JlYXRlciB0aGFuIGNvbXBhcmlzb24gKD4pICovXG4gIEJJR0dFUiA9IFwiQklHR0VSXCIsXG4gIC8qKiBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvbiAoPj0pICovXG4gIEJJR0dFUl9FUSA9IFwiQklHR0VSX0VRXCIsXG4gIC8qKiBMZXNzIHRoYW4gY29tcGFyaXNvbiAoPCkgKi9cbiAgU01BTExFUiA9IFwiU01BTExFUlwiLFxuICAvKiogTGVzcyB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb24gKDw9KSAqL1xuICBTTUFMTEVSX0VRID0gXCJTTUFMTEVSX0VRXCIsXG4gIC8vIEJFVFdFRU4gPSBcIkJFVFdFRU5cIixcbiAgLyoqIE5lZ2F0aW9uIG9wZXJhdG9yIChOT1QpICovXG4gIE5PVCA9IFwiTk9UXCIsXG4gIC8qKiBJbmNsdXNpb24gb3BlcmF0b3IgKElOKSAqL1xuICBJTiA9IFwiSU5cIixcbiAgLy8gSVMgPSBcIklTXCIsXG4gIC8qKiBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgKi9cbiAgUkVHRVhQID0gXCJSRUdFWFBcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTG9naWNhbCBvcGVyYXRvcnMgZm9yIGNvbWJpbmluZyBxdWVyeSBjb25kaXRpb25zXG4gKiBAc3VtbWFyeSBFbnVtIGRlZmluaW5nIHRoZSBhdmFpbGFibGUgb3BlcmF0b3JzIGZvciBncm91cGluZyBtdWx0aXBsZSBjb25kaXRpb25zIGluIGRhdGFiYXNlIHF1ZXJpZXNcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZW51bSBHcm91cE9wZXJhdG9yIHtcbiAgLyoqIExvZ2ljYWwgQU5EIG9wZXJhdG9yIC0gYWxsIGNvbmRpdGlvbnMgbXVzdCBiZSB0cnVlICovXG4gIEFORCA9IFwiQU5EXCIsXG4gIC8qKiBMb2dpY2FsIE9SIG9wZXJhdG9yIC0gYXQgbGVhc3Qgb25lIGNvbmRpdGlvbiBtdXN0IGJlIHRydWUgKi9cbiAgT1IgPSBcIk9SXCIsXG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIGR1cmluZyBxdWVyeSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyBxdWVyeSBidWlsZGluZyBvciBleGVjdXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nIHwgRXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQGNsYXNzIFF1ZXJ5RXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXJ5RXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoUXVlcnlFcnJvci5uYW1lLCBtc2csIDUwMCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIGR1cmluZyBwYWdpbmF0aW9uIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgZXJyb3JzIHRoYXQgb2NjdXIgZHVyaW5nIHBhZ2luYXRpb24gc2V0dXAgb3IgZXhlY3V0aW9uXG4gKiBAcGFyYW0ge3N0cmluZyB8IEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEBjbGFzcyBQYWdpbmdFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgUGFnaW5nRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoUGFnaW5nRXJyb3IubmFtZSwgbXNnLCA1MDApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBBdHRyaWJ1dGVPcHRpb24sIENvbmRpdGlvbkJ1aWxkZXJPcHRpb24gfSBmcm9tIFwiLi9vcHRpb25zXCI7XG5pbXBvcnQge1xuICBDb25kaXRpb25hbEFzeW5jLFxuICBNb2RlbCxcbiAgTW9kZWxFcnJvckRlZmluaXRpb24sXG4gIHJlcXVpcmVkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBHcm91cE9wZXJhdG9yLCBPcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG50eXBlIEluZmVyQXN5bmM8TT4gPSBNIGV4dGVuZHMgTW9kZWw8aW5mZXIgQT4gPyBBIDogZmFsc2U7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgYSBsb2dpY2FsIGNvbmRpdGlvbiBmb3IgZGF0YWJhc2UgcXVlcmllc1xuICogQHN1bW1hcnkgQSBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBxdWVyeSBjb25kaXRpb25zIHdpdGggc3VwcG9ydCBmb3IgY29tcGxleCBsb2dpY2FsIG9wZXJhdGlvbnMuXG4gKiBUaGlzIGNsYXNzIGFsbG93cyBmb3IgYnVpbGRpbmcgYW5kIGNvbWJpbmluZyBxdWVyeSBjb25kaXRpb25zIHVzaW5nIGxvZ2ljYWwgb3BlcmF0b3JzIChBTkQsIE9SLCBOT1QpXG4gKiBhbmQgY29tcGFyaXNvbiBvcGVyYXRvcnMgKGVxdWFscywgbm90IGVxdWFscywgZ3JlYXRlciB0aGFuLCBldGMuKS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gb3BlcmF0ZXMgb25cbiAqIEBwYXJhbSB7c3RyaW5nIHwgQ29uZGl0aW9uPE0+fSBhdHRyMSAtIFRoZSBhdHRyaWJ1dGUgbmFtZSBvciBhIG5lc3RlZCBjb25kaXRpb25cbiAqIEBwYXJhbSB7T3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yfSBvcGVyYXRvciAtIFRoZSBvcGVyYXRvciB0byB1c2UgZm9yIHRoZSBjb25kaXRpb25cbiAqIEBwYXJhbSB7YW55fSBjb21wYXJpc29uIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdCBvciBhbm90aGVyIGNvbmRpdGlvblxuICogQGNsYXNzIENvbmRpdGlvblxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIHNpbXBsZSBjb25kaXRpb25cbiAqIGNvbnN0IG5hbWVDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlKFwibmFtZVwiKS5lcShcIkpvaG5cIik7XG4gKlxuICogLy8gQ3JlYXRlIGEgY29tcGxleCBjb25kaXRpb25cbiAqIGNvbnN0IGNvbXBsZXhDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlKFwiYWdlXCIpLmd0KDE4KVxuICogICAuYW5kKENvbmRpdGlvbi5hdHRyaWJ1dGUoXCJzdGF0dXNcIikuZXEoXCJhY3RpdmVcIikpO1xuICpcbiAqIC8vIFVzZSB0aGUgYnVpbGRlciBwYXR0ZXJuXG4gKiBjb25zdCB1c2VyUXVlcnkgPSBDb25kaXRpb24uYnVpbGRlcigpXG4gKiAgIC5hdHRyaWJ1dGUoXCJlbWFpbFwiKS5yZWdleHAoXCIuKkBleGFtcGxlLmNvbVwiKVxuICogICAuYW5kKENvbmRpdGlvbi5hdHRyaWJ1dGUoXCJsYXN0TG9naW5cIikuZ3QobmV3IERhdGUoXCIyMDIzLTAxLTAxXCIpKSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDb25kaXRpb248TSBleHRlbmRzIE1vZGVsPGFueT4+IGV4dGVuZHMgTW9kZWw8SW5mZXJBc3luYzxNPj4ge1xuICBAcmVxdWlyZWQoKVxuICBwcm90ZWN0ZWQgYXR0cjE/OiBzdHJpbmcgfCBDb25kaXRpb248TT4gPSB1bmRlZmluZWQ7XG4gIEByZXF1aXJlZCgpXG4gIHByb3RlY3RlZCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgQHJlcXVpcmVkKClcbiAgcHJvdGVjdGVkIGNvbXBhcmlzb24/OiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+LFxuICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3IsXG4gICAgY29tcGFyaXNvbjogYW55XG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hdHRyMSA9IGF0dHIxO1xuICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICB0aGlzLmNvbXBhcmlzb24gPSBjb21wYXJpc29uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb21iaW5lcyB0aGlzIGNvbmRpdGlvbiB3aXRoIGFub3RoZXIgdXNpbmcgbG9naWNhbCBBTkRcbiAgICogQHN1bW1hcnkgSm9pbnMgdHdvIGNvbmRpdGlvbnMgd2l0aCBhbiBBTkQgb3BlcmF0b3IsIHJlcXVpcmluZyBib3RoIHRvIGJlIHRydWVcbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbiAtIFRoZSBjb25kaXRpb24gdG8gY29tYmluZSB3aXRoIHRoaXMgb25lXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgQU5EIG9wZXJhdGlvblxuICAgKi9cbiAgYW5kKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+KTogQ29uZGl0aW9uPE0+IHtcbiAgICByZXR1cm4gQ29uZGl0aW9uLmFuZCh0aGlzLCBjb25kaXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb21iaW5lcyB0aGlzIGNvbmRpdGlvbiB3aXRoIGFub3RoZXIgdXNpbmcgbG9naWNhbCBPUlxuICAgKiBAc3VtbWFyeSBKb2lucyB0d28gY29uZGl0aW9ucyB3aXRoIGFuIE9SIG9wZXJhdG9yLCByZXF1aXJpbmcgYXQgbGVhc3Qgb25lIHRvIGJlIHRydWVcbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbiAtIFRoZSBjb25kaXRpb24gdG8gY29tYmluZSB3aXRoIHRoaXMgb25lXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgT1Igb3BlcmF0aW9uXG4gICAqL1xuICBvcihjb25kaXRpb246IENvbmRpdGlvbjxNPik6IENvbmRpdGlvbjxNPiB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5vcih0aGlzLCBjb25kaXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmVnYXRpb24gY29uZGl0aW9uXG4gICAqIEBzdW1tYXJ5IEV4Y2x1ZGVzIGEgdmFsdWUgZnJvbSB0aGUgcmVzdWx0IGJ5IGFwcGx5aW5nIGEgTk9UIG9wZXJhdG9yXG4gICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gbmVnYXRlXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgTk9UIG9wZXJhdGlvblxuICAgKi9cbiAgbm90KHZhbDogYW55KTogQ29uZGl0aW9uPE0+IHtcbiAgICByZXR1cm4gbmV3IENvbmRpdGlvbih0aGlzLCBPcGVyYXRvci5OT1QsIHZhbCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyB0aGUgY29uZGl0aW9uIGFuZCBjaGVja3MgZm9yIGVycm9yc1xuICAgKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIHZhbGlkYXRpb24gdG8gZW5zdXJlIHRoZSBjb25kaXRpb24gaXMgcHJvcGVybHkgZm9ybWVkXG4gICAqIEBwYXJhbSB7Li4uc3RyaW5nW119IGV4Y2VwdGlvbnMgLSBGaWVsZHMgdG8gZXhjbHVkZSBmcm9tIHZhbGlkYXRpb25cbiAgICogQHJldHVybiB7TW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWR9IEVycm9yIGRlZmluaXRpb24gaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIG90aGVyd2lzZVxuICAgKi9cbiAgb3ZlcnJpZGUgaGFzRXJyb3JzKFxuICAgIC4uLmV4Y2VwdGlvbnM6IHN0cmluZ1tdXG4gICk6IENvbmRpdGlvbmFsQXN5bmM8SW5mZXJBc3luYzxNPiwgTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBjb25kaXRpb25DaGVjayA9ICgpOiBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkT3BNZXNzYWdlID0gYEludmFsaWQgb3BlcmF0b3IgJHt0aGlzLm9wZXJhdG9yfX1gO1xuXG4gICAgICBpZiAodHlwZW9mIHRoaXMuYXR0cjEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGFyaXNvbiBpbnN0YW5jZW9mIENvbmRpdGlvbilcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29tcGFyaXNvbjoge1xuICAgICAgICAgICAgICBjb25kaXRpb246XG4gICAgICAgICAgICAgICAgXCJCb3RoIHNpZGVzIG9mIHRoZSBjb21wYXJpc29uIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uO1xuICAgICAgICBpZiAoT2JqZWN0LnZhbHVlcyhPcGVyYXRvcikuaW5kZXhPZih0aGlzLm9wZXJhdG9yIGFzIE9wZXJhdG9yKSA9PT0gLTEpXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9wZXJhdG9yOiB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbjogaW52YWxpZE9wTWVzc2FnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBNb2RlbEVycm9yRGVmaW5pdGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYXR0cjEgaW5zdGFuY2VvZiBDb25kaXRpb24pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICEodGhpcy5jb21wYXJpc29uIGluc3RhbmNlb2YgQ29uZGl0aW9uKSAmJlxuICAgICAgICAgIHRoaXMub3BlcmF0b3IgIT09IE9wZXJhdG9yLk5PVFxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbXBhcmlzb246IHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiBpbnZhbGlkT3BNZXNzYWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgT2JqZWN0LnZhbHVlcyhHcm91cE9wZXJhdG9yKS5pbmRleE9mKFxuICAgICAgICAgICAgdGhpcy5vcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yXG4gICAgICAgICAgKSA9PT0gLTEgJiZcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yICE9PSBPcGVyYXRvci5OT1RcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcGVyYXRvcjoge1xuICAgICAgICAgICAgICBjb25kaXRpb246IGludmFsaWRPcE1lc3NhZ2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgTW9kZWxFcnJvckRlZmluaXRpb247XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGVycm9ycyA9IHN1cGVyLmhhc0Vycm9ycyguLi5leGNlcHRpb25zKTtcbiAgICBpZiAoIXRoaXMuaXNBc3luYygpKVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGVycm9ycyBhcyBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCkgPz9cbiAgICAgICAgKGNvbmRpdGlvbkNoZWNrKCkgYXMgYW55KVxuICAgICAgKTtcblxuICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgIGVycm9ycyBhcyB1bmtub3duIGFzIFByb21pc2U8TW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ+XG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlc29sdmVkID8/IGNvbmRpdGlvbkNoZWNrKCk7XG4gICAgfSkoKSBhcyBDb25kaXRpb25hbEFzeW5jPEluZmVyQXN5bmM8TT4sIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBjb25kaXRpb24gdGhhdCBjb21iaW5lcyB0d28gY29uZGl0aW9ucyB3aXRoIGxvZ2ljYWwgQU5EXG4gICAqIEBzdW1tYXJ5IFN0YXRpYyBtZXRob2QgdGhhdCBqb2lucyB0d28gY29uZGl0aW9ucyB3aXRoIGFuIEFORCBvcGVyYXRvciwgcmVxdWlyaW5nIGJvdGggdG8gYmUgdHJ1ZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24xIC0gVGhlIGZpcnN0IGNvbmRpdGlvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uMiAtIFRoZSBzZWNvbmQgY29uZGl0aW9uXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgQU5EIG9wZXJhdGlvblxuICAgKi9cbiAgc3RhdGljIGFuZDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNvbmRpdGlvbjE6IENvbmRpdGlvbjxNPixcbiAgICBjb25kaXRpb24yOiBDb25kaXRpb248TT5cbiAgKTogQ29uZGl0aW9uPE0+IHtcbiAgICByZXR1cm4gQ29uZGl0aW9uLmdyb3VwKGNvbmRpdGlvbjEsIEdyb3VwT3BlcmF0b3IuQU5ELCBjb25kaXRpb24yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBjb25kaXRpb24gdGhhdCBjb21iaW5lcyB0d28gY29uZGl0aW9ucyB3aXRoIGxvZ2ljYWwgT1JcbiAgICogQHN1bW1hcnkgU3RhdGljIG1ldGhvZCB0aGF0IGpvaW5zIHR3byBjb25kaXRpb25zIHdpdGggYW4gT1Igb3BlcmF0b3IsIHJlcXVpcmluZyBhdCBsZWFzdCBvbmUgdG8gYmUgdHJ1ZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24xIC0gVGhlIGZpcnN0IGNvbmRpdGlvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uMiAtIFRoZSBzZWNvbmQgY29uZGl0aW9uXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgT1Igb3BlcmF0aW9uXG4gICAqL1xuICBzdGF0aWMgb3I8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjb25kaXRpb24xOiBDb25kaXRpb248TT4sXG4gICAgY29uZGl0aW9uMjogQ29uZGl0aW9uPE0+XG4gICk6IENvbmRpdGlvbjxNPiB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5ncm91cChjb25kaXRpb24xLCBHcm91cE9wZXJhdG9yLk9SLCBjb25kaXRpb24yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBjb25kaXRpb24gdGhhdCBncm91cHMgdHdvIGNvbmRpdGlvbnMgd2l0aCBhIHNwZWNpZmllZCBvcGVyYXRvclxuICAgKiBAc3VtbWFyeSBQcml2YXRlIHN0YXRpYyBtZXRob2QgdGhhdCBjb21iaW5lcyB0d28gY29uZGl0aW9ucyB1c2luZyB0aGUgc3BlY2lmaWVkIGdyb3VwIG9wZXJhdG9yXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gb3BlcmF0ZXMgb25cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbjEgLSBUaGUgZmlyc3QgY29uZGl0aW9uXG4gICAqIEBwYXJhbSB7R3JvdXBPcGVyYXRvcn0gb3BlcmF0b3IgLSBUaGUgZ3JvdXAgb3BlcmF0b3IgdG8gdXNlIChBTkQsIE9SKVxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uMiAtIFRoZSBzZWNvbmQgY29uZGl0aW9uXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgZ3JvdXBlZCBvcGVyYXRpb25cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdyb3VwPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY29uZGl0aW9uMTogQ29uZGl0aW9uPE0+LFxuICAgIG9wZXJhdG9yOiBHcm91cE9wZXJhdG9yLFxuICAgIGNvbmRpdGlvbjI6IENvbmRpdGlvbjxNPlxuICApOiBDb25kaXRpb248TT4ge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uKGNvbmRpdGlvbjEsIG9wZXJhdG9yLCBjb25kaXRpb24yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGNvbmRpdGlvbiBidWlsZGVyIGZvciBhIHNwZWNpZmljIG1vZGVsIGF0dHJpYnV0ZVxuICAgKiBAc3VtbWFyeSBTdGF0aWMgbWV0aG9kIHRoYXQgaW5pdGlhbGl6ZXMgYSBjb25kaXRpb24gYnVpbGRlciB3aXRoIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gb3BlcmF0ZXMgb25cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgbW9kZWwgYXR0cmlidXRlIHRvIGJ1aWxkIGEgY29uZGl0aW9uIGZvclxuICAgKiBAcmV0dXJuIHtBdHRyaWJ1dGVPcHRpb248TT59IEEgY29uZGl0aW9uIGJ1aWxkZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYXR0cmlidXRlXG4gICAqL1xuICBzdGF0aWMgYXR0cmlidXRlPE0gZXh0ZW5kcyBNb2RlbD4oYXR0cjoga2V5b2YgTSkge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uLkJ1aWxkZXI8TT4oKS5hdHRyaWJ1dGUoYXR0cik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsaWFzIGZvciB0aGUgYXR0cmlidXRlIG1ldGhvZFxuICAgKiBAc3VtbWFyeSBTaG9ydGhhbmQgbWV0aG9kIHRoYXQgaW5pdGlhbGl6ZXMgYSBjb25kaXRpb24gYnVpbGRlciB3aXRoIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gb3BlcmF0ZXMgb25cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgbW9kZWwgYXR0cmlidXRlIHRvIGJ1aWxkIGEgY29uZGl0aW9uIGZvclxuICAgKiBAcmV0dXJuIHtBdHRyaWJ1dGVPcHRpb248TT59IEEgY29uZGl0aW9uIGJ1aWxkZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYXR0cmlidXRlXG4gICAqL1xuICBzdGF0aWMgYXR0cjxNIGV4dGVuZHMgTW9kZWw+KGF0dHI6IGtleW9mIE0pIHtcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGUoYXR0cik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGEgZmx1ZW50IEFQSSB0byBidWlsZCBxdWVyeSBjb25kaXRpb25zXG4gICAqIEBzdW1tYXJ5IEEgYnVpbGRlciBjbGFzcyB0aGF0IHNpbXBsaWZpZXMgdGhlIGNyZWF0aW9uIG9mIGRhdGFiYXNlIHF1ZXJ5IGNvbmRpdGlvbnNcbiAgICogd2l0aCBhIGNoYWluYWJsZSBpbnRlcmZhY2UgZm9yIHNldHRpbmcgYXR0cmlidXRlcyBhbmQgb3BlcmF0b3JzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gYnVpbGRlciBvcGVyYXRlcyBvblxuICAgKiBAY2xhc3MgQ29uZGl0aW9uQnVpbGRlclxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgQnVpbGRlciA9IGNsYXNzIENvbmRpdGlvbkJ1aWxkZXI8TSBleHRlbmRzIE1vZGVsPlxuICAgIGltcGxlbWVudHMgQ29uZGl0aW9uQnVpbGRlck9wdGlvbjxNPiwgQXR0cmlidXRlT3B0aW9uPE0+XG4gIHtcbiAgICBhdHRyMT86IGtleW9mIE0gfCBDb25kaXRpb248TT4gPSB1bmRlZmluZWQ7XG4gICAgb3BlcmF0b3I/OiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgY29tcGFyaXNvbj86IGFueSA9IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBhdHRyaWJ1dGUgZm9yIHRoZSBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hpY2ggbW9kZWwgYXR0cmlidXRlIHRoZSBjb25kaXRpb24gd2lsbCBvcGVyYXRlIG9uXG4gICAgICogQHBhcmFtIGF0dHIgLSBUaGUgbW9kZWwgYXR0cmlidXRlIHRvIHVzZSBpbiB0aGUgY29uZGl0aW9uXG4gICAgICogQHJldHVybiB7QXR0cmlidXRlT3B0aW9uPE0+fSBUaGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgICAqL1xuICAgIGF0dHJpYnV0ZShhdHRyOiBrZXlvZiBNKTogQXR0cmlidXRlT3B0aW9uPE0+IHtcbiAgICAgIHRoaXMuYXR0cjEgPSBhdHRyO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEFsaWFzIGZvciB0aGUgYXR0cmlidXRlIG1ldGhvZFxuICAgICAqIEBzdW1tYXJ5IFNob3J0aGFuZCBtZXRob2QgdG8gc3BlY2lmeSB3aGljaCBtb2RlbCBhdHRyaWJ1dGUgdGhlIGNvbmRpdGlvbiB3aWxsIG9wZXJhdGUgb25cbiAgICAgKiBAcGFyYW0gYXR0ciAtIFRoZSBtb2RlbCBhdHRyaWJ1dGUgdG8gdXNlIGluIHRoZSBjb25kaXRpb25cbiAgICAgKiBAcmV0dXJuIHtBdHRyaWJ1dGVPcHRpb248TT59IFRoaXMgYnVpbGRlciBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAgICovXG4gICAgYXR0cihhdHRyOiBrZXlvZiBNKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGUoYXR0cik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gZXF1YWxpdHkgY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgZXF1YWxzIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIGF0dHJpYnV0ZSBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uXG4gICAgICovXG4gICAgZXEodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkVRVUFMLCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGluZXF1YWxpdHkgY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgYXR0cmlidXRlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGluZXF1YWxpdHkgY29tcGFyaXNvblxuICAgICAqL1xuICAgIGRpZih2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuRElGRkVSRU5ULCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZ3JlYXRlciB0aGFuIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBhdHRyaWJ1dGUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgZ3JlYXRlciB0aGFuIGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBndCh2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuQklHR0VSLCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbGVzcyB0aGFuIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBhdHRyaWJ1dGUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgbGVzcyB0aGFuIGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBsdCh2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuU01BTExFUiwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb25kaXRpb24gdGhhdCBjaGVja3MgaWYgdGhlIGF0dHJpYnV0ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgYXR0cmlidXRlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uXG4gICAgICovXG4gICAgZ3RlKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5CSUdHRVJfRVEsIHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIGF0dHJpYnV0ZSBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBsZXNzIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvblxuICAgICAqL1xuICAgIGx0ZSh2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuU01BTExFUl9FUSwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbmNsdXNpb24gY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgaW5jbHVkZWQgaW4gdGhlIHNwZWNpZmllZCBhcnJheVxuICAgICAqIEBwYXJhbSB7YW55W119IGFyciAtIFRoZSBhcnJheSBvZiB2YWx1ZXMgdG8gY2hlY2sgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgaW5jbHVzaW9uIGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBpbihhcnI6IGFueVtdKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5JTiwgYXJyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb25kaXRpb24gdGhhdCBjaGVja3MgaWYgdGhlIGF0dHJpYnV0ZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjb21wYXJpc29uXG4gICAgICovXG4gICAgcmVnZXhwKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5SRUdFWFAsIG5ldyBSZWdFeHAodmFsKS5zb3VyY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBvcGVyYXRvciBhbmQgY29tcGFyaXNvbiB2YWx1ZSBmb3IgdGhlIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IFByaXZhdGUgbWV0aG9kIHRoYXQgY29uZmlndXJlcyB0aGUgY29uZGl0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBvcGVyYXRvciBhbmQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge09wZXJhdG9yfSBvcCAtIFRoZSBvcGVyYXRvciB0byB1c2UgZm9yIHRoZSBjb25kaXRpb25cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBvcGVyYXRvciBhbmQgdmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldE9wKG9wOiBPcGVyYXRvciwgdmFsOiBhbnkpIHtcbiAgICAgIHRoaXMub3BlcmF0b3IgPSBvcDtcbiAgICAgIHRoaXMuY29tcGFyaXNvbiA9IHZhbDtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdHMgYSBDb25kaXRpb24gaW5zdGFuY2UgZnJvbSB0aGUgYnVpbGRlcidzIHN0YXRlXG4gICAgICogQHN1bW1hcnkgRmluYWxpemVzIHRoZSBjb25kaXRpb24gYnVpbGRpbmcgcHJvY2VzcyBieSBjcmVhdGluZyBhIG5ldyBDb25kaXRpb24gaW5zdGFuY2VcbiAgICAgKiBAdGhyb3dzIHtRdWVyeUVycm9yfSBJZiB0aGUgY29uZGl0aW9uIGNhbm5vdCBiZSBidWlsdCBkdWUgdG8gaW52YWxpZCBwYXJhbWV0ZXJzXG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gaW5zdGFuY2Ugd2l0aCB0aGUgY29uZmlndXJlZCBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZCgpOiBDb25kaXRpb248TT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25kaXRpb24oXG4gICAgICAgICAgdGhpcy5hdHRyMSBhcyBzdHJpbmcgfCBDb25kaXRpb248TT4sXG4gICAgICAgICAgdGhpcy5vcGVyYXRvciBhcyBPcGVyYXRvcixcbiAgICAgICAgICB0aGlzLmNvbXBhcmlzb24gYXMgYW55XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBjb25kaXRpb24gYnVpbGRlclxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNvbmRpdGlvbiBidWlsZGVyXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBjb25kaXRpb24gYnVpbGRlciB3aWxsIG9wZXJhdGUgb25cbiAgICogQHJldHVybiB7Q29uZGl0aW9uQnVpbGRlck9wdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIGJ1aWxkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBidWlsZGVyPE0gZXh0ZW5kcyBNb2RlbD4oKTogQ29uZGl0aW9uQnVpbGRlck9wdGlvbjxNPiB7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb24uQnVpbGRlcjxNPigpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsQ29uc3RydWN0b3IsXG4gIFZhbGlkYXRpb24sXG4gIFZhbGlkYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvLCBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgUmVsYXRpb25zTWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZmluZFByaW1hcnlLZXksXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIFJlcG9zaXRvcnlGbGFncyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDYXNjYWRlIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgb3IgdXBkYXRlcyBhIG1vZGVsIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gY3JlYXRlIGEgbmV3IG1vZGVsIG9yIHVwZGF0ZSBhbiBleGlzdGluZyBvbmUgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgcHJpbWFyeSBrZXlcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gY3JlYXRlIG9yIHVwZGF0ZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7UmVwbzxNLCBGLCBDb250ZXh0PEY+Pn0gW3JlcG9zaXRvcnldIC0gT3B0aW9uYWwgcmVwb3NpdG9yeSB0byB1c2UgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIG9yIHVwZGF0ZWQgbW9kZWxcbiAqIEBmdW5jdGlvbiBjcmVhdGVPclVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBjcmVhdGVPclVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKlxuICogICBDYWxsZXItPj5jcmVhdGVPclVwZGF0ZTogbW9kZWwsIGNvbnRleHQsIHJlcG9zaXRvcnk/XG4gKiAgIGFsdCByZXBvc2l0b3J5IG5vdCBwcm92aWRlZFxuICogICAgIGNyZWF0ZU9yVXBkYXRlLT4+TW9kZWw6IGdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKVxuICogICAgIE1vZGVsLS0+PmNyZWF0ZU9yVXBkYXRlOiBjb25zdHJ1Y3RvclxuICogICAgIGNyZWF0ZU9yVXBkYXRlLT4+UmVwb3NpdG9yeTogZm9yTW9kZWwoY29uc3RydWN0b3IpXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5jcmVhdGVPclVwZGF0ZTogcmVwb3NpdG9yeVxuICogICBlbmRcbiAqXG4gKiAgIGFsdCBwcmltYXJ5IGtleSB1bmRlZmluZWRcbiAqICAgICBjcmVhdGVPclVwZGF0ZS0+PlJlcG9zaXRvcnk6IGNyZWF0ZShtb2RlbCwgY29udGV4dClcbiAqICAgICBSZXBvc2l0b3J5LS0+PmNyZWF0ZU9yVXBkYXRlOiBjcmVhdGVkIG1vZGVsXG4gKiAgIGVsc2UgcHJpbWFyeSBrZXkgZGVmaW5lZFxuICogICAgIGNyZWF0ZU9yVXBkYXRlLT4+UmVwb3NpdG9yeTogdXBkYXRlKG1vZGVsLCBjb250ZXh0KVxuICogICAgIGFsdCB1cGRhdGUgc3VjY2Vzc2Z1bFxuICogICAgICAgUmVwb3NpdG9yeS0tPj5jcmVhdGVPclVwZGF0ZTogdXBkYXRlZCBtb2RlbFxuICogICAgIGVsc2UgTm90Rm91bmRFcnJvclxuICogICAgICAgY3JlYXRlT3JVcGRhdGUtPj5SZXBvc2l0b3J5OiBjcmVhdGUobW9kZWwsIGNvbnRleHQpXG4gKiAgICAgICBSZXBvc2l0b3J5LS0+PmNyZWF0ZU9yVXBkYXRlOiBjcmVhdGVkIG1vZGVsXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICpcbiAqICAgY3JlYXRlT3JVcGRhdGUtLT4+Q2FsbGVyOiBtb2RlbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlT3JVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbj4oXG4gIG1vZGVsOiBNLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBhbGlhcz86IHN0cmluZyxcbiAgcmVwb3NpdG9yeT86IFJlcG88TSwgRiwgQ29udGV4dDxGPj5cbik6IFByb21pc2U8TT4ge1xuICBpZiAoIXJlcG9zaXRvcnkpIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9IE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYENvdWxkIG5vdCBmaW5kIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gKTtcbiAgICByZXBvc2l0b3J5ID0gUmVwb3NpdG9yeS5mb3JNb2RlbDxNLCBSZXBvPE0+PihcbiAgICAgIGNvbnN0cnVjdG9yIGFzIHVua25vd24gYXMgTW9kZWxDb25zdHJ1Y3RvcjxNPixcbiAgICAgIGFsaWFzXG4gICAgKTtcbiAgfVxuICBpZiAodHlwZW9mIG1vZGVsW3JlcG9zaXRvcnkucGtdID09PSBcInVuZGVmaW5lZFwiKVxuICAgIHJldHVybiByZXBvc2l0b3J5LmNyZWF0ZShtb2RlbCwgY29udGV4dCk7XG4gIGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmVwb3NpdG9yeS51cGRhdGUobW9kZWwsIGNvbnRleHQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgcmV0dXJuIHJlcG9zaXRvcnkuY3JlYXRlKG1vZGVsLCBjb250ZXh0KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCBjcmVhdGlvblxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgd2hlbiBjcmVhdGluZyBhIG1vZGVsLCBlaXRoZXIgYnkgcmVmZXJlbmNpbmcgYW4gZXhpc3RpbmcgbW9kZWwgb3IgY3JlYXRpbmcgYSBuZXcgb25lXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvT25lT25DcmVhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9PbmVPbkNyZWF0ZVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+b25lVG9PbmVPbkNyZWF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb09uZU9uQ3JlYXRlLT4+b25lVG9PbmVPbkNyZWF0ZTogY2hlY2sgaWYgcHJvcGVydHlWYWx1ZSBleGlzdHNcbiAqXG4gKiAgIGFsdCBwcm9wZXJ0eVZhbHVlIGlzIG5vdCBhbiBvYmplY3RcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBrZXlcbiAqICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5vbmVUb09uZU9uQ3JlYXRlOiBpbm5lclJlcG9cbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+aW5uZXJSZXBvOiByZWFkKHByb3BlcnR5VmFsdWUpXG4gKiAgICAgaW5uZXJSZXBvLS0+Pm9uZVRvT25lT25DcmVhdGU6IHJlYWRcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBwcm9wZXJ0eVZhbHVlLCByZWFkXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+Pm9uZVRvT25lT25DcmVhdGU6IHNldCBtb2RlbFtrZXldID0gcHJvcGVydHlWYWx1ZVxuICogICBlbHNlIHByb3BlcnR5VmFsdWUgaXMgYW4gb2JqZWN0XG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+Pk1vZGVsOiBnZXQoZGF0YS5jbGFzcylcbiAqICAgICBNb2RlbC0tPj5vbmVUb09uZU9uQ3JlYXRlOiBjb25zdHJ1Y3RvclxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5SZXBvc2l0b3J5OiBmb3JNb2RlbChjb25zdHJ1Y3RvcilcbiAqICAgICBSZXBvc2l0b3J5LS0+Pm9uZVRvT25lT25DcmVhdGU6IHJlcG9cbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+cmVwbzogY3JlYXRlKHByb3BlcnR5VmFsdWUpXG4gKiAgICAgcmVwby0tPj5vbmVUb09uZU9uQ3JlYXRlOiBjcmVhdGVkXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PmZpbmRQcmltYXJ5S2V5OiBjcmVhdGVkXG4gKiAgICAgZmluZFByaW1hcnlLZXktLT4+b25lVG9PbmVPbkNyZWF0ZTogcGtcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBjcmVhdGVkW3BrXSwgY3JlYXRlZFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5vbmVUb09uZU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IGNyZWF0ZWRbcGtdXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9PbmVPbkNyZWF0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZTogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlKSByZXR1cm47XG5cbiAgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgaW5uZXJSZXBvID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEoXG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICAgICk7XG4gICAgY29uc3QgcmVhZCA9IGF3YWl0IGlubmVyUmVwby5yZWFkKHByb3BlcnR5VmFsdWUpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBwcm9wZXJ0eVZhbHVlLCByZWFkKTtcbiAgICAobW9kZWwgYXMgYW55KVtrZXldID0gcHJvcGVydHlWYWx1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICBkYXRhLmNsYXNzID1cbiAgICB0eXBlb2YgZGF0YS5jbGFzcyA9PT0gXCJzdHJpbmdcIiA/IGRhdGEuY2xhc3MgOiAoZGF0YS5jbGFzcyBhcyBhbnkpKCkubmFtZTtcblxuICBjb25zdCBjb25zdHJ1Y3RvciA9IE1vZGVsLmdldChkYXRhLmNsYXNzIGFzIHN0cmluZyk7XG4gIGlmICghY29uc3RydWN0b3IpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYENvdWxkIG5vdCBmaW5kIG1vZGVsICR7ZGF0YS5jbGFzc31gKTtcbiAgY29uc3QgcmVwbzogUmVwbzxhbnk+ID0gUmVwb3NpdG9yeS5mb3JNb2RlbChjb25zdHJ1Y3RvciwgdGhpcy5hZGFwdGVyLmFsaWFzKTtcbiAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHJlcG8uY3JlYXRlKHByb3BlcnR5VmFsdWUpO1xuICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KGNyZWF0ZWQpLmlkO1xuICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgY3JlYXRlZFtwa10sIGNyZWF0ZWQpO1xuICAobW9kZWwgYXMgYW55KVtrZXldID0gY3JlYXRlZFtwa107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgdXBkYXRlc1xuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgd2hlbiB1cGRhdGluZyBhIG1vZGVsLCBlaXRoZXIgYnkgcmVmZXJlbmNpbmcgYW4gZXhpc3RpbmcgbW9kZWwgb3IgdXBkYXRpbmcgdGhlIHJlbGF0ZWQgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gb25lVG9PbmVPblVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBvbmVUb09uZU9uVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IGNyZWF0ZU9yVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IGZpbmRQcmltYXJ5S2V5XG4gKiAgIHBhcnRpY2lwYW50IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+b25lVG9PbmVPblVwZGF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb09uZU9uVXBkYXRlLT4+b25lVG9PbmVPblVwZGF0ZTogY2hlY2sgaWYgcHJvcGVydHlWYWx1ZSBleGlzdHNcbiAqICAgb25lVG9PbmVPblVwZGF0ZS0+Pm9uZVRvT25lT25VcGRhdGU6IGNoZWNrIGlmIGNhc2NhZGUudXBkYXRlIGlzIENBU0NBREVcbiAqXG4gKiAgIGFsdCBwcm9wZXJ0eVZhbHVlIGlzIG5vdCBhbiBvYmplY3RcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBrZXlcbiAqICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5vbmVUb09uZU9uVXBkYXRlOiBpbm5lclJlcG9cbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+aW5uZXJSZXBvOiByZWFkKHByb3BlcnR5VmFsdWUpXG4gKiAgICAgaW5uZXJSZXBvLS0+Pm9uZVRvT25lT25VcGRhdGU6IHJlYWRcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBwcm9wZXJ0eVZhbHVlLCByZWFkXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+Pm9uZVRvT25lT25VcGRhdGU6IHNldCBtb2RlbFtrZXldID0gcHJvcGVydHlWYWx1ZVxuICogICBlbHNlIHByb3BlcnR5VmFsdWUgaXMgYW4gb2JqZWN0XG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PmNyZWF0ZU9yVXBkYXRlOiBtb2RlbFtrZXldLCBjb250ZXh0XG4gKiAgICAgY3JlYXRlT3JVcGRhdGUtLT4+b25lVG9PbmVPblVwZGF0ZTogdXBkYXRlZFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5maW5kUHJpbWFyeUtleTogdXBkYXRlZFxuICogICAgIGZpbmRQcmltYXJ5S2V5LS0+Pm9uZVRvT25lT25VcGRhdGU6IHBrXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgdXBkYXRlZFtwa10sIHVwZGF0ZWRcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+b25lVG9PbmVPblVwZGF0ZTogc2V0IG1vZGVsW2tleV0gPSB1cGRhdGVkW3BrXVxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvT25lT25VcGRhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb09uZU9uVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3BlcnR5VmFsdWU6IGFueSA9IG1vZGVsW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZSkgcmV0dXJuO1xuICBpZiAoZGF0YS5jYXNjYWRlLnVwZGF0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG5cbiAgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgaW5uZXJSZXBvID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEoXG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICAgICk7XG4gICAgY29uc3QgcmVhZCA9IGF3YWl0IGlubmVyUmVwby5yZWFkKHByb3BlcnR5VmFsdWUpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBwcm9wZXJ0eVZhbHVlLCByZWFkKTtcbiAgICAobW9kZWwgYXMgYW55KVtrZXldID0gcHJvcGVydHlWYWx1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB1cGRhdGVkID0gYXdhaXQgY3JlYXRlT3JVcGRhdGUoXG4gICAgbW9kZWxba2V5XSBhcyBNLFxuICAgIGNvbnRleHQsXG4gICAgdGhpcy5hZGFwdGVyLmFsaWFzXG4gICk7XG4gIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkodXBkYXRlZCkuaWQ7XG4gIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShcbiAgICBjb250ZXh0LFxuICAgIG1vZGVsLFxuICAgIGtleSxcbiAgICB1cGRhdGVkW3BrXSBhcyBzdHJpbmcsXG4gICAgdXBkYXRlZFxuICApO1xuICBtb2RlbFtrZXldID0gdXBkYXRlZFtwa107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgZGVsZXRpb25cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIHdoZW4gZGVsZXRpbmcgYSBtb2RlbCwgZGVsZXRpbmcgdGhlIHJlbGF0ZWQgbW9kZWwgaWYgY2FzY2FkZSBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvT25lT25EZWxldGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9PbmVPbkRlbGV0ZVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvT25lT25EZWxldGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9PbmVPbkRlbGV0ZS0+Pm9uZVRvT25lT25EZWxldGU6IGNoZWNrIGlmIHByb3BlcnR5VmFsdWUgZXhpc3RzXG4gKiAgIG9uZVRvT25lT25EZWxldGUtPj5vbmVUb09uZU9uRGVsZXRlOiBjaGVjayBpZiBjYXNjYWRlLnVwZGF0ZSBpcyBDQVNDQURFXG4gKlxuICogICBvbmVUb09uZU9uRGVsZXRlLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBrZXlcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9PbmVPbkRlbGV0ZTogaW5uZXJSZXBvXG4gKlxuICogICBhbHQgcHJvcGVydHlWYWx1ZSBpcyBub3QgYSBNb2RlbCBpbnN0YW5jZVxuICogICAgIG9uZVRvT25lT25EZWxldGUtPj5pbm5lclJlcG86IGRlbGV0ZShtb2RlbFtrZXldLCBjb250ZXh0KVxuICogICAgIGlubmVyUmVwby0tPj5vbmVUb09uZU9uRGVsZXRlOiBkZWxldGVkXG4gKiAgIGVsc2UgcHJvcGVydHlWYWx1ZSBpcyBhIE1vZGVsIGluc3RhbmNlXG4gKiAgICAgb25lVG9PbmVPbkRlbGV0ZS0+PmlubmVyUmVwbzogZGVsZXRlKG1vZGVsW2tleV1baW5uZXJSZXBvLnBrXSwgY29udGV4dClcbiAqICAgICBpbm5lclJlcG8tLT4+b25lVG9PbmVPbkRlbGV0ZTogZGVsZXRlZFxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvT25lT25EZWxldGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIGRlbGV0ZWRbaW5uZXJSZXBvLnBrXSwgZGVsZXRlZFxuICogICBvbmVUb09uZU9uRGVsZXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9PbmVPbkRlbGV0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9wZXJ0eVZhbHVlOiBhbnkgPSBtb2RlbFtrZXldO1xuICBpZiAoIXByb3BlcnR5VmFsdWUpIHJldHVybjtcbiAgaWYgKGRhdGEuY2FzY2FkZS51cGRhdGUgIT09IENhc2NhZGUuQ0FTQ0FERSkgcmV0dXJuO1xuICBjb25zdCBpbm5lclJlcG86IFJlcG88TT4gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShcbiAgICBtb2RlbCxcbiAgICBrZXksXG4gICAgdGhpcy5hZGFwdGVyLmFsaWFzXG4gICk7XG4gIGxldCBkZWxldGVkOiBNO1xuICBpZiAoIShwcm9wZXJ0eVZhbHVlIGluc3RhbmNlb2YgTW9kZWwpKVxuICAgIGRlbGV0ZWQgPSBhd2FpdCBpbm5lclJlcG8uZGVsZXRlKG1vZGVsW2tleV0gYXMgc3RyaW5nLCBjb250ZXh0KTtcbiAgZWxzZVxuICAgIGRlbGV0ZWQgPSBhd2FpdCBpbm5lclJlcG8uZGVsZXRlKFxuICAgICAgKG1vZGVsW2tleV0gYXMgTSlbaW5uZXJSZXBvLnBrIGFzIGtleW9mIE1dIGFzIHN0cmluZyxcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXksXG4gICAgZGVsZXRlZFtpbm5lclJlcG8ucGtdIGFzIHN0cmluZyxcbiAgICBkZWxldGVkXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGNyZWF0aW9uXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgd2hlbiBjcmVhdGluZyBhIG1vZGVsLCBlaXRoZXIgYnkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgbW9kZWxzIG9yIGNyZWF0aW5nIG5ldyBvbmVzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueU9uQ3JlYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uQ3JlYXRlXG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IGNyZWF0ZU9yVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IGZpbmRQcmltYXJ5S2V5XG4gKiAgIHBhcnRpY2lwYW50IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+b25lVG9NYW55T25DcmVhdGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogY2hlY2sgaWYgcHJvcGVydHlWYWx1ZXMgZXhpc3RzIGFuZCBoYXMgbGVuZ3RoXG4gKiAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGNoZWNrIGlmIGFsbCBlbGVtZW50cyBoYXZlIHNhbWUgdHlwZVxuICogICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjcmVhdGUgdW5pcXVlVmFsdWVzIHNldFxuICpcbiAqICAgYWx0IGFycmF5VHlwZSBpcyBub3QgXCJvYmplY3RcIlxuICogICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBrZXlcbiAqICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5vbmVUb01hbnlPbkNyZWF0ZTogcmVwb1xuICogICAgIGxvb3AgZm9yIGVhY2ggaWQgaW4gdW5pcXVlVmFsdWVzXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PnJlcG86IHJlYWQoaWQpXG4gKiAgICAgICByZXBvLS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiByZWFkXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgaWQsIHJlYWRcbiAqICAgICBlbmRcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdXG4gKiAgIGVsc2UgYXJyYXlUeXBlIGlzIFwib2JqZWN0XCJcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PmZpbmRQcmltYXJ5S2V5OiBwcm9wZXJ0eVZhbHVlc1swXVxuICogICAgIGZpbmRQcmltYXJ5S2V5LS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBwa05hbWVcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjcmVhdGUgcmVzdWx0IHNldFxuICogICAgIGxvb3AgZm9yIGVhY2ggbSBpbiBwcm9wZXJ0eVZhbHVlc1xuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5jcmVhdGVPclVwZGF0ZTogbSwgY29udGV4dFxuICogICAgICAgY3JlYXRlT3JVcGRhdGUtLT4+b25lVG9NYW55T25DcmVhdGU6IHJlY29yZFxuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIHJlY29yZFtwa05hbWVdLCByZWNvcmRcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGFkZCByZWNvcmRbcGtOYW1lXSB0byByZXN1bHRcbiAqICAgICBlbmRcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IFsuLi5yZXN1bHRdXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25DcmVhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb01hbnlPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9wZXJ0eVZhbHVlczogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlcyB8fCAhcHJvcGVydHlWYWx1ZXMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGFycmF5VHlwZSA9IHR5cGVvZiBwcm9wZXJ0eVZhbHVlc1swXTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlcy5ldmVyeSgoaXRlbTogYW55KSA9PiB0eXBlb2YgaXRlbSA9PT0gYXJyYXlUeXBlKSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBJbnZhbGlkIG9wZXJhdGlvbi4gQWxsIGVsZW1lbnRzIG9mIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gbXVzdCBtYXRjaCB0aGUgc2FtZSB0eXBlLmBcbiAgICApO1xuICBjb25zdCB1bmlxdWVWYWx1ZXMgPSBuZXcgU2V0KFsuLi5wcm9wZXJ0eVZhbHVlc10pO1xuICBpZiAoYXJyYXlUeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcmVwbyA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKG1vZGVsLCBrZXksIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgZm9yIChjb25zdCBpZCBvZiB1bmlxdWVWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IHJlYWQgPSBhd2FpdCByZXBvLnJlYWQoaWQpO1xuICAgICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCByZWFkKTtcbiAgICB9XG4gICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBrTmFtZSA9IGZpbmRQcmltYXJ5S2V5KHByb3BlcnR5VmFsdWVzWzBdKS5pZDtcblxuICBjb25zdCByZXN1bHQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIGZvciAoY29uc3QgbSBvZiBwcm9wZXJ0eVZhbHVlcykge1xuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGNyZWF0ZU9yVXBkYXRlKG0sIGNvbnRleHQsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIHJlY29yZFtwa05hbWVdLCByZWNvcmQpO1xuICAgIHJlc3VsdC5hZGQocmVjb3JkW3BrTmFtZV0pO1xuICB9XG5cbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IFsuLi5yZXN1bHRdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCB1cGRhdGVzXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgd2hlbiB1cGRhdGluZyBhIG1vZGVsLCBkZWxlZ2F0aW5nIHRvIG9uZVRvTWFueU9uQ3JlYXRlIGlmIGNhc2NhZGUgdXBkYXRlIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gb25lVG9NYW55T25VcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9NYW55T25VcGRhdGVcbiAqICAgcGFydGljaXBhbnQgb25lVG9NYW55T25DcmVhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvTWFueU9uVXBkYXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvTWFueU9uVXBkYXRlLT4+b25lVG9NYW55T25VcGRhdGU6IGNoZWNrIGlmIGNhc2NhZGUudXBkYXRlIGlzIENBU0NBREVcbiAqXG4gKiAgIGFsdCBjYXNjYWRlLnVwZGF0ZSBpcyBDQVNDQURFXG4gKiAgICAgb25lVG9NYW55T25VcGRhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogYXBwbHkodGhpcywgW2NvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxdKVxuICogICAgIG9uZVRvTWFueU9uQ3JlYXRlLS0+Pm9uZVRvTWFueU9uVXBkYXRlOiB2b2lkXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25VcGRhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb01hbnlPblVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGNhc2NhZGUgfSA9IGRhdGE7XG4gIGlmIChjYXNjYWRlLnVwZGF0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG4gIHJldHVybiBvbmVUb01hbnlPbkNyZWF0ZS5hcHBseSh0aGlzIGFzIGFueSwgW1xuICAgIGNvbnRleHQsXG4gICAgZGF0YSxcbiAgICBrZXkgYXMga2V5b2YgTW9kZWwsXG4gICAgbW9kZWwsXG4gIF0pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBkZWxldGlvblxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIHdoZW4gZGVsZXRpbmcgYSBtb2RlbCwgZGVsZXRpbmcgYWxsIHJlbGF0ZWQgbW9kZWxzIGlmIGNhc2NhZGUgZGVsZXRlIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gb25lVG9NYW55T25EZWxldGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9NYW55T25EZWxldGVcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvTWFueU9uRGVsZXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IGNoZWNrIGlmIGNhc2NhZGUuZGVsZXRlIGlzIENBU0NBREVcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogY2hlY2sgaWYgdmFsdWVzIGV4aXN0cyBhbmQgaGFzIGxlbmd0aFxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjaGVjayBpZiBhbGwgZWxlbWVudHMgaGF2ZSBzYW1lIHR5cGVcbiAqXG4gKiAgIGFsdCBpc0luc3RhbnRpYXRlZCAoYXJyYXlUeXBlIGlzIFwib2JqZWN0XCIpXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5SZXBvc2l0b3J5OiBmb3JNb2RlbCh2YWx1ZXNbMF0pXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5vbmVUb01hbnlPbkRlbGV0ZTogcmVwb1xuICogICBlbHNlIG5vdCBpbnN0YW50aWF0ZWRcbiAqICAgICBvbmVUb01hbnlPbkRlbGV0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9NYW55T25EZWxldGU6IHJlcG9cbiAqICAgZW5kXG4gKlxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjcmVhdGUgdW5pcXVlVmFsdWVzIHNldFxuICpcbiAqICAgbG9vcCBmb3IgZWFjaCBpZCBpbiB1bmlxdWVWYWx1ZXNcbiAqICAgICBvbmVUb01hbnlPbkRlbGV0ZS0+PnJlcG86IGRlbGV0ZShpZCwgY29udGV4dClcbiAqICAgICByZXBvLS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBkZWxldGVkXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCBkZWxldGVkXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogc2V0IG1vZGVsW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXVxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvTWFueU9uRGVsZXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkYXRhLmNhc2NhZGUuZGVsZXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcbiAgY29uc3QgdmFsdWVzID0gbW9kZWxba2V5XSBhcyBhbnk7XG4gIGlmICghdmFsdWVzIHx8ICF2YWx1ZXMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGFycmF5VHlwZSA9IHR5cGVvZiB2YWx1ZXNbMF07XG4gIGNvbnN0IGFyZUFsbFNhbWVUeXBlID0gdmFsdWVzLmV2ZXJ5KChpdGVtOiBhbnkpID0+IHR5cGVvZiBpdGVtID09PSBhcnJheVR5cGUpO1xuICBpZiAoIWFyZUFsbFNhbWVUeXBlKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEludmFsaWQgb3BlcmF0aW9uLiBBbGwgZWxlbWVudHMgb2YgcHJvcGVydHkgJHtrZXkgYXMgc3RyaW5nfSBtdXN0IG1hdGNoIHRoZSBzYW1lIHR5cGUuYFxuICAgICk7XG4gIGNvbnN0IGlzSW5zdGFudGlhdGVkID0gYXJyYXlUeXBlID09PSBcIm9iamVjdFwiO1xuICBjb25zdCByZXBvID0gaXNJbnN0YW50aWF0ZWRcbiAgICA/IFJlcG9zaXRvcnkuZm9yTW9kZWwodmFsdWVzWzBdLCB0aGlzLmFkYXB0ZXIuYWxpYXMpXG4gICAgOiByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwga2V5LCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuXG4gIGNvbnN0IHVuaXF1ZVZhbHVlcyA9IG5ldyBTZXQoW1xuICAgIC4uLihpc0luc3RhbnRpYXRlZFxuICAgICAgPyB2YWx1ZXMubWFwKCh2OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2W3JlcG8ucGsgYXMgc3RyaW5nXSlcbiAgICAgIDogdmFsdWVzKSxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBpZCBvZiB1bmlxdWVWYWx1ZXMudmFsdWVzKCkpIHtcbiAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgcmVwby5kZWxldGUoaWQsIGNvbnRleHQpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBpZCwgZGVsZXRlZCk7XG4gIH1cbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBrZXkgZm9yIGNhY2hpbmcgcG9wdWxhdGVkIG1vZGVsIHJlbGF0aW9uc2hpcHNcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSB1bmlxdWUga2V5IGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIHBvcHVsYXRlZCBtb2RlbCByZWxhdGlvbnNoaXBzIGluIHRoZSBjYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBvciBtb2RlbFxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByZWxhdGVkIG1vZGVsXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEEgZG90LXNlcGFyYXRlZCBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBmdW5jdGlvbiBnZXRQb3B1bGF0ZUtleVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3B1bGF0ZUtleShcbiAgdGFibGVOYW1lOiBzdHJpbmcsXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICBpZDogc3RyaW5nIHwgbnVtYmVyXG4pIHtcbiAgcmV0dXJuIFtQZXJzaXN0ZW5jZUtleXMuUE9QVUxBVEUsIHRhYmxlTmFtZSwgZmllbGROYW1lLCBpZF0uam9pbihcIi5cIik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENhY2hlcyBhIG1vZGVsIGZvciBsYXRlciBwb3B1bGF0aW9uXG4gKiBAc3VtbWFyeSBTdG9yZXMgYSBtb2RlbCBpbiB0aGUgY29udGV4dCBjYWNoZSBmb3IgZWZmaWNpZW50IHJldHJpZXZhbCBkdXJpbmcgcmVsYXRpb25zaGlwIHBvcHVsYXRpb25cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge019IHBhcmVudE1vZGVsIC0gVGhlIHBhcmVudCBtb2RlbCB0aGF0IGNvbnRhaW5zIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHBrVmFsdWUgLSBUaGUgcHJpbWFyeSBrZXkgdmFsdWUgb2YgdGhlIHJlbGF0ZWQgbW9kZWxcbiAqIEBwYXJhbSB7YW55fSBjYWNoZVZhbHVlIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNhY2hlXG4gKiBAcmV0dXJuIHtQcm9taXNlPGFueT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgY2FjaGUgb3BlcmF0aW9uXG4gKiBAZnVuY3Rpb24gY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhY2hlTW9kZWxGb3JQb3B1bGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuPihcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgcGFyZW50TW9kZWw6IE0sXG4gIHByb3BlcnR5S2V5OiBrZXlvZiBNIHwgc3RyaW5nLFxuICBwa1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4gIGNhY2hlVmFsdWU6IGFueVxuKSB7XG4gIGNvbnN0IGNhY2hlS2V5ID0gZ2V0UG9wdWxhdGVLZXkoXG4gICAgcGFyZW50TW9kZWwuY29uc3RydWN0b3IubmFtZSxcbiAgICBwcm9wZXJ0eUtleSBhcyBzdHJpbmcsXG4gICAgcGtWYWx1ZVxuICApO1xuICByZXR1cm4gY29udGV4dC5hY2N1bXVsYXRlKHsgW2NhY2hlS2V5XTogY2FjaGVWYWx1ZSB9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUG9wdWxhdGVzIGEgbW9kZWwncyByZWxhdGlvbnNoaXBcbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbmQgYXR0YWNoZXMgcmVsYXRlZCBtb2RlbHMgdG8gYSBtb2RlbCdzIHJlbGF0aW9uc2hpcCBwcm9wZXJ0eVxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBwb3B1bGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBwb3B1bGF0ZVxuICogICBwYXJ0aWNpcGFudCBmZXRjaFBvcHVsYXRlVmFsdWVzXG4gKiAgIHBhcnRpY2lwYW50IGdldFBvcHVsYXRlS2V5XG4gKiAgIHBhcnRpY2lwYW50IENvbnRleHRcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqXG4gKiAgIENhbGxlci0+PnBvcHVsYXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIHBvcHVsYXRlLT4+cG9wdWxhdGU6IGNoZWNrIGlmIGRhdGEucG9wdWxhdGUgaXMgdHJ1ZVxuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBnZXQgbmVzdGVkIHZhbHVlIGFuZCBjaGVjayBpZiBpdCBleGlzdHNcbiAqXG4gKiAgIHBvcHVsYXRlLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogY29udGV4dCwgbW9kZWwsIGtleSwgaXNBcnIgPyBuZXN0ZWQgOiBbbmVzdGVkXVxuICpcbiAqICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IGluaXRpYWxpemUgdmFyaWFibGVzXG4gKlxuICogICBsb29wIGZvciBlYWNoIHByb0tleVZhbHVlIGluIHByb3BLZXlWYWx1ZXNcbiAqICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+Z2V0UG9wdWxhdGVLZXk6IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsIHByb3BOYW1lLCBwcm9LZXlWYWx1ZVxuICogICAgIGdldFBvcHVsYXRlS2V5LS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IGNhY2hlS2V5XG4gKlxuICogICAgIGFsdCB0cnkgdG8gZ2V0IGZyb20gY2FjaGVcbiAqICAgICAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5Db250ZXh0OiBnZXQoY2FjaGVLZXkpXG4gKiAgICAgICBDb250ZXh0LS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IHZhbFxuICogICAgIGVsc2UgY2F0Y2ggZXJyb3JcbiAqICAgICAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIHByb3BOYW1lXG4gKiAgICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiByZXBvXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+cmVwbzogcmVhZChwcm9LZXlWYWx1ZSlcbiAqICAgICAgIHJlcG8tLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogdmFsXG4gKiAgICAgZW5kXG4gKlxuICogICAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBhZGQgdmFsIHRvIHJlc3VsdHNcbiAqICAgZW5kXG4gKlxuICogICBmZXRjaFBvcHVsYXRlVmFsdWVzLS0+PnBvcHVsYXRlOiByZXN1bHRzXG4gKiAgIHBvcHVsYXRlLT4+cG9wdWxhdGU6IHNldCBtb2RlbFtrZXldID0gaXNBcnIgPyByZXMgOiByZXNbMF1cbiAqICAgcG9wdWxhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb3B1bGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWRhdGEucG9wdWxhdGUpIHJldHVybjtcbiAgY29uc3QgbmVzdGVkOiBhbnkgPSBtb2RlbFtrZXldO1xuICBjb25zdCBpc0FyciA9IEFycmF5LmlzQXJyYXkobmVzdGVkKTtcbiAgaWYgKHR5cGVvZiBuZXN0ZWQgPT09IFwidW5kZWZpbmVkXCIgfHwgKGlzQXJyICYmIG5lc3RlZC5sZW5ndGggPT09IDApKSByZXR1cm47XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hQb3B1bGF0ZVZhbHVlcyhcbiAgICBjOiBDb250ZXh0PEY+LFxuICAgIG1vZGVsOiBNLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgcHJvcEtleVZhbHVlczogYW55W10sXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IGNhY2hlS2V5OiBzdHJpbmc7XG4gICAgbGV0IHZhbDogYW55O1xuICAgIGNvbnN0IHJlc3VsdHM6IE1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvS2V5VmFsdWUgb2YgcHJvcEtleVZhbHVlcykge1xuICAgICAgY2FjaGVLZXkgPSBnZXRQb3B1bGF0ZUtleShtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCBwcm9wTmFtZSwgcHJvS2V5VmFsdWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsID0gYXdhaXQgYy5nZXQoY2FjaGVLZXkgYXMgYW55KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGNvbnN0IHJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwgcHJvcE5hbWUsIGFsaWFzKTtcbiAgICAgICAgaWYgKCFyZXBvKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHJlcG9cIik7XG4gICAgICAgIHZhbCA9IGF3YWl0IHJlcG8ucmVhZChwcm9LZXlWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXN1bHRzLnB1c2godmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hQb3B1bGF0ZVZhbHVlcyhcbiAgICBjb250ZXh0LFxuICAgIG1vZGVsLFxuICAgIGtleSBhcyBzdHJpbmcsXG4gICAgaXNBcnIgPyBuZXN0ZWQgOiBbbmVzdGVkXSxcbiAgICB0aGlzLmFkYXB0ZXIuYWxpYXNcbiAgKTtcbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IGlzQXJyID8gcmVzIDogcmVzWzBdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMaXN0IG9mIGNvbW1vbiBKYXZhU2NyaXB0IHR5cGVzXG4gKiBAc3VtbWFyeSBBbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyBjb21tb24gSmF2YVNjcmlwdCB0eXBlcyB0aGF0IGFyZSBub3QgY3VzdG9tIG1vZGVsIHR5cGVzXG4gKiBAY29uc3QgY29tbW9tVHlwZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5jb25zdCBjb21tb21UeXBlcyA9IFtcbiAgXCJhcnJheVwiLFxuICBcInN0cmluZ1wiLFxuICBcIm51bWJlclwiLFxuICBcImJvb2xlYW5cIixcbiAgXCJzeW1ib2xcIixcbiAgXCJmdW5jdGlvblwiLFxuICBcIm9iamVjdFwiLFxuICBcInVuZGVmaW5lZFwiLFxuICBcIm51bGxcIixcbiAgXCJiaWdpbnRcIixcbl07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwgcHJvcGVydHkgYmFzZWQgb24gaXRzIHR5cGUgbWV0YWRhdGFcbiAqIEBzdW1tYXJ5IEV4YW1pbmVzIGEgbW9kZWwgcHJvcGVydHkncyB0eXBlIG1ldGFkYXRhIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgcmVwb3NpdG9yeSBmb3IgcmVsYXRlZCBtb2RlbHNcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge2FueX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgY29udGFpbmluZyB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gZXhhbWluZVxuICogQHJldHVybiB7UmVwbzxNPn0gQSByZXBvc2l0b3J5IGZvciB0aGUgbW9kZWwgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgUmVmbGVjdFxuICogICBwYXJ0aWNpcGFudCBWYWxpZGF0aW9uXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAqXG4gKiAgIENhbGxlci0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwgcHJvcGVydHlLZXlcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+VmFsaWRhdGlvbjoga2V5KEFycmF5LmlzQXJyYXkobW9kZWxbcHJvcGVydHlLZXldKSA/IFZhbGlkYXRpb25LZXlzLkxJU1QgOiBWYWxpZGF0aW9uS2V5cy5UWVBFKVxuICogICBWYWxpZGF0aW9uLS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiB2YWxpZGF0aW9uS2V5XG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PlJlZmxlY3Q6IGdldE1ldGFkYXRhKHZhbGlkYXRpb25LZXksIG1vZGVsLCBwcm9wZXJ0eUtleSlcbiAqICAgUmVmbGVjdC0tPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogdHlwZXNcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGRldGVybWluZSBjdXN0b21UeXBlcyBiYXNlZCBvbiBwcm9wZXJ0eSB0eXBlXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNoZWNrIGlmIHR5cGVzIGFuZCBjdXN0b21UeXBlcyBleGlzdFxuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogY3JlYXRlIGFsbG93ZWRUeXBlcyBhcnJheVxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBmaW5kIGNvbnN0cnVjdG9yTmFtZSBub3QgaW4gY29tbW9tVHlwZXNcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogY2hlY2sgaWYgY29uc3RydWN0b3JOYW1lIGV4aXN0c1xuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5Nb2RlbDogZ2V0KGNvbnN0cnVjdG9yTmFtZSlcbiAqICAgTW9kZWwtLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNvbnN0cnVjdG9yXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNoZWNrIGlmIGNvbnN0cnVjdG9yIGV4aXN0c1xuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5SZXBvc2l0b3J5OiBmb3JNb2RlbChjb25zdHJ1Y3RvcilcbiAqICAgUmVwb3NpdG9yeS0tPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogcmVwb1xuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+Q2FsbGVyOiByZXBvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogYW55LFxuICBwcm9wZXJ0eUtleTogc3RyaW5nIHwga2V5b2YgTSxcbiAgYWxpYXM/OiBzdHJpbmdcbik6IFJlcG88TT4ge1xuICBjb25zdCB0eXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgVmFsaWRhdGlvbi5rZXkoXG4gICAgICBBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5S2V5XSlcbiAgICAgICAgPyBWYWxpZGF0aW9uS2V5cy5MSVNUXG4gICAgICAgIDogVmFsaWRhdGlvbktleXMuVFlQRVxuICAgICksXG4gICAgbW9kZWwsXG4gICAgcHJvcGVydHlLZXkgYXMgc3RyaW5nXG4gICk7XG4gIGNvbnN0IGN1c3RvbVR5cGVzOiBhbnkgPSBBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5S2V5XSlcbiAgICA/IHR5cGVzLmNsYXp6XG4gICAgOiB0eXBlcy5jdXN0b21UeXBlcztcbiAgaWYgKCF0eXBlcyB8fCAhY3VzdG9tVHlwZXMpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGZpbmQgdHlwZXMgZGVjb3JhdG9ycyBmb3IgcHJvcGVydHkgJHtwcm9wZXJ0eUtleSBhcyBzdHJpbmd9YFxuICAgICk7XG5cbiAgY29uc3QgYWxsb3dlZFR5cGVzOiBzdHJpbmdbXSA9IChcbiAgICBBcnJheS5pc0FycmF5KGN1c3RvbVR5cGVzKSA/IFsuLi5jdXN0b21UeXBlc10gOiBbY3VzdG9tVHlwZXNdXG4gICkubWFwKCh0KSA9PiAodHlwZW9mIHQgPT09IFwiZnVuY3Rpb25cIiA/IHQoKSA6IHQpKTtcbiAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gYWxsb3dlZFR5cGVzLmZpbmQoXG4gICAgKHQpID0+ICFjb21tb21UeXBlcy5pbmNsdWRlcyhgJHt0fWAudG9Mb3dlckNhc2UoKSlcbiAgKTtcbiAgaWYgKCFjb25zdHJ1Y3Rvck5hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgUHJvcGVydHkga2V5ICR7cHJvcGVydHlLZXkgYXMgc3RyaW5nfSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgY29uc3RydWN0b3IgdHlwZWBcbiAgICApO1xuICBjb25zdCBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8TT4gfCB1bmRlZmluZWQgPSBNb2RlbC5nZXQoY29uc3RydWN0b3JOYW1lKTtcbiAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gcmVnaXN0ZXJlZCBtb2RlbCBmb3VuZCBmb3IgJHtjb25zdHJ1Y3Rvck5hbWV9YCk7XG5cbiAgcmV0dXJuIFJlcG9zaXRvcnkuZm9yTW9kZWwoY29uc3RydWN0b3IsIGFsaWFzKTtcbn1cblxuIiwiaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgb25DcmVhdGUsXG4gIG9uQ3JlYXRlVXBkYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25VcGRhdGUsXG4gIGFmdGVyQW55LFxuICBSZXBvc2l0b3J5RmxhZ3MsXG4gIENvbnRleHQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDYXNjYWRlTWV0YWRhdGEsIEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdENhc2NhZGUsIE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgbGlzdCxcbiAgTW9kZWwsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbiAgdHlwZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBSZXBvLCBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3F1ZXJ5L0NvbmRpdGlvblwiO1xuaW1wb3J0IHsgUmVsYXRpb25zTWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgb25lVG9NYW55T25DcmVhdGUsXG4gIG9uZVRvTWFueU9uRGVsZXRlLFxuICBvbmVUb01hbnlPblVwZGF0ZSxcbiAgb25lVG9PbmVPbkNyZWF0ZSxcbiAgb25lVG9PbmVPbkRlbGV0ZSxcbiAgb25lVG9PbmVPblVwZGF0ZSxcbiAgcG9wdWxhdGUgYXMgcG9wLFxufSBmcm9tIFwiLi9jb25zdHJ1Y3Rpb25cIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IHNldHMgdGhlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWwgY2xhc3MgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0cyAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3NcbiAqIEBmdW5jdGlvbiB0YWJsZVxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhYmxlPE9QVFMgPSBzdHJpbmc+KG9wdHM6IE9QVFMpIHtcbiAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWV0YWRhdGEsXG4gICAgICBhcmdzOiBba2V5LCBvcHRzXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIHByb3BlcnR5XG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXBzIGEgbW9kZWwgcHJvcGVydHkgdG8gYSBzcGVjaWZpYyBjb2x1bW4gbmFtZSBpbiB0aGUgZGF0YWJhc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBjb2x1bW5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2x1bW48T1BUUyA9IHN0cmluZz4oY29sdW1uTmFtZT86IE9QVFMpIHtcbiAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTik7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNvbHVtbihrLCBjKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBjb2x1bW4ob2JqOiBhbnksIGF0dHI6IGFueSkge1xuICAgICAgICAgIHJldHVybiBwcm9wTWV0YWRhdGEoaywgYyB8fCBhdHRyKShvYmosIGF0dHIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtrZXksIGNvbHVtbk5hbWVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5kZXggb24gYSBtb2RlbCBwcm9wZXJ0eSBmb3IgaW1wcm92ZWQgcXVlcnkgcGVyZm9ybWFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gYmUgaW5kZXhlZCBpbiB0aGUgZGF0YWJhc2UsIG9wdGlvbmFsbHkgd2l0aCBzcGVjaWZpYyBkaXJlY3Rpb25zIGFuZCBjb21wb3NpdGlvbnNcbiAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb25bXX0gW2RpcmVjdGlvbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2Ygc29ydCBkaXJlY3Rpb25zIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgdG8gY3JlYXRlIGEgY29tcG9zaXRlIGluZGV4XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gaW5kZXhcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleChkaXJlY3Rpb25zPzogT3JkZXJEaXJlY3Rpb25bXSwgY29tcG9zaXRpb25zPzogc3RyaW5nW10pIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YShcbiAgICBSZXBvc2l0b3J5LmtleShcbiAgICAgIGAke1BlcnNpc3RlbmNlS2V5cy5JTkRFWH0ke2NvbXBvc2l0aW9ucyAmJiBjb21wb3NpdGlvbnMubGVuZ3RoID8gYC4ke2NvbXBvc2l0aW9ucy5qb2luKFwiLlwiKX1gIDogXCJcIn1gXG4gICAgKSxcbiAgICB7XG4gICAgICBkaXJlY3Rpb25zOiBkaXJlY3Rpb25zLFxuICAgICAgY29tcG9zaXRpb25zOiBjb21wb3NpdGlvbnMsXG4gICAgfSBhcyBJbmRleE1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVuZm9yY2VzIHVuaXF1ZW5lc3MgY29uc3RyYWludCBkdXJpbmcgbW9kZWwgY3JlYXRpb24gYW5kIHVwZGF0ZVxuICogQHN1bW1hcnkgSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSB0aGUgdW5pcXVlIGRlY29yYXRvciB0byBjaGVjayBpZiBhIHByb3BlcnR5IHZhbHVlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBkYXRhYmFzZVxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgbWV0YWRhdGEgdHlwZVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIG1ldGFkYXRhIGZvciB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIGNoZWNrIGZvciB1bmlxdWVuZXNzXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2hlY2sgaXMgY29tcGxldGUgb3IgcmVqZWN0cyB3aXRoIGEgQ29uZmxpY3RFcnJvclxuICogQGZ1bmN0aW9uIHVuaXF1ZU9uQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVuaXF1ZU9uQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgb2JqZWN0LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShtb2RlbCBhcyBhbnkpW2tleV0pIHJldHVybjtcbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnNlbGVjdCgpXG4gICAgLndoZXJlKENvbmRpdGlvbi5hdHRyaWJ1dGUoa2V5KS5lcShtb2RlbFtrZXldKSlcbiAgICAuZXhlY3V0ZSgpO1xuICBpZiAoZXhpc3RpbmcubGVuZ3RoKVxuICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgYG1vZGVsIGFscmVhZHkgZXhpc3RzIHdpdGggcHJvcGVydHkgJHtrZXkgYXMgc3RyaW5nfSBlcXVhbCB0byAke0pTT04uc3RyaW5naWZ5KChtb2RlbCBhcyBhbnkpW2tleV0sIHVuZGVmaW5lZCwgMil9YFxuICAgICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRhZ3MgYSBwcm9wZXJ0eSBhcyB1bmlxdWVcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVuc3VyZXMgYSBwcm9wZXJ0eSB2YWx1ZSBpcyB1bmlxdWUgYWNyb3NzIGFsbCBpbnN0YW5jZXMgb2YgYSBtb2RlbCBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiB1bmlxdWVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEB1bmlxdWUoKVxuICogICBAcmVxdWlyZWQoKVxuICogICB1c2VybmFtZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlKCkge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVU5JUVVFKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKG9uQ3JlYXRlVXBkYXRlKHVuaXF1ZU9uQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKGtleSwge30pKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHVzZXIgaWRlbnRpZmljYXRpb24gZm9yIG93bmVyc2hpcCB0cmFja2luZ1xuICogQHN1bW1hcnkgSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSB0aGUgY3JlYXRlZEJ5IGFuZCB1cGRhdGVkQnkgZGVjb3JhdG9ycyB0byBzZXQgb3duZXJzaGlwIGluZm9ybWF0aW9uXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBtZXRhZGF0YSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzdG9yZSB0aGUgdXNlciBpZGVudGlmaWVyXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVqZWN0cyB3aXRoIGFuIEF1dGhvcml6YXRpb25FcnJvciBpZiB1c2VyIGlkZW50aWZpY2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWRcbiAqIEBmdW5jdGlvbiBjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBkYXRhOiBWLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgXCJUaGlzIGFkYXB0ZXIgZG9lcyBub3Qgc3VwcG9ydCB1c2VyIGlkZW50aWZpY2F0aW9uXCJcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHJhY2tzIHRoZSBjcmVhdG9yIG9mIGEgbW9kZWwgaW5zdGFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gc3RvcmUgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHVzZXIgd2hvIGNyZWF0ZWQgdGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIERvY3VtZW50IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQGNyZWF0ZWRCeSgpXG4gKiAgIGNyZWF0b3IhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZWRCeSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUob25DcmVhdGUoY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGUpLCBwcm9wTWV0YWRhdGEoa2V5LCB7fSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRyYWNrcyB0aGUgbGFzdCB1cGRhdGVyIG9mIGEgbW9kZWwgaW5zdGFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gc3RvcmUgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHVzZXIgd2hvIGxhc3QgdXBkYXRlZCB0aGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiB1cGRhdGVkQnlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgRG9jdW1lbnQgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAdXBkYXRlZEJ5KClcbiAqICAgbGFzdEVkaXRvciE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlZEJ5KCkge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShvbkNyZWF0ZVVwZGF0ZShjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YShrZXksIHt9KSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGN1cnJlbnQgbW9kZWwgYW5kIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG9uZVRvT25lXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAb25lVG9PbmUoUHJvZmlsZSlcbiAqICAgcHJvZmlsZSE6IHN0cmluZyB8IFByb2ZpbGU7XG4gKiB9XG4gKlxuICogY2xhc3MgUHJvZmlsZSBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIGJpbyE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICogQHNlZSBvbmVUb01hbnlcbiAqIEBzZWUgbWFueVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVUb09uZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlOiBib29sZWFuID0gdHJ1ZVxuKSB7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fT05FKTtcbiAgLy8gTW9kZWwucmVnaXN0ZXIoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pO1xuXG4gIGZ1bmN0aW9uIG9uZVRvT25lRGVjKFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgIHBvcHVsYXRlOiBib29sZWFuXG4gICkge1xuICAgIGNvbnN0IG1ldGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgIH07XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIHR5cGUoW1xuICAgICAgICBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgXSksXG4gICAgICBvbkNyZWF0ZShvbmVUb09uZU9uQ3JlYXRlLCBtZXRhKSxcbiAgICAgIG9uVXBkYXRlKG9uZVRvT25lT25VcGRhdGUsIG1ldGEpLFxuICAgICAgb25EZWxldGUob25lVG9PbmVPbkRlbGV0ZSwgbWV0YSksXG4gICAgICBhZnRlckFueShwb3AsIG1ldGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogb25lVG9PbmVEZWMsXG4gICAgICBhcmdzOiBbY2xhenosIGNhc2NhZGVPcHRpb25zLCBwb3B1bGF0ZV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZXN0YWJsaXNoZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgY3VycmVudCBtb2RlbCBhbmQgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBBdXRob3IgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICBuYW1lITogc3RyaW5nO1xuICpcbiAqICAgQG9uZVRvTWFueShCb29rKVxuICogICBib29rcyE6IHN0cmluZ1tdIHwgQm9va1tdO1xuICogfVxuICpcbiAqIGNsYXNzIEJvb2sgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICB0aXRsZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICogQHNlZSBvbmVUb09uZVxuICogQHNlZSBtYW55VG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uZVRvTWFueTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlOiBib29sZWFuID0gdHJ1ZVxuKSB7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSk7XG5cbiAgZnVuY3Rpb24gb25lVG9NYW55RGVjKFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgIHBvcHVsYXRlOiBib29sZWFuXG4gICkge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICBsaXN0KFtcbiAgICAgICAgY2xhenogYXMgQ29uc3RydWN0b3I8TT4sXG4gICAgICAgIFN0cmluZyxcbiAgICAgICAgTnVtYmVyLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEJpZ2ludCBpcyBub3QgYSBjb25zdHJ1Y3RvclxuICAgICAgICBCaWdJbnQsXG4gICAgICBdKSxcbiAgICAgIG9uQ3JlYXRlKG9uZVRvTWFueU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgICBvblVwZGF0ZShvbmVUb01hbnlPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25EZWxldGUob25lVG9NYW55T25EZWxldGUsIG1ldGFkYXRhKSxcbiAgICAgIGFmdGVyQW55KHBvcCwgbWV0YWRhdGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YWRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG9uZVRvTWFueURlYyxcbiAgICAgIGFyZ3M6IFtjbGF6eiwgY2FzY2FkZU9wdGlvbnMsIHBvcHVsYXRlXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgbWFueS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgY3VycmVudCBtb2RlbCBhbmQgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gbWFueVRvT25lXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEJvb2sgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICB0aXRsZSE6IHN0cmluZztcbiAqXG4gKiAgIEBtYW55VG9PbmUoQXV0aG9yKVxuICogICBhdXRob3IhOiBzdHJpbmcgfCBBdXRob3I7XG4gKiB9XG4gKlxuICogY2xhc3MgQXV0aG9yIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgbmFtZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICogQHNlZSBvbmVUb01hbnlcbiAqIEBzZWUgb25lVG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbnlUb09uZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlID0gdHJ1ZVxuKSB7XG4gIC8vIE1vZGVsLnJlZ2lzdGVyKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KTtcblxuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpO1xuXG4gIGZ1bmN0aW9uIG1hbnlUb09uZURlYyhcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICBwb3B1bGF0ZTogYm9vbGVhblxuICApIHtcbiAgICBpZiAoIWNsYXp6Lm5hbWUpXG4gICAgICBjbGF6eiA9IChjbGF6eiBhcyAoKSA9PiBDb25zdHJ1Y3RvcjxNPikoKSBhcyBDb25zdHJ1Y3RvcjxNPjtcbiAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgfTtcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgdHlwZShbXG4gICAgICAgIGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICBdKSxcbiAgICAgIC8vIG9uQ3JlYXRlKG9uZVRvTWFueU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvblVwZGF0ZShvbmVUb01hbnlPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gb25EZWxldGUob25lVG9NYW55T25EZWxldGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIGFmdGVyQW55KHBvcCwgbWV0YWRhdGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YWRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1hbnlUb09uZURlYyxcbiAgICAgIGFyZ3M6IFtjbGF6eiwgY2FzY2FkZU9wdGlvbnMsIHBvcHVsYXRlXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZXN0YWJsaXNoZXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIGN1cnJlbnQgbW9kZWwgYW5kIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG1hbnlUb09uZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBCb29rIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdGl0bGUhOiBzdHJpbmc7XG4gKlxuICogICBAbWFueVRvT25lKEF1dGhvcilcbiAqICAgYXV0aG9yITogc3RyaW5nIHwgQXV0aG9yO1xuICogfVxuICpcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9NYW55XG4gKiBAc2VlIG9uZVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW55VG9NYW55PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGUgPSB0cnVlXG4pIHtcbiAgLy8gTW9kZWwucmVnaXN0ZXIoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pO1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19NQU5ZKTtcblxuICBmdW5jdGlvbiBtYW55VG9NYW55RGVjKFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgIHBvcHVsYXRlOiBib29sZWFuXG4gICkge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICBsaXN0KFtcbiAgICAgICAgY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgIF0pLFxuICAgICAgLy8gb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gYWZ0ZXJBbGwocG9wdWxhdGUsIG1ldGFkYXRhKSxcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIG1ldGFkYXRhKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWFueVRvTWFueURlYyxcbiAgICAgIGFyZ3M6IFtjbGF6eiwgY2FzY2FkZU9wdGlvbnMsIHBvcHVsYXRlXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiaW1wb3J0IHtcbiAgRGVjb3JhdGlvbixcbiAgTW9kZWwsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbiAgcmVxdWlyZWQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIERlZmF1bHRTZXF1ZW5jZU9wdGlvbnMsXG4gIFNlcXVlbmNlT3B0aW9ucyxcbn0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQge1xuICBEQktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICByZWFkb25seSxcbiAgUmVwb3NpdG9yeUZsYWdzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBpbmRleCB9IGZyb20gXCIuLi9tb2RlbC9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBzZXF1ZW5jZU5hbWVGb3JNb2RlbCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9TZXF1ZW5jZVwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgT3JkZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi4vcmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgYXBwbHkgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHByaW1hcnkga2V5IGNyZWF0aW9uXG4gKiBAc3VtbWFyeSBIYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBwcmltYXJ5IGtleSB2YWx1ZXMgZm9yIG1vZGVscyB1c2luZyBzZXF1ZW5jZXNcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSB0aGF0IGV4dGVuZHMgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUeXBlIHRoYXQgZXh0ZW5kcyBTZXF1ZW5jZU9wdGlvbnNcbiAqIEB0ZW1wbGF0ZSBGIC0gVHlwZSB0aGF0IGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIFR5cGUgdGhhdCBleHRlbmRzIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBleGVjdXRpb24gY29udGV4dFxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHNlcXVlbmNlIG9wdGlvbnNcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNldCBhcyBwcmltYXJ5IGtleVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcHJpbWFyeSBrZXkgaXMgc2V0XG4gKiBAZnVuY3Rpb24gcGtPbkNyZWF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgcGtPbkNyZWF0ZVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFNlcXVlbmNlXG4gKlxuICogICBNb2RlbC0+PnBrT25DcmVhdGU6IENhbGwgd2l0aCBtb2RlbCBpbnN0YW5jZVxuICogICBOb3RlIG92ZXIgcGtPbkNyZWF0ZTogQ2hlY2sgaWYga2V5IGFscmVhZHkgZXhpc3RzXG4gKiAgIGFsdCBLZXkgZXhpc3RzIG9yIG5vIHR5cGUgc3BlY2lmaWVkXG4gKiAgICAgcGtPbkNyZWF0ZS0tPj5Nb2RlbDogUmV0dXJuIGVhcmx5XG4gKiAgIGVsc2UgS2V5IG5lZWRzIHRvIGJlIGNyZWF0ZWRcbiAqICAgICBwa09uQ3JlYXRlLT4+cGtPbkNyZWF0ZTogR2VuZXJhdGUgc2VxdWVuY2UgbmFtZSBpZiBub3QgcHJvdmlkZWRcbiAqICAgICBwa09uQ3JlYXRlLT4+QWRhcHRlcjogUmVxdWVzdCBTZXF1ZW5jZShkYXRhKVxuICogICAgIEFkYXB0ZXItPj5TZXF1ZW5jZTogQ3JlYXRlIHNlcXVlbmNlXG4gKiAgICAgU2VxdWVuY2UtLT4+cGtPbkNyZWF0ZTogUmV0dXJuIHNlcXVlbmNlXG4gKiAgICAgcGtPbkNyZWF0ZS0+PlNlcXVlbmNlOiBDYWxsIG5leHQoKVxuICogICAgIFNlcXVlbmNlLS0+PnBrT25DcmVhdGU6IFJldHVybiBuZXh0IHZhbHVlXG4gKiAgICAgcGtPbkNyZWF0ZS0+Pk1vZGVsOiBTZXQgcHJpbWFyeSBrZXkgdmFsdWVcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwa09uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgU2VxdWVuY2VPcHRpb25zLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWRhdGEudHlwZSB8fCAhZGF0YS5nZW5lcmF0ZWQgfHwgbW9kZWxba2V5XSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNldFByaW1hcnlLZXlWYWx1ZSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgaWYgKCFkYXRhLm5hbWUpIGRhdGEubmFtZSA9IHNlcXVlbmNlTmFtZUZvck1vZGVsKG1vZGVsLCBcInBrXCIpO1xuICBsZXQgc2VxdWVuY2U6IFNlcXVlbmNlO1xuICB0cnkge1xuICAgIHNlcXVlbmNlID0gYXdhaXQgdGhpcy5hZGFwdGVyLlNlcXVlbmNlKGRhdGEpO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gaW5zdGFudGlhdGUgU2VxdWVuY2UgJHtkYXRhLm5hbWV9OiAke2V9YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBuZXh0ID0gYXdhaXQgc2VxdWVuY2UubmV4dCgpO1xuICBzZXRQcmltYXJ5S2V5VmFsdWUobW9kZWwsIGtleSBhcyBzdHJpbmcsIG5leHQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IEtleSBEZWNvcmF0b3JcbiAqIEBzdW1tYXJ5IE1hcmtzIGEgcHJvcGVydHkgYXMgdGhlIG1vZGVsJ3MgcHJpbWFyeSBrZXkgd2l0aCBhdXRvbWF0aWMgc2VxdWVuY2UgZ2VuZXJhdGlvblxuICogVGhpcyBkZWNvcmF0b3IgY29tYmluZXMgbXVsdGlwbGUgYmVoYXZpb3JzOiBpdCBtYXJrcyB0aGUgcHJvcGVydHkgYXMgdW5pcXVlLCByZXF1aXJlZCxcbiAqIGFuZCBlbnN1cmVzIHRoZSBpbmRleCBpcyBjcmVhdGVkIHByb3Blcmx5IGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgc2VxdWVuY2Ugb3B0aW9ucy5cbiAqIEBwYXJhbSB7T21pdDxTZXF1ZW5jZU9wdGlvbnMsIFwiY3ljbGVcIiB8IFwic3RhcnRXaXRoXCIgfCBcImluY3JlbWVudEJ5XCI+fSBvcHRzIC0gT3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlIGdlbmVyYXRpb25cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIG1vZGVsIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBwa1xuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHBrKClcbiAqICAgaWQhOiBzdHJpbmc7XG4gKlxuICogICBAcmVxdWlyZWQoKVxuICogICB1c2VybmFtZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGsoXG4gIG9wdHM6IE9taXQ8XG4gICAgU2VxdWVuY2VPcHRpb25zLFxuICAgIFwiY3ljbGVcIiB8IFwic3RhcnRXaXRoXCIgfCBcImluY3JlbWVudEJ5XCJcbiAgPiA9IERlZmF1bHRTZXF1ZW5jZU9wdGlvbnNcbikge1xuICBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdFNlcXVlbmNlT3B0aW9ucywgb3B0cywge1xuICAgIGdlbmVyYXRlZDpcbiAgICAgIG9wdHMudHlwZSAmJiB0eXBlb2Ygb3B0cy5nZW5lcmF0ZWQgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyB0cnVlXG4gICAgICAgIDogb3B0cy5nZW5lcmF0ZWQgfHwgRGVmYXVsdFNlcXVlbmNlT3B0aW9ucy5nZW5lcmF0ZWQsXG4gIH0pIGFzIFNlcXVlbmNlT3B0aW9ucztcblxuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShEQktleXMuSUQpO1xuICBmdW5jdGlvbiBwa0RlYyhvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gcGtEZWMob2JqOiBhbnksIGF0dHI6IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICBpbmRleChbT3JkZXJEaXJlY3Rpb24uQVNDLCBPcmRlckRpcmVjdGlvbi5EU0NdKSxcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGtleSwgb3B0aW9ucyksXG4gICAgICAgIG9uQ3JlYXRlKHBrT25DcmVhdGUsIG9wdGlvbnMpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoREJLZXlzLklELCBhdHRyKVxuICAgICAgKShvYmosIGF0dHIpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogcGtEZWMsXG4gICAgICBhcmdzOiBbb3B0c10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbiIsImltcG9ydCB7IERCT3BlcmF0aW9ucywgdGltZXN0YW1wIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbEFyZywgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgbW9kZWwgY2xhc3MgZm9yIGFsbCBkb21haW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTW9kZWwgY2xhc3MgZnJvbSBkZWNvcmF0b3ItdmFsaWRhdGlvbiBhbmQgYWRkcyB0aW1lc3RhbXAgZnVuY3Rpb25hbGl0eS5cbiAqIEFsbCBkb21haW4gbW9kZWxzIGluIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZXh0ZW5kIHRoaXMgY2xhc3MgdG8gaW5oZXJpdCBjb21tb24gcHJvcGVydGllcyBhbmQgYmVoYXZpb3JzLlxuICogQHBhcmFtIHtNb2RlbEFyZzxCYXNlTW9kZWw+fSBhcmcgLSBPcHRpb25hbCBpbml0aWFsaXphdGlvbiBkYXRhIGZvciB0aGUgbW9kZWxcbiAqIEBjbGFzcyBCYXNlTW9kZWxcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWUhOiBzdHJpbmc7XG4gKiAgIFxuICogICBAZW1haWwoKVxuICogICBlbWFpbCE6IHN0cmluZztcbiAqICAgXG4gKiAgIGNvbnN0cnVjdG9yKGRhdGE/OiBNb2RlbEFyZzxVc2VyPikge1xuICogICAgIHN1cGVyKGRhdGEpO1xuICogICB9XG4gKiB9XG4gKiBcbiAqIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih7IHVzZXJuYW1lOiAnam9obicsIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSBtb2RlbFxuICAgKiBAc3VtbWFyeSBBdXRvbWF0aWNhbGx5IHNldCB0byB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIG1vZGVsIGlzIGNyZWF0ZWRcbiAgICovXG4gIEB0aW1lc3RhbXAoREJPcGVyYXRpb25zLkNSRUFURSlcbiAgY3JlYXRlZE9uITogRGF0ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExhc3QgdXBkYXRlIHRpbWVzdGFtcCBmb3IgdGhlIG1vZGVsXG4gICAqIEBzdW1tYXJ5IEF1dG9tYXRpY2FsbHkgdXBkYXRlZCB0byB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIHdoZW5ldmVyIHRoZSBtb2RlbCBpcyBtb2RpZmllZFxuICAgKi9cbiAgQHRpbWVzdGFtcCgpXG4gIHVwZGF0ZWRPbiE6IERhdGU7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPEJhc2VNb2RlbD4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQYWdpbmdFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBhZ2luYXRpb24gZm9yIGRhdGFiYXNlIHF1ZXJpZXNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIG5hdmlnYXRpbmcgdGhyb3VnaCBwYWdpbmF0ZWQgcXVlcnkgcmVzdWx0c1xuICogXG4gKiBUaGlzIGFic3RyYWN0IGNsYXNzIG1hbmFnZXMgdGhlIHN0YXRlIGFuZCBuYXZpZ2F0aW9uIG9mIHBhZ2luYXRlZCBkYXRhYmFzZSBxdWVyeSByZXN1bHRzLlxuICogSXQgdHJhY2tzIHRoZSBjdXJyZW50IHBhZ2UsIHRvdGFsIHBhZ2VzLCBhbmQgcmVjb3JkIGNvdW50LCBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3JcbiAqIG1vdmluZyBiZXR3ZWVuIHBhZ2VzLlxuICogXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgcGFnaW5hdG9yIG9wZXJhdGVzIG9uXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcGFnaW5hdGVkIHF1ZXJ5IChkZWZhdWx0cyB0byBNW10pXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlIChkZWZhdWx0cyB0byBhbnkpXG4gKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBRLCBhbnksIGFueT59IGFkYXB0ZXIgLSBUaGUgZGF0YWJhc2UgYWRhcHRlciB0byB1c2UgZm9yIGV4ZWN1dGluZyBxdWVyaWVzXG4gKiBAcGFyYW0ge1F9IHF1ZXJ5IC0gVGhlIHF1ZXJ5IHRvIHBhZ2luYXRlXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgcmVjb3JkcyBwZXIgcGFnZVxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBtb2RlbCB0eXBlXG4gKiBAY2xhc3MgUGFnaW5hdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgcGFnaW5hdG9yIGZvciBhIHVzZXIgcXVlcnlcbiAqIGNvbnN0IHVzZXJRdWVyeSA9IGRiLnNlbGVjdCgpLmZyb20oVXNlcik7XG4gKiBjb25zdCBwYWdpbmF0b3IgPSBhd2FpdCB1c2VyUXVlcnkucGFnaW5hdGUoMTApOyAvLyAxMCB1c2VycyBwZXIgcGFnZVxuICogXG4gKiAvLyBHZXQgdGhlIGZpcnN0IHBhZ2Ugb2YgcmVzdWx0c1xuICogY29uc3QgZmlyc3RQYWdlID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UoMSk7XG4gKiBcbiAqIC8vIE5hdmlnYXRlIHRvIHRoZSBuZXh0IHBhZ2VcbiAqIGNvbnN0IHNlY29uZFBhZ2UgPSBhd2FpdCBwYWdpbmF0b3IubmV4dCgpO1xuICogXG4gKiAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhZ2luYXRpb25cbiAqIGNvbnNvbGUubG9nKGBQYWdlICR7cGFnaW5hdG9yLmN1cnJlbnR9IG9mICR7cGFnaW5hdG9yLnRvdGFsfSwgJHtwYWdpbmF0b3IuY291bnR9IHRvdGFsIHJlY29yZHNgKTtcbiAqIFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUGFnaW5hdG9yXG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgRGF0YWJhc2VcbiAqICAgXG4gKiAgIENsaWVudC0+PlBhZ2luYXRvcjogbmV3IFBhZ2luYXRvcihhZGFwdGVyLCBxdWVyeSwgc2l6ZSwgY2xhenopXG4gKiAgIENsaWVudC0+PlBhZ2luYXRvcjogcGFnZSgxKVxuICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IHZhbGlkYXRlUGFnZSgxKVxuICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IHByZXBhcmUocXVlcnkpXG4gKiAgIFBhZ2luYXRvci0+PkFkYXB0ZXI6IGV4ZWN1dGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uXG4gKiAgIEFkYXB0ZXItPj5EYXRhYmFzZTogZXhlY3V0ZSBxdWVyeVxuICogICBEYXRhYmFzZS0tPj5BZGFwdGVyOiByZXR1cm4gcmVzdWx0c1xuICogICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogcmV0dXJuIHJlc3VsdHNcbiAqICAgUGFnaW5hdG9yLS0+PkNsaWVudDogcmV0dXJuIHBhZ2UgcmVzdWx0c1xuICogICBcbiAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBuZXh0KClcbiAqICAgUGFnaW5hdG9yLT4+UGFnaW5hdG9yOiBwYWdlKGN1cnJlbnQgKyAxKVxuICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IHZhbGlkYXRlUGFnZShjdXJyZW50ICsgMSlcbiAqICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogZXhlY3V0ZSBxdWVyeSB3aXRoIHBhZ2luYXRpb25cbiAqICAgQWRhcHRlci0+PkRhdGFiYXNlOiBleGVjdXRlIHF1ZXJ5XG4gKiAgIERhdGFiYXNlLS0+PkFkYXB0ZXI6IHJldHVybiByZXN1bHRzXG4gKiAgIEFkYXB0ZXItLT4+UGFnaW5hdG9yOiByZXR1cm4gcmVzdWx0c1xuICogICBQYWdpbmF0b3ItLT4+Q2xpZW50OiByZXR1cm4gcGFnZSByZXN1bHRzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsLCBSID0gTVtdLCBRID0gYW55PiB7XG4gIHByb3RlY3RlZCBfY3VycmVudFBhZ2UhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBfdG90YWxQYWdlcyE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9yZWNvcmRDb3VudCE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGxpbWl0ITogbnVtYmVyO1xuXG4gIHByaXZhdGUgX3N0YXRlbWVudD86IFE7XG5cbiAgZ2V0IGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRQYWdlO1xuICB9XG5cbiAgZ2V0IHRvdGFsKCkge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFBhZ2VzO1xuICB9XG5cbiAgZ2V0IGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZENvdW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBzdGF0ZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLl9zdGF0ZW1lbnQpIHRoaXMuX3N0YXRlbWVudCA9IHRoaXMucHJlcGFyZSh0aGlzLnF1ZXJ5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVtZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBhZGFwdGVyOiBBZGFwdGVyPGFueSwgUSwgYW55LCBhbnk+LFxuICAgIHByb3RlY3RlZCByZWFkb25seSBxdWVyeTogUSxcbiAgICByZWFkb25seSBzaXplOiBudW1iZXIsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApIHt9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHByZXBhcmUocmF3U3RhdGVtZW50OiBRKTogUTtcblxuICBhc3luYyBuZXh0KCkge1xuICAgIHJldHVybiB0aGlzLnBhZ2UodGhpcy5jdXJyZW50ICsgMSk7XG4gIH1cblxuICBhc3luYyBwcmV2aW91cygpIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlKHRoaXMuY3VycmVudCAtIDEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZhbGlkYXRlUGFnZShwYWdlOiBudW1iZXIpIHtcbiAgICBpZiAocGFnZSA8IDEgfHwgIU51bWJlci5pc0ludGVnZXIocGFnZSkpXG4gICAgICB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXG4gICAgICAgIFwiUGFnZSBudW1iZXIgY2Fubm90IGJlIHVuZGVyIDEgYW5kIG11c3QgYmUgYW4gaW50ZWdlclwiXG4gICAgICApO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdG90YWxQYWdlcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwYWdlID4gdGhpcy5fdG90YWxQYWdlcylcbiAgICAgIHRocm93IG5ldyBQYWdpbmdFcnJvcihcbiAgICAgICAgYE9ubHkgJHt0aGlzLl90b3RhbFBhZ2VzfSBhcmUgYXZhaWxhYmxlLiBDYW5ub3QgZ28gdG8gcGFnZSAke3BhZ2V9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcGFnZTtcbiAgfVxuXG4gIGFic3RyYWN0IHBhZ2UocGFnZT86IG51bWJlcik6IFByb21pc2U8UltdPjtcbn1cbiIsImltcG9ydCB7IHR5cGUgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRvciwgUmF3RXhlY3V0b3IgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHR5cGUge1xuICBGcm9tU2VsZWN0b3IsXG4gIEdyb3VwQnlTZWxlY3RvcixcbiAgT3JkZXJCeVNlbGVjdG9yLFxuICBTZWxlY3RTZWxlY3Rvcixcbn0gZnJvbSBcIi4vc2VsZWN0b3JzXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi9Db25kaXRpb25cIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5LCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi91dGlscy9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvdW50T3B0aW9uLFxuICBEaXN0aW5jdE9wdGlvbixcbiAgTGltaXRPcHRpb24sXG4gIE1heE9wdGlvbixcbiAgTWluT3B0aW9uLFxuICBPZmZzZXRPcHRpb24sXG4gIE9yZGVyQW5kR3JvdXBPcHRpb24sXG4gIFNlbGVjdE9wdGlvbixcbiAgV2hlcmVPcHRpb24sXG59IGZyb20gXCIuL29wdGlvbnNcIjtcbmltcG9ydCB7IFBhZ2luYXRhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvUGFnaW5hdGFibGVcIjtcbmltcG9ydCB7IFBhZ2luYXRvciB9IGZyb20gXCIuL1BhZ2luYXRvclwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgY2xhc3MgZm9yIGRhdGFiYXNlIHF1ZXJ5IHN0YXRlbWVudHNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgZm91bmRhdGlvbiBmb3IgYnVpbGRpbmcgYW5kIGV4ZWN1dGluZyBkYXRhYmFzZSBxdWVyaWVzXG4gKlxuICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBxdWVyeSBidWlsZGVyIHBhdHRlcm4gZm9yIGNvbnN0cnVjdGluZ1xuICogZGF0YWJhc2UgcXVlcmllcy4gSXQgc3VwcG9ydHMgdmFyaW91cyBxdWVyeSBvcGVyYXRpb25zIGxpa2Ugc2VsZWN0LCBmcm9tLFxuICogd2hlcmUsIG9yZGVyQnksIGdyb3VwQnksIGxpbWl0LCBhbmQgb2Zmc2V0LiBJdCBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgZm9yXG4gKiBleGVjdXRpbmcgcXVlcmllcyBhbmQgaGFuZGxpbmcgcGFnaW5hdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlIHNwZWNpZmljIHRvIHRoZSBkYXRhYmFzZSBhZGFwdGVyXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgc3RhdGVtZW50IG9wZXJhdGVzIG9uXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcXVlcnlcbiAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIFEsIGFueSwgYW55Pn0gYWRhcHRlciAtIFRoZSBkYXRhYmFzZSBhZGFwdGVyIHRvIHVzZSBmb3IgZXhlY3V0aW5nIHF1ZXJpZXNcbiAqIEBjbGFzcyBTdGF0ZW1lbnRcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBzdGF0ZW1lbnQgdG8gcXVlcnkgdXNlcnNcbiAqIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBTUUxTdGF0ZW1lbnQoYWRhcHRlcik7XG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuc2VsZWN0KClcbiAqICAgLmZyb20oVXNlcilcbiAqICAgLndoZXJlKENvbmRpdGlvbi5hdHRyaWJ1dGUoXCJzdGF0dXNcIikuZXEoXCJhY3RpdmVcIikpXG4gKiAgIC5vcmRlckJ5KFtcImNyZWF0ZWRBdFwiLCBcIkRFU0NcIl0pXG4gKiAgIC5saW1pdCgxMClcbiAqICAgLmV4ZWN1dGUoKTtcbiAqXG4gKiAvLyBVc2UgcGFnaW5hdGlvblxuICogY29uc3QgcGFnaW5hdG9yID0gYXdhaXQgc3RhdGVtZW50XG4gKiAgIC5zZWxlY3QoKVxuICogICAuZnJvbShVc2VyKVxuICogICAucGFnaW5hdGUoMjApOyAvLyAyMCB1c2VycyBwZXIgcGFnZVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IERhdGFiYXNlXG4gKlxuICogICBDbGllbnQtPj5TdGF0ZW1lbnQ6IHNlbGVjdCgpXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogZnJvbShNb2RlbClcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiB3aGVyZShjb25kaXRpb24pXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogb3JkZXJCeShbZmllbGQsIGRpcmVjdGlvbl0pXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogbGltaXQodmFsdWUpXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogZXhlY3V0ZSgpXG4gKiAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogYnVpbGQoKVxuICogICBTdGF0ZW1lbnQtPj5BZGFwdGVyOiByYXcocXVlcnkpXG4gKiAgIEFkYXB0ZXItPj5EYXRhYmFzZTogZXhlY3V0ZSBxdWVyeVxuICogICBEYXRhYmFzZS0tPj5BZGFwdGVyOiByZXR1cm4gcmVzdWx0c1xuICogICBBZGFwdGVyLS0+PlN0YXRlbWVudDogcmV0dXJuIHByb2Nlc3NlZCByZXN1bHRzXG4gKiAgIFN0YXRlbWVudC0tPj5DbGllbnQ6IHJldHVybiBmaW5hbCByZXN1bHRzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdGF0ZW1lbnQ8USwgTSBleHRlbmRzIE1vZGVsLCBSPlxuICBpbXBsZW1lbnRzIEV4ZWN1dG9yPFI+LCBSYXdFeGVjdXRvcjxRPiwgUGFnaW5hdGFibGU8TSwgUiwgUT5cbntcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdFNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3I8TT5bXTtcbiAgcHJvdGVjdGVkIGRpc3RpbmN0U2VsZWN0b3I/OiBTZWxlY3RTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIG1heFNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3I8TT47XG4gIHByb3RlY3RlZCBtaW5TZWxlY3Rvcj86IFNlbGVjdFNlbGVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgY291bnRTZWxlY3Rvcj86IFNlbGVjdFNlbGVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgZnJvbVNlbGVjdG9yITogQ29uc3RydWN0b3I8TT47XG4gIHByb3RlY3RlZCB3aGVyZUNvbmRpdGlvbj86IENvbmRpdGlvbjxNPjtcbiAgcHJvdGVjdGVkIG9yZGVyQnlTZWxlY3Rvcj86IE9yZGVyQnlTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIGdyb3VwQnlTZWxlY3Rvcj86IEdyb3VwQnlTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIGxpbWl0U2VsZWN0b3I/OiBudW1iZXI7XG4gIHByb3RlY3RlZCBvZmZzZXRTZWxlY3Rvcj86IG51bWJlcjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIGFkYXB0ZXI6IEFkYXB0ZXI8YW55LCBRLCBhbnksIGFueT4pIHt9XG5cbiAgcHJvdGVjdGVkIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gKHRoaXMuYWRhcHRlciBhcyBhbnkpLmxvZy5mb3IoU3RhdGVtZW50KTtcbiAgfVxuXG4gIHNlbGVjdDxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgUyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10sXG4gID4oKTogU2VsZWN0T3B0aW9uPE0sIE1bXT47XG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I6IHJlYWRvbmx5IFsuLi5TXVxuICApOiBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuXG4gIEBmaW5hbCgpXG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I/OiByZWFkb25seSBbLi4uU11cbiAgKTogU2VsZWN0T3B0aW9uPE0sIE1bXT4gfCBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJzZWxlY3RTZWxlY3RvclwiLCB7XG4gICAgICB2YWx1ZTogc2VsZWN0b3IsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMgYXMgU2VsZWN0T3B0aW9uPE0sIE1bXT4gfCBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgZGlzdGluY3Q8UyBleHRlbmRzIFNlbGVjdFNlbGVjdG9yPE0+PihcbiAgICBzZWxlY3RvcjogU1xuICApOiBEaXN0aW5jdE9wdGlvbjxNLCBNW1NdW10+IHtcbiAgICB0aGlzLmRpc3RpbmN0U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcyBhcyBEaXN0aW5jdE9wdGlvbjxNLCBNW1NdW10+O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgbWF4PFMgZXh0ZW5kcyBTZWxlY3RTZWxlY3RvcjxNPj4oc2VsZWN0b3I6IFMpOiBNYXhPcHRpb248TSwgTVtTXT4ge1xuICAgIHRoaXMubWF4U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcyBhcyBNYXhPcHRpb248TSwgTVtTXT47XG4gIH1cblxuICBAZmluYWwoKVxuICBtaW48UyBleHRlbmRzIFNlbGVjdFNlbGVjdG9yPE0+PihzZWxlY3RvcjogUyk6IE1pbk9wdGlvbjxNLCBNW1NdPiB7XG4gICAgdGhpcy5taW5TZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHJldHVybiB0aGlzIGFzIE1pbk9wdGlvbjxNLCBNW1NdPjtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIGNvdW50PFMgZXh0ZW5kcyBTZWxlY3RTZWxlY3RvcjxNPj4oc2VsZWN0b3I/OiBTKTogQ291bnRPcHRpb248TSwgbnVtYmVyPiB7XG4gICAgdGhpcy5jb3VudFNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgcmV0dXJuIHRoaXMgYXMgQ291bnRPcHRpb248TSwgbnVtYmVyPjtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBmcm9tKHNlbGVjdG9yOiBGcm9tU2VsZWN0b3I8TT4pOiBXaGVyZU9wdGlvbjxNLCBSPiB7XG4gICAgdGhpcy5mcm9tU2VsZWN0b3IgPSAoXG4gICAgICB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgPyBNb2RlbC5nZXQoc2VsZWN0b3IpIDogc2VsZWN0b3JcbiAgICApIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihgQ291bGQgbm90IGZpbmQgc2VsZWN0b3IgbW9kZWw6ICR7c2VsZWN0b3J9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBAZmluYWwoKVxuICBwdWJsaWMgd2hlcmUoY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBPcmRlckFuZEdyb3VwT3B0aW9uPE0sIFI+IHtcbiAgICB0aGlzLndoZXJlQ29uZGl0aW9uID0gY29uZGl0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHVibGljIG9yZGVyQnkoXG4gICAgc2VsZWN0b3I6IE9yZGVyQnlTZWxlY3RvcjxNPlxuICApOiBMaW1pdE9wdGlvbjxNLCBSPiAmIE9mZnNldE9wdGlvbjxSPiB7XG4gICAgdGhpcy5vcmRlckJ5U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBncm91cEJ5KHNlbGVjdG9yOiBHcm91cEJ5U2VsZWN0b3I8TT4pOiBMaW1pdE9wdGlvbjxNLCBSPiB7XG4gICAgdGhpcy5ncm91cEJ5U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBsaW1pdCh2YWx1ZTogbnVtYmVyKTogT2Zmc2V0T3B0aW9uPFI+IHtcbiAgICB0aGlzLmxpbWl0U2VsZWN0b3IgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBvZmZzZXQodmFsdWU6IG51bWJlcik6IEV4ZWN1dG9yPFI+IHtcbiAgICB0aGlzLm9mZnNldFNlbGVjdG9yID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBAZmluYWwoKVxuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8Uj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeTogUSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5yYXcocXVlcnkpKSBhcyBSO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogUSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3PFI+KHJhd0lucHV0KTtcbiAgICBpZiAoIXRoaXMuc2VsZWN0U2VsZWN0b3IpIHJldHVybiByZXN1bHRzO1xuICAgIGNvbnN0IHBrQXR0ciA9IGZpbmRQcmltYXJ5S2V5KFxuICAgICAgbmV3ICh0aGlzLmZyb21TZWxlY3RvciBhcyBDb25zdHJ1Y3RvcjxNPikoKVxuICAgICkuaWQ7XG5cbiAgICBjb25zdCBwcm9jZXNzb3IgPSBmdW5jdGlvbiByZWNvcmRQcm9jZXNzb3IoXG4gICAgICB0aGlzOiBTdGF0ZW1lbnQ8USwgTSwgUj4sXG4gICAgICByOiBhbnlcbiAgICApIHtcbiAgICAgIGNvbnN0IGlkID0gcltwa0F0dHJdO1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQoXG4gICAgICAgIHIsXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yIGFzIENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgIHBrQXR0cixcbiAgICAgICAgaWRcbiAgICAgICkgYXMgYW55O1xuICAgIH0uYmluZCh0aGlzIGFzIGFueSk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRzKSkgcmV0dXJuIHJlc3VsdHMubWFwKHByb2Nlc3NvcikgYXMgUjtcbiAgICByZXR1cm4gcHJvY2Vzc29yKHJlc3VsdHMpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnVpbGQoKTogUTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LCAuLi5hcmdzOiBhbnlbXSk6IFE7XG4gIGFic3RyYWN0IHBhZ2luYXRlKHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFE+Pjtcbn1cbiIsIi8qKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAZGVzY3JpcHRpb24gQ29yZSBtb2R1bGUgZm9yIHRoZSBEZWNhZiBUeXBlU2NyaXB0IGZyYW1ld29ya1xuICogQHN1bW1hcnkgVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGZvdW5kYXRpb25hbCBjb21wb25lbnRzIG9mIHRoZSBEZWNhZiBmcmFtZXdvcmssIGluY2x1ZGluZyBpZGVudGl0eSBtYW5hZ2VtZW50LCBcbiAqIG1vZGVsIGRlZmluaXRpb25zLCByZXBvc2l0b3J5IHBhdHRlcm5zLCBwZXJzaXN0ZW5jZSBsYXllciwgcXVlcnkgYnVpbGRpbmcsIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucy5cbiAqIEl0IGV4cG9ydHMgZnVuY3Rpb25hbGl0eSBmcm9tIHZhcmlvdXMgc3VibW9kdWxlcyBhbmQgc2V0cyB1cCB0aGUgaW5qZWN0YWJsZSByZWdpc3RyeSBmb3IgcmVwb3NpdG9yeSBkZWNvcmF0b3JzLlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGVzUmVnaXN0cnkgfSBmcm9tIFwiLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5cbi8vIG92ZXJyaWRlcyB0aGUgcHJldmlvdXMgSW5qZWN0YWJsZXMgcmVnaXN0cnkgdG8gZW5hYmxlIHRoZSBAcmVwb3NpdG9yeSBkZWNvcmF0b3JcbkluamVjdGFibGVzLnNldFJlZ2lzdHJ5KG5ldyBJbmplY3RhYmxlc1JlZ2lzdHJ5KCkpO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9pZGVudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3F1ZXJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuLy9sZWZ0IHRvIGxhc3Qgb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvblxuICogQHN1bW1hcnkgQSBjb25zdGFudCByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIGNvcmUgcGFja2FnZVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJPcmRlckRpcmVjdGlvbiIsIkNhc2NhZGUiLCJQZXJzaXN0ZW5jZUtleXMiLCJCYXNlRXJyb3IiLCJMb2dnaW5nIiwiSW50ZXJuYWxFcnJvciIsIk9wZXJhdGlvbktleXMiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJEZWNvcmF0aW9uIiwiTW9kZWwiLCJEZWZhdWx0Rmxhdm91ciIsIkNvbnRleHQiLCJEZWZhdWx0UmVwb3NpdG9yeUZsYWdzIiwibW9kZWxUb1RyYW5zaWVudCIsIkRCS2V5cyIsIl9fZGVjb3JhdGUiLCJhcHBseSIsIm1ldGFkYXRhIiwiUmVwIiwid3JhcE1ldGhvZFdpdGhDb250ZXh0IiwiZW5mb3JjZURCRGVjb3JhdG9ycyIsIlZhbGlkYXRpb25FcnJvciIsIkRlZmF1bHRTZXBhcmF0b3IiLCJmaW5kUHJpbWFyeUtleSIsIlJlZmxlY3Rpb24iLCJpbmplY3QiLCJNb2RlbEtleXMiLCJpbmplY3RhYmxlIiwic2YiLCJJbmplY3RhYmxlUmVnaXN0cnlJbXAiLCJJbmplY3RhYmxlcyIsIk9wZXJhdG9yIiwiR3JvdXBPcGVyYXRvciIsInJlcXVpcmVkIiwiTm90Rm91bmRFcnJvciIsIlZhbGlkYXRpb24iLCJWYWxpZGF0aW9uS2V5cyIsInByb3BNZXRhZGF0YSIsIkNvbmZsaWN0RXJyb3IiLCJvbkNyZWF0ZVVwZGF0ZSIsIm9uQ3JlYXRlIiwicG9wdWxhdGUiLCJwcm9wIiwidHlwZSIsIm9uVXBkYXRlIiwib25EZWxldGUiLCJhZnRlckFueSIsInBvcCIsImxpc3QiLCJyZWFkb25seSIsInRpbWVzdGFtcCIsIkRCT3BlcmF0aW9ucyIsIl9fbWV0YWRhdGEiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUVBOzs7Ozs7SUFNRztBQUNTQTtJQUFaLENBQUEsVUFBWSxjQUFjLEVBQUE7O0lBRXhCLElBQUEsY0FBQSxDQUFBLEtBQUEsQ0FBQSxHQUFBLEtBQVc7O0lBR1gsSUFBQSxjQUFBLENBQUEsS0FBQSxDQUFBLEdBQUEsTUFBWTtJQUNkLENBQUMsRUFOV0Esc0JBQWMsS0FBZEEsc0JBQWMsR0FNekIsRUFBQSxDQUFBLENBQUE7SUFFRDs7Ozs7O0lBTUc7QUFDU0M7SUFBWixDQUFBLFVBQVksT0FBTyxFQUFBOztJQUVqQixJQUFBLE9BQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxTQUFtQjs7SUFFbkIsSUFBQSxPQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsTUFBYTtJQUNmLENBQUMsRUFMV0EsZUFBTyxLQUFQQSxlQUFPLEdBS2xCLEVBQUEsQ0FBQSxDQUFBO0lBRUQ7Ozs7OztJQU1HO0FBQ1UsVUFBQSxjQUFjLEdBQW9CO1FBQzdDLE1BQU0sRUFBRUEsZUFBTyxDQUFDLE9BQU87UUFDdkIsTUFBTSxFQUFFQSxlQUFPLENBQUMsSUFBSTs7O0lDeEN0Qjs7Ozs7O0lBTUc7QUFDU0M7SUFBWixDQUFBLFVBQVksZUFBZSxFQUFBOztJQUV6QixJQUFB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
|
4102
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXBvc2l0b3J5L2NvbnN0YW50cy50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9jb25zdGFudHMudHMiLCIuLi9zcmMvdXRpbHMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy91dGlscy9lcnJvcnMudHMiLCIuLi9zcmMvcGVyc2lzdGVuY2UvZXJyb3JzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL0Rpc3BhdGNoLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL09ic2VydmVySGFuZGxlci50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9BZGFwdGVyLnRzIiwiLi4vc3JjL2lkZW50aXR5L3V0aWxzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL1NlcXVlbmNlLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9SZXBvc2l0b3J5LnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L2Vycm9ycy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L3V0aWxzLnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvaW5qZWN0YWJsZXMudHMiLCIuLi9zcmMvaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnMudHMiLCIuLi9zcmMvcXVlcnkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3F1ZXJ5L2Vycm9ycy50cyIsIi4uL3NyYy9xdWVyeS9Db25kaXRpb24udHMiLCIuLi9zcmMvbW9kZWwvY29uc3RydWN0aW9uLnRzIiwiLi4vc3JjL21vZGVsL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvaWRlbnRpdHkvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9tb2RlbC9CYXNlTW9kZWwudHMiLCIuLi9zcmMvcXVlcnkvUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3F1ZXJ5L1N0YXRlbWVudC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDYXNjYWRlTWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBzb3J0IGRpcmVjdGlvbnMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBhdmFpbGFibGUgc29ydCBkaXJlY3Rpb25zIGZvciBvcmRlcmluZyBxdWVyeSByZXN1bHRzLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIE9yZGVyRGlyZWN0aW9uIHtcbiAgLyoqIEFzY2VuZGluZyBvcmRlciAoQSB0byBaLCAwIHRvIDkpICovXG4gIEFTQyA9IFwiYXNjXCIsXG5cbiAgLyoqIERlc2NlbmRpbmcgb3JkZXIgKFogdG8gQSwgOSB0byAwKSAqL1xuICBEU0MgPSBcImRlc2NcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW51bWVyYXRpb24gb2YgY2FzY2FkZSBvcGVyYXRpb24gdHlwZXMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBhdmFpbGFibGUgY2FzY2FkZSBiZWhhdmlvcnMgZm9yIGVudGl0eSByZWxhdGlvbnNoaXBzLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIENhc2NhZGUge1xuICAvKiogUGVyZm9ybSBjYXNjYWRlIG9wZXJhdGlvbiBvbiByZWxhdGVkIGVudGl0aWVzICovXG4gIENBU0NBREUgPSBcImNhc2NhZGVcIixcbiAgLyoqIERvIG5vdCBwZXJmb3JtIGNhc2NhZGUgb3BlcmF0aW9uIG9uIHJlbGF0ZWQgZW50aXRpZXMgKi9cbiAgTk9ORSA9IFwibm9uZVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNhc2NhZGUgY29uZmlndXJhdGlvbiBmb3IgZW50aXR5IHJlbGF0aW9uc2hpcHMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyB0aGUgZGVmYXVsdCBjYXNjYWRlIGJlaGF2aW9yIHdoZXJlIHVwZGF0ZXMgY2FzY2FkZSBidXQgZGVsZXRlcyBkbyBub3QuXG4gKiBAdHlwZSB7Q2FzY2FkZU1ldGFkYXRhfVxuICogQGNvbnN0IERlZmF1bHRDYXNjYWRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbn07XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBQZXJzaXN0ZW5jZS1yZWxhdGVkIGNvbnN0YW50IGtleXNcbiAqIEBzdW1tYXJ5IEVudW0gY29udGFpbmluZyBzdHJpbmcgY29uc3RhbnRzIHVzZWQgdGhyb3VnaG91dCB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIgZm9yIG1ldGFkYXRhLCByZWxhdGlvbnMsIGFuZCBvdGhlciBwZXJzaXN0ZW5jZS1yZWxhdGVkIG9wZXJhdGlvbnNcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZW51bSBQZXJzaXN0ZW5jZUtleXMge1xuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgaW5kZXggbWV0YWRhdGEgKi9cbiAgSU5ERVggPSBcImluZGV4XCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHVuaXF1ZSBjb25zdHJhaW50IG1ldGFkYXRhICovXG4gIFVOSVFVRSA9IFwidW5pcXVlXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGFkYXB0ZXIgbWV0YWRhdGEgKi9cbiAgQURBUFRFUiA9IFwiYWRhcHRlclwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gVGVtcGxhdGUgZm9yIGluamVjdGFibGUgYWRhcHRlciBuYW1lcyAqL1xuICBJTkpFQ1RBQkxFID0gXCJkZWNhZl97MH1fYWRhcHRlcl9mb3JfezF9XCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHRhYmxlIG5hbWUgbWV0YWRhdGEgKi9cbiAgVEFCTEUgPSBcInRhYmxlXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGNvbHVtbiBuYW1lIG1ldGFkYXRhICovXG4gIENPTFVNTiA9IFwiY29sdW1uXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIGdlbmVyYWwgbWV0YWRhdGEgc3RvcmFnZSAqL1xuICBNRVRBREFUQSA9IFwiX19tZXRhZGF0YVwiLFxuXG4gIC8vIE93bmVyc2hpcFxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgY3JlYXRlZC1ieSBvd25lcnNoaXAgbWV0YWRhdGEgKi9cbiAgT1dORVJTSElQID0gXCJvd25lcnNoaXBcIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgY3JlYXRlZC1ieSBvd25lcnNoaXAgbWV0YWRhdGEgKi9cbiAgQ1JFQVRFRF9CWSA9IGAke09XTkVSU0hJUH0uY3JlYXRlZC1ieWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHVwZGF0ZWQtYnkgb3duZXJzaGlwIG1ldGFkYXRhICovXG4gIFVQREFURURfQlkgPSBgJHtPV05FUlNISVB9LnVwZGF0ZWQtYnlgLFxuXG4gIC8vIFJlbGF0aW9uc1xuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciByZWxhdGlvbnMgbWV0YWRhdGEgc3RvcmFnZSAqL1xuICBSRUxBVElPTlMgPSBcIl9fcmVsYXRpb25zXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHJlbGF0aW9ucyBtZXRhZGF0YSBzdG9yYWdlICovXG4gIFJFTEFUSU9OID0gXCJyZWxhdGlvblwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBvbmUtdG8tb25lIHJlbGF0aW9uIG1ldGFkYXRhICovXG4gIE9ORV9UT19PTkUgPSBgJHtSRUxBVElPTn0ub25lLXRvLW9uZWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIG9uZS10by1tYW55IHJlbGF0aW9uIG1ldGFkYXRhICovXG4gIE9ORV9UT19NQU5ZID0gYCR7UkVMQVRJT059Lm9uZS10by1tYW55YCxcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgbWFueS10by1vbmUgcmVsYXRpb24gbWV0YWRhdGEgKi9cbiAgTUFOWV9UT19PTkUgPSBgJHtSRUxBVElPTn0ubWFueS10by1vbmVgLFxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgbWFueS10by1vbmUgcmVsYXRpb24gbWV0YWRhdGEgKi9cbiAgTUFOWV9UT19NQU5ZID0gYCR7UkVMQVRJT059Lm1hbnktdG8tbWFueWAsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHBvcHVsYXRlIG1ldGFkYXRhICovXG4gIFBPUFVMQVRFID0gXCJwb3B1bGF0ZVwiLFxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IG1ha2VzIGEgbWV0aG9kIG5vbi1jb25maWd1cmFibGVcbiAqIEBzdW1tYXJ5IFRoaXMgZGVjb3JhdG9yIHByZXZlbnRzIGEgbWV0aG9kIGZyb20gYmVpbmcgb3ZlcnJpZGRlbiBieSBtYWtpbmcgaXQgbm9uLWNvbmZpZ3VyYWJsZS5cbiAqIEl0IHRocm93cyBhbiBlcnJvciBpZiB1c2VkIG9uIGFueXRoaW5nIG90aGVyIHRoYW4gYSBtZXRob2QuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBtZXRob2RzXG4gKiBAZnVuY3Rpb24gZmluYWxcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWwoKSB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuICApID0+IHtcbiAgICBpZiAoIWRlc2NyaXB0b3IpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbCBkZWNvcmF0b3IgY2FuIG9ubHkgYmUgdXNlZCBvbiBtZXRob2RzXCIpO1xuICAgIGlmIChkZXNjcmlwdG9yPy5jb25maWd1cmFibGUpIHtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgdXNlciBpcyBub3QgYXV0aG9yaXplZCB0byBwZXJmb3JtIGFuIGFjdGlvblxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhIHVzZXIgYXR0ZW1wdHMgdG8gYWNjZXNzIGEgcmVzb3VyY2Ugb3IgcGVyZm9ybSBhbiBhY3Rpb24gd2l0aG91dCBwcm9wZXIgYXV0aGVudGljYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEBjbGFzcyBBdXRob3JpemF0aW9uRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIHRocm93aW5nIGFuIEF1dGhvcml6YXRpb25FcnJvclxuICogaWYgKCF1c2VyLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gKiAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoJ1VzZXIgbm90IGF1dGhlbnRpY2F0ZWQnKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvbkVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKEF1dGhvcml6YXRpb25FcnJvci5uYW1lLCBtc2csIDQwMSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYSB1c2VyIGlzIGZvcmJpZGRlbiBmcm9tIGFjY2Vzc2luZyBhIHJlc291cmNlXG4gKiBAc3VtbWFyeSBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIGFuIGF1dGhlbnRpY2F0ZWQgdXNlciBhdHRlbXB0cyB0byBhY2Nlc3MgYSByZXNvdXJjZSBvciBwZXJmb3JtIGFuIGFjdGlvbiB0aGV5IGRvbid0IGhhdmUgcGVybWlzc2lvbiBmb3JcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRm9yYmlkZGVuRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIHRocm93aW5nIGEgRm9yYmlkZGVuRXJyb3JcbiAqIGlmICghdXNlci5oYXNQZXJtaXNzaW9uKCdhZG1pbicpKSB7XG4gKiAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignVXNlciBkb2VzIG5vdCBoYXZlIGFkbWluIHBlcm1pc3Npb25zJyk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcmJpZGRlbkVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKEZvcmJpZGRlbkVycm9yLm5hbWUsIG1zZywgNDAzKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhIGNvbm5lY3Rpb24gdG8gYSBzZXJ2aWNlIGZhaWxzXG4gKiBAc3VtbWFyeSBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIHRoZSBhcHBsaWNhdGlvbiBmYWlscyB0byBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIGEgcmVxdWlyZWQgc2VydmljZSBvciByZXNvdXJjZVxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBDb25uZWN0aW9uRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIHRocm93aW5nIGEgQ29ubmVjdGlvbkVycm9yXG4gKiB0cnkge1xuICogICBhd2FpdCBkYXRhYmFzZS5jb25uZWN0KCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICB0aHJvdyBuZXcgQ29ubmVjdGlvbkVycm9yKCdGYWlsZWQgdG8gY29ubmVjdCB0byBkYXRhYmFzZScpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoQ29ubmVjdGlvbkVycm9yLm5hbWUsIG1zZywgNTAzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGFuIHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWRcbiAqIEBzdW1tYXJ5IFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIHJlcXVlc3RlZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRcbiAqIHBlcnNpc3RlbmNlIGFkYXB0ZXIgb3IgY29uZmlndXJhdGlvbi4gSXQgZXh0ZW5kcyB0aGUgQmFzZUVycm9yIGNsYXNzIGFuZCBzZXRzIGEgNTAwIHN0YXR1cyBjb2RlLlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIGFuIEVycm9yIG9iamVjdCB0byB3cmFwXG4gKiBAY2xhc3MgVW5zdXBwb3J0ZWRFcnJvclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFRocm93aW5nIGFuIFVuc3VwcG9ydGVkRXJyb3JcbiAqIGlmICghYWRhcHRlci5zdXBwb3J0c1RyYW5zYWN0aW9ucygpKSB7XG4gKiAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdUcmFuc2FjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhZGFwdGVyJyk7XG4gKiB9XG4gKiBcbiAqIC8vIENhdGNoaW5nIGFuIFVuc3VwcG9ydGVkRXJyb3JcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IGFkYXB0ZXIuYmVnaW5UcmFuc2FjdGlvbigpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ09wZXJhdGlvbiBub3Qgc3VwcG9ydGVkOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoVW5zdXBwb3J0ZWRFcnJvci5uYW1lLCBtc2csIDUwMCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRXZlbnRJZHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEaXNwYXRjaGVzIGRhdGFiYXNlIG9wZXJhdGlvbiBldmVudHMgdG8gb2JzZXJ2ZXJzXG4gKiBAc3VtbWFyeSBUaGUgRGlzcGF0Y2ggY2xhc3MgaW1wbGVtZW50cyB0aGUgT2JzZXJ2YWJsZSBpbnRlcmZhY2UgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBpbnRlcmNlcHRpbmdcbiAqIGRhdGFiYXNlIG9wZXJhdGlvbnMgZnJvbSBhbiBBZGFwdGVyIGFuZCBub3RpZnlpbmcgb2JzZXJ2ZXJzIHdoZW4gY2hhbmdlcyBvY2N1ci4gSXQgdXNlcyBwcm94aWVzIHRvXG4gKiB3cmFwIHRoZSBhZGFwdGVyJ3MgQ1JVRCBtZXRob2RzIGFuZCBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgb2JzZXJ2ZXIgdXBkYXRlcyBhZnRlciBvcGVyYXRpb25zIGNvbXBsZXRlLlxuICogQHRlbXBsYXRlIFkgLSBUaGUgbmF0aXZlIGRhdGFiYXNlIGRyaXZlciB0eXBlXG4gKiBAcGFyYW0ge3ZvaWR9IC0gTm8gY29uc3RydWN0b3IgcGFyYW1ldGVyc1xuICogQGNsYXNzIERpc3BhdGNoXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRpbmcgYW5kIHVzaW5nIGEgRGlzcGF0Y2ggaW5zdGFuY2VcbiAqIGNvbnN0IGRpc3BhdGNoID0gbmV3IERpc3BhdGNoPFBvc3RncmVzRHJpdmVyPigpO1xuICpcbiAqIC8vIENvbm5lY3QgaXQgdG8gYW4gYWRhcHRlclxuICogY29uc3QgYWRhcHRlciA9IG5ldyBQb3N0Z3Jlc0FkYXB0ZXIoY29ubmVjdGlvbik7XG4gKiBkaXNwYXRjaC5vYnNlcnZlKGFkYXB0ZXIpO1xuICpcbiAqIC8vIE5vdyBhbnkgQ1JVRCBvcGVyYXRpb25zIG9uIHRoZSBhZGFwdGVyIHdpbGwgYXV0b21hdGljYWxseVxuICogLy8gdHJpZ2dlciBvYnNlcnZlciBub3RpZmljYXRpb25zXG4gKiBhd2FpdCBhZGFwdGVyLmNyZWF0ZSgndXNlcnMnLCAxMjMsIHVzZXJNb2RlbCk7XG4gKiAvLyBPYnNlcnZlcnMgd2lsbCBiZSBub3RpZmllZCBhYm91dCB0aGUgY3JlYXRpb25cbiAqXG4gKiAvLyBXaGVuIGRvbmUsIHlvdSBjYW4gZGlzY29ubmVjdFxuICogZGlzcGF0Y2gudW5PYnNlcnZlKGFkYXB0ZXIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXNwYXRjaDxZPiBpbXBsZW1lbnRzIE9ic2VydmFibGUge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBhZGFwdGVyIGJlaW5nIG9ic2VydmVkXG4gICAqIEBzdW1tYXJ5IFJlZmVyZW5jZSB0byB0aGUgZGF0YWJhc2UgYWRhcHRlciB3aG9zZSBvcGVyYXRpb25zIGFyZSBiZWluZyBtb25pdG9yZWRcbiAgICovXG4gIHByb3RlY3RlZCBhZGFwdGVyPzogQWRhcHRlcjxZLCBhbnksIGFueSwgYW55PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBuYXRpdmUgZGF0YWJhc2UgZHJpdmVyXG4gICAqIEBzdW1tYXJ5IFJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSBkcml2ZXIgZnJvbSB0aGUgYWRhcHRlclxuICAgKi9cbiAgcHJvdGVjdGVkIG5hdGl2ZT86IFk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0IG9mIG1vZGVsIGNvbnN0cnVjdG9yc1xuICAgKiBAc3VtbWFyeSBBcnJheSBvZiBtb2RlbCBjb25zdHJ1Y3RvcnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBhZGFwdGVyXG4gICAqL1xuICBwcm90ZWN0ZWQgbW9kZWxzITogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgTG9nZ2VyIGZvciByZWNvcmRpbmcgZGlzcGF0Y2ggYWN0aXZpdGllc1xuICAgKi9cbiAgcHJpdmF0ZSBsb2dnZXIhOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBY2Nlc3NvciBmb3IgdGhlIGxvZ2dlclxuICAgKiBAc3VtbWFyeSBHZXRzIG9yIGluaXRpYWxpemVzIHRoZSBsb2dnZXIgZm9yIHRoaXMgZGlzcGF0Y2ggaW5zdGFuY2VcbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgbG9nZ2VyIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGxvZygpIHtcbiAgICBpZiAoIXRoaXMubG9nZ2VyKVxuICAgICAgdGhpcy5sb2dnZXIgPSBMb2dnaW5nLmZvcih0aGlzIGFzIGFueSkuZm9yKHRoaXMuYWRhcHRlciBhcyBhbnkpO1xuICAgIHJldHVybiB0aGlzLmxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBEaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBEaXNwYXRjaCBpbnN0YW5jZSB3aXRob3V0IGFueSBhZGFwdGVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgZGlzcGF0Y2ggYnkgcHJveHlpbmcgYWRhcHRlciBtZXRob2RzXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgcHJveGllcyBvbiB0aGUgYWRhcHRlcidzIENSVUQgbWV0aG9kcyB0byBpbnRlcmNlcHQgb3BlcmF0aW9ucyBhbmQgbm90aWZ5IG9ic2VydmVycy5cbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiBhZGFwdGVyIGlzIG9ic2VydmVkLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IERpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFByb3h5XG4gICAqXG4gICAqICAgRGlzcGF0Y2gtPj5EaXNwYXRjaDogaW5pdGlhbGl6ZSgpXG4gICAqICAgRGlzcGF0Y2gtPj5EaXNwYXRjaDogQ2hlY2sgaWYgYWRhcHRlciBleGlzdHNcbiAgICogICBhbHQgTm8gYWRhcHRlclxuICAgKiAgICAgRGlzcGF0Y2gtLT4+RGlzcGF0Y2g6IFRocm93IEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICpcbiAgICogICBsb29wIEZvciBlYWNoIENSVUQgbWV0aG9kXG4gICAqICAgICBEaXNwYXRjaC0+PkFkYXB0ZXI6IENoZWNrIGlmIG1ldGhvZCBleGlzdHNcbiAgICogICAgIGFsdCBNZXRob2QgZG9lc24ndCBleGlzdFxuICAgKiAgICAgICBEaXNwYXRjaC0tPj5EaXNwYXRjaDogVGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgICAgZW5kXG4gICAqXG4gICAqICAgICBEaXNwYXRjaC0+PkFkYXB0ZXI6IEdldCBwcm9wZXJ0eSBkZXNjcmlwdG9yXG4gICAqICAgICBsb29wIFdoaWxlIGRlc2NyaXB0b3Igbm90IGZvdW5kXG4gICAqICAgICAgIERpc3BhdGNoLT4+QWRhcHRlcjogQ2hlY2sgcHJvdG90eXBlIGNoYWluXG4gICAqICAgICBlbmRcbiAgICpcbiAgICogICAgIGFsdCBEZXNjcmlwdG9yIG5vdCBmb3VuZCBvciBub3Qgd3JpdGFibGVcbiAgICogICAgICAgRGlzcGF0Y2gtPj5EaXNwYXRjaDogTG9nIGVycm9yIGFuZCBjb250aW51ZVxuICAgKiAgICAgZWxzZSBEZXNjcmlwdG9yIGZvdW5kIGFuZCB3cml0YWJsZVxuICAgKiAgICAgICBEaXNwYXRjaC0+PlByb3h5OiBDcmVhdGUgcHJveHkgZm9yIG1ldGhvZFxuICAgKiAgICAgICBEaXNwYXRjaC0+PkFkYXB0ZXI6IFJlcGxhY2UgbWV0aG9kIHdpdGggcHJveHlcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyIGFzIEFkYXB0ZXI8WSwgYW55LCBhbnksIGFueT47XG4gICAgKFxuICAgICAgW1xuICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLFxuICAgICAgXSBhcyAoa2V5b2YgQWRhcHRlcjxZLCBhbnksIGFueSwgYW55PilbXVxuICAgICkuZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gICAgICBpZiAoIWFkYXB0ZXJbbWV0aG9kXSlcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE1ldGhvZCAke21ldGhvZH0gbm90IGZvdW5kIGluICR7YWRhcHRlci5hbGlhc30gYWRhcHRlciB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYWRhcHRlciwgbWV0aG9kKTtcbiAgICAgIGxldCBwcm90bzogYW55ID0gYWRhcHRlcjtcbiAgICAgIHdoaWxlICghZGVzY3JpcHRvciAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgICAgIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBtZXRob2QpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgIWRlc2NyaXB0b3Iud3JpdGFibGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGhvZCAke21ldGhvZH0gdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gYnVsa1RvU2luZ2xlKG1ldGhvZDogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkNSRUFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuVVBEQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5ERUxFVEU7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGVyZSBhcmUgcmVhZCBvbmx5IHByb3BlcnRpZXNcbiAgICAgIGFkYXB0ZXJbbWV0aG9kXSA9IG5ldyBQcm94eShhZGFwdGVyW21ldGhvZF0sIHtcbiAgICAgICAgYXBwbHk6IGFzeW5jICh0YXJnZXQ6IGFueSwgdGhpc0FyZywgYXJnQXJyYXk6IGFueVtdKSA9PiB7XG4gICAgICAgICAgY29uc3QgW3RhYmxlTmFtZSwgaWRzXSA9IGFyZ0FycmF5O1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5hcHBseSh0aGlzQXJnLCBhcmdBcnJheSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGVOYW1lLCBidWxrVG9TaW5nbGUobWV0aG9kKSwgaWRzIGFzIEV2ZW50SWRzKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvZy52ZXJib3NlKFxuICAgICAgICAgICAgICAgIGBPYnNlcnZlciByZWZyZXNoIGRpc3BhdGNoZWQgYnkgJHttZXRob2R9IGZvciAke3RhYmxlTmFtZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBwa3M6ICR7aWRzfWApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZTogdW5rbm93bikgPT5cbiAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBkaXNwYXRjaCBvYnNlcnZlciByZWZyZXNoIGZvciAke21ldGhvZH0gb24gJHt0YWJsZU5hbWV9OiAke2V9YFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xvc2VzIHRoZSBkaXNwYXRjaFxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAgd2hlbiB0aGUgZGlzcGF0Y2ggaXMgbm8gbG9uZ2VyIG5lZWRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGNsb3NpbmcgaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIC8vIHRvIG5vdGhpbmcgaW4gdGhpcyBpbnN0YW5jZSBidXQgbWF5IGJlIHJlcXVpcmVkIGZvciBjbG9zaW5nIGNvbm5lY3Rpb25zXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXJ0cyBvYnNlcnZpbmcgYW4gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBDb25uZWN0cyB0aGlzIGRpc3BhdGNoIHRvIGFuIGFkYXB0ZXIgdG8gbW9uaXRvciBpdHMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0ge0FkYXB0ZXI8WSwgYW55LCBhbnksIGFueT59IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gb2JzZXJ2ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb2JzZXJ2ZShvYnNlcnZlcjogQWRhcHRlcjxZLCBhbnksIGFueSwgYW55Pik6IHZvaWQge1xuICAgIGlmICghKG9ic2VydmVyIGluc3RhbmNlb2YgQWRhcHRlcikpXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcIk9ubHkgQWRhcHRlcnMgY2FuIGJlIG9ic2VydmVkIGJ5IGRpc3BhdGNoXCIpO1xuICAgIHRoaXMuYWRhcHRlciA9IG9ic2VydmVyO1xuICAgIHRoaXMubmF0aXZlID0gb2JzZXJ2ZXIubmF0aXZlO1xuICAgIHRoaXMubW9kZWxzID0gQWRhcHRlci5tb2RlbHModGhpcy5hZGFwdGVyLmFsaWFzKTtcbiAgICB0aGlzLmluaXRpYWxpemUoKS50aGVuKCgpID0+XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKFxuICAgICAgICBgRGlzcGF0Y2ggaW5pdGlhbGl6ZWQgZm9yICR7dGhpcy5hZGFwdGVyIS5hbGlhc30gYWRhcHRlcmBcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdG9wcyBvYnNlcnZpbmcgYW4gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBEaXNjb25uZWN0cyB0aGlzIGRpc3BhdGNoIGZyb20gYW4gYWRhcHRlclxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBhZGFwdGVyIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWRhcHRlciAhPT0gb2JzZXJ2ZXIpXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgXCJPbmx5IHRoZSBhZGFwdGVyIHRoYXQgd2FzIHVzZWQgdG8gb2JzZXJ2ZSBjYW4gYmUgdW5vYnNlcnZlZFwiXG4gICAgICApO1xuICAgIHRoaXMuYWRhcHRlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHNcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlciBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLnJlZnJlc2godGFibGUsIGV2ZW50LCBpZCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIGRpc3BhdGNoOiAke2V9YCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBPYnNlcnZhYmxlLCBPYnNlcnZlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBFdmVudElkcywgT2JzZXJ2ZXJGaWx0ZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiBvYnNlcnZlcnMgZm9yIGRhdGFiYXNlIGV2ZW50c1xuICogQHN1bW1hcnkgVGhlIE9ic2VydmVySGFuZGxlciBjbGFzcyBpbXBsZW1lbnRzIHRoZSBPYnNlcnZhYmxlIGludGVyZmFjZSBhbmQgcHJvdmlkZXMgYSBjZW50cmFsaXplZFxuICogd2F5IHRvIG1hbmFnZSBtdWx0aXBsZSBvYnNlcnZlcnMuIEl0IGFsbG93cyByZWdpc3RlcmluZyBvYnNlcnZlcnMgd2l0aCBvcHRpb25hbCBmaWx0ZXJzIHRvIGNvbnRyb2xcbiAqIHdoaWNoIGV2ZW50cyB0aGV5IHJlY2VpdmUgbm90aWZpY2F0aW9ucyBmb3IsIGFuZCBoYW5kbGVzIHRoZSBwcm9jZXNzIG9mIG5vdGlmeWluZyBhbGwgcmVsZXZhbnRcbiAqIG9ic2VydmVycyB3aGVuIGRhdGFiYXNlIGV2ZW50cyBvY2N1ci5cbiAqIEBjbGFzcyBPYnNlcnZlckhhbmRsZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYW4gb2JzZXJ2ZXIgaGFuZGxlclxuICogY29uc3QgaGFuZGxlciA9IG5ldyBPYnNlcnZlckhhbmRsZXIoKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhbiBvYnNlcnZlclxuICogY29uc3QgbXlPYnNlcnZlciA9IHtcbiAqICAgcmVmcmVzaDogYXN5bmMgKHRhYmxlLCBldmVudCwgaWQpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZyhgQ2hhbmdlIGluICR7dGFibGV9OiAke2V2ZW50fSBmb3IgSUQgJHtpZH1gKTtcbiAqICAgfVxuICogfTtcbiAqXG4gKiAvLyBBZGQgb2JzZXJ2ZXIgd2l0aCBhIGZpbHRlciBmb3Igb25seSB1c2VyIHRhYmxlIGV2ZW50c1xuICogaGFuZGxlci5vYnNlcnZlKG15T2JzZXJ2ZXIsICh0YWJsZSwgZXZlbnQsIGlkKSA9PiB0YWJsZSA9PT0gJ3VzZXJzJyk7XG4gKlxuICogLy8gTm90aWZ5IG9ic2VydmVycyBhYm91dCBhbiBldmVudFxuICogYXdhaXQgaGFuZGxlci51cGRhdGVPYnNlcnZlcnMobG9nZ2VyLCAndXNlcnMnLCAnQ1JFQVRFJywgMTIzKTtcbiAqXG4gKiAvLyBSZW1vdmUgYW4gb2JzZXJ2ZXIgd2hlbiBubyBsb25nZXIgbmVlZGVkXG4gKiBoYW5kbGVyLnVuT2JzZXJ2ZShteU9ic2VydmVyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZXJIYW5kbGVyIGltcGxlbWVudHMgT2JzZXJ2YWJsZSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29sbGVjdGlvbiBvZiByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKiBAc3VtbWFyeSBBcnJheSBvZiBvYnNlcnZlciBvYmplY3RzIGFsb25nIHdpdGggdGhlaXIgb3B0aW9uYWwgZmlsdGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9ic2VydmVyczoge1xuICAgIG9ic2VydmVyOiBPYnNlcnZlcjtcbiAgICBmaWx0ZXI/OiBPYnNlcnZlckZpbHRlcjtcbiAgfVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY291bnQgb2Ygb2JzZXJ2ZXJzIGN1cnJlbnRseSByZWdpc3RlcmVkIHdpdGggdGhpcyBoYW5kbGVyXG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKi9cbiAgY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgbmV3IG9ic2VydmVyXG4gICAqIEBzdW1tYXJ5IEFkZHMgYW4gb2JzZXJ2ZXIgdG8gdGhlIGNvbGxlY3Rpb24gd2l0aCBhbiBvcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtPYnNlcnZlckZpbHRlcn0gW2ZpbHRlcl0gLSBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGV2ZW50cyB0aGUgb2JzZXJ2ZXIgcmVjZWl2ZXNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyLCBmaWx0ZXI/OiBPYnNlcnZlckZpbHRlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMubWFwKChvKSA9PiBvLm9ic2VydmVyKS5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk9ic2VydmVyIGFscmVhZHkgcmVnaXN0ZXJlZFwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5wdXNoKHsgb2JzZXJ2ZXI6IG9ic2VydmVyLCBmaWx0ZXI6IGZpbHRlciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgYW4gb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhbiBvYnNlcnZlciBmcm9tIHRoZSBjb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHVucmVnaXN0ZXJcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMub2JzZXJ2ZXJzLm1hcCgobykgPT4gby5vYnNlcnZlcikuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBPYnNlcnZlclwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgcmVsZXZhbnQgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgRmlsdGVycyBvYnNlcnZlcnMgYmFzZWQgb24gdGhlaXIgZmlsdGVyIGZ1bmN0aW9ucyBhbmQgY2FsbHMgcmVmcmVzaCBvbiBlYWNoIG1hdGNoaW5nIG9ic2VydmVyXG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBsb2cgLSBMb2dnZXIgZm9yIHJlY29yZGluZyBub3RpZmljYXRpb24gYWN0aXZpdGllc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgb2JzZXJ2ZXJzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgT2JzZXJ2ZXJIYW5kbGVyXG4gICAqICAgcGFydGljaXBhbnQgT2JzZXJ2ZXJcbiAgICpcbiAgICogICBDbGllbnQtPj5PYnNlcnZlckhhbmRsZXI6IHVwZGF0ZU9ic2VydmVycyhsb2csIHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpXG4gICAqXG4gICAqICAgT2JzZXJ2ZXJIYW5kbGVyLT4+T2JzZXJ2ZXJIYW5kbGVyOiBGaWx0ZXIgb2JzZXJ2ZXJzXG4gICAqXG4gICAqICAgbG9vcCBGb3IgZWFjaCBvYnNlcnZlciB3aXRoIG1hdGNoaW5nIGZpbHRlclxuICAgKiAgICAgYWx0IE9ic2VydmVyIGhhcyBmaWx0ZXJcbiAgICogICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+T2JzZXJ2ZXI6IEFwcGx5IGZpbHRlcih0YWJsZSwgZXZlbnQsIGlkKVxuICAgKiAgICAgICBhbHQgRmlsdGVyIHRocm93cyBlcnJvclxuICAgKiAgICAgICAgIE9ic2VydmVySGFuZGxlci0+PkxvZ2dlcjogTG9nIGVycm9yXG4gICAqICAgICAgICAgT2JzZXJ2ZXJIYW5kbGVyLS0+Pk9ic2VydmVySGFuZGxlcjogU2tpcCBvYnNlcnZlclxuICAgKiAgICAgICBlbHNlIEZpbHRlciByZXR1cm5zIHRydWVcbiAgICogICAgICAgICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlcjogcmVmcmVzaCh0YWJsZSwgZXZlbnQsIGlkLCAuLi5hcmdzKVxuICAgKiAgICAgICBlbHNlIEZpbHRlciByZXR1cm5zIGZhbHNlXG4gICAqICAgICAgICAgT2JzZXJ2ZXJIYW5kbGVyLS0+Pk9ic2VydmVySGFuZGxlcjogU2tpcCBvYnNlcnZlclxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVsc2UgTm8gZmlsdGVyXG4gICAqICAgICAgIE9ic2VydmVySGFuZGxlci0+Pk9ic2VydmVyOiByZWZyZXNoKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlckhhbmRsZXI6IFByb2Nlc3MgcmVzdWx0c1xuICAgKiAgIGxvb3AgRm9yIGVhY2ggcmVzdWx0XG4gICAqICAgICBhbHQgUmVzdWx0IGlzIHJlamVjdGVkXG4gICAqICAgICAgIE9ic2VydmVySGFuZGxlci0+PkxvZ2dlcjogTG9nIGVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBPYnNlcnZlckhhbmRsZXItLT4+Q2xpZW50OiBSZXR1cm5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICBsb2c6IExvZ2dlcixcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdGhpcy5vYnNlcnZlcnNcbiAgICAgICAgLmZpbHRlcigobykgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZmlsdGVyIH0gPSBvO1xuICAgICAgICAgIGlmICghZmlsdGVyKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcih0YWJsZSwgZXZlbnQsIGlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gZmlsdGVyIG9ic2VydmVyICR7by5vYnNlcnZlci50b1N0cmluZygpfTogJHtlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAubWFwKChvKSA9PiB7XG4gICAgICAgICAgby5vYnNlcnZlci5yZWZyZXNoKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpO1xuICAgICAgICB9KVxuICAgICk7XG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpXG4gICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSBvYnNlcnZhYmxlICR7dGhpcy5vYnNlcnZlcnNbaV0udG9TdHJpbmcoKX06ICR7cmVzdWx0LnJlYXNvbn1gXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgREJLZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBDb250ZXh0LFxuICBPcGVyYXRpb25LZXlzLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG4gIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MsXG4gIENvbnRleHR1YWwsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgbW9kZWxUb1RyYW5zaWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIERlZmF1bHRGbGF2b3VyLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgTW9kZWxSZWdpc3RyeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBSYXdFeGVjdXRvciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1Jhd0V4ZWN1dG9yXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2YWJsZVwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi9TZXF1ZW5jZVwiO1xuaW1wb3J0IHsgRXJyb3JQYXJzZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU3RhdGVtZW50IH0gZnJvbSBcIi4uL3F1ZXJ5L1N0YXRlbWVudFwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgRGlzcGF0Y2ggfSBmcm9tIFwiLi9EaXNwYXRjaFwiO1xuaW1wb3J0IHsgdHlwZSBFdmVudElkcywgdHlwZSBPYnNlcnZlckZpbHRlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBPYnNlcnZlckhhbmRsZXIgfSBmcm9tIFwiLi9PYnNlcnZlckhhbmRsZXJcIjtcblxuRGVjb3JhdGlvbi5zZXRGbGF2b3VyUmVzb2x2ZXIoKG9iajogb2JqZWN0KSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIEFkYXB0ZXIuZmxhdm91ck9mKE1vZGVsLmlzTW9kZWwob2JqKSA/IG9iai5jb25zdHJ1Y3RvciA6IChvYmogYXMgYW55KSkgfHxcbiAgICAgIEFkYXB0ZXIuY3VycmVudEZsYXZvdXIgfHxcbiAgICAgIERlZmF1bHRGbGF2b3VyXG4gICAgKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAvLyByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gQWRhcHRlci5jdXJyZW50Rmxhdm91ciB8fCBEZWZhdWx0Rmxhdm91cjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG4gIH1cbn0pO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBkYXRhYmFzZSBhZGFwdGVyc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIGZvdW5kYXRpb24gZm9yIGFsbCBkYXRhYmFzZSBhZGFwdGVycyBpbiB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIuIFRoaXMgY2xhc3NcbiAqIGltcGxlbWVudHMgc2V2ZXJhbCBpbnRlcmZhY2VzIHRvIHByb3ZpZGUgYSBjb25zaXN0ZW50IEFQSSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucywgb2JzZXJ2ZXJcbiAqIHBhdHRlcm4gc3VwcG9ydCwgYW5kIGVycm9yIGhhbmRsaW5nLiBJdCBtYW5hZ2VzIGFkYXB0ZXIgcmVnaXN0cmF0aW9uLCBDUlVEIG9wZXJhdGlvbnMsIGFuZFxuICogb2JzZXJ2ZXIgbm90aWZpY2F0aW9ucy5cbiAqIEB0ZW1wbGF0ZSBZIC0gVGhlIHVuZGVybHlpbmcgZGF0YWJhc2UgZHJpdmVyIHR5cGVcbiAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHF1ZXJ5IG9iamVjdCB0eXBlIHVzZWQgYnkgdGhlIGFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlXG4gKiBAcGFyYW0ge1l9IF9uYXRpdmUgLSBUaGUgdW5kZXJseWluZyBkYXRhYmFzZSBkcml2ZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgYWRhcHRlciB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ30gW19hbGlhc10gLSBPcHRpb25hbCBhbHRlcm5hdGl2ZSBuYW1lIGZvciB0aGlzIGFkYXB0ZXJcbiAqIEBjbGFzcyBBZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW1wbGVtZW50aW5nIGEgY29uY3JldGUgYWRhcHRlclxuICogY2xhc3MgUG9zdGdyZXNBZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxwZy5DbGllbnQsIHBnLlF1ZXJ5LCBQb3N0Z3Jlc0ZsYWdzLCBQb3N0Z3Jlc0NvbnRleHQ+IHtcbiAqICAgY29uc3RydWN0b3IoY2xpZW50OiBwZy5DbGllbnQpIHtcbiAqICAgICBzdXBlcihjbGllbnQsICdwb3N0Z3JlcycpO1xuICogICB9XG4gKlxuICogICBhc3luYyBpbml0aWFsaXplKCkge1xuICogICAgIC8vIFNldCB1cCB0aGUgYWRhcHRlclxuICogICAgIGF3YWl0IHRoaXMubmF0aXZlLmNvbm5lY3QoKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKSB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIGNyZWF0aW5nIHJlY29yZHNcbiAqICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LmtleXMobW9kZWwpLmpvaW4oJywgJyk7XG4gKiAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhtb2RlbCk7XG4gKiAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gdmFsdWVzLm1hcCgoXywgaSkgPT4gYCQke2krMX1gKS5qb2luKCcsICcpO1xuICpcbiAqICAgICBjb25zdCBxdWVyeSA9IGBJTlNFUlQgSU5UTyAke3RhYmxlTmFtZX0gKCR7Y29sdW1uc30pIFZBTFVFUyAoJHtwbGFjZWhvbGRlcnN9KSBSRVRVUk5JTkcgKmA7XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5uYXRpdmUucXVlcnkocXVlcnksIHZhbHVlcyk7XG4gKiAgICAgcmV0dXJuIHJlc3VsdC5yb3dzWzBdO1xuICogICB9XG4gKlxuICogICAvLyBPdGhlciByZXF1aXJlZCBtZXRob2QgaW1wbGVtZW50YXRpb25zLi4uXG4gKiB9XG4gKlxuICogLy8gVXNpbmcgdGhlIGFkYXB0ZXJcbiAqIGNvbnN0IHBnQ2xpZW50ID0gbmV3IHBnLkNsaWVudChjb25uZWN0aW9uU3RyaW5nKTtcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9zdGdyZXNBZGFwdGVyKHBnQ2xpZW50KTtcbiAqIGF3YWl0IGFkYXB0ZXIuaW5pdGlhbGl6ZSgpO1xuICpcbiAqIC8vIFNldCBhcyB0aGUgZGVmYXVsdCBhZGFwdGVyXG4gKiBBZGFwdGVyLnNldEN1cnJlbnQoJ3Bvc3RncmVzJyk7XG4gKlxuICogLy8gUGVyZm9ybSBvcGVyYXRpb25zXG4gKiBjb25zdCB1c2VyID0gYXdhaXQgYWRhcHRlci5jcmVhdGUoJ3VzZXJzJywgMSwgeyBuYW1lOiAnSm9obicsIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScgfSk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgQWRhcHRlciB7XG4gKiAgICAgK1kgbmF0aXZlXG4gKiAgICAgK3N0cmluZyBmbGF2b3VyXG4gKiAgICAgK3N0cmluZyBhbGlhc1xuICogICAgICtjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gKiAgICAgK3JlYWQodGFibGVOYW1lLCBpZClcbiAqICAgICArdXBkYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICogICAgICtkZWxldGUodGFibGVOYW1lLCBpZClcbiAqICAgICArb2JzZXJ2ZShvYnNlcnZlciwgZmlsdGVyKVxuICogICAgICt1bk9ic2VydmUob2JzZXJ2ZXIpXG4gKiAgICAgK3N0YXRpYyBjdXJyZW50XG4gKiAgICAgK3N0YXRpYyBnZXQoZmxhdm91cilcbiAqICAgICArc3RhdGljIHNldEN1cnJlbnQoZmxhdm91cilcbiAqICAgfVxuICpcbiAqICAgY2xhc3MgUmF3RXhlY3V0b3Ige1xuICogICAgICtyYXcocXVlcnkpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE9ic2VydmFibGUge1xuICogICAgICtvYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpXG4gKiAgICAgK3VuT2JzZXJ2ZShvYnNlcnZlcilcbiAqICAgICArdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE9ic2VydmVyIHtcbiAqICAgICArcmVmcmVzaCh0YWJsZSwgZXZlbnQsIGlkKVxuICogICB9XG4gKlxuICogICBjbGFzcyBFcnJvclBhcnNlciB7XG4gKiAgICAgK3BhcnNlRXJyb3IoZXJyKVxuICogICB9XG4gKlxuICogICBBZGFwdGVyIC0tfD4gUmF3RXhlY3V0b3JcbiAqICAgQWRhcHRlciAtLXw+IE9ic2VydmFibGVcbiAqICAgQWRhcHRlciAtLXw+IE9ic2VydmVyXG4gKiAgIEFkYXB0ZXIgLS18PiBFcnJvclBhcnNlclxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWRhcHRlcjxcbiAgICBZLFxuICAgIFEsXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbiAgPlxuICBpbXBsZW1lbnRzIFJhd0V4ZWN1dG9yPFE+LCBDb250ZXh0dWFsPEYsIEM+LCBPYnNlcnZhYmxlLCBPYnNlcnZlciwgRXJyb3JQYXJzZXJcbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2N1cnJlbnRGbGF2b3VyOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhdGljIF9jYWNoZTogUmVjb3JkPHN0cmluZywgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+PiA9IHt9O1xuXG4gIHByaXZhdGUgbG9nZ2VyITogTG9nZ2VyO1xuXG4gIHByb3RlY3RlZCBkaXNwYXRjaD86IERpc3BhdGNoPFk+O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBvYnNlcnZlckhhbmRsZXI/OiBPYnNlcnZlckhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgYWNjZXNzb3JcbiAgICogQHN1bW1hcnkgR2V0cyBvciBpbml0aWFsaXplcyB0aGUgbG9nZ2VyIGZvciB0aGlzIGFkYXB0ZXIgaW5zdGFuY2VcbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgbG9nZ2VyIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGxvZygpIHtcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB0aGlzLmxvZ2dlciA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KTtcbiAgICByZXR1cm4gdGhpcy5sb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG5hdGl2ZSBkYXRhYmFzZSBkcml2ZXJcbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIGRyaXZlciBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtZfSBUaGUgbmF0aXZlIGRhdGFiYXNlIGRyaXZlclxuICAgKi9cbiAgZ2V0IG5hdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmF0aXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBhZGFwdGVyJ3MgYWxpYXMgb3IgZmxhdm9yIG5hbWVcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgYWxpYXMgaWYgc2V0LCBvdGhlcndpc2UgcmV0dXJucyB0aGUgZmxhdm9yIG5hbWVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWRhcHRlcidzIGlkZW50aWZpZXJcbiAgICovXG4gIGdldCBhbGlhcygpIHtcbiAgICByZXR1cm4gdGhpcy5fYWxpYXMgfHwgdGhpcy5mbGF2b3VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIHJlcG9zaXRvcmllcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGFkYXB0ZXJcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3RvcjxSZXBvc2l0b3J5PE0sIFEsIEFkYXB0ZXI8WSwgUSwgRiwgQz4sIEYsIEM+Pn0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3JcbiAgICovXG4gIHJlcG9zaXRvcnk8TSBleHRlbmRzIE1vZGVsPHRydWUgfCBmYWxzZT4+KCk6IENvbnN0cnVjdG9yPFxuICAgIFJlcG9zaXRvcnk8TSwgUSwgQWRhcHRlcjxZLCBRLCBGLCBDPiwgRiwgQz5cbiAgPiB7XG4gICAgcmV0dXJuIFJlcG9zaXRvcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyB0aGUgYWRhcHRlciB3aXRoIHRoZSBuYXRpdmUgZHJpdmVyIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIGFkYXB0ZXIgY2FjaGVcbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9uYXRpdmU6IFksXG4gICAgcmVhZG9ubHkgZmxhdm91cjogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2FsaWFzPzogc3RyaW5nXG4gICkge1xuICAgIGlmICh0aGlzLmZsYXZvdXIgaW4gQWRhcHRlci5fY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYCR7dGhpcy5hbGlhc30gcGVyc2lzdGVuY2UgYWRhcHRlciAke3RoaXMuX2FsaWFzID8gYCgke3RoaXMuZmxhdm91cn0pIGAgOiBcIlwifSBhbHJlYWR5IHJlZ2lzdGVyZWRgXG4gICAgICApO1xuICAgIEFkYXB0ZXIuX2NhY2hlW3RoaXMuYWxpYXNdID0gdGhpcztcbiAgICB0aGlzLmxvZy5pbmZvKFxuICAgICAgYENyZWF0ZWQgJHt0aGlzLmFsaWFzfSBwZXJzaXN0ZW5jZSBhZGFwdGVyICR7dGhpcy5fYWxpYXMgPyBgKCR7dGhpcy5mbGF2b3VyfSkgYCA6IFwiXCJ9IHBlcnNpc3RlbmNlIGFkYXB0ZXJgXG4gICAgKTtcbiAgICBpZiAoIUFkYXB0ZXIuX2N1cnJlbnRGbGF2b3VyKSB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKGBEZWZpbmVkICR7dGhpcy5hbGlhc30gcGVyc2lzdGVuY2UgYWRhcHRlciBhcyBjdXJyZW50YCk7XG4gICAgICBBZGFwdGVyLl9jdXJyZW50Rmxhdm91ciA9IHRoaXMuYWxpYXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHN0YXRlbWVudCBidWlsZGVyIGZvciBhIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBzdGF0ZW1lbnQgYnVpbGRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBxdWVyaWVzIGZvciBhIHNwZWNpZmljIG1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHJldHVybiB7U3RhdGVtZW50fSBBIHN0YXRlbWVudCBidWlsZGVyIGZvciB0aGUgbW9kZWxcbiAgICovXG4gIGFic3RyYWN0IFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KCk6IFN0YXRlbWVudDxRLCBNLCBhbnk+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBkaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBkaXNwYXRjaCBpbnN0YW5jZSBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge0Rpc3BhdGNoPFk+fSBBIG5ldyBkaXNwYXRjaCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIERpc3BhdGNoKCk6IERpc3BhdGNoPFk+IHtcbiAgICByZXR1cm4gbmV3IERpc3BhdGNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXIgaGFuZGxlclxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYW4gb2JzZXJ2ZXIgaGFuZGxlciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge09ic2VydmVySGFuZGxlcn0gQSBuZXcgb2JzZXJ2ZXIgaGFuZGxlciBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIE9ic2VydmVySGFuZGxlcigpOiBPYnNlcnZlckhhbmRsZXIge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZFxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gYXR0cmlidXRlIG5hbWUgaXMgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlc2VydmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByb3RlY3RlZCBpc1Jlc2VydmVkKGF0dHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhYXR0cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgZGF0YWJhc2UgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBlcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBkYXRhYmFzZS1zcGVjaWZpYyBlcnJvcnMgaW50byBzdGFuZGFyZGl6ZWQgYXBwbGljYXRpb24gZXJyb3JzXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVyciAtIFRoZSBvcmlnaW5hbCBkYXRhYmFzZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IEEgc3RhbmRhcmRpemVkIGVycm9yXG4gICAqL1xuICBhYnN0cmFjdCBwYXJzZUVycm9yKGVycjogRXJyb3IpOiBCYXNlRXJyb3I7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhbnkgbmVjZXNzYXJ5IHNldHVwIGZvciB0aGUgYWRhcHRlciwgc3VjaCBhcyBlc3RhYmxpc2hpbmcgY29ubmVjdGlvbnNcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEluaXRpYWxpemF0aW9uIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhYnN0cmFjdCBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzZXF1ZW5jZSBnZW5lcmF0b3JcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgc2VxdWVuY2UgZ2VuZXJhdG9yIGZvciBnZW5lcmF0aW5nIHNlcXVlbnRpYWwgdmFsdWVzXG4gICAqIEBwYXJhbSB7U2VxdWVuY2VPcHRpb25zfSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHJldHVybiB7UHJvbWlzZTxTZXF1ZW5jZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgbmV3IHNlcXVlbmNlIGluc3RhbmNlXG4gICAqL1xuICBhYnN0cmFjdCBTZXF1ZW5jZShvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpOiBQcm9taXNlPFNlcXVlbmNlPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgcmVwb3NpdG9yeSBmbGFncyBmb3IgYW4gb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIHNldCBvZiBmbGFncyB0aGF0IGRlc2NyaWJlIGEgZGF0YWJhc2Ugb3BlcmF0aW9uLCBjb21iaW5pbmcgZGVmYXVsdCBmbGFncyB3aXRoIG92ZXJyaWRlc1xuICAgKiBAdGVtcGxhdGUgRiAtIFRoZSBSZXBvc2l0b3J5IEZsYWdzIHR5cGVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBmbGFncyAtIEN1c3RvbSBmbGFnIG92ZXJyaWRlc1xuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxGPn0gVGhlIGNvbXBsZXRlIHNldCBvZiBmbGFnc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBmbGFnczogUGFydGlhbDxGPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGPiB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MsIGZsYWdzLCB7XG4gICAgICBhZmZlY3RlZFRhYmxlczogUmVwb3NpdG9yeS50YWJsZShtb2RlbCksXG4gICAgICB3cml0ZU9wZXJhdGlvbjogb3BlcmF0aW9uICE9PSBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICB9KSBhcyBGO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY29udGV4dCBjb25zdHJ1Y3RvciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJlZmVyZW5jZSB0byB0aGUgY29udGV4dCBjbGFzcyBjb25zdHJ1Y3RvciB1c2VkIGJ5IHRoaXMgYWRhcHRlclxuICAgKi9cbiAgcHJvdGVjdGVkIENvbnRleHQgPSBDb250ZXh0PEY+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGNvbnRleHQgZm9yIGEgZGF0YWJhc2Ugb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIGNvbnRleHQgb2JqZWN0IHRoYXQgZGVzY3JpYmVzIGEgZGF0YWJhc2Ugb3BlcmF0aW9uLCB1c2VkIGZvciB0cmFja2luZyBhbmQgYXVkaXRpbmdcbiAgICogQHRlbXBsYXRlIEYgLSBUaGUgUmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzLkNSRUFURXxPcGVyYXRpb25LZXlzLlJFQUR8T3BlcmF0aW9uS2V5cy5VUERBVEV8T3BlcmF0aW9uS2V5cy5ERUxFVEV9IG9wZXJhdGlvbiAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvblxuICAgKiBAcGFyYW0ge1BhcnRpYWw8Rj59IG92ZXJyaWRlcyAtIEN1c3RvbSBmbGFnIG92ZXJyaWRlc1xuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxDPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRleHQgb2JqZWN0XG4gICAqL1xuICBAZmluYWwoKVxuICBhc3luYyBjb250ZXh0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOlxuICAgICAgfCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEY+LFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEM+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jb250ZXh0KTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ3JlYXRpbmcgbmV3IGNvbnRleHQgZm9yICR7b3BlcmF0aW9ufSBvcGVyYXRpb24gb24gJHttb2RlbC5uYW1lfSBtb2RlbCB3aXRoIGZsYWcgb3ZlcnJpZGVzOiAke0pTT04uc3RyaW5naWZ5KG92ZXJyaWRlcyl9YFxuICAgICk7XG4gICAgY29uc3QgZmxhZ3MgPSBhd2FpdCB0aGlzLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIG92ZXJyaWRlcywgLi4uYXJncyk7XG4gICAgcmV0dXJuIG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKGZsYWdzKSBhcyB1bmtub3duIGFzIEM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHBlcnNpc3RlbmNlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGF0YWJhc2Ugc3RvcmFnZSxcbiAgICogaGFuZGxpbmcgY29sdW1uIG1hcHBpbmcgYW5kIHNlcGFyYXRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgZGF0YVxuICAgKi9cbiAgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIHBrOiBrZXlvZiBNXG4gICk6IHtcbiAgICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgaWQ6IHN0cmluZztcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5wcmVwYXJlKTtcbiAgICBjb25zdCBzcGxpdCA9IG1vZGVsVG9UcmFuc2llbnQobW9kZWwpO1xuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5lbnRyaWVzKHNwbGl0Lm1vZGVsKS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBhY2N1bTtcbiAgICAgICAgY29uc3QgbWFwcGVkUHJvcCA9IFJlcG9zaXRvcnkuY29sdW1uKG1vZGVsLCBrZXkpO1xuICAgICAgICBpZiAodGhpcy5pc1Jlc2VydmVkKG1hcHBlZFByb3ApKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBQcm9wZXJ0eSBuYW1lICR7bWFwcGVkUHJvcH0gaXMgcmVzZXJ2ZWRgKTtcbiAgICAgICAgYWNjdW1bbWFwcGVkUHJvcF0gPSB2YWw7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gICAgaWYgKChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0pIHtcbiAgICAgIGxvZy5zaWxseShcbiAgICAgICAgYFBhc3NpbmcgYWxvbmcgcGVyc2lzdGVuY2UgbWV0YWRhdGEgZm9yICR7KG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVjb3JkOiByZXN1bHQsXG4gICAgICBpZDogbW9kZWxbcGtdIGFzIHN0cmluZyxcbiAgICAgIHRyYW5zaWVudDogc3BsaXQudHJhbnNpZW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGRhdGFiYXNlIGRhdGEgYmFjayBpbnRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgUmVjb25zdHJ1Y3RzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSBkYXRhYmFzZSBkYXRhLCBoYW5kbGluZyBjb2x1bW4gbWFwcGluZ1xuICAgKiBhbmQgcmVhdHRhY2hpbmcgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0gb2JqIC0gVGhlIGRhdGFiYXNlIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ3xDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgbW9kZWwgY2xhc3Mgb3IgbmFtZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBwcmltYXJ5IGtleSB2YWx1ZVxuICAgKiBAcGFyYW0gW3RyYW5zaWVudF0gLSBUcmFuc2llbnQgcHJvcGVydGllcyB0byByZWF0dGFjaFxuICAgKiBAcmV0dXJuIHtNfSBUaGUgcmVjb25zdHJ1Y3RlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPixcbiAgICBwazoga2V5b2YgTSxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogTSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmV2ZXJ0KTtcbiAgICBjb25zdCBvYjogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIG9iW3BrIGFzIHN0cmluZ10gPSBpZDtcbiAgICBjb25zdCBtID0gKFxuICAgICAgdHlwZW9mIGNsYXp6ID09PSBcInN0cmluZ1wiID8gTW9kZWwuYnVpbGQob2IsIGNsYXp6KSA6IG5ldyBjbGF6eihvYilcbiAgICApIGFzIE07XG4gICAgbG9nLnNpbGx5KGBSZWJ1aWxkaW5nIG1vZGVsICR7bS5jb25zdHJ1Y3Rvci5uYW1lfSBpZCAke2lkfWApO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gb2JqW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV07XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMobSkucmVkdWNlKChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBwaykgcmV0dXJuIGFjY3VtO1xuICAgICAgKGFjY3VtIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV0gPSBvYmpbUmVwb3NpdG9yeS5jb2x1bW4oYWNjdW0sIGtleSldO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIG0pO1xuXG4gICAgaWYgKHRyYW5zaWVudCkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGByZS1hZGRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXM6ICR7T2JqZWN0LmtleXModHJhbnNpZW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudCkuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIHJlc3VsdClcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBUcmFuc2llbnQgcHJvcGVydHkgJHtrZXl9IGFscmVhZHkgZXhpc3RzIG9uIG1vZGVsICR7bS5jb25zdHJ1Y3Rvci5uYW1lfS4gc2hvdWxkIGJlIGltcG9zc2libGVgXG4gICAgICAgICAgKTtcbiAgICAgICAgcmVzdWx0W2tleSBhcyBrZXlvZiBNXSA9IHZhbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyAke3RoaXMuZmxhdm91cn0gcGVyc2lzdGVuY2UgbWV0YWRhdGEgZm9yICR7bS5jb25zdHJ1Y3Rvci5uYW1lfSBpZCAke2lkfTogJHttZXRhZGF0YX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBtZXRhZGF0YSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIGEgbmV3IHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBpbnNlcnQgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBuZXcgcmVjb3JkXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBkYXRhIHRvIGluc2VydFxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEluc2VydHMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgYW5kIGRhdGEgaW50byB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gaW5zZXJ0IGludG9cbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkZW50aWZpZXJzIGZvciB0aGUgbmV3IHJlY29yZHNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIGRhdGEgdG8gaW5zZXJ0IGZvciBlYWNoIHJlY29yZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBjcmVhdGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNyZWF0ZUFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMuY3JlYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5hcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZWNvcmQgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byByZWFkIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBhYnN0cmFjdCByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcmVhZCBmcm9tXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXRyaWV2ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJlYWRBbGwpO1xuICAgIGxvZy52ZXJib3NlKGBSZWFkaW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChpZC5tYXAoKGkpID0+IHRoaXMucmVhZCh0YWJsZU5hbWUsIGksIC4uLmFyZ3MpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSByZWNvcmQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IE1vZGlmaWVzIGFuIGV4aXN0aW5nIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gIG1vZGVsIC0gVGhlIG5ldyBkYXRhIGZvciB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgYWJzdHJhY3QgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgTW9kaWZpZXMgbXVsdGlwbGUgZXhpc3RpbmcgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgaW4gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byB1cGRhdGVcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG5ldyBkYXRhIGZvciBlYWNoIHJlY29yZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiB1cGRhdGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnVwZGF0ZUFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYFVwZGF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMudXBkYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5hcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gZGVsZXRlIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBtdWx0aXBsZSByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBkZWxldGUgZnJvbVxuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWRlbnRpZmllcnMgb2YgdGhlIHJlY29yZHMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGRlbGV0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY3JlYXRlQWxsKTtcbiAgICBsb2cudmVyYm9zZShgRGVsZXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwa3M6ICR7aWR9YCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGlkLm1hcCgoaSkgPT4gdGhpcy5kZWxldGUodGFibGVOYW1lLCBpLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBbGxvd3MgZXhlY3V0aW5nIGRhdGFiYXNlLXNwZWNpZmljIHF1ZXJpZXMgZGlyZWN0bHlcbiAgICogQHRlbXBsYXRlIFEgLSBUaGUgcmF3IHF1ZXJ5IHR5cGVcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHF1ZXJ5XG4gICAqIEBwYXJhbSB7UX0gcmF3SW5wdXQgLSBUaGUgcXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKi9cbiAgYWJzdHJhY3QgcmF3PFI+KHJhd0lucHV0OiBRLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Uj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb2JzZXJ2ZXIgZm9yIGRhdGFiYXNlIGV2ZW50c1xuICAgKiBAc3VtbWFyeSBBZGRzIGFuIG9ic2VydmVyIHRvIGJlIG5vdGlmaWVkIGFib3V0IGRhdGFiYXNlIGNoYW5nZXMuIFRoZSBvYnNlcnZlciBjYW4gb3B0aW9uYWxseVxuICAgKiBwcm92aWRlIGEgZmlsdGVyIGZ1bmN0aW9uIHRvIHJlY2VpdmUgb25seSBzcGVjaWZpYyBldmVudHMuXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJGaWx0ZXJ9IFtmaWx0ZXJdIC0gT3B0aW9uYWwgZmlsdGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBldmVudHMgdGhlIG9ic2VydmVyIHJlY2VpdmVzXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBAZmluYWwoKVxuICBvYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlciwgZmlsdGVyPzogT2JzZXJ2ZXJGaWx0ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwib2JzZXJ2ZXJIYW5kbGVyXCIsIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuT2JzZXJ2ZXJIYW5kbGVyKCksXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyIS5vYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpO1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMub2JzZXJ2ZSlcbiAgICAgIC52ZXJib3NlKGBSZWdpc3RlcmluZyBuZXcgb2JzZXJ2ZXIgJHtvYnNlcnZlci50b1N0cmluZygpfWApO1xuICAgIGlmICghdGhpcy5kaXNwYXRjaCkge1xuICAgICAgdGhpcy5sb2cuZm9yKHRoaXMub2JzZXJ2ZSkuaW5mbyhgQ3JlYXRpbmcgZGlzcGF0Y2ggZm9yICR7dGhpcy5hbGlhc31gKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2ggPSB0aGlzLkRpc3BhdGNoKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoLm9ic2VydmUodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbnJlZ2lzdGVycyBhbiBvYnNlcnZlclxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIG9ic2VydmVyIHNvIGl0IG5vIGxvbmdlciByZWNlaXZlcyBkYXRhYmFzZSBldmVudCBub3RpZmljYXRpb25zXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHVucmVnaXN0ZXJcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIEBmaW5hbCgpXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgdGhpcy5vYnNlcnZlckhhbmRsZXIudW5PYnNlcnZlKG9ic2VydmVyKTtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLnVuT2JzZXJ2ZSlcbiAgICAgIC52ZXJib3NlKGBPYnNlcnZlciAke29ic2VydmVyLnRvU3RyaW5nKCl9IHJlbW92ZWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIG9ic2VydmVycyBhYm91dCBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IFNlbmRzIG5vdGlmaWNhdGlvbnMgdG8gYWxsIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzIGFib3V0IGEgY2hhbmdlIGluIHRoZSBkYXRhYmFzZSxcbiAgICogZmlsdGVyaW5nIGJhc2VkIG9uIGVhY2ggb2JzZXJ2ZXIncyBmaWx0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy51cGRhdGVPYnNlcnZlcnMpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYFVwZGF0aW5nICR7dGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKX0gb2JzZXJ2ZXJzIGZvciBhZGFwdGVyICR7dGhpcy5hbGlhc31gXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLm9ic2VydmVySGFuZGxlci51cGRhdGVPYnNlcnZlcnMoXG4gICAgICB0aGlzLmxvZyxcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBpZCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZyZXNoZXMgZGF0YSBiYXNlZCBvbiBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IEltcGxlbWVudGF0aW9uIG9mIHRoZSBPYnNlcnZlciBpbnRlcmZhY2UgbWV0aG9kIHRoYXQgZGVsZWdhdGVzIHRvIHVwZGF0ZU9ic2VydmVyc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBpZGVudGlmaWVyKHMpIG9mIHRoZSBhZmZlY3RlZCByZWNvcmQocylcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHJlbGF0ZWQgdG8gdGhlIGV2ZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHJlZnJlc2ggaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIHJlZnJlc2goXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFkYXB0ZXJcbiAgICovXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmZsYXZvdXJ9IHBlcnNpc3RlbmNlIEFkYXB0ZXJgO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBhZGFwdGVyIGZsYXZvciBhc3NvY2lhdGVkIHdpdGggYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGFkYXB0ZXIgZmxhdm9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGEgc3BlY2lmaWMgbW9kZWwgY2xhc3NcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZGFwdGVyIGZsYXZvciBuYW1lXG4gICAqL1xuICBzdGF0aWMgZmxhdm91ck9mPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IENvbnN0cnVjdG9yPE0+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YSh0aGlzLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIG1vZGVsKSB8fFxuICAgICAgdGhpcy5jdXJyZW50Py5mbGF2b3VyXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgY3VycmVudEZsYXZvdXIoKSB7XG4gICAgaWYgKCFBZGFwdGVyLl9jdXJyZW50Rmxhdm91cilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcGVyc2lzdGVuY2UgZmxhdm91ciBzZXQuIFBsZWFzZSBpbml0aWFsaXplIHlvdXIgYWRhcHRlcmBcbiAgICAgICk7XG4gICAgcmV0dXJuIEFkYXB0ZXIuX2N1cnJlbnRGbGF2b3VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjdXJyZW50IGRlZmF1bHQgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGFkYXB0ZXIgdGhhdCBpcyBjdXJyZW50bHkgc2V0IGFzIHRoZSBkZWZhdWx0IGZvciBvcGVyYXRpb25zXG4gICAqIEByZXR1cm4ge0FkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pn0gVGhlIGN1cnJlbnQgYWRhcHRlclxuICAgKi9cbiAgc3RhdGljIGdldCBjdXJyZW50KCk6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIEFkYXB0ZXIuZ2V0KHRoaXMuY3VycmVudEZsYXZvdXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFuIGFkYXB0ZXIgYnkgZmxhdm9yXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHJlZ2lzdGVyZWQgYWRhcHRlciBieSBpdHMgZmxhdm9yIG5hbWVcbiAgICogQHRlbXBsYXRlIFkgLSBUaGUgZGF0YWJhc2UgZHJpdmVyIHR5cGVcbiAgICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgdHlwZVxuICAgKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGVcbiAgICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGZsYXZvciBuYW1lIG9mIHRoZSBhZGFwdGVyIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4ge0FkYXB0ZXI8WSwgUSwgRiwgQz4gfCB1bmRlZmluZWR9IFRoZSBhZGFwdGVyIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIHN0YXRpYyBnZXQ8WSwgUSwgQyBleHRlbmRzIENvbnRleHQ8Rj4sIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3M+KFxuICAgIGZsYXZvdXI/OiBhbnlcbiAgKTogQWRhcHRlcjxZLCBRLCBGLCBDPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFmbGF2b3VyKSByZXR1cm4gQWRhcHRlci5nZXQodGhpcy5fY3VycmVudEZsYXZvdXIpO1xuICAgIGlmIChmbGF2b3VyIGluIHRoaXMuX2NhY2hlKSByZXR1cm4gdGhpcy5fY2FjaGVbZmxhdm91cl07XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIEFkYXB0ZXIgcmVnaXN0ZXJlZCB1bmRlciAke2ZsYXZvdXJ9LmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBjdXJyZW50IGRlZmF1bHQgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBDaGFuZ2VzIHdoaWNoIGFkYXB0ZXIgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3Igb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBmbGF2b3IgbmFtZSBvZiB0aGUgYWRhcHRlciB0byBzZXQgYXMgY3VycmVudFxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldEN1cnJlbnQoZmxhdm91cjogc3RyaW5nKSB7XG4gICAgdGhpcy5fY3VycmVudEZsYXZvdXIgPSBmbGF2b3VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbWV0YWRhdGEga2V5XG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIHN0YW5kYXJkaXplZCBtZXRhZGF0YSBrZXkgZm9yIHBlcnNpc3RlbmNlLXJlbGF0ZWQgbWV0YWRhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBiYXNlIGtleSBuYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBtZXRhZGF0YSBrZXlcbiAgICovXG4gIHN0YXRpYyBrZXkoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gUmVwb3NpdG9yeS5rZXkoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhbGwgbW9kZWxzIGFzc29jaWF0ZWQgd2l0aCBhbiBhZGFwdGVyIGZsYXZvclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYWxsIG1vZGVsIGNvbnN0cnVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIHRvIHVzZSBhIHNwZWNpZmljIGFkYXB0ZXIgZmxhdm9yXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgYWRhcHRlciBmbGF2b3IgdG8gZmluZCBtb2RlbHMgZm9yXG4gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgbW9kZWwgY29uc3RydWN0b3JzXG4gICAqL1xuICBzdGF0aWMgbW9kZWxzPE0gZXh0ZW5kcyBNb2RlbD4oZmxhdm91cjogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gKE1vZGVsIGFzIGFueSkuZ2V0UmVnaXN0cnkoKSBhcyBNb2RlbFJlZ2lzdHJ5PGFueT47XG4gICAgICBjb25zdCBjYWNoZSA9IChcbiAgICAgICAgcmVnaXN0cnkgYXMgdW5rbm93biBhcyB7IGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvbnN0cnVjdG9yPGFueT4+IH1cbiAgICAgICkuY2FjaGU7XG4gICAgICBjb25zdCBtYW5hZ2VkTW9kZWxzOiBNb2RlbENvbnN0cnVjdG9yPGFueT5bXSA9IE9iamVjdC52YWx1ZXMoY2FjaGUpXG4gICAgICAgIC5tYXAoKG06IE1vZGVsQ29uc3RydWN0b3I8TT4pID0+IHtcbiAgICAgICAgICBsZXQgZiA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGYgJiYgZiA9PT0gZmxhdm91cikgcmV0dXJuIG07XG4gICAgICAgICAgaWYgKCFmKSB7XG4gICAgICAgICAgICBjb25zdCByZXBvID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgUmVwb3NpdG9yeS5rZXkoREJLZXlzLlJFUE9TSVRPUlkpLFxuICAgICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghcmVwbykgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgcmVwb3NpdG9yeSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobSk7XG5cbiAgICAgICAgICAgIGYgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICAgIHJlcG9zaXRvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICEhbSk7XG4gICAgICByZXR1cm4gbWFuYWdlZE1vZGVscztcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBkZWNvcmF0aW9uKCk6IHZvaWQge31cbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0YWJsZSBuYW1lIGZvciBhIG1vZGVsXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHRhYmxlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIGEgbW9kZWwgYnkgY2hlY2tpbmcgbWV0YWRhdGEgb3IgZmFsbGluZyBiYWNrIHRvIHRoZSBjb25zdHJ1Y3RvciBuYW1lXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IgdG8gZ2V0IHRoZSB0YWJsZSBuYW1lIGZvclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgdGFibGUgbmFtZSBmb3IgdGhlIG1vZGVsXG4gKiBAZnVuY3Rpb24gZ2V0VGFibGVOYW1lXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTmFtZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBzdHJpbmcge1xuICBjb25zdCBvYmogPSBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwuY29uc3RydWN0b3IgOiBtb2RlbDtcblxuICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXG4gICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKSxcbiAgICBvYmpcbiAgKTtcbiAgaWYgKG1ldGFkYXRhKSB7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG4gIGlmIChtb2RlbCBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgcmV0dXJuIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cbiAgcmV0dXJuIG1vZGVsLm5hbWU7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIHNlcXVlbmNlIG5hbWUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgc2VxdWVuY2UgbmFtZSBieSBjb21iaW5pbmcgdGhlIHRhYmxlIG5hbWUgd2l0aCBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIHRoZSBzZXF1ZW5jZSBuYW1lIGZvclxuICogQHBhcmFtIHsuLi5zdHJpbmd9IGFyZ3MgLSBBZGRpdGlvbmFsIHN0cmluZyBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRoZSBzZXF1ZW5jZSBuYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgc2VxdWVuY2UgbmFtZVxuICogQGZ1bmN0aW9uIHNlcXVlbmNlTmFtZUZvck1vZGVsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlTmFtZUZvck1vZGVsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIC4uLmFyZ3M6IHN0cmluZ1tdXG4pIHtcbiAgcmV0dXJuIFtnZXRUYWJsZU5hbWUobW9kZWwpLCAuLi5hcmdzXS5qb2luKFwiX1wiKTtcbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHNlcXVlbmNlTmFtZUZvck1vZGVsIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBzZXF1ZW5jZSBnZW5lcmF0aW9uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIGZyYW1ld29yayBmb3IgZ2VuZXJhdGluZyBzZXF1ZW50aWFsIHZhbHVlcyAobGlrZSBwcmltYXJ5IGtleXMpIGluIHRoZSBwZXJzaXN0ZW5jZSBsYXllci5cbiAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzIGhhbmRsZSB0aGUgc3BlY2lmaWNzIG9mIGhvdyBzZXF1ZW5jZXMgYXJlIHN0b3JlZCBhbmQgaW5jcmVtZW50ZWQgaW4gZGlmZmVyZW50XG4gKiBkYXRhYmFzZSBzeXN0ZW1zLlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3JcbiAqIEBjbGFzcyBTZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gZm9yIGEgc3BlY2lmaWMgZGF0YWJhc2VcbiAqIGNsYXNzIFBvc3RncmVzU2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7XG4gKiAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge1xuICogICAgIHN1cGVyKG9wdGlvbnMpO1xuICogICB9XG4gKlxuICogICBhc3luYyBuZXh0KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gdG8gZ2V0IG5leHQgdmFsdWUgZnJvbSBQb3N0Z3JlU1FMIHNlcXVlbmNlXG4gKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcHRpb25zLmV4ZWN1dG9yLnJhdyhgU0VMRUNUIG5leHR2YWwoJyR7dGhpcy5vcHRpb25zLm5hbWV9JylgKTtcbiAqICAgICByZXR1cm4gcGFyc2VJbnQocmVzdWx0LnJvd3NbMF0ubmV4dHZhbCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGN1cnJlbnQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiB0byBnZXQgY3VycmVudCB2YWx1ZSBmcm9tIFBvc3RncmVTUUwgc2VxdWVuY2VcbiAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZXhlY3V0b3IucmF3KGBTRUxFQ1QgY3VycnZhbCgnJHt0aGlzLm9wdGlvbnMubmFtZX0nKWApO1xuICogICAgIHJldHVybiBwYXJzZUludChyZXN1bHQucm93c1swXS5jdXJydmFsKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgcmFuZ2UoY291bnQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyW10+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiB0byBnZXQgYSByYW5nZSBvZiB2YWx1ZXNcbiAqICAgICBjb25zdCB2YWx1ZXM6IG51bWJlcltdID0gW107XG4gKiAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gKiAgICAgICB2YWx1ZXMucHVzaChhd2FpdCB0aGlzLm5leHQoKSk7XG4gKiAgICAgfVxuICogICAgIHJldHVybiB2YWx1ZXM7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBVc2FnZVxuICogY29uc3Qgc2VxdWVuY2UgPSBuZXcgUG9zdGdyZXNTZXF1ZW5jZSh7XG4gKiAgIG5hbWU6ICd1c2VyX2lkX3NlcScsXG4gKiAgIGV4ZWN1dG9yOiBkYkV4ZWN1dG9yXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBuZXh0SWQgPSBhd2FpdCBzZXF1ZW5jZS5uZXh0KCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNlcXVlbmNlIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgaW5zdGFuY2UgZm9yIHRoaXMgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgTGF6aWx5IGluaXRpYWxpemVkIGxvZ2dlciBmb3IgdGhlIHNlcXVlbmNlIGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIGxvZ2dlciE6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFjY2Vzc29yIGZvciB0aGUgbG9nZ2VyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEdldHMgb3IgaW5pdGlhbGl6ZXMgdGhlIGxvZ2dlciBmb3IgdGhpcyBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBsb2dnZXIgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLmxvZ2dlcikgdGhpcy5sb2dnZXIgPSBMb2dnaW5nLmZvcih0aGlzIGFzIGFueSk7XG4gICAgcmV0dXJuIHRoaXMubG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFByb3RlY3RlZCBjb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIHRoZSBzZXF1ZW5jZSB3aXRoIHRoZSBwcm92aWRlZCBvcHRpb25zXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBzZXF1ZW5jZSwgaW5jcmVtZW50aW5nIGl0IGluIHRoZSBwcm9jZXNzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqL1xuICBhYnN0cmFjdCBuZXh0KCk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2Ugd2l0aG91dCBpbmNyZW1lbnRpbmcgaXRcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAgICovXG4gIGFic3RyYWN0IGN1cnJlbnQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIHJhbmdlIG9mIHNlcXVlbnRpYWwgdmFsdWVzXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBtdWx0aXBsZSBzZXF1ZW50aWFsIHZhbHVlcyBhdCBvbmNlLCB3aGljaCBjYW4gYmUgbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIG5leHQoKSBtdWx0aXBsZSB0aW1lc1xuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIHNlcXVlbnRpYWwgdmFsdWVzIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2Ygc2VxdWVudGlhbCB2YWx1ZXNcbiAgICovXG4gIGFic3RyYWN0IHJhbmdlKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcHJpbWFyeSBrZXkgc2VxdWVuY2UgbmFtZSBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBVdGlsaXR5IG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIHN0YW5kYXJkaXplZCBzZXF1ZW5jZSBuYW1lIGZvciBhIG1vZGVsJ3MgcHJpbWFyeSBrZXlcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge018Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHNlcXVlbmNlIG5hbWUgZm9yIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5XG4gICAqL1xuICBzdGF0aWMgcGs8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgcmV0dXJuIHNlcXVlbmNlTmFtZUZvck1vZGVsKG1vZGVsLCBcInBrXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBzZXF1ZW5jZSB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIHNlcXVlbmNlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSAoTnVtYmVyIG9yIEJpZ0ludClcbiAgICogQHBhcmFtIHtcIk51bWJlclwifFwiQmlnSW50XCJ8dW5kZWZpbmVkfSB0eXBlIC0gVGhlIHRhcmdldCB0eXBlIHRvIGNvbnZlcnQgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gVGhlIGNvbnZlcnRlZCB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIHBhcnNlVmFsdWUoXG4gICAgdHlwZTogXCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludFxuICApOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIk51bWJlclwiOlxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBwYXJzZUludCh2YWx1ZSlcbiAgICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgOiBCaWdJbnQodmFsdWUpO1xuICAgICAgY2FzZSBcIkJpZ0ludFwiOlxuICAgICAgICByZXR1cm4gQmlnSW50KHZhbHVlKTtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgc2VxdWVuY2UgdHlwZTogJHt0eXBlfSBmb3IgYWRhcHRlciAke3RoaXN9YFxuICAgICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi9BZGFwdGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB3aGljaCBwZXJzaXN0ZW5jZSBhZGFwdGVyIGZsYXZvciBhIG1vZGVsIHNob3VsZCB1c2VcbiAqIEBzdW1tYXJ5IFRoaXMgZGVjb3JhdG9yIGFwcGxpZXMgbWV0YWRhdGEgdG8gYSBtb2RlbCBjbGFzcyB0byBpbmRpY2F0ZSB3aGljaCBwZXJzaXN0ZW5jZSBhZGFwdGVyIGZsYXZvclxuICogc2hvdWxkIGJlIHVzZWQgd2hlbiBwZXJmb3JtaW5nIGRhdGFiYXNlIG9wZXJhdGlvbnMgb24gaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4gVGhlIGZsYXZvciBpcyBhIHN0cmluZ1xuICogaWRlbnRpZmllciB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgcmVnaXN0ZXJlZCBhZGFwdGVyIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhZGFwdGVyIGZsYXZvciB0byB1c2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgbW9kZWwgY2xhc3NcbiAqIEBmdW5jdGlvbiB1c2VzXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlcyhmbGF2b3VyOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZXMob3JpZ2luYWw6IGFueSkge1xuICAgIHJldHVybiBhcHBseShtZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIGZsYXZvdXIpKShcbiAgICAgIG9yaWdpbmFsXG4gICAgKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgQ29udGV4dCxcbiAgREJLZXlzLFxuICBEZWZhdWx0U2VwYXJhdG9yLFxuICBlbmZvcmNlREJEZWNvcmF0b3JzLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgSVJlcG9zaXRvcnksXG4gIE9wZXJhdGlvbktleXMsXG4gIFJlcG9zaXRvcnkgYXMgUmVwLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgd3JhcE1ldGhvZFdpdGhDb250ZXh0LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZhYmxlXCI7XG5pbXBvcnQgeyB0eXBlIE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2ZXJcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3JkZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1NlcXVlbmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgUXVlcmlhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvUXVlcmlhYmxlXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBJbmRleE1ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcXVlcnkvQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBXaGVyZU9wdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9vcHRpb25zXCI7XG5pbXBvcnQgeyBPcmRlckJ5U2VsZWN0b3IsIFNlbGVjdFNlbGVjdG9yIH0gZnJvbSBcIi4uL3F1ZXJ5L3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgZ2V0VGFibGVOYW1lIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyB1c2VzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgT2JzZXJ2ZXJIYW5kbGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL09ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHsgZmluYWwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgRXZlbnRJZHMsIE9ic2VydmVyRmlsdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgYWxpYXMgZm9yIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCBzaW1wbGlmaWVkIGdlbmVyaWMgcGFyYW1ldGVycy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgbW9yZSBjb25jaXNlIHdheSB0byByZWZlcmVuY2UgdGhlIFJlcG9zaXRvcnkgY2xhc3Mgd2l0aCBpdHMgZ2VuZXJpYyBwYXJhbWV0ZXJzLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUuXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUuXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlLlxuICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlLlxuICogQHR5cGVkZWYgUmVwb1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCB0eXBlIFJlcG88XG4gIE0gZXh0ZW5kcyBNb2RlbDx0cnVlIHwgZmFsc2U+LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gYW55LFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IGFueSxcbiAgUSA9IGFueSxcbiAgQSBleHRlbmRzIEFkYXB0ZXI8YW55LCBRLCBGLCBDPiA9IGFueSxcbj4gPSBSZXBvc2l0b3J5PE0sIFEsIEEsIEYsIEM+O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb3JlIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMgb24gbW9kZWxzIG9uIGEgdGFibGUgYnkgdGFibGUgd2F5LlxuICogQHN1bW1hcnkgUHJvdmlkZXMgQ1JVRCBvcGVyYXRpb25zLCBxdWVyeWluZyBjYXBhYmlsaXRpZXMsIGFuZCBvYnNlcnZlciBwYXR0ZXJuIGltcGxlbWVudGF0aW9uIGZvciBtb2RlbCBwZXJzaXN0ZW5jZS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgdHlwZSB1c2VkIGJ5IHRoZSBhZGFwdGVyLlxuICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLlxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGZvciBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtBfSBbYWRhcHRlcl0gLSBPcHRpb25hbCBhZGFwdGVyIGluc3RhbmNlIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gW2NsYXp6XSAtIE9wdGlvbmFsIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0gey4uLmFueVtdfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgcmVwb3NpdG9yeSBpbml0aWFsaXphdGlvbi5cbiAqIEBjbGFzcyBSZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRpbmcgYSByZXBvc2l0b3J5IGZvciBVc2VyIG1vZGVsXG4gKiBjb25zdCB1c2VyUmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoVXNlcik7XG4gKlxuICogLy8gVXNpbmcgdGhlIHJlcG9zaXRvcnkgZm9yIENSVUQgb3BlcmF0aW9uc1xuICogY29uc3QgdXNlciA9IGF3YWl0IHVzZXJSZXBvLmNyZWF0ZShuZXcgVXNlcih7IG5hbWU6ICdKb2huJyB9KSk7XG4gKiBjb25zdCByZXRyaWV2ZWRVc2VyID0gYXdhaXQgdXNlclJlcG8ucmVhZCh1c2VyLmlkKTtcbiAqIHVzZXIubmFtZSA9ICdKYW5lJztcbiAqIGF3YWl0IHVzZXJSZXBvLnVwZGF0ZSh1c2VyKTtcbiAqIGF3YWl0IHVzZXJSZXBvLmRlbGV0ZSh1c2VyLmlkKTtcbiAqXG4gKiAvLyBRdWVyeWluZyB3aXRoIGNvbmRpdGlvbnNcbiAqIGNvbnN0IHVzZXJzID0gYXdhaXQgdXNlclJlcG9cbiAqICAgLnNlbGVjdCgpXG4gKiAgIC53aGVyZSh7IG5hbWU6ICdKYW5lJyB9KVxuICogICAub3JkZXJCeSgnY3JlYXRlZEF0JywgT3JkZXJEaXJlY3Rpb24uRFNDKVxuICogICAubGltaXQoMTApXG4gKiAgIC5leGVjdXRlKCk7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50IENvZGVcbiAqICAgcGFydGljaXBhbnQgUiBhcyBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEEgYXMgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICogICBwYXJ0aWNpcGFudCBPIGFzIE9ic2VydmVyc1xuICpcbiAqICAgQy0+PitSOiBjcmVhdGUobW9kZWwpXG4gKiAgIFItPj5SOiBjcmVhdGVQcmVmaXgobW9kZWwpXG4gKiAgIFItPj4rQTogcHJlcGFyZShtb2RlbClcbiAqICAgQS0tPj4tUjogcHJlcGFyZWQgZGF0YVxuICogICBSLT4+K0E6IGNyZWF0ZSh0YWJsZSwgaWQsIHJlY29yZClcbiAqICAgQS0+PitEQjogSW5zZXJ0IE9wZXJhdGlvblxuICogICBEQi0tPj4tQTogUmVzdWx0XG4gKiAgIEEtLT4+LVI6IHJlY29yZFxuICogICBSLT4+K0E6IHJldmVydChyZWNvcmQpXG4gKiAgIEEtLT4+LVI6IG1vZGVsIGluc3RhbmNlXG4gKiAgIFItPj5SOiBjcmVhdGVTdWZmaXgobW9kZWwpXG4gKiAgIFItPj4rTzogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBDUkVBVEUsIGlkKVxuICogICBPLS0+Pi1SOiBOb3RpZmljYXRpb24gY29tcGxldGVcbiAqICAgUi0tPj4tQzogY3JlYXRlZCBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgUmVwb3NpdG9yeTxcbiAgICBNIGV4dGVuZHMgTW9kZWw8dHJ1ZSB8IGZhbHNlPixcbiAgICBRLFxuICAgIEEgZXh0ZW5kcyBBZGFwdGVyPGFueSwgUSwgRiwgQz4sXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4gID5cbiAgZXh0ZW5kcyBSZXA8TSwgRiwgQz5cbiAgaW1wbGVtZW50cyBPYnNlcnZhYmxlLCBPYnNlcnZlciwgUXVlcmlhYmxlPE0+LCBJUmVwb3NpdG9yeTxNLCBGLCBDPlxue1xuICBwcml2YXRlIHN0YXRpYyBfY2FjaGU6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgQ29uc3RydWN0b3I8UmVwbzxNb2RlbD4+IHwgUmVwbzxNb2RlbD5cbiAgPiA9IHt9O1xuXG4gIHByb3RlY3RlZCBvYnNlcnZlcnM6IE9ic2VydmVyW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgb2JzZXJ2ZXJIYW5kbGVyPzogT2JzZXJ2ZXJIYW5kbGVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkYXB0ZXIhOiBBO1xuICBwcml2YXRlIF90YWJsZU5hbWUhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfb3ZlcnJpZGVzPzogUGFydGlhbDxGPjtcblxuICBwcml2YXRlIGxvZ2dlciE6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ2dlciBpbnN0YW5jZSBmb3IgdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxvZ2dlciBmb3IgdGhpcyByZXBvc2l0b3J5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLmxvZ2dlcikgdGhpcy5sb2dnZXIgPSBMb2dnaW5nLmZvcih0aGlzIGFzIGFueSk7XG4gICAgcmV0dXJuIHRoaXMubG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGFkYXB0ZXIgaW5zdGFuY2UgZm9yIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHRlbXBsYXRlIEEgLSBUaGUgYWRhcHRlciB0eXBlLlxuICAgKiBAcmV0dXJuIHtBfSBUaGUgYWRhcHRlciBpbnN0YW5jZS5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gYWRhcHRlciBpcyBmb3VuZC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgYWRhcHRlcigpOiBBIHtcbiAgICBpZiAoIXRoaXMuX2FkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIGFkYXB0ZXIgZm91bmQgZm9yIHRoaXMgcmVwb3NpdG9yeS4gZGlkIHlvdSB1c2UgdGhlIEB1c2VzIGRlY29yYXRvciBvciBwYXNzIGl0IGluIHRoZSBjb25zdHJ1Y3Rvcj9gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUYWJsZSBuYW1lIGZvciB0aGlzIHJlcG9zaXRvcnkncyBtb2RlbC5cbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgZGF0YWJhc2UgdGFibGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXBvc2l0b3J5J3MgbW9kZWwuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRhYmxlIG5hbWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRhYmxlTmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fdGFibGVOYW1lKSB0aGlzLl90YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaW1hcnkga2V5IHByb3BlcnRpZXMgZm9yIHRoaXMgcmVwb3NpdG9yeSdzIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBzZXF1ZW5jZSBvcHRpb25zIGNvbnRhaW5pbmcgcHJpbWFyeSBrZXkgaW5mb3JtYXRpb24uXG4gICAqIEByZXR1cm4ge1NlcXVlbmNlT3B0aW9uc30gVGhlIHByaW1hcnkga2V5IHByb3BlcnRpZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0IHBrUHJvcHMoKTogU2VxdWVuY2VPcHRpb25zIHtcbiAgICByZXR1cm4gc3VwZXIucGtQcm9wcztcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgc3VwZXIoY2xhenopO1xuICAgIGlmIChhZGFwdGVyKSB0aGlzLl9hZGFwdGVyID0gYWRhcHRlcjtcbiAgICBpZiAoY2xhenopIHtcbiAgICAgIFJlcG9zaXRvcnkucmVnaXN0ZXIoY2xhenosIHRoaXMsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBjb25zdCBmbGF2b3VyID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgY2xhenpcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZsYXZvdXIgJiYgZmxhdm91ciAhPT0gYWRhcHRlci5mbGF2b3VyKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSW5jb21wYXRpYmxlIGZsYXZvdXJzXCIpO1xuICAgICAgICB1c2VzKGFkYXB0ZXIuZmxhdm91cikoY2xhenopO1xuICAgICAgfVxuICAgIH1cbiAgICBbdGhpcy5jcmVhdGVBbGwsIHRoaXMucmVhZEFsbCwgdGhpcy51cGRhdGVBbGwsIHRoaXMuZGVsZXRlQWxsXS5mb3JFYWNoKFxuICAgICAgKG0pID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IG0ubmFtZTtcbiAgICAgICAgd3JhcE1ldGhvZFdpdGhDb250ZXh0KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKHRoaXMgYXMgYW55KVtuYW1lICsgXCJQcmVmaXhcIl0sXG4gICAgICAgICAgbSxcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW25hbWUgKyBcIlN1ZmZpeFwiXVxuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBwcm94eSB3aXRoIG92ZXJyaWRkZW4gcmVwb3NpdG9yeSBmbGFncy5cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIHByb3h5IG9mIHRoaXMgcmVwb3NpdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQgZmxhZ3Mgb3ZlcnJpZGRlbi5cbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBmbGFncyAtIFRoZSBmbGFncyB0byBvdmVycmlkZS5cbiAgICogQHJldHVybiB7UmVwb3NpdG9yeX0gQSBwcm94eSBvZiB0aGlzIHJlcG9zaXRvcnkgd2l0aCBvdmVycmlkZGVuIGZsYWdzLlxuICAgKi9cbiAgb3ZlcnJpZGUoZmxhZ3M6IFBhcnRpYWw8Rj4pOiBSZXBvc2l0b3J5PE0sIFEsIEEsIEYsIEM+IHtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLm92ZXJyaWRlKVxuICAgICAgLmRlYnVnKGBPdmVycmlkaW5nIHJlcG9zaXRvcnkgZmxhZ3Mgd2l0aCAke0pTT04uc3RyaW5naWZ5KGZsYWdzKX1gKTtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldDogKHRhcmdldDogdHlwZW9mIHRoaXMsIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgaWYgKHAgIT09IFwiX292ZXJyaWRlc1wiKSByZXR1cm4gcmVzdWx0O1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVzdWx0LCBmbGFncyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IG9ic2VydmVyIGhhbmRsZXIuXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBvYnNlcnZlciBoYW5kbGVyIGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHtPYnNlcnZlckhhbmRsZXJ9IEEgbmV3IG9ic2VydmVyIGhhbmRsZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgT2JzZXJ2ZXJIYW5kbGVyKCk6IE9ic2VydmVySGFuZGxlciB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZlckhhbmRsZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgY3JlYXRpb24uXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGUgbW9kZWwgYW5kIHByZXBhcmVzIGl0IGZvciBjcmVhdGlvbiBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIG1vZGVsIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiB0aGUgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVQcmVmaXgoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxbTSwgLi4uYW55W11dPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBtb2RlbCA9IG5ldyB0aGlzLmNsYXNzKG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBtb2RlbC5oYXNFcnJvcnMoXG4gICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgIClcbiAgICApO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBtb2RlbCBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBzdW1tYXJ5IFBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UgdG8gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgY3JlYXRlZCBtb2RlbCB3aXRoIHVwZGF0ZWQgcHJvcGVydGllcy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgbGV0IGM6IEMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGFyZ3MubGVuZ3RoKSBjID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdIGFzIEM7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICByZWNvcmQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgdGhpcy5wayxcbiAgICAgIGlkLFxuICAgICAgYyAmJiBjLmdldChcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpID8gdHJhbnNpZW50IDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUG9zdC1jcmVhdGlvbiBob29rLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhZnRlciBhIG1vZGVsIGlzIGNyZWF0ZWQgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgY3JlYXRlZCBtb2RlbC5cbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIG9wZXJhdGlvbiBjb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgcHJvY2Vzc2VkIG1vZGVsLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlU3VmZml4KG1vZGVsOiBNLCBjb250ZXh0OiBDKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHN1cGVyLmNyZWF0ZVN1ZmZpeChtb2RlbCwgY29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgbW9kZWxzIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIHRvIHRoZSBkYXRhYmFzZSBpbiBhIGJhdGNoIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIGNyZWF0ZWQgbW9kZWxzIHdpdGggdXBkYXRlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gbW9kZWxzO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgdGhpcy5waykpO1xuICAgIGNvbnN0IGlkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5pZCk7XG4gICAgbGV0IHJlY29yZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAucmVjb3JkKTtcbiAgICByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgaWRzIGFzIChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgICByZWNvcmRzLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZHNbaV0gYXMgc3RyaW5nIHwgbnVtYmVyKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIG1vZGVscyBmb3IgY3JlYXRpb24uXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBtdWx0aXBsZSBtb2RlbHMgYW5kIHByZXBhcmVzIHRoZW0gZm9yIGNyZWF0aW9uIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgYW55IG1vZGVsIGZhaWxzIHZhbGlkYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsUHJlZml4KG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gICAgY29uc3Qgb3B0cyA9IFJlcG9zaXRvcnkuZ2V0U2VxdWVuY2VPcHRpb25zKG1vZGVsc1swXSk7XG4gICAgbGV0IGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB8IHVuZGVmaW5lZClbXSA9IFtdO1xuICAgIGlmIChvcHRzLnR5cGUpIHtcbiAgICAgIGlmICghb3B0cy5uYW1lKSBvcHRzLm5hbWUgPSBTZXF1ZW5jZS5wayhtb2RlbHNbMF0pO1xuICAgICAgaWRzID0gYXdhaXQgKGF3YWl0IHRoaXMuYWRhcHRlci5TZXF1ZW5jZShvcHRzKSkucmFuZ2UobW9kZWxzLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkcyA9IG1vZGVscy5tYXAoKG0sIGkpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBtW3RoaXMucGtdID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYFByaW1hcnkga2V5IGlzIG5vdCBkZWZpbmVkIGZvciBtb2RlbCBpbiBwb3NpdGlvbiAke2l9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBtW3RoaXMucGtdIGFzIHN0cmluZztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSwgaSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGlmIChvcHRzLnR5cGUpIG1bdGhpcy5wa10gPSBpZHNbaV0gYXMgTVtrZXlvZiBNXTtcbiAgICAgICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgaWdub3JlZFByb3BzID1cbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtKSA9PiBQcm9taXNlLnJlc29sdmUobS5oYXNFcnJvcnMoLi4uaWdub3JlZFByb3BzKSkpXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBlcnJvcnMucmVkdWNlKChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICBpZiAoZSlcbiAgICAgICAgYWNjdW0gPVxuICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoZXJyb3JNZXNzYWdlcykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvck1lc3NhZ2VzKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciByZWFkaW5nIGEgbW9kZWwgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSByZWFkaW5nIGEgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkUHJlZml4KGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gbmV3IHRoaXMuY2xhc3MoKTtcbiAgICBtb2RlbFt0aGlzLnBrXSA9IGtleSBhcyBNW2tleW9mIE1dO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG4gICAgcmV0dXJuIFtrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIG1vZGVsIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBhc3luYyByZWFkKGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgcmVhZGluZyBtdWx0aXBsZSBtb2RlbHMgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgY29udGV4dCBhbmQgZW5mb3JjZXMgZGVjb3JhdG9ycyBiZWZvcmUgcmVhZGluZyBtdWx0aXBsZSBtb2RlbHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGtleXMgLSBUaGUgcHJpbWFyeSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXlzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkQWxsUHJlZml4KFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBrZXlzLm1hcChhc3luYyAoaykgPT4ge1xuICAgICAgICBjb25zdCBtID0gbmV3IHRoaXMuY2xhc3MoKTtcbiAgICAgICAgbVt0aGlzLnBrXSA9IGsgYXMgTVtrZXlvZiBNXTtcbiAgICAgICAgcmV0dXJuIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWRBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgbW9kZWwgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBjaGFuZ2VzIHRvIGFuIGV4aXN0aW5nIG1vZGVsIGluc3RhbmNlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIHVwZGF0ZWQgbW9kZWwgd2l0aCByZWZyZXNoZWQgcHJvcGVydGllcy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4ocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCwgdHJhbnNpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgdXBkYXRlLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhlIG1vZGVsIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXBkYXRlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgbW9kZWwgaGFzIG5vIHByaW1hcnkga2V5IHZhbHVlLlxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hcmdzOiBhbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHBrID0gbW9kZWxbdGhpcy5wa10gYXMgc3RyaW5nO1xuICAgIGlmICghcGspXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHZhbHVlIGZvciB0aGUgSWQgaXMgZGVmaW5lZCB1bmRlciB0aGUgcHJvcGVydHkgJHt0aGlzLnBrIGFzIHN0cmluZ31gXG4gICAgICApO1xuICAgIGNvbnN0IG9sZE1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKHBrLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbCA9IHRoaXMubWVyZ2Uob2xkTW9kZWwsIG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgIG9sZE1vZGVsXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIG1vZGVsLmhhc0Vycm9ycyhcbiAgICAgICAgb2xkTW9kZWwsXG4gICAgICAgIC4uLlJlcG9zaXRvcnkucmVsYXRpb25zKHRoaXMuY2xhc3MpLFxuICAgICAgICAuLi4oY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW10pXG4gICAgICApXG4gICAgKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcbiAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbCkpIHtcbiAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtb2RlbCkpXG4gICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobW9kZWwsIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgbW9kZWxzIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgY2hhbmdlcyB0byBtdWx0aXBsZSBleGlzdGluZyBtb2RlbCBpbnN0YW5jZXMgaW4gdGhlIGRhdGFiYXNlIGluIGEgYmF0Y2ggb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgdXBkYXRlZCBtb2RlbHMgd2l0aCByZWZyZXNoZWQgcHJvcGVydGllcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci51cGRhdGVBbGwoXG4gICAgICB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLmlkKSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLnJlY29yZCksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHUsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHUsIHRoaXMuY2xhc3MsIHRoaXMucGssIHJlY29yZHNbaV0uaWQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgbW9kZWxzIGZvciB1cGRhdGUuXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBtdWx0aXBsZSBtb2RlbHMgYW5kIHByZXBhcmVzIHRoZW0gZm9yIHVwZGF0ZSBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueVtdPn0gVGhlIHByZXBhcmVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGFueSBtb2RlbCBoYXMgbm8gcHJpbWFyeSBrZXkgdmFsdWUuXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgYW55IG1vZGVsIGZhaWxzIHZhbGlkYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsUHJlZml4KFxuICAgIG1vZGVsczogTVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IGlkcyA9IG1vZGVscy5tYXAoKG0pID0+IHtcbiAgICAgIGNvbnN0IGlkID0gbVt0aGlzLnBrXSBhcyBzdHJpbmc7XG4gICAgICBpZiAoIWlkKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIm1pc3NpbmcgaWQgb24gdXBkYXRlIG9wZXJhdGlvblwiKTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9KTtcbiAgICBjb25zdCBvbGRNb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoaWRzLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbHMgPSBtb2RlbHMubWFwKChtLCBpKSA9PiB7XG4gICAgICBtID0gdGhpcy5tZXJnZShvbGRNb2RlbHNbaV0sIG0pO1xuICAgICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSkge1xuICAgICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobSkpXG4gICAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG07XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT04sXG4gICAgICAgICAgb2xkTW9kZWxzW2ldXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgaWdub3JlZFByb3BzID1cbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICBQcm9taXNlLnJlc29sdmUobS5oYXNFcnJvcnMob2xkTW9kZWxzW2ldLCBtLCAuLi5pZ25vcmVkUHJvcHMpKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gZXJyb3JzLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgaWYgKGUpXG4gICAgICAgIGFjY3VtID1cbiAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgOiBgIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YDtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB1bmRlZmluZWQpO1xuXG4gICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobSwgaSkgPT4ge1xuICAgICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSkge1xuICAgICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobSkpXG4gICAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIGRlbGV0aW5nIGEgbW9kZWwgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSBkZWxldGluZyBhIG1vZGVsLlxuICAgKiBAcGFyYW0ge2FueX0ga2V5IC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVQcmVmaXgoa2V5OiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMucmVhZChrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgZGVsZXRpbmcgbXVsdGlwbGUgbW9kZWxzIGJ5IElEcy5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIGNvbnRleHQgYW5kIGVuZm9yY2VzIGRlY29yYXRvcnMgYmVmb3JlIGRlbGV0aW5nIG11bHRpcGxlIG1vZGVscy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5cyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsUHJlZml4KFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoa2V5cywgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIHJldHVybiBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRHMuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlQWxsKHRoaXMudGFibGVOYW1lLCBrZXlzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGtleXNbaV0pXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzZWxlY3QgcXVlcnkgd2l0aG91dCBzcGVjaWZ5aW5nIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgU3RhcnRzIGJ1aWxkaW5nIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybiBhbGwgZmllbGRzIG9mIHRoZSBtb2RlbC5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlciBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgc2VsZWN0PFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXSxcbiAgPigpOiBXaGVyZU9wdGlvbjxNLCBNW10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNlbGVjdCBxdWVyeSB3aXRoIHNwZWNpZmljIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgU3RhcnRzIGJ1aWxkaW5nIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybiBvbmx5IHRoZSBzcGVjaWZpZWQgZmllbGRzIG9mIHRoZSBtb2RlbC5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgZmllbGRzIHRvIHNlbGVjdC5cbiAgICogQHJldHVybiBBIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSBzZWxlY3RlZCBmaWVsZHMuXG4gICAqL1xuICBzZWxlY3Q8UyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10+KFxuICAgIHNlbGVjdG9yOiByZWFkb25seSBbLi4uU11cbiAgKTogV2hlcmVPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW1wbGVtZW50YXRpb24gb2YgdGhlIHNlbGVjdCBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBxdWVyeSBidWlsZGVyIGZvciB0aGUgbW9kZWwgd2l0aCBvcHRpb25hbCBmaWVsZCBzZWxlY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBTIC0gVGhlIGFycmF5IHR5cGUgb2Ygc2VsZWN0IHNlbGVjdG9ycy5cbiAgICogQHBhcmFtIFtzZWxlY3Rvcl0gLSBPcHRpb25hbCBmaWVsZHMgdG8gc2VsZWN0LlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlci5cbiAgICovXG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I/OiByZWFkb25seSBbLi4uU11cbiAgKTogV2hlcmVPcHRpb248TSwgTVtdPiB8IFdoZXJlT3B0aW9uPE0sIFBpY2s8TSwgU1tudW1iZXJdPltdPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlclxuICAgICAgLlN0YXRlbWVudDxNPigpXG4gICAgICAuc2VsZWN0KHNlbGVjdG9yIGFzIHJlYWRvbmx5IFsuLi5TXSlcbiAgICAgIC5mcm9tKHRoaXMuY2xhc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHF1ZXJ5IHdpdGggdGhlIHNwZWNpZmllZCBjb25kaXRpb25zIGFuZCBvcHRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHNpbXBsaWZpZWQgd2F5IHRvIHF1ZXJ5IHRoZSBkYXRhYmFzZSB3aXRoIGNvbW1vbiBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiB0byBmaWx0ZXIgcmVjb3Jkcy5cbiAgICogQHBhcmFtIG9yZGVyQnkgLSBUaGUgZmllbGQgdG8gb3JkZXIgcmVzdWx0cyBieS5cbiAgICogQHBhcmFtIHtPcmRlckRpcmVjdGlvbn0gW29yZGVyPU9yZGVyRGlyZWN0aW9uLkFTQ10gLSBUaGUgc29ydCBkaXJlY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIC0gT3B0aW9uYWwgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF0gLSBPcHRpb25hbCBudW1iZXIgb2YgcmVzdWx0cyB0byBza2lwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBxdWVyeSByZXN1bHRzIGFzIG1vZGVsIGluc3RhbmNlcy5cbiAgICovXG4gIGFzeW5jIHF1ZXJ5KFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIG9yZGVyQnk6IGtleW9mIE0sXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIGxpbWl0PzogbnVtYmVyLFxuICAgIHNraXA/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCBzb3J0OiBPcmRlckJ5U2VsZWN0b3I8TT4gPSBbb3JkZXJCeSwgb3JkZXIgYXMgT3JkZXJEaXJlY3Rpb25dO1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zZWxlY3QoKS53aGVyZShjb25kaXRpb24pLm9yZGVyQnkoc29ydCk7XG4gICAgaWYgKGxpbWl0KSBxdWVyeS5saW1pdChsaW1pdCk7XG4gICAgaWYgKHNraXApIHF1ZXJ5Lm9mZnNldChza2lwKTtcbiAgICByZXR1cm4gcXVlcnkuZXhlY3V0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb2JzZXJ2ZXIgZm9yIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgb2YgY2hhbmdlcyB0byBtb2RlbHMgaW4gdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3Rlci5cbiAgICogQHBhcmFtIHtPYnNlcnZlckZpbHRlcn0gW2ZpbHRlcl0gLSBPcHRpb25hbCBmaWx0ZXIgdG8gbGltaXQgd2hpY2ggZXZlbnRzIHRoZSBvYnNlcnZlciByZWNlaXZlcy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogQHNlZSB7T2JzZXJ2YWJsZSNvYnNlcnZlfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIsIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9ic2VydmVySGFuZGxlclwiLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLk9ic2VydmVySGFuZGxlcigpLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5vYnNlcnZlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHRoaXMuYWRhcHRlci5vYnNlcnZlKHRoaXMsICh0YWJsZTogc3RyaW5nKSA9PiB0YWJsZU5hbWUgPT09IHRhYmxlKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBub3cgb2JzZXJ2aW5nICR7dGhpcy5hZGFwdGVyfSBmaWx0ZXJpbmcgb24gdGFibGUgPT09ICR7dGFibGVOYW1lfWBcbiAgICApO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyIS5vYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpO1xuICAgIGxvZy52ZXJib3NlKGBSZWdpc3RlcmVkIG5ldyBvYnNlcnZlciAke29ic2VydmVyLnRvU3RyaW5nKCl9YCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVucmVnaXN0ZXJzIGFuIG9ic2VydmVyIGZyb20gdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGFuIG9ic2VydmVyIHNvIGl0IHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBvZiBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqIEBzZWUge09ic2VydmFibGUjdW5PYnNlcnZlfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICB0aGlzLm9ic2VydmVySGFuZGxlci51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMudW5PYnNlcnZlKVxuICAgICAgLnZlcmJvc2UoYE9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX0gcmVtb3ZlZGApO1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKSkge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgYE5vIG1vcmUgb2JzZXJ2ZXJzIHJlZ2lzdGVyZWQgZm9yICR7dGhpcy5hZGFwdGVyfSwgdW5zdWJzY3JpYmluZ2BcbiAgICAgICk7XG4gICAgICB0aGlzLmFkYXB0ZXIudW5PYnNlcnZlKHRoaXMpO1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgTm8gbG9uZ2VyIG9ic2VydmluZyBhZGFwdGVyICR7dGhpcy5hZGFwdGVyLmZsYXZvdXJ9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGFuIGV2ZW50LlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGFsbCByZWdpc3RlcmVkIG9ic2VydmVycyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGEgZGF0YWJhc2UgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSB0YWJsZSBuYW1lIHdoZXJlIHRoZSBldmVudCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgSUQgb3IgSURzIG9mIHRoZSBhZmZlY3RlZCByZWNvcmRzLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWQuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBvYnNlcnZlciBoYW5kbGVyIGlzIG5vdCBpbml0aWFsaXplZC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy51cGRhdGVPYnNlcnZlcnMpXG4gICAgICAudmVyYm9zZShcbiAgICAgICAgYFVwZGF0aW5nICR7dGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKX0gb2JzZXJ2ZXJzIGZvciAke3RoaXN9YFxuICAgICAgKTtcbiAgICBhd2FpdCB0aGlzLm9ic2VydmVySGFuZGxlci51cGRhdGVPYnNlcnZlcnMoXG4gICAgICB0aGlzLmxvZyxcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBBcnJheS5pc0FycmF5KGlkKVxuICAgICAgICA/IGlkLm1hcCgoaSkgPT4gU2VxdWVuY2UucGFyc2VWYWx1ZSh0aGlzLnBrUHJvcHMudHlwZSwgaSkgYXMgc3RyaW5nKVxuICAgICAgICA6IChTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMucGtQcm9wcy50eXBlLCBpZCkgYXMgc3RyaW5nKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbGlhcyBmb3IgdXBkYXRlT2JzZXJ2ZXJzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGFuIGV2ZW50IChhbGlhcyBmb3IgdXBkYXRlT2JzZXJ2ZXJzKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlIG5hbWUgd2hlcmUgdGhlIGV2ZW50IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBldmVudCB0aGF0IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBJRCBvciBJRHMgb2YgdGhlIGFmZmVjdGVkIHJlY29yZHMuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZC5cbiAgICovXG4gIGFzeW5jIHJlZnJlc2goXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9yIHJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgcmV0dXJucyBhIHJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZWwuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgdGhhdCBleHRlbmRzIFJlcG88TT4uXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGRlZmF1bHQgYWRhcHRlciBmbGF2b3VyIGlmIG5vdCBzcGVjaWZpZWQgb24gdGhlIG1vZGVsLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtSfSBBIHJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIHRoZSBtb2RlbC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gYWRhcHRlciBpcyByZWdpc3RlcmVkIGZvciB0aGUgZmxhdm91ci5cbiAgICovXG4gIHN0YXRpYyBmb3JNb2RlbDxNIGV4dGVuZHMgTW9kZWwsIFIgZXh0ZW5kcyBSZXBvPE0+PihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgYWxpYXM/OiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUiB7XG4gICAgbGV0IHJlcG86IFIgfCBDb25zdHJ1Y3RvcjxSPiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IF9hbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIGFsaWFzIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgbW9kZWwpIHx8XG4gICAgICBBZGFwdGVyLmN1cnJlbnRGbGF2b3VyO1xuICAgIHRyeSB7XG4gICAgICByZXBvID0gdGhpcy5nZXQobW9kZWwsIF9hbGlhcykgYXMgQ29uc3RydWN0b3I8Uj4gfCBSO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmVwbyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAocmVwbyBpbnN0YW5jZW9mIFJlcG9zaXRvcnkpIHJldHVybiByZXBvIGFzIFI7XG5cbiAgICBjb25zdCBmbGF2b3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgYWxpYXMgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBtb2RlbCkgfHxcbiAgICAgIChyZXBvICYmXG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCByZXBvKSkgfHxcbiAgICAgIEFkYXB0ZXIuY3VycmVudEZsYXZvdXI7XG4gICAgY29uc3QgYWRhcHRlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+IHwgdW5kZWZpbmVkID0gZmxhdm91clxuICAgICAgPyBBZGFwdGVyLmdldChmbGF2b3VyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgcGVyc2lzdGVuY2UgYWRhcHRlciBmb3VuZCBmbGF2b3VyICR7Zmxhdm91cn1gXG4gICAgICApO1xuXG4gICAgcmVwbyA9IHJlcG8gfHwgKGFkYXB0ZXIucmVwb3NpdG9yeSgpIGFzIENvbnN0cnVjdG9yPFI+KTtcbiAgICByZXR1cm4gbmV3IHJlcG8oYWRhcHRlciwgbW9kZWwsIC4uLmFyZ3MpIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwgZnJvbSB0aGUgY2FjaGUuXG4gICAqIEBzdW1tYXJ5IEdldHMgYSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsIGZyb20gdGhlIGludGVybmFsIGNhY2hlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gVGhlIGFkYXB0ZXIgYWxpYXMuXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPn0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIHJlcG9zaXRvcnkgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICk6IENvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPiB7XG4gICAgbGV0IG5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG1vZGVsKTtcbiAgICBpZiAoYWxpYXMpIHtcbiAgICAgIG5hbWUgPSBbbmFtZSwgYWxpYXNdLmpvaW4oRGVmYXVsdFNlcGFyYXRvcik7XG4gICAgfVxuICAgIGlmIChuYW1lIGluIHRoaXMuX2NhY2hlKVxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlW25hbWVdIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+O1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYENvdWxkIG5vdCBmaW5kIHJlcG9zaXRvcnkgcmVnaXN0ZXJlZCB1bmRlciAke25hbWV9YFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEFzc29jaWF0ZXMgYSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIHdpdGggYSBtb2RlbCBpbiB0aGUgaW50ZXJuYWwgY2FjaGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxSZXBvPE0+PiB8IFJlcG88TT59IHJlcG8gLSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZS5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgYSByZXBvc2l0b3J5IGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIHJlcG86IENvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPixcbiAgICBhbGlhcz86IHN0cmluZ1xuICApIHtcbiAgICBsZXQgbmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGlmIChhbGlhcykge1xuICAgICAgbmFtZSA9IFtuYW1lLCBhbGlhc10uam9pbihEZWZhdWx0U2VwYXJhdG9yKTtcbiAgICB9XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5fY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgJHtuYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWQgYXMgYSByZXBvc2l0b3J5YCk7XG4gICAgdGhpcy5fY2FjaGVbbmFtZV0gPSByZXBvIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyBtZXRhZGF0YSBvbiBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBBdHRhY2hlcyBtZXRhZGF0YSB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2FueX0gbWV0YWRhdGEgLSBUaGUgbWV0YWRhdGEgdG8gYXR0YWNoIHRvIHRoZSBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBzZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCBtZXRhZGF0YTogYW55KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG1ldGFkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHByZXZpb3VzbHkgYXR0YWNoZWQgbWV0YWRhdGEgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7YW55fSBUaGUgbWV0YWRhdGEgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cbiAgICovXG4gIHN0YXRpYyBnZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLnZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgRGVsZXRlcyB0aGUgbWV0YWRhdGEgcHJvcGVydHkgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyByZW1vdmVNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgaWYgKGRlc2NyaXB0b3IpIGRlbGV0ZSAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHNlcXVlbmNlIG9wdGlvbnMgZm9yIGEgbW9kZWwncyBwcmltYXJ5IGtleS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBzZXF1ZW5jZSBjb25maWd1cmF0aW9uIGZvciBhIG1vZGVsJ3MgcHJpbWFyeSBrZXkgZnJvbSBtZXRhZGF0YS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge1NlcXVlbmNlT3B0aW9uc30gVGhlIHNlcXVlbmNlIG9wdGlvbnMgZm9yIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBzZXF1ZW5jZSBvcHRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2VxdWVuY2VPcHRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG1vZGVsKS5pZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBSZXBvc2l0b3J5LmtleShEQktleXMuSUQpLFxuICAgICAgbW9kZWwsXG4gICAgICBwayBhcyBzdHJpbmdcbiAgICApO1xuICAgIGlmICghbWV0YWRhdGEpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJObyBzZXF1ZW5jZSBvcHRpb25zIGRlZmluZWQgZm9yIG1vZGVsLiBkaWQgeW91IHVzZSB0aGUgQHBrIGRlY29yYXRvcj9cIlxuICAgICAgKTtcbiAgICByZXR1cm4gbWV0YWRhdGEgYXMgU2VxdWVuY2VPcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCBpbmRleGVzIGRlZmluZWQgb24gYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFsbCBpbmRleCBtZXRhZGF0YSBmcm9tIGEgbW9kZWwncyBwcm9wZXJ0eSBkZWNvcmF0b3JzLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj59IEEgbmVzdGVkIHJlY29yZCBvZiBwcm9wZXJ0eSBuYW1lcyB0byBpbmRleCBtZXRhZGF0YS5cbiAgICovXG4gIHN0YXRpYyBpbmRleGVzPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGNvbnN0IGluZGV4RGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsIDogbmV3IG1vZGVsKCksXG4gICAgICBEQktleXMuUkVGTEVDVFxuICAgICk7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGluZGV4RGVjb3JhdG9ycyB8fCB7fSkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj4sIFtrLCB2YWxdKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSB2YWwuZmlsdGVyKCh2KSA9PiB2LmtleS5zdGFydHNXaXRoKFBlcnNpc3RlbmNlS2V5cy5JTkRFWCkpO1xuICAgICAgICBpZiAoZGVjcyAmJiBkZWNzLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgZGVjIG9mIGRlY3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjO1xuICAgICAgICAgICAgYWNjdW1ba10gPSBhY2N1bVtrXSB8fCB7fTtcbiAgICAgICAgICAgIGFjY3VtW2tdW2tleV0gPSBwcm9wcyBhcyBJbmRleE1ldGFkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCByZWxhdGlvbiBwcm9wZXJ0aWVzIGRlZmluZWQgb24gYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBuYW1lcyBvZiBhbGwgcHJvcGVydGllcyBtYXJrZWQgYXMgcmVsYXRpb25zIGluIHRoZSBtb2RlbCBoaWVyYXJjaHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IGFyZSByZWxhdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgcmVsYXRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHByb3RvdHlwZSA9XG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsXG4gICAgICAgID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZGVsKVxuICAgICAgICA6IChtb2RlbCBhcyBhbnkpLnByb3RvdHlwZTtcbiAgICB3aGlsZSAocHJvdG90eXBlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHByb3BzOiBzdHJpbmdbXSA9IHByb3RvdHlwZVtQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TXTtcbiAgICAgIGlmIChwcm9wcykge1xuICAgICAgICByZXN1bHQucHVzaCguLi5wcm9wcyk7XG4gICAgICB9XG4gICAgICBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdGFibGUgbmFtZSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBhIG1vZGVsLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgdGFibGU8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0VGFibGVOYW1lKG1vZGVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY29sdW1uIG5hbWUgZm9yIGEgbW9kZWwgYXR0cmlidXRlLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIHByb3BlcnR5LlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIFRoZSBhdHRyaWJ1dGUvcHJvcGVydHkgbmFtZS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29sdW1uIG5hbWUgZm9yIHRoZSBhdHRyaWJ1dGUuXG4gICAqL1xuICBzdGF0aWMgY29sdW1uPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0sIGF0dHJpYnV0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKSxcbiAgICAgIG1vZGVsLFxuICAgICAgYXR0cmlidXRlXG4gICAgKTtcbiAgICByZXR1cm4gbWV0YWRhdGEgPyBtZXRhZGF0YSA6IGF0dHJpYnV0ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IERCS2V5cywgSVJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwb3NpdG9yeSBkZWNvcmF0b3IgZm9yIG1vZGVsIGNsYXNzZXMuXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGFuZCByZWdpc3RlcnMgYSByZXBvc2l0b3J5IGZvciBhIG1vZGVsIGNsYXNzLiBDYW4gYmUgdXNlZCBhcyBib3RoIGEgcHJvcGVydHkgZGVjb3JhdG9yIGFuZCBhIGNsYXNzIGRlY29yYXRvci5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxUPn0gbW9kZWwgLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lT3ZlcnJpZGVdIC0gT3B0aW9uYWwgbmFtZSBvdmVycmlkZSBmb3IgdGhlIHJlcG9zaXRvcnkuXG4gKiBAcmV0dXJuIHthbnl9IC0gVGhlIGRlY29yYXRvciBmdW5jdGlvbi5cbiAqIEBmdW5jdGlvbiByZXBvc2l0b3J5XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50IENvZGVcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgUiBhcyBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTWV0YWRhdGFcbiAqXG4gKiAgIEMtPj5EOiBBcHBseSBAcmVwb3NpdG9yeShNb2RlbClcbiAqICAgYWx0IFByb3BlcnR5IERlY29yYXRvclxuICogICAgIEQtPj5EOiBDaGVjayBpZiBwcm9wZXJ0eUtleSBleGlzdHNcbiAqICAgICBELT4+K0M6IFJldHVybiBpbmplY3QobmFtZSkgZGVjb3JhdG9yXG4gKiAgIGVsc2UgQ2xhc3MgRGVjb3JhdG9yXG4gKiAgICAgRC0+Pk06IFNldCByZXBvc2l0b3J5IG1ldGFkYXRhIG9uIG1vZGVsXG4gKiAgICAgRC0+PlI6IFJlZ2lzdGVyIG1vZGVsIHdpdGggUmVwb3NpdG9yeVxuICogICAgIEQtPj4rQzogUmV0dXJuIGluamVjdGFibGUgZGVjb3JhdG9yIHdpdGggY29uZmlnXG4gKiAgICAgQy0+PkM6IERlZmluZSBEQktleXMuQ0xBU1MgcHJvcGVydHlcbiAqICAgZW5kXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8VD4sXG4gIGZsYXZvdXI/OiBzdHJpbmdcbik6IGFueSB7XG4gIHJldHVybiAoKG9yaWdpbmFsOiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgaWYgKHByb3BlcnR5S2V5KSB7XG4gICAgICByZXR1cm4gaW5qZWN0KG1vZGVsW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSB8fCBtb2RlbCkoXG4gICAgICAgIG9yaWdpbmFsLFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBtZXRhZGF0YShSZXBvc2l0b3J5LmtleShEQktleXMuUkVQT1NJVE9SWSksIG9yaWdpbmFsLm5hbWUpKG1vZGVsKTtcbiAgICBmbGF2b3VyID1cbiAgICAgIGZsYXZvdXIgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBvcmlnaW5hbCk7XG4gICAgUmVwb3NpdG9yeS5yZWdpc3RlcihcbiAgICAgIG1vZGVsW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSB8fCBtb2RlbCxcbiAgICAgIG9yaWdpbmFsLFxuICAgICAgZmxhdm91clxuICAgICk7XG4gICAgcmV0dXJuIGluamVjdGFibGUoXG4gICAgICBtb2RlbFtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gfHwgbW9kZWwsXG4gICAgICAoaW5zdGFuY2U6IElSZXBvc2l0b3J5PFQ+KSA9PiB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0YW5jZSwgREJLZXlzLkNMQVNTLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgdmFsdWU6IG1vZGVsLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApKG9yaWdpbmFsKTtcbiAgfSkgYXMgYW55O1xufVxuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIG9ic2VydmVyIGNvbW11bmljYXRpb24gZmFpbHMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSBpbiBvYnNlcnZlciBjb21tdW5pY2F0aW9uIGJldHdlZW4gcmVwb3NpdG9yaWVzLlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdC5cbiAqIEBjbGFzcyBPYnNlcnZlckVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKiBAZXhhbXBsZVxuICogdHJ5IHtcbiAqICAgLy8gU29tZSByZXBvc2l0b3J5IG9ic2VydmVyIG9wZXJhdGlvblxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgT2JzZXJ2ZXJFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoJ09ic2VydmVyIGNvbW11bmljYXRpb24gZmFpbGVkOicsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBPYnNlcnZlckVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKE9ic2VydmVyRXJyb3IubmFtZSwgbXNnLCA1MDApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3Rvciwgc2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuL1JlcG9zaXRvcnlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgdW5pcXVlIGluamVjdGFibGUgbmFtZSBmb3IgYSByZXBvc2l0b3J5LlxuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBuYW1lIGZvciByZXBvc2l0b3J5IGluamVjdGFibGVzIGJhc2VkIG9uIG1vZGVsIGFuZCBhZGFwdGVyIGZsYXZvdXIuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VD4gfCBUfSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gLSBPcHRpb25hbCBhZGFwdGVyIGZsYXZvdXIuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbW9kZWwgbWV0YWRhdGEuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgaW5qZWN0YWJsZSBuYW1lLlxuICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gZmxhdm91ciBpcyBwcm92aWRlZCBhbmQgbm9uZSBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIG1vZGVsLlxuICogQGZ1bmN0aW9uIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5PFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxUPiB8IFQsXG4gIGZsYXZvdXI/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGlmICghZmxhdm91cikge1xuICAgIGNvbnN0IGtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKTtcbiAgICBmbGF2b3VyID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIGtleSxcbiAgICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IG1vZGVsXG4gICAgKTtcbiAgICBpZiAoIWZsYXZvdXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXRyaWV2ZSBmbGF2b3VyIGZyb20gbW9kZWwgJHttb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwuY29uc3RydWN0b3IubmFtZSA6IG1vZGVsLm5hbWV9YFxuICAgICAgKTtcbiAgfVxuICByZXR1cm4gc2YoUGVyc2lzdGVuY2VLZXlzLklOSkVDVEFCTEUsIGZsYXZvdXIsIFJlcG9zaXRvcnkudGFibGUobW9kZWwpKTtcbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGVSZWdpc3RyeUltcCxcbiAgSW5qZWN0YWJsZXMsXG59IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVnaXN0cnkgZm9yIGluamVjdGFibGUgcmVwb3NpdG9yaWVzLlxuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBpbmplY3RhYmxlIHJlZ2lzdHJ5IHRvIHByb3ZpZGUgYXV0b21hdGljIHJlcG9zaXRvcnkgcmVzb2x1dGlvbiBmb3IgbW9kZWxzLlxuICogQHBhcmFtIHt2b2lkfSAtIE5vIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgcmVxdWlyZWQuXG4gKiBAY2xhc3MgSW5qZWN0YWJsZXNSZWdpc3RyeVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IEluamVjdGFibGVzUmVnaXN0cnkoKTtcbiAqIGNvbnN0IHVzZXJSZXBvID0gcmVnaXN0cnkuZ2V0PFVzZXJSZXBvc2l0b3J5PignVXNlcicpO1xuICogLy8gSWYgVXNlclJlcG9zaXRvcnkgZXhpc3RzLCBpdCB3aWxsIGJlIHJldHVybmVkXG4gKiAvLyBJZiBub3QsIGJ1dCBVc2VyIG1vZGVsIGV4aXN0cywgYSByZXBvc2l0b3J5IHdpbGwgYmUgY3JlYXRlZCBmb3IgaXRcbiAqL1xuZXhwb3J0IGNsYXNzIEluamVjdGFibGVzUmVnaXN0cnkgZXh0ZW5kcyBJbmplY3RhYmxlUmVnaXN0cnlJbXAge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFuIGluamVjdGFibGUgYnkgbmFtZSB3aXRoIHJlcG9zaXRvcnkgYXV0by1yZXNvbHV0aW9uLlxuICAgKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIGdldCBtZXRob2QgdG8gYXV0b21hdGljYWxseSByZXNvbHZlIHJlcG9zaXRvcmllcyBmb3IgbW9kZWxzIHdoZW4gbm90IGZvdW5kIGRpcmVjdGx5LlxuICAgKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIGluamVjdGFibGUgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBpbmplY3RhYmxlIHRvIHJldHJpZXZlLlxuICAgKiBAcmV0dXJuIHtUIHwgdW5kZWZpbmVkfSAtIFRoZSBpbmplY3RhYmxlIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmQuXG4gICAqL1xuICBvdmVycmlkZSBnZXQ8VD4oXG4gICAgbmFtZTogc3ltYm9sIHwgQ29uc3RydWN0b3I8VD4sXG4gICAgZmxhdm91cj86IHN0cmluZ1xuICApOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaW5qZWN0YWJsZSA9IHN1cGVyLmdldChuYW1lKTtcbiAgICBpZiAoIWluamVjdGFibGUpXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgbSA9IG5hbWU7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIiB8fCB0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIG0gPSBNb2RlbC5nZXQobmFtZS50b1N0cmluZygpKSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG0pXG4gICAgICAgICAgaW5qZWN0YWJsZSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobSBhcyBDb25zdHJ1Y3Rvcjxhbnk+LCBmbGF2b3VyKSBhcyBUO1xuICAgICAgICBpZiAoaW5qZWN0YWJsZSkge1xuICAgICAgICAgIGlmIChpbmplY3RhYmxlIGluc3RhbmNlb2YgUmVwb3NpdG9yeSkgcmV0dXJuIGluamVjdGFibGUgYXMgVDtcbiAgICAgICAgICBmbGF2b3VyID1cbiAgICAgICAgICAgIGZsYXZvdXIgfHxcbiAgICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICAgICAgaW5qZWN0YWJsZS5jb25zdHJ1Y3RvclxuICAgICAgICAgICAgKSB8fFxuICAgICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBJbmplY3RhYmxlcy5yZWdpc3RlcihcbiAgICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICAgICBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeShcbiAgICAgICAgICAgICAgbSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgICAgICAgIGZsYXZvdXJcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIHJldHVybiBpbmplY3RhYmxlIGFzIFQgfCB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIEludGVyZmFjZSBmb3Igc2VxdWVuY2UgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBzZXF1ZW5jZXNcbiAqIEBpbnRlcmZhY2UgU2VxdWVuY2VPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXF1ZW5jZU9wdGlvbnM8XG4gIFRZUEUgPSBcIk51bWJlclwiIHwgXCJCaWdJbnRcIiB8IHN0cmluZyB8IHVuZGVmaW5lZCxcbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc2VxdWVuY2VcbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG5cbiAgZ2VuZXJhdGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBzZXF1ZW5jZSBnZW5lcmF0ZXMgTnVtYmVyIG9yIEJpZ0ludCB2YWx1ZXNcbiAgICovXG4gIHR5cGU6IFRZUEU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgVGhlIHZhbHVlIHRoYXQgdGhlIHNlcXVlbmNlIHN0YXJ0cyB3aXRoXG4gICAqL1xuICBzdGFydFdpdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbmNyZW1lbnQgdmFsdWUgZm9yIGVhY2ggc3RlcCBpbiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgVGhlIGFtb3VudCBieSB3aGljaCB0aGUgc2VxdWVuY2UgaW5jcmVhc2VzIHdpdGggZWFjaCBjYWxsXG4gICAqL1xuICBpbmNyZW1lbnRCeTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT3B0aW9uYWwgbWluaW11bSB2YWx1ZSBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFRoZSBsb3dlc3QgdmFsdWUgdGhhdCB0aGUgc2VxdWVuY2UgY2FuIGdlbmVyYXRlXG4gICAqL1xuICBtaW5WYWx1ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9wdGlvbmFsIG1heGltdW0gdmFsdWUgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBUaGUgaGlnaGVzdCB2YWx1ZSB0aGF0IHRoZSBzZXF1ZW5jZSBjYW4gZ2VuZXJhdGVcbiAgICovXG4gIG1heFZhbHVlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV2hldGhlciB0aGUgc2VxdWVuY2Ugc2hvdWxkIGN5Y2xlIHdoZW4gcmVhY2hpbmcgaXRzIGxpbWl0c1xuICAgKiBAc3VtbWFyeSBJZiB0cnVlLCB0aGUgc2VxdWVuY2Ugd2lsbCByZXN0YXJ0IGZyb20gbWluVmFsdWUgd2hlbiByZWFjaGluZyBtYXhWYWx1ZVxuICAgKi9cbiAgY3ljbGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgb3B0aW9ucyBmb3Igc2VxdWVuY2VzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZm9yIG51bWJlciBzZXF1ZW5jZXMgc3RhcnRpbmcgYXQgMCBhbmQgaW5jcmVtZW50aW5nIGJ5IDFcbiAqIEBjb25zdCBOb25lU2VxdWVuY2VPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IE5vbmVTZXF1ZW5jZU9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyA9IHtcbiAgdHlwZTogdW5kZWZpbmVkLFxuICBnZW5lcmF0ZWQ6IGZhbHNlLFxuICBzdGFydFdpdGg6IDAsXG4gIGluY3JlbWVudEJ5OiAxLFxuICBjeWNsZTogZmFsc2UsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IG9wdGlvbnMgZm9yIHNlcXVlbmNlc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZvciBudW1iZXIgc2VxdWVuY2VzIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlbWVudGluZyBieSAxXG4gKiBAY29uc3QgRGVmYXVsdFNlcXVlbmNlT3B0aW9uc1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0U2VxdWVuY2VPcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMgPSBOb25lU2VxdWVuY2VPcHRpb25zO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmVkZWZpbmVkIG9wdGlvbnMgZm9yIG51bWVyaWMgc2VxdWVuY2VzXG4gKiBAc3VtbWFyeSBDb25maWd1cmF0aW9uIGZvciBzdGFuZGFyZCBudW1iZXIgc2VxdWVuY2VzIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlbWVudGluZyBieSAxXG4gKiBAY29uc3QgTnVtZXJpY1NlcXVlbmNlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IE51bWVyaWNTZXF1ZW5jZTogU2VxdWVuY2VPcHRpb25zID0ge1xuICB0eXBlOiBcIk51bWJlclwiLFxuICBnZW5lcmF0ZWQ6IHRydWUsXG4gIHN0YXJ0V2l0aDogMCxcbiAgaW5jcmVtZW50Qnk6IDEsXG4gIGN5Y2xlOiBmYWxzZSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByZWRlZmluZWQgb3B0aW9ucyBmb3IgQmlnSW50IHNlcXVlbmNlc1xuICogQHN1bW1hcnkgQ29uZmlndXJhdGlvbiBmb3IgQmlnSW50IHNlcXVlbmNlcyBzdGFydGluZyBhdCAwIGFuZCBpbmNyZW1lbnRpbmcgYnkgMVxuICogQGNvbnN0IEJpZ0ludFNlcXVlbmNlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IEJpZ0ludFNlcXVlbmNlOiBTZXF1ZW5jZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICB7fSxcbiAgTnVtZXJpY1NlcXVlbmNlLFxuICB7XG4gICAgdHlwZTogXCJCaWdJbnRcIixcbiAgfVxuKTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXBhcmlzb24gb3BlcmF0b3JzIGZvciBxdWVyeSBjb25kaXRpb25zXG4gKiBAc3VtbWFyeSBFbnVtIGRlZmluaW5nIHRoZSBhdmFpbGFibGUgb3BlcmF0b3JzIGZvciBjb21wYXJpbmcgdmFsdWVzIGluIGRhdGFiYXNlIHF1ZXJpZXNcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZW51bSBPcGVyYXRvciB7XG4gIC8qKiBFcXVhbCBjb21wYXJpc29uICg9KSAqL1xuICBFUVVBTCA9IFwiRVFVQUxcIixcbiAgLyoqIE5vdCBlcXVhbCBjb21wYXJpc29uICghPSkgKi9cbiAgRElGRkVSRU5UID0gXCJESUZGRVJFTlRcIixcbiAgLyoqIEdyZWF0ZXIgdGhhbiBjb21wYXJpc29uICg+KSAqL1xuICBCSUdHRVIgPSBcIkJJR0dFUlwiLFxuICAvKiogR3JlYXRlciB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb24gKD49KSAqL1xuICBCSUdHRVJfRVEgPSBcIkJJR0dFUl9FUVwiLFxuICAvKiogTGVzcyB0aGFuIGNvbXBhcmlzb24gKDwpICovXG4gIFNNQUxMRVIgPSBcIlNNQUxMRVJcIixcbiAgLyoqIExlc3MgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uICg8PSkgKi9cbiAgU01BTExFUl9FUSA9IFwiU01BTExFUl9FUVwiLFxuICAvLyBCRVRXRUVOID0gXCJCRVRXRUVOXCIsXG4gIC8qKiBOZWdhdGlvbiBvcGVyYXRvciAoTk9UKSAqL1xuICBOT1QgPSBcIk5PVFwiLFxuICAvKiogSW5jbHVzaW9uIG9wZXJhdG9yIChJTikgKi9cbiAgSU4gPSBcIklOXCIsXG4gIC8vIElTID0gXCJJU1wiLFxuICAvKiogUmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nICovXG4gIFJFR0VYUCA9IFwiUkVHRVhQXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExvZ2ljYWwgb3BlcmF0b3JzIGZvciBjb21iaW5pbmcgcXVlcnkgY29uZGl0aW9uc1xuICogQHN1bW1hcnkgRW51bSBkZWZpbmluZyB0aGUgYXZhaWxhYmxlIG9wZXJhdG9ycyBmb3IgZ3JvdXBpbmcgbXVsdGlwbGUgY29uZGl0aW9ucyBpbiBkYXRhYmFzZSBxdWVyaWVzXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGVudW0gR3JvdXBPcGVyYXRvciB7XG4gIC8qKiBMb2dpY2FsIEFORCBvcGVyYXRvciAtIGFsbCBjb25kaXRpb25zIG11c3QgYmUgdHJ1ZSAqL1xuICBBTkQgPSBcIkFORFwiLFxuICAvKiogTG9naWNhbCBPUiBvcGVyYXRvciAtIGF0IGxlYXN0IG9uZSBjb25kaXRpb24gbXVzdCBiZSB0cnVlICovXG4gIE9SID0gXCJPUlwiLFxufVxuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biBkdXJpbmcgcXVlcnkgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgUmVwcmVzZW50cyBlcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgcXVlcnkgYnVpbGRpbmcgb3IgZXhlY3V0aW9uXG4gKiBAcGFyYW0ge3N0cmluZyB8IEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEBjbGFzcyBRdWVyeUVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVyeUVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKFF1ZXJ5RXJyb3IubmFtZSwgbXNnLCA1MDApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biBkdXJpbmcgcGFnaW5hdGlvbiBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyBwYWdpbmF0aW9uIHNldHVwIG9yIGV4ZWN1dGlvblxuICogQHBhcmFtIHtzdHJpbmcgfCBFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0XG4gKiBAY2xhc3MgUGFnaW5nRXJyb3JcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2luZ0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKFBhZ2luZ0Vycm9yLm5hbWUsIG1zZywgNTAwKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQXR0cmlidXRlT3B0aW9uLCBDb25kaXRpb25CdWlsZGVyT3B0aW9uIH0gZnJvbSBcIi4vb3B0aW9uc1wiO1xuaW1wb3J0IHtcbiAgQ29uZGl0aW9uYWxBc3luYyxcbiAgTW9kZWwsXG4gIE1vZGVsRXJyb3JEZWZpbml0aW9uLFxuICByZXF1aXJlZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgR3JvdXBPcGVyYXRvciwgT3BlcmF0b3IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxudHlwZSBJbmZlckFzeW5jPE0+ID0gTSBleHRlbmRzIE1vZGVsPGluZmVyIEE+ID8gQSA6IGZhbHNlO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIGEgbG9naWNhbCBjb25kaXRpb24gZm9yIGRhdGFiYXNlIHF1ZXJpZXNcbiAqIEBzdW1tYXJ5IEEgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgcXVlcnkgY29uZGl0aW9ucyB3aXRoIHN1cHBvcnQgZm9yIGNvbXBsZXggbG9naWNhbCBvcGVyYXRpb25zLlxuICogVGhpcyBjbGFzcyBhbGxvd3MgZm9yIGJ1aWxkaW5nIGFuZCBjb21iaW5pbmcgcXVlcnkgY29uZGl0aW9ucyB1c2luZyBsb2dpY2FsIG9wZXJhdG9ycyAoQU5ELCBPUiwgTk9UKVxuICogYW5kIGNvbXBhcmlzb24gb3BlcmF0b3JzIChlcXVhbHMsIG5vdCBlcXVhbHMsIGdyZWF0ZXIgdGhhbiwgZXRjLikuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gKiBAcGFyYW0ge3N0cmluZyB8IENvbmRpdGlvbjxNPn0gYXR0cjEgLSBUaGUgYXR0cmlidXRlIG5hbWUgb3IgYSBuZXN0ZWQgY29uZGl0aW9uXG4gKiBAcGFyYW0ge09wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcn0gb3BlcmF0b3IgLSBUaGUgb3BlcmF0b3IgdG8gdXNlIGZvciB0aGUgY29uZGl0aW9uXG4gKiBAcGFyYW0ge2FueX0gY29tcGFyaXNvbiAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3Qgb3IgYW5vdGhlciBjb25kaXRpb25cbiAqIEBjbGFzcyBDb25kaXRpb25cbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBzaW1wbGUgY29uZGl0aW9uXG4gKiBjb25zdCBuYW1lQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZShcIm5hbWVcIikuZXEoXCJKb2huXCIpO1xuICpcbiAqIC8vIENyZWF0ZSBhIGNvbXBsZXggY29uZGl0aW9uXG4gKiBjb25zdCBjb21wbGV4Q29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZShcImFnZVwiKS5ndCgxOClcbiAqICAgLmFuZChDb25kaXRpb24uYXR0cmlidXRlKFwic3RhdHVzXCIpLmVxKFwiYWN0aXZlXCIpKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGJ1aWxkZXIgcGF0dGVyblxuICogY29uc3QgdXNlclF1ZXJ5ID0gQ29uZGl0aW9uLmJ1aWxkZXIoKVxuICogICAuYXR0cmlidXRlKFwiZW1haWxcIikucmVnZXhwKFwiLipAZXhhbXBsZS5jb21cIilcbiAqICAgLmFuZChDb25kaXRpb24uYXR0cmlidXRlKFwibGFzdExvZ2luXCIpLmd0KG5ldyBEYXRlKFwiMjAyMy0wMS0wMVwiKSkpO1xuICovXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uPE0gZXh0ZW5kcyBNb2RlbDxhbnk+PiBleHRlbmRzIE1vZGVsPEluZmVyQXN5bmM8TT4+IHtcbiAgQHJlcXVpcmVkKClcbiAgcHJvdGVjdGVkIGF0dHIxPzogc3RyaW5nIHwgQ29uZGl0aW9uPE0+ID0gdW5kZWZpbmVkO1xuICBAcmVxdWlyZWQoKVxuICBwcm90ZWN0ZWQgb3BlcmF0b3I/OiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3IgPSB1bmRlZmluZWQ7XG4gIEByZXF1aXJlZCgpXG4gIHByb3RlY3RlZCBjb21wYXJpc29uPzogYW55ID0gdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjxNPixcbiAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yLFxuICAgIGNvbXBhcmlzb246IGFueVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXR0cjEgPSBhdHRyMTtcbiAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgdGhpcy5jb21wYXJpc29uID0gY29tcGFyaXNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tYmluZXMgdGhpcyBjb25kaXRpb24gd2l0aCBhbm90aGVyIHVzaW5nIGxvZ2ljYWwgQU5EXG4gICAqIEBzdW1tYXJ5IEpvaW5zIHR3byBjb25kaXRpb25zIHdpdGggYW4gQU5EIG9wZXJhdG9yLCByZXF1aXJpbmcgYm90aCB0byBiZSB0cnVlXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIGNvbWJpbmUgd2l0aCB0aGlzIG9uZVxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIEFORCBvcGVyYXRpb25cbiAgICovXG4gIGFuZChjb25kaXRpb246IENvbmRpdGlvbjxNPik6IENvbmRpdGlvbjxNPiB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5hbmQodGhpcywgY29uZGl0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tYmluZXMgdGhpcyBjb25kaXRpb24gd2l0aCBhbm90aGVyIHVzaW5nIGxvZ2ljYWwgT1JcbiAgICogQHN1bW1hcnkgSm9pbnMgdHdvIGNvbmRpdGlvbnMgd2l0aCBhbiBPUiBvcGVyYXRvciwgcmVxdWlyaW5nIGF0IGxlYXN0IG9uZSB0byBiZSB0cnVlXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIGNvbWJpbmUgd2l0aCB0aGlzIG9uZVxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIE9SIG9wZXJhdGlvblxuICAgKi9cbiAgb3IoY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBDb25kaXRpb248TT4ge1xuICAgIHJldHVybiBDb25kaXRpb24ub3IodGhpcywgY29uZGl0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5lZ2F0aW9uIGNvbmRpdGlvblxuICAgKiBAc3VtbWFyeSBFeGNsdWRlcyBhIHZhbHVlIGZyb20gdGhlIHJlc3VsdCBieSBhcHBseWluZyBhIE5PVCBvcGVyYXRvclxuICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIG5lZ2F0ZVxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIE5PVCBvcGVyYXRpb25cbiAgICovXG4gIG5vdCh2YWw6IGFueSk6IENvbmRpdGlvbjxNPiB7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb24odGhpcywgT3BlcmF0b3IuTk9ULCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgdGhlIGNvbmRpdGlvbiBhbmQgY2hlY2tzIGZvciBlcnJvcnNcbiAgICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSB2YWxpZGF0aW9uIHRvIGVuc3VyZSB0aGUgY29uZGl0aW9uIGlzIHByb3Blcmx5IGZvcm1lZFxuICAgKiBAcGFyYW0gey4uLnN0cmluZ1tdfSBleGNlcHRpb25zIC0gRmllbGRzIHRvIGV4Y2x1ZGUgZnJvbSB2YWxpZGF0aW9uXG4gICAqIEByZXR1cm4ge01vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkfSBFcnJvciBkZWZpbml0aW9uIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICovXG4gIG92ZXJyaWRlIGhhc0Vycm9ycyhcbiAgICAuLi5leGNlcHRpb25zOiBzdHJpbmdbXVxuICApOiBDb25kaXRpb25hbEFzeW5jPEluZmVyQXN5bmM8TT4sIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgY29uZGl0aW9uQ2hlY2sgPSAoKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3QgaW52YWxpZE9wTWVzc2FnZSA9IGBJbnZhbGlkIG9wZXJhdG9yICR7dGhpcy5vcGVyYXRvcn19YDtcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLmF0dHIxID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBhcmlzb24gaW5zdGFuY2VvZiBDb25kaXRpb24pXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbXBhcmlzb246IHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOlxuICAgICAgICAgICAgICAgIFwiQm90aCBzaWRlcyBvZiB0aGUgY29tcGFyaXNvbiBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBNb2RlbEVycm9yRGVmaW5pdGlvbjtcbiAgICAgICAgaWYgKE9iamVjdC52YWx1ZXMoT3BlcmF0b3IpLmluZGV4T2YodGhpcy5vcGVyYXRvciBhcyBPcGVyYXRvcikgPT09IC0xKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcGVyYXRvcjoge1xuICAgICAgICAgICAgICBjb25kaXRpb246IGludmFsaWRPcE1lc3NhZ2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgTW9kZWxFcnJvckRlZmluaXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmF0dHIxIGluc3RhbmNlb2YgQ29uZGl0aW9uKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhKHRoaXMuY29tcGFyaXNvbiBpbnN0YW5jZW9mIENvbmRpdGlvbikgJiZcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yICE9PSBPcGVyYXRvci5OT1RcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21wYXJpc29uOiB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbjogaW52YWxpZE9wTWVzc2FnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBNb2RlbEVycm9yRGVmaW5pdGlvbjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIE9iamVjdC52YWx1ZXMoR3JvdXBPcGVyYXRvcikuaW5kZXhPZihcbiAgICAgICAgICAgIHRoaXMub3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgICAgICkgPT09IC0xICYmXG4gICAgICAgICAgdGhpcy5vcGVyYXRvciAhPT0gT3BlcmF0b3IuTk9UXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3BlcmF0b3I6IHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiBpbnZhbGlkT3BNZXNzYWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBlcnJvcnMgPSBzdXBlci5oYXNFcnJvcnMoLi4uZXhjZXB0aW9ucyk7XG4gICAgaWYgKCF0aGlzLmlzQXN5bmMoKSlcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChlcnJvcnMgYXMgTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQpID8/XG4gICAgICAgIChjb25kaXRpb25DaGVjaygpIGFzIGFueSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBlcnJvcnMgYXMgdW5rbm93biBhcyBQcm9taXNlPE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPlxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXNvbHZlZCA/PyBjb25kaXRpb25DaGVjaygpO1xuICAgIH0pKCkgYXMgQ29uZGl0aW9uYWxBc3luYzxJbmZlckFzeW5jPE0+LCBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD47XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIHRoYXQgY29tYmluZXMgdHdvIGNvbmRpdGlvbnMgd2l0aCBsb2dpY2FsIEFORFxuICAgKiBAc3VtbWFyeSBTdGF0aWMgbWV0aG9kIHRoYXQgam9pbnMgdHdvIGNvbmRpdGlvbnMgd2l0aCBhbiBBTkQgb3BlcmF0b3IsIHJlcXVpcmluZyBib3RoIHRvIGJlIHRydWVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGlzIGNvbmRpdGlvbiBvcGVyYXRlcyBvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uMSAtIFRoZSBmaXJzdCBjb25kaXRpb25cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbjIgLSBUaGUgc2Vjb25kIGNvbmRpdGlvblxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIEFORCBvcGVyYXRpb25cbiAgICovXG4gIHN0YXRpYyBhbmQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjb25kaXRpb24xOiBDb25kaXRpb248TT4sXG4gICAgY29uZGl0aW9uMjogQ29uZGl0aW9uPE0+XG4gICk6IENvbmRpdGlvbjxNPiB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5ncm91cChjb25kaXRpb24xLCBHcm91cE9wZXJhdG9yLkFORCwgY29uZGl0aW9uMik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIHRoYXQgY29tYmluZXMgdHdvIGNvbmRpdGlvbnMgd2l0aCBsb2dpY2FsIE9SXG4gICAqIEBzdW1tYXJ5IFN0YXRpYyBtZXRob2QgdGhhdCBqb2lucyB0d28gY29uZGl0aW9ucyB3aXRoIGFuIE9SIG9wZXJhdG9yLCByZXF1aXJpbmcgYXQgbGVhc3Qgb25lIHRvIGJlIHRydWVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGlzIGNvbmRpdGlvbiBvcGVyYXRlcyBvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uMSAtIFRoZSBmaXJzdCBjb25kaXRpb25cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbjIgLSBUaGUgc2Vjb25kIGNvbmRpdGlvblxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIE9SIG9wZXJhdGlvblxuICAgKi9cbiAgc3RhdGljIG9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY29uZGl0aW9uMTogQ29uZGl0aW9uPE0+LFxuICAgIGNvbmRpdGlvbjI6IENvbmRpdGlvbjxNPlxuICApOiBDb25kaXRpb248TT4ge1xuICAgIHJldHVybiBDb25kaXRpb24uZ3JvdXAoY29uZGl0aW9uMSwgR3JvdXBPcGVyYXRvci5PUiwgY29uZGl0aW9uMik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIHRoYXQgZ3JvdXBzIHR3byBjb25kaXRpb25zIHdpdGggYSBzcGVjaWZpZWQgb3BlcmF0b3JcbiAgICogQHN1bW1hcnkgUHJpdmF0ZSBzdGF0aWMgbWV0aG9kIHRoYXQgY29tYmluZXMgdHdvIGNvbmRpdGlvbnMgdXNpbmcgdGhlIHNwZWNpZmllZCBncm91cCBvcGVyYXRvclxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24xIC0gVGhlIGZpcnN0IGNvbmRpdGlvblxuICAgKiBAcGFyYW0ge0dyb3VwT3BlcmF0b3J9IG9wZXJhdG9yIC0gVGhlIGdyb3VwIG9wZXJhdG9yIHRvIHVzZSAoQU5ELCBPUilcbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbjIgLSBUaGUgc2Vjb25kIGNvbmRpdGlvblxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGdyb3VwZWQgb3BlcmF0aW9uXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBncm91cDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNvbmRpdGlvbjE6IENvbmRpdGlvbjxNPixcbiAgICBvcGVyYXRvcjogR3JvdXBPcGVyYXRvcixcbiAgICBjb25kaXRpb24yOiBDb25kaXRpb248TT5cbiAgKTogQ29uZGl0aW9uPE0+IHtcbiAgICByZXR1cm4gbmV3IENvbmRpdGlvbihjb25kaXRpb24xLCBvcGVyYXRvciwgY29uZGl0aW9uMik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjb25kaXRpb24gYnVpbGRlciBmb3IgYSBzcGVjaWZpYyBtb2RlbCBhdHRyaWJ1dGVcbiAgICogQHN1bW1hcnkgU3RhdGljIG1ldGhvZCB0aGF0IGluaXRpYWxpemVzIGEgY29uZGl0aW9uIGJ1aWxkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gICAqIEBwYXJhbSBhdHRyIC0gVGhlIG1vZGVsIGF0dHJpYnV0ZSB0byBidWlsZCBhIGNvbmRpdGlvbiBmb3JcbiAgICogQHJldHVybiB7QXR0cmlidXRlT3B0aW9uPE0+fSBBIGNvbmRpdGlvbiBidWlsZGVyIGluaXRpYWxpemVkIHdpdGggdGhlIGF0dHJpYnV0ZVxuICAgKi9cbiAgc3RhdGljIGF0dHJpYnV0ZTxNIGV4dGVuZHMgTW9kZWw+KGF0dHI6IGtleW9mIE0pIHtcbiAgICByZXR1cm4gbmV3IENvbmRpdGlvbi5CdWlsZGVyPE0+KCkuYXR0cmlidXRlKGF0dHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbGlhcyBmb3IgdGhlIGF0dHJpYnV0ZSBtZXRob2RcbiAgICogQHN1bW1hcnkgU2hvcnRoYW5kIG1ldGhvZCB0aGF0IGluaXRpYWxpemVzIGEgY29uZGl0aW9uIGJ1aWxkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gICAqIEBwYXJhbSBhdHRyIC0gVGhlIG1vZGVsIGF0dHJpYnV0ZSB0byBidWlsZCBhIGNvbmRpdGlvbiBmb3JcbiAgICogQHJldHVybiB7QXR0cmlidXRlT3B0aW9uPE0+fSBBIGNvbmRpdGlvbiBidWlsZGVyIGluaXRpYWxpemVkIHdpdGggdGhlIGF0dHJpYnV0ZVxuICAgKi9cbiAgc3RhdGljIGF0dHI8TSBleHRlbmRzIE1vZGVsPihhdHRyOiBrZXlvZiBNKSB7XG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlKGF0dHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBhIGZsdWVudCBBUEkgdG8gYnVpbGQgcXVlcnkgY29uZGl0aW9uc1xuICAgKiBAc3VtbWFyeSBBIGJ1aWxkZXIgY2xhc3MgdGhhdCBzaW1wbGlmaWVzIHRoZSBjcmVhdGlvbiBvZiBkYXRhYmFzZSBxdWVyeSBjb25kaXRpb25zXG4gICAqIHdpdGggYSBjaGFpbmFibGUgaW50ZXJmYWNlIGZvciBzZXR0aW5nIGF0dHJpYnV0ZXMgYW5kIG9wZXJhdG9yc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIGJ1aWxkZXIgb3BlcmF0ZXMgb25cbiAgICogQGNsYXNzIENvbmRpdGlvbkJ1aWxkZXJcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIEJ1aWxkZXIgPSBjbGFzcyBDb25kaXRpb25CdWlsZGVyPE0gZXh0ZW5kcyBNb2RlbD5cbiAgICBpbXBsZW1lbnRzIENvbmRpdGlvbkJ1aWxkZXJPcHRpb248TT4sIEF0dHJpYnV0ZU9wdGlvbjxNPlxuICB7XG4gICAgYXR0cjE/OiBrZXlvZiBNIHwgQ29uZGl0aW9uPE0+ID0gdW5kZWZpbmVkO1xuICAgIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgIGNvbXBhcmlzb24/OiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgYXR0cmlidXRlIGZvciB0aGUgY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoaWNoIG1vZGVsIGF0dHJpYnV0ZSB0aGUgY29uZGl0aW9uIHdpbGwgb3BlcmF0ZSBvblxuICAgICAqIEBwYXJhbSBhdHRyIC0gVGhlIG1vZGVsIGF0dHJpYnV0ZSB0byB1c2UgaW4gdGhlIGNvbmRpdGlvblxuICAgICAqIEByZXR1cm4ge0F0dHJpYnV0ZU9wdGlvbjxNPn0gVGhpcyBidWlsZGVyIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGUoYXR0cjoga2V5b2YgTSk6IEF0dHJpYnV0ZU9wdGlvbjxNPiB7XG4gICAgICB0aGlzLmF0dHIxID0gYXR0cjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBBbGlhcyBmb3IgdGhlIGF0dHJpYnV0ZSBtZXRob2RcbiAgICAgKiBAc3VtbWFyeSBTaG9ydGhhbmQgbWV0aG9kIHRvIHNwZWNpZnkgd2hpY2ggbW9kZWwgYXR0cmlidXRlIHRoZSBjb25kaXRpb24gd2lsbCBvcGVyYXRlIG9uXG4gICAgICogQHBhcmFtIGF0dHIgLSBUaGUgbW9kZWwgYXR0cmlidXRlIHRvIHVzZSBpbiB0aGUgY29uZGl0aW9uXG4gICAgICogQHJldHVybiB7QXR0cmlidXRlT3B0aW9uPE0+fSBUaGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgICAqL1xuICAgIGF0dHIoYXR0cjoga2V5b2YgTSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlKGF0dHIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGVxdWFsaXR5IGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIGVxdWFscyB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBhdHRyaWJ1dGUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvblxuICAgICAqL1xuICAgIGVxKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5FUVVBTCwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbmVxdWFsaXR5IGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIGF0dHJpYnV0ZSBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBpbmVxdWFsaXR5IGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBkaWYodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkRJRkZFUkVOVCwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGdyZWF0ZXIgdGhhbiBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb25kaXRpb24gdGhhdCBjaGVja3MgaWYgdGhlIGF0dHJpYnV0ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgYXR0cmlidXRlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGdyZWF0ZXIgdGhhbiBjb21wYXJpc29uXG4gICAgICovXG4gICAgZ3QodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkJJR0dFUiwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGxlc3MgdGhhbiBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb25kaXRpb24gdGhhdCBjaGVja3MgaWYgdGhlIGF0dHJpYnV0ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgYXR0cmlidXRlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGxlc3MgdGhhbiBjb21wYXJpc29uXG4gICAgICovXG4gICAgbHQodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLlNNQUxMRVIsIHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIGF0dHJpYnV0ZSBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvblxuICAgICAqL1xuICAgIGd0ZSh2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuQklHR0VSX0VRLCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBhdHRyaWJ1dGUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgbGVzcyB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBsdGUodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLlNNQUxMRVJfRVEsIHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5jbHVzaW9uIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIGluY2x1ZGVkIGluIHRoZSBzcGVjaWZpZWQgYXJyYXlcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBhcnIgLSBUaGUgYXJyYXkgb2YgdmFsdWVzIHRvIGNoZWNrIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGluY2x1c2lvbiBjb21wYXJpc29uXG4gICAgICovXG4gICAgaW4oYXJyOiBhbnlbXSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuSU4sIGFycik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gY29tcGFyaXNvblxuICAgICAqL1xuICAgIHJlZ2V4cCh2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuUkVHRVhQLCBuZXcgUmVnRXhwKHZhbCkuc291cmNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgb3BlcmF0b3IgYW5kIGNvbXBhcmlzb24gdmFsdWUgZm9yIHRoZSBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBQcml2YXRlIG1ldGhvZCB0aGF0IGNvbmZpZ3VyZXMgdGhlIGNvbmRpdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgb3BlcmF0b3IgYW5kIHZhbHVlXG4gICAgICogQHBhcmFtIHtPcGVyYXRvcn0gb3AgLSBUaGUgb3BlcmF0b3IgdG8gdXNlIGZvciB0aGUgY29uZGl0aW9uXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgb3BlcmF0b3IgYW5kIHZhbHVlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRPcChvcDogT3BlcmF0b3IsIHZhbDogYW55KSB7XG4gICAgICB0aGlzLm9wZXJhdG9yID0gb3A7XG4gICAgICB0aGlzLmNvbXBhcmlzb24gPSB2YWw7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RzIGEgQ29uZGl0aW9uIGluc3RhbmNlIGZyb20gdGhlIGJ1aWxkZXIncyBzdGF0ZVxuICAgICAqIEBzdW1tYXJ5IEZpbmFsaXplcyB0aGUgY29uZGl0aW9uIGJ1aWxkaW5nIHByb2Nlc3MgYnkgY3JlYXRpbmcgYSBuZXcgQ29uZGl0aW9uIGluc3RhbmNlXG4gICAgICogQHRocm93cyB7UXVlcnlFcnJvcn0gSWYgdGhlIGNvbmRpdGlvbiBjYW5ub3QgYmUgYnVpbHQgZHVlIHRvIGludmFsaWQgcGFyYW1ldGVyc1xuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIGluc3RhbmNlIHdpdGggdGhlIGNvbmZpZ3VyZWQgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHByaXZhdGUgYnVpbGQoKTogQ29uZGl0aW9uPE0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29uZGl0aW9uKFxuICAgICAgICAgIHRoaXMuYXR0cjEgYXMgc3RyaW5nIHwgQ29uZGl0aW9uPE0+LFxuICAgICAgICAgIHRoaXMub3BlcmF0b3IgYXMgT3BlcmF0b3IsXG4gICAgICAgICAgdGhpcy5jb21wYXJpc29uIGFzIGFueVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKGUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIGJ1aWxkZXJcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCByZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjb25kaXRpb24gYnVpbGRlclxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIGJ1aWxkZXIgd2lsbCBvcGVyYXRlIG9uXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbkJ1aWxkZXJPcHRpb248TT59IEEgbmV3IGNvbmRpdGlvbiBidWlsZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYnVpbGRlcjxNIGV4dGVuZHMgTW9kZWw+KCk6IENvbmRpdGlvbkJ1aWxkZXJPcHRpb248TT4ge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uLkJ1aWxkZXI8TT4oKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFJlbGF0aW9uc01ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2FzY2FkZSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9yIHVwZGF0ZXMgYSBtb2RlbCBpbnN0YW5jZVxuICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGNyZWF0ZSBhIG5ldyBtb2RlbCBvciB1cGRhdGUgYW4gZXhpc3Rpbmcgb25lIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIHByaW1hcnkga2V5XG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNyZWF0ZSBvciB1cGRhdGVcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1JlcG88TSwgRiwgQ29udGV4dDxGPj59IFtyZXBvc2l0b3J5XSAtIE9wdGlvbmFsIHJlcG9zaXRvcnkgdG8gdXNlIGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCBvciB1cGRhdGVkIG1vZGVsXG4gKiBAZnVuY3Rpb24gY3JlYXRlT3JVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgY3JlYXRlT3JVcGRhdGVcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICpcbiAqICAgQ2FsbGVyLT4+Y3JlYXRlT3JVcGRhdGU6IG1vZGVsLCBjb250ZXh0LCByZXBvc2l0b3J5P1xuICogICBhbHQgcmVwb3NpdG9yeSBub3QgcHJvdmlkZWRcbiAqICAgICBjcmVhdGVPclVwZGF0ZS0+Pk1vZGVsOiBnZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSlcbiAqICAgICBNb2RlbC0tPj5jcmVhdGVPclVwZGF0ZTogY29uc3RydWN0b3JcbiAqICAgICBjcmVhdGVPclVwZGF0ZS0+PlJlcG9zaXRvcnk6IGZvck1vZGVsKGNvbnN0cnVjdG9yKVxuICogICAgIFJlcG9zaXRvcnktLT4+Y3JlYXRlT3JVcGRhdGU6IHJlcG9zaXRvcnlcbiAqICAgZW5kXG4gKlxuICogICBhbHQgcHJpbWFyeSBrZXkgdW5kZWZpbmVkXG4gKiAgICAgY3JlYXRlT3JVcGRhdGUtPj5SZXBvc2l0b3J5OiBjcmVhdGUobW9kZWwsIGNvbnRleHQpXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5jcmVhdGVPclVwZGF0ZTogY3JlYXRlZCBtb2RlbFxuICogICBlbHNlIHByaW1hcnkga2V5IGRlZmluZWRcbiAqICAgICBjcmVhdGVPclVwZGF0ZS0+PlJlcG9zaXRvcnk6IHVwZGF0ZShtb2RlbCwgY29udGV4dClcbiAqICAgICBhbHQgdXBkYXRlIHN1Y2Nlc3NmdWxcbiAqICAgICAgIFJlcG9zaXRvcnktLT4+Y3JlYXRlT3JVcGRhdGU6IHVwZGF0ZWQgbW9kZWxcbiAqICAgICBlbHNlIE5vdEZvdW5kRXJyb3JcbiAqICAgICAgIGNyZWF0ZU9yVXBkYXRlLT4+UmVwb3NpdG9yeTogY3JlYXRlKG1vZGVsLCBjb250ZXh0KVxuICogICAgICAgUmVwb3NpdG9yeS0tPj5jcmVhdGVPclVwZGF0ZTogY3JlYXRlZCBtb2RlbFxuICogICAgIGVuZFxuICogICBlbmRcbiAqXG4gKiAgIGNyZWF0ZU9yVXBkYXRlLS0+PkNhbGxlcjogbW9kZWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU9yVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4+KFxuICBtb2RlbDogTSxcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgYWxpYXM/OiBzdHJpbmcsXG4gIHJlcG9zaXRvcnk/OiBSZXBvPE0sIEYsIENvbnRleHQ8Rj4+XG4pOiBQcm9taXNlPE0+IHtcbiAgaWYgKCFyZXBvc2l0b3J5KSB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSk7XG4gICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBDb3VsZCBub3QgZmluZCBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gICAgcmVwb3NpdG9yeSA9IFJlcG9zaXRvcnkuZm9yTW9kZWw8TSwgUmVwbzxNPj4oXG4gICAgICBjb25zdHJ1Y3RvciBhcyB1bmtub3duIGFzIE1vZGVsQ29uc3RydWN0b3I8TT4sXG4gICAgICBhbGlhc1xuICAgICk7XG4gIH1cbiAgaWYgKHR5cGVvZiBtb2RlbFtyZXBvc2l0b3J5LnBrXSA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICByZXR1cm4gcmVwb3NpdG9yeS5jcmVhdGUobW9kZWwsIGNvbnRleHQpO1xuICBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHJlcG9zaXRvcnkudXBkYXRlKG1vZGVsLCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSkgdGhyb3cgZTtcbiAgICAgIHJldHVybiByZXBvc2l0b3J5LmNyZWF0ZShtb2RlbCwgY29udGV4dCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgY3JlYXRpb25cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIHdoZW4gY3JlYXRpbmcgYSBtb2RlbCwgZWl0aGVyIGJ5IHJlZmVyZW5jaW5nIGFuIGV4aXN0aW5nIG1vZGVsIG9yIGNyZWF0aW5nIGEgbmV3IG9uZVxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb09uZU9uQ3JlYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvT25lT25DcmVhdGVcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvT25lT25DcmVhdGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9PbmVPbkNyZWF0ZS0+Pm9uZVRvT25lT25DcmVhdGU6IGNoZWNrIGlmIHByb3BlcnR5VmFsdWUgZXhpc3RzXG4gKlxuICogICBhbHQgcHJvcGVydHlWYWx1ZSBpcyBub3QgYW4gb2JqZWN0XG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9PbmVPbkNyZWF0ZTogaW5uZXJSZXBvXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PmlubmVyUmVwbzogcmVhZChwcm9wZXJ0eVZhbHVlKVxuICogICAgIGlubmVyUmVwby0tPj5vbmVUb09uZU9uQ3JlYXRlOiByZWFkXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgcHJvcGVydHlWYWx1ZSwgcmVhZFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5vbmVUb09uZU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IHByb3BlcnR5VmFsdWVcbiAqICAgZWxzZSBwcm9wZXJ0eVZhbHVlIGlzIGFuIG9iamVjdFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5Nb2RlbDogZ2V0KGRhdGEuY2xhc3MpXG4gKiAgICAgTW9kZWwtLT4+b25lVG9PbmVPbkNyZWF0ZTogY29uc3RydWN0b3JcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+UmVwb3NpdG9yeTogZm9yTW9kZWwoY29uc3RydWN0b3IpXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5vbmVUb09uZU9uQ3JlYXRlOiByZXBvXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PnJlcG86IGNyZWF0ZShwcm9wZXJ0eVZhbHVlKVxuICogICAgIHJlcG8tLT4+b25lVG9PbmVPbkNyZWF0ZTogY3JlYXRlZFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5maW5kUHJpbWFyeUtleTogY3JlYXRlZFxuICogICAgIGZpbmRQcmltYXJ5S2V5LS0+Pm9uZVRvT25lT25DcmVhdGU6IHBrXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgY3JlYXRlZFtwa10sIGNyZWF0ZWRcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+b25lVG9PbmVPbkNyZWF0ZTogc2V0IG1vZGVsW2tleV0gPSBjcmVhdGVkW3BrXVxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvT25lT25DcmVhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb09uZU9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3BlcnR5VmFsdWU6IGFueSA9IG1vZGVsW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZSkgcmV0dXJuO1xuXG4gIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGlubmVyUmVwbyA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKFxuICAgICAgbW9kZWwsXG4gICAgICBrZXksXG4gICAgICB0aGlzLmFkYXB0ZXIuYWxpYXNcbiAgICApO1xuICAgIGNvbnN0IHJlYWQgPSBhd2FpdCBpbm5lclJlcG8ucmVhZChwcm9wZXJ0eVZhbHVlKTtcbiAgICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgcHJvcGVydHlWYWx1ZSwgcmVhZCk7XG4gICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IHByb3BlcnR5VmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZGF0YS5jbGFzcyA9XG4gICAgdHlwZW9mIGRhdGEuY2xhc3MgPT09IFwic3RyaW5nXCIgPyBkYXRhLmNsYXNzIDogKGRhdGEuY2xhc3MgYXMgYW55KSgpLm5hbWU7XG5cbiAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZGF0YS5jbGFzcyBhcyBzdHJpbmcpO1xuICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBDb3VsZCBub3QgZmluZCBtb2RlbCAke2RhdGEuY2xhc3N9YCk7XG4gIGNvbnN0IHJlcG86IFJlcG88YW55PiA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoY29uc3RydWN0b3IsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShwcm9wZXJ0eVZhbHVlKTtcbiAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShjcmVhdGVkKS5pZDtcbiAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIGNyZWF0ZWRbcGtdLCBjcmVhdGVkKTtcbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IGNyZWF0ZWRbcGtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIHVwZGF0ZXNcbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIHdoZW4gdXBkYXRpbmcgYSBtb2RlbCwgZWl0aGVyIGJ5IHJlZmVyZW5jaW5nIGFuIGV4aXN0aW5nIG1vZGVsIG9yIHVwZGF0aW5nIHRoZSByZWxhdGVkIG1vZGVsXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvT25lT25VcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9PbmVPblVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBjcmVhdGVPclVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBmaW5kUHJpbWFyeUtleVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvT25lT25VcGRhdGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9PbmVPblVwZGF0ZS0+Pm9uZVRvT25lT25VcGRhdGU6IGNoZWNrIGlmIHByb3BlcnR5VmFsdWUgZXhpc3RzXG4gKiAgIG9uZVRvT25lT25VcGRhdGUtPj5vbmVUb09uZU9uVXBkYXRlOiBjaGVjayBpZiBjYXNjYWRlLnVwZGF0ZSBpcyBDQVNDQURFXG4gKlxuICogICBhbHQgcHJvcGVydHlWYWx1ZSBpcyBub3QgYW4gb2JqZWN0XG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9PbmVPblVwZGF0ZTogaW5uZXJSZXBvXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PmlubmVyUmVwbzogcmVhZChwcm9wZXJ0eVZhbHVlKVxuICogICAgIGlubmVyUmVwby0tPj5vbmVUb09uZU9uVXBkYXRlOiByZWFkXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgcHJvcGVydHlWYWx1ZSwgcmVhZFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5vbmVUb09uZU9uVXBkYXRlOiBzZXQgbW9kZWxba2V5XSA9IHByb3BlcnR5VmFsdWVcbiAqICAgZWxzZSBwcm9wZXJ0eVZhbHVlIGlzIGFuIG9iamVjdFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5jcmVhdGVPclVwZGF0ZTogbW9kZWxba2V5XSwgY29udGV4dFxuICogICAgIGNyZWF0ZU9yVXBkYXRlLS0+Pm9uZVRvT25lT25VcGRhdGU6IHVwZGF0ZWRcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+ZmluZFByaW1hcnlLZXk6IHVwZGF0ZWRcbiAqICAgICBmaW5kUHJpbWFyeUtleS0tPj5vbmVUb09uZU9uVXBkYXRlOiBwa1xuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIHVwZGF0ZWRbcGtdLCB1cGRhdGVkXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+Pm9uZVRvT25lT25VcGRhdGU6IHNldCBtb2RlbFtrZXldID0gdXBkYXRlZFtwa11cbiAqICAgZW5kXG4gKlxuICogICBvbmVUb09uZU9uVXBkYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9PbmVPblVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9wZXJ0eVZhbHVlOiBhbnkgPSBtb2RlbFtrZXldO1xuICBpZiAoIXByb3BlcnR5VmFsdWUpIHJldHVybjtcbiAgaWYgKGRhdGEuY2FzY2FkZS51cGRhdGUgIT09IENhc2NhZGUuQ0FTQ0FERSkgcmV0dXJuO1xuXG4gIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGlubmVyUmVwbyA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKFxuICAgICAgbW9kZWwsXG4gICAgICBrZXksXG4gICAgICB0aGlzLmFkYXB0ZXIuYWxpYXNcbiAgICApO1xuICAgIGNvbnN0IHJlYWQgPSBhd2FpdCBpbm5lclJlcG8ucmVhZChwcm9wZXJ0eVZhbHVlKTtcbiAgICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgcHJvcGVydHlWYWx1ZSwgcmVhZCk7XG4gICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IHByb3BlcnR5VmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IGNyZWF0ZU9yVXBkYXRlKFxuICAgIG1vZGVsW2tleV0gYXMgTSxcbiAgICBjb250ZXh0LFxuICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICApO1xuICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KHVwZGF0ZWQpLmlkO1xuICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXksXG4gICAgdXBkYXRlZFtwa10gYXMgc3RyaW5nLFxuICAgIHVwZGF0ZWRcbiAgKTtcbiAgbW9kZWxba2V5XSA9IHVwZGF0ZWRbcGtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGRlbGV0aW9uXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB3aGVuIGRlbGV0aW5nIGEgbW9kZWwsIGRlbGV0aW5nIHRoZSByZWxhdGVkIG1vZGVsIGlmIGNhc2NhZGUgaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb09uZU9uRGVsZXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvT25lT25EZWxldGVcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb09uZU9uRGVsZXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvT25lT25EZWxldGUtPj5vbmVUb09uZU9uRGVsZXRlOiBjaGVjayBpZiBwcm9wZXJ0eVZhbHVlIGV4aXN0c1xuICogICBvbmVUb09uZU9uRGVsZXRlLT4+b25lVG9PbmVPbkRlbGV0ZTogY2hlY2sgaWYgY2FzY2FkZS51cGRhdGUgaXMgQ0FTQ0FERVxuICpcbiAqICAgb25lVG9PbmVPbkRlbGV0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+Pm9uZVRvT25lT25EZWxldGU6IGlubmVyUmVwb1xuICpcbiAqICAgYWx0IHByb3BlcnR5VmFsdWUgaXMgbm90IGEgTW9kZWwgaW5zdGFuY2VcbiAqICAgICBvbmVUb09uZU9uRGVsZXRlLT4+aW5uZXJSZXBvOiBkZWxldGUobW9kZWxba2V5XSwgY29udGV4dClcbiAqICAgICBpbm5lclJlcG8tLT4+b25lVG9PbmVPbkRlbGV0ZTogZGVsZXRlZFxuICogICBlbHNlIHByb3BlcnR5VmFsdWUgaXMgYSBNb2RlbCBpbnN0YW5jZVxuICogICAgIG9uZVRvT25lT25EZWxldGUtPj5pbm5lclJlcG86IGRlbGV0ZShtb2RlbFtrZXldW2lubmVyUmVwby5wa10sIGNvbnRleHQpXG4gKiAgICAgaW5uZXJSZXBvLS0+Pm9uZVRvT25lT25EZWxldGU6IGRlbGV0ZWRcbiAqICAgZW5kXG4gKlxuICogICBvbmVUb09uZU9uRGVsZXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBkZWxldGVkW2lubmVyUmVwby5wa10sIGRlbGV0ZWRcbiAqICAgb25lVG9PbmVPbkRlbGV0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZTogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlKSByZXR1cm47XG4gIGlmIChkYXRhLmNhc2NhZGUudXBkYXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcbiAgY29uc3QgaW5uZXJSZXBvOiBSZXBvPE0+ID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEoXG4gICAgbW9kZWwsXG4gICAga2V5LFxuICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICApO1xuICBsZXQgZGVsZXRlZDogTTtcbiAgaWYgKCEocHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSlcbiAgICBkZWxldGVkID0gYXdhaXQgaW5uZXJSZXBvLmRlbGV0ZShtb2RlbFtrZXldIGFzIHN0cmluZywgY29udGV4dCk7XG4gIGVsc2VcbiAgICBkZWxldGVkID0gYXdhaXQgaW5uZXJSZXBvLmRlbGV0ZShcbiAgICAgIChtb2RlbFtrZXldIGFzIE0pW2lubmVyUmVwby5wayBhcyBrZXlvZiBNXSBhcyBzdHJpbmcsXG4gICAgICBjb250ZXh0XG4gICAgKTtcbiAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKFxuICAgIGNvbnRleHQsXG4gICAgbW9kZWwsXG4gICAga2V5LFxuICAgIGRlbGV0ZWRbaW5uZXJSZXBvLnBrXSBhcyBzdHJpbmcsXG4gICAgZGVsZXRlZFxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBjcmVhdGlvblxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIHdoZW4gY3JlYXRpbmcgYSBtb2RlbCwgZWl0aGVyIGJ5IHJlZmVyZW5jaW5nIGV4aXN0aW5nIG1vZGVscyBvciBjcmVhdGluZyBuZXcgb25lc1xuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb01hbnlPbkNyZWF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBvbmVUb01hbnlPbkNyZWF0ZVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBjcmVhdGVPclVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBmaW5kUHJpbWFyeUtleVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvTWFueU9uQ3JlYXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGNoZWNrIGlmIHByb3BlcnR5VmFsdWVzIGV4aXN0cyBhbmQgaGFzIGxlbmd0aFxuICogICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjaGVjayBpZiBhbGwgZWxlbWVudHMgaGF2ZSBzYW1lIHR5cGVcbiAqICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogY3JlYXRlIHVuaXF1ZVZhbHVlcyBzZXRcbiAqXG4gKiAgIGFsdCBhcnJheVR5cGUgaXMgbm90IFwib2JqZWN0XCJcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9NYW55T25DcmVhdGU6IHJlcG9cbiAqICAgICBsb29wIGZvciBlYWNoIGlkIGluIHVuaXF1ZVZhbHVlc1xuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5yZXBvOiByZWFkKGlkKVxuICogICAgICAgcmVwby0tPj5vbmVUb01hbnlPbkNyZWF0ZTogcmVhZFxuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCByZWFkXG4gKiAgICAgZW5kXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogc2V0IG1vZGVsW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXVxuICogICBlbHNlIGFycmF5VHlwZSBpcyBcIm9iamVjdFwiXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5maW5kUHJpbWFyeUtleTogcHJvcGVydHlWYWx1ZXNbMF1cbiAqICAgICBmaW5kUHJpbWFyeUtleS0tPj5vbmVUb01hbnlPbkNyZWF0ZTogcGtOYW1lXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogY3JlYXRlIHJlc3VsdCBzZXRcbiAqICAgICBsb29wIGZvciBlYWNoIG0gaW4gcHJvcGVydHlWYWx1ZXNcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+Y3JlYXRlT3JVcGRhdGU6IG0sIGNvbnRleHRcbiAqICAgICAgIGNyZWF0ZU9yVXBkYXRlLS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiByZWNvcmRcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCByZWNvcmRbcGtOYW1lXSwgcmVjb3JkXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBhZGQgcmVjb3JkW3BrTmFtZV0gdG8gcmVzdWx0XG4gKiAgICAgZW5kXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogc2V0IG1vZGVsW2tleV0gPSBbLi4ucmVzdWx0XVxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvTWFueU9uQ3JlYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9NYW55T25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZXM6IGFueSA9IG1vZGVsW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZXMgfHwgIXByb3BlcnR5VmFsdWVzLmxlbmd0aCkgcmV0dXJuO1xuICBjb25zdCBhcnJheVR5cGUgPSB0eXBlb2YgcHJvcGVydHlWYWx1ZXNbMF07XG4gIGlmICghcHJvcGVydHlWYWx1ZXMuZXZlcnkoKGl0ZW06IGFueSkgPT4gdHlwZW9mIGl0ZW0gPT09IGFycmF5VHlwZSkpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgSW52YWxpZCBvcGVyYXRpb24uIEFsbCBlbGVtZW50cyBvZiBwcm9wZXJ0eSAke2tleSBhcyBzdHJpbmd9IG11c3QgbWF0Y2ggdGhlIHNhbWUgdHlwZS5gXG4gICAgKTtcbiAgY29uc3QgdW5pcXVlVmFsdWVzID0gbmV3IFNldChbLi4ucHJvcGVydHlWYWx1ZXNdKTtcbiAgaWYgKGFycmF5VHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwga2V5LCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgdW5pcXVlVmFsdWVzKSB7XG4gICAgICBjb25zdCByZWFkID0gYXdhaXQgcmVwby5yZWFkKGlkKTtcbiAgICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBpZCwgcmVhZCk7XG4gICAgfVxuICAgIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwa05hbWUgPSBmaW5kUHJpbWFyeUtleShwcm9wZXJ0eVZhbHVlc1swXSkuaWQ7XG5cbiAgY29uc3QgcmVzdWx0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICBmb3IgKGNvbnN0IG0gb2YgcHJvcGVydHlWYWx1ZXMpIHtcbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBjcmVhdGVPclVwZGF0ZShtLCBjb250ZXh0LCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCByZWNvcmRbcGtOYW1lXSwgcmVjb3JkKTtcbiAgICByZXN1bHQuYWRkKHJlY29yZFtwa05hbWVdKTtcbiAgfVxuXG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4ucmVzdWx0XTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgdXBkYXRlc1xuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIHdoZW4gdXBkYXRpbmcgYSBtb2RlbCwgZGVsZWdhdGluZyB0byBvbmVUb01hbnlPbkNyZWF0ZSBpZiBjYXNjYWRlIHVwZGF0ZSBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueU9uVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uQ3JlYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb01hbnlPblVwZGF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb01hbnlPblVwZGF0ZS0+Pm9uZVRvTWFueU9uVXBkYXRlOiBjaGVjayBpZiBjYXNjYWRlLnVwZGF0ZSBpcyBDQVNDQURFXG4gKlxuICogICBhbHQgY2FzY2FkZS51cGRhdGUgaXMgQ0FTQ0FERVxuICogICAgIG9uZVRvTWFueU9uVXBkYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGFwcGx5KHRoaXMsIFtjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXSlcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0tPj5vbmVUb01hbnlPblVwZGF0ZTogdm9pZFxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvTWFueU9uVXBkYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9NYW55T25VcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBjYXNjYWRlIH0gPSBkYXRhO1xuICBpZiAoY2FzY2FkZS51cGRhdGUgIT09IENhc2NhZGUuQ0FTQ0FERSkgcmV0dXJuO1xuICByZXR1cm4gb25lVG9NYW55T25DcmVhdGUuYXBwbHkodGhpcyBhcyBhbnksIFtcbiAgICBjb250ZXh0LFxuICAgIGRhdGEsXG4gICAga2V5IGFzIGtleW9mIE1vZGVsLFxuICAgIG1vZGVsLFxuICBdKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgZGVsZXRpb25cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCB3aGVuIGRlbGV0aW5nIGEgbW9kZWwsIGRlbGV0aW5nIGFsbCByZWxhdGVkIG1vZGVscyBpZiBjYXNjYWRlIGRlbGV0ZSBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueU9uRGVsZXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uRGVsZXRlXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb01hbnlPbkRlbGV0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjaGVjayBpZiBjYXNjYWRlLmRlbGV0ZSBpcyBDQVNDQURFXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IGNoZWNrIGlmIHZhbHVlcyBleGlzdHMgYW5kIGhhcyBsZW5ndGhcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogY2hlY2sgaWYgYWxsIGVsZW1lbnRzIGhhdmUgc2FtZSB0eXBlXG4gKlxuICogICBhbHQgaXNJbnN0YW50aWF0ZWQgKGFycmF5VHlwZSBpcyBcIm9iamVjdFwiKVxuICogICAgIG9uZVRvTWFueU9uRGVsZXRlLT4+UmVwb3NpdG9yeTogZm9yTW9kZWwodmFsdWVzWzBdKVxuICogICAgIFJlcG9zaXRvcnktLT4+b25lVG9NYW55T25EZWxldGU6IHJlcG9cbiAqICAgZWxzZSBub3QgaW5zdGFudGlhdGVkXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIGtleVxuICogICAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+Pm9uZVRvTWFueU9uRGVsZXRlOiByZXBvXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogY3JlYXRlIHVuaXF1ZVZhbHVlcyBzZXRcbiAqXG4gKiAgIGxvb3AgZm9yIGVhY2ggaWQgaW4gdW5pcXVlVmFsdWVzXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5yZXBvOiBkZWxldGUoaWQsIGNvbnRleHQpXG4gKiAgICAgcmVwby0tPj5vbmVUb01hbnlPbkRlbGV0ZTogZGVsZXRlZFxuICogICAgIG9uZVRvTWFueU9uRGVsZXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBpZCwgZGVsZXRlZFxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IHNldCBtb2RlbFtrZXldID0gWy4uLnVuaXF1ZVZhbHVlc11cbiAqICAgb25lVG9NYW55T25EZWxldGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb01hbnlPbkRlbGV0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZGF0YS5jYXNjYWRlLmRlbGV0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG4gIGNvbnN0IHZhbHVlcyA9IG1vZGVsW2tleV0gYXMgYW55O1xuICBpZiAoIXZhbHVlcyB8fCAhdmFsdWVzLmxlbmd0aCkgcmV0dXJuO1xuICBjb25zdCBhcnJheVR5cGUgPSB0eXBlb2YgdmFsdWVzWzBdO1xuICBjb25zdCBhcmVBbGxTYW1lVHlwZSA9IHZhbHVlcy5ldmVyeSgoaXRlbTogYW55KSA9PiB0eXBlb2YgaXRlbSA9PT0gYXJyYXlUeXBlKTtcbiAgaWYgKCFhcmVBbGxTYW1lVHlwZSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBJbnZhbGlkIG9wZXJhdGlvbi4gQWxsIGVsZW1lbnRzIG9mIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gbXVzdCBtYXRjaCB0aGUgc2FtZSB0eXBlLmBcbiAgICApO1xuICBjb25zdCBpc0luc3RhbnRpYXRlZCA9IGFycmF5VHlwZSA9PT0gXCJvYmplY3RcIjtcbiAgY29uc3QgcmVwbyA9IGlzSW5zdGFudGlhdGVkXG4gICAgPyBSZXBvc2l0b3J5LmZvck1vZGVsKHZhbHVlc1swXSwgdGhpcy5hZGFwdGVyLmFsaWFzKVxuICAgIDogcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEobW9kZWwsIGtleSwgdGhpcy5hZGFwdGVyLmFsaWFzKTtcblxuICBjb25zdCB1bmlxdWVWYWx1ZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oaXNJbnN0YW50aWF0ZWRcbiAgICAgID8gdmFsdWVzLm1hcCgodjogUmVjb3JkPHN0cmluZywgYW55PikgPT4gdltyZXBvLnBrIGFzIHN0cmluZ10pXG4gICAgICA6IHZhbHVlcyksXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgaWQgb2YgdW5pcXVlVmFsdWVzLnZhbHVlcygpKSB7XG4gICAgY29uc3QgZGVsZXRlZCA9IGF3YWl0IHJlcG8uZGVsZXRlKGlkLCBjb250ZXh0KTtcbiAgICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgaWQsIGRlbGV0ZWQpO1xuICB9XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEga2V5IGZvciBjYWNoaW5nIHBvcHVsYXRlZCBtb2RlbCByZWxhdGlvbnNoaXBzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgdW5pcXVlIGtleSBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyBwb3B1bGF0ZWQgbW9kZWwgcmVsYXRpb25zaGlwcyBpbiB0aGUgY2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgb3IgbW9kZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHlcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVsYXRlZCBtb2RlbFxuICogQHJldHVybiB7c3RyaW5nfSBBIGRvdC1zZXBhcmF0ZWQgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcmVsYXRpb25zaGlwXG4gKiBAZnVuY3Rpb24gZ2V0UG9wdWxhdGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9wdWxhdGVLZXkoXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgaWQ6IHN0cmluZyB8IG51bWJlclxuKSB7XG4gIHJldHVybiBbUGVyc2lzdGVuY2VLZXlzLlBPUFVMQVRFLCB0YWJsZU5hbWUsIGZpZWxkTmFtZSwgaWRdLmpvaW4oXCIuXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDYWNoZXMgYSBtb2RlbCBmb3IgbGF0ZXIgcG9wdWxhdGlvblxuICogQHN1bW1hcnkgU3RvcmVzIGEgbW9kZWwgaW4gdGhlIGNvbnRleHQgY2FjaGUgZm9yIGVmZmljaWVudCByZXRyaWV2YWwgZHVyaW5nIHJlbGF0aW9uc2hpcCBwb3B1bGF0aW9uXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtNfSBwYXJlbnRNb2RlbCAtIFRoZSBwYXJlbnQgbW9kZWwgdGhhdCBjb250YWlucyB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBwa1ZhbHVlIC0gVGhlIHByaW1hcnkga2V5IHZhbHVlIG9mIHRoZSByZWxhdGVkIG1vZGVsXG4gKiBAcGFyYW0ge2FueX0gY2FjaGVWYWx1ZSAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjYWNoZVxuICogQHJldHVybiB7UHJvbWlzZTxhbnk+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGNhY2hlIG9wZXJhdGlvblxuICogQGZ1bmN0aW9uIGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWNoZU1vZGVsRm9yUG9wdWxhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbj4oXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIHBhcmVudE1vZGVsOiBNLFxuICBwcm9wZXJ0eUtleToga2V5b2YgTSB8IHN0cmluZyxcbiAgcGtWYWx1ZTogc3RyaW5nIHwgbnVtYmVyLFxuICBjYWNoZVZhbHVlOiBhbnlcbikge1xuICBjb25zdCBjYWNoZUtleSA9IGdldFBvcHVsYXRlS2V5KFxuICAgIHBhcmVudE1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgcHJvcGVydHlLZXkgYXMgc3RyaW5nLFxuICAgIHBrVmFsdWVcbiAgKTtcbiAgcmV0dXJuIGNvbnRleHQuYWNjdW11bGF0ZSh7IFtjYWNoZUtleV06IGNhY2hlVmFsdWUgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBvcHVsYXRlcyBhIG1vZGVsJ3MgcmVsYXRpb25zaGlwXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIGF0dGFjaGVzIHJlbGF0ZWQgbW9kZWxzIHRvIGEgbW9kZWwncyByZWxhdGlvbnNoaXAgcHJvcGVydHlcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gcG9wdWxhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgcG9wdWxhdGVcbiAqICAgcGFydGljaXBhbnQgZmV0Y2hQb3B1bGF0ZVZhbHVlc1xuICogICBwYXJ0aWNpcGFudCBnZXRQb3B1bGF0ZUtleVxuICogICBwYXJ0aWNpcGFudCBDb250ZXh0XG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKlxuICogICBDYWxsZXItPj5wb3B1bGF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBjaGVjayBpZiBkYXRhLnBvcHVsYXRlIGlzIHRydWVcbiAqICAgcG9wdWxhdGUtPj5wb3B1bGF0ZTogZ2V0IG5lc3RlZCB2YWx1ZSBhbmQgY2hlY2sgaWYgaXQgZXhpc3RzXG4gKlxuICogICBwb3B1bGF0ZS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlzQXJyID8gbmVzdGVkIDogW25lc3RlZF1cbiAqXG4gKiAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBpbml0aWFsaXplIHZhcmlhYmxlc1xuICpcbiAqICAgbG9vcCBmb3IgZWFjaCBwcm9LZXlWYWx1ZSBpbiBwcm9wS2V5VmFsdWVzXG4gKiAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PmdldFBvcHVsYXRlS2V5OiBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCBwcm9wTmFtZSwgcHJvS2V5VmFsdWVcbiAqICAgICBnZXRQb3B1bGF0ZUtleS0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBjYWNoZUtleVxuICpcbiAqICAgICBhbHQgdHJ5IHRvIGdldCBmcm9tIGNhY2hlXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+Q29udGV4dDogZ2V0KGNhY2hlS2V5KVxuICogICAgICAgQ29udGV4dC0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiB2YWxcbiAqICAgICBlbHNlIGNhdGNoIGVycm9yXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBwcm9wTmFtZVxuICogICAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogcmVwb1xuICogICAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PnJlcG86IHJlYWQocHJvS2V5VmFsdWUpXG4gKiAgICAgICByZXBvLS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IHZhbFxuICogICAgIGVuZFxuICpcbiAqICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogYWRkIHZhbCB0byByZXN1bHRzXG4gKiAgIGVuZFxuICpcbiAqICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0tPj5wb3B1bGF0ZTogcmVzdWx0c1xuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBzZXQgbW9kZWxba2V5XSA9IGlzQXJyID8gcmVzIDogcmVzWzBdXG4gKiAgIHBvcHVsYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFkYXRhLnBvcHVsYXRlKSByZXR1cm47XG4gIGNvbnN0IG5lc3RlZDogYW55ID0gbW9kZWxba2V5XTtcbiAgY29uc3QgaXNBcnIgPSBBcnJheS5pc0FycmF5KG5lc3RlZCk7XG4gIGlmICh0eXBlb2YgbmVzdGVkID09PSBcInVuZGVmaW5lZFwiIHx8IChpc0FyciAmJiBuZXN0ZWQubGVuZ3RoID09PSAwKSkgcmV0dXJuO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoUG9wdWxhdGVWYWx1ZXMoXG4gICAgYzogQ29udGV4dDxGPixcbiAgICBtb2RlbDogTSxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICAgIHByb3BLZXlWYWx1ZXM6IGFueVtdLFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICkge1xuICAgIGxldCBjYWNoZUtleTogc3RyaW5nO1xuICAgIGxldCB2YWw6IGFueTtcbiAgICBjb25zdCByZXN1bHRzOiBNW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHByb0tleVZhbHVlIG9mIHByb3BLZXlWYWx1ZXMpIHtcbiAgICAgIGNhY2hlS2V5ID0gZ2V0UG9wdWxhdGVLZXkobW9kZWwuY29uc3RydWN0b3IubmFtZSwgcHJvcE5hbWUsIHByb0tleVZhbHVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbCA9IGF3YWl0IGMuZ2V0KGNhY2hlS2V5IGFzIGFueSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBjb25zdCByZXBvID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEobW9kZWwsIHByb3BOYW1lLCBhbGlhcyk7XG4gICAgICAgIGlmICghcmVwbykgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZmluZCByZXBvXCIpO1xuICAgICAgICB2YWwgPSBhd2FpdCByZXBvLnJlYWQocHJvS2V5VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmVzdWx0cy5wdXNoKHZhbCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoUG9wdWxhdGVWYWx1ZXMoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXkgYXMgc3RyaW5nLFxuICAgIGlzQXJyID8gbmVzdGVkIDogW25lc3RlZF0sXG4gICAgdGhpcy5hZGFwdGVyLmFsaWFzXG4gICk7XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBpc0FyciA/IHJlcyA6IHJlc1swXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTGlzdCBvZiBjb21tb24gSmF2YVNjcmlwdCB0eXBlc1xuICogQHN1bW1hcnkgQW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgY29tbW9uIEphdmFTY3JpcHQgdHlwZXMgdGhhdCBhcmUgbm90IGN1c3RvbSBtb2RlbCB0eXBlc1xuICogQGNvbnN0IGNvbW1vbVR5cGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuY29uc3QgY29tbW9tVHlwZXMgPSBbXG4gIFwiYXJyYXlcIixcbiAgXCJzdHJpbmdcIixcbiAgXCJudW1iZXJcIixcbiAgXCJib29sZWFuXCIsXG4gIFwic3ltYm9sXCIsXG4gIFwiZnVuY3Rpb25cIixcbiAgXCJvYmplY3RcIixcbiAgXCJ1bmRlZmluZWRcIixcbiAgXCJudWxsXCIsXG4gIFwiYmlnaW50XCIsXG5dO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZXBvc2l0b3J5IGZvciBhIG1vZGVsIHByb3BlcnR5IGJhc2VkIG9uIGl0cyB0eXBlIG1ldGFkYXRhXG4gKiBAc3VtbWFyeSBFeGFtaW5lcyBhIG1vZGVsIHByb3BlcnR5J3MgdHlwZSBtZXRhZGF0YSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIHJlcG9zaXRvcnkgZm9yIHJlbGF0ZWQgbW9kZWxzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHthbnl9IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIGV4YW1pbmVcbiAqIEByZXR1cm4ge1JlcG88TT59IEEgcmVwb3NpdG9yeSBmb3IgdGhlIG1vZGVsIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IFJlZmxlY3RcbiAqICAgcGFydGljaXBhbnQgVmFsaWRhdGlvblxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKlxuICogICBDYWxsZXItPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIHByb3BlcnR5S2V5XG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PlZhbGlkYXRpb246IGtleShBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5S2V5XSkgPyBWYWxpZGF0aW9uS2V5cy5MSVNUIDogVmFsaWRhdGlvbktleXMuVFlQRSlcbiAqICAgVmFsaWRhdGlvbi0tPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogdmFsaWRhdGlvbktleVxuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5SZWZsZWN0OiBnZXRNZXRhZGF0YSh2YWxpZGF0aW9uS2V5LCBtb2RlbCwgcHJvcGVydHlLZXkpXG4gKiAgIFJlZmxlY3QtLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IHR5cGVzXG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBkZXRlcm1pbmUgY3VzdG9tVHlwZXMgYmFzZWQgb24gcHJvcGVydHkgdHlwZVxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBjaGVjayBpZiB0eXBlcyBhbmQgY3VzdG9tVHlwZXMgZXhpc3RcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNyZWF0ZSBhbGxvd2VkVHlwZXMgYXJyYXlcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogZmluZCBjb25zdHJ1Y3Rvck5hbWUgbm90IGluIGNvbW1vbVR5cGVzXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNoZWNrIGlmIGNvbnN0cnVjdG9yTmFtZSBleGlzdHNcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+TW9kZWw6IGdldChjb25zdHJ1Y3Rvck5hbWUpXG4gKiAgIE1vZGVsLS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBjb25zdHJ1Y3RvclxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBjaGVjayBpZiBjb25zdHJ1Y3RvciBleGlzdHNcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+UmVwb3NpdG9yeTogZm9yTW9kZWwoY29uc3RydWN0b3IpXG4gKiAgIFJlcG9zaXRvcnktLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IHJlcG9cbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+PkNhbGxlcjogcmVwb1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IGFueSxcbiAgcHJvcGVydHlLZXk6IHN0cmluZyB8IGtleW9mIE0sXG4gIGFsaWFzPzogc3RyaW5nXG4pOiBSZXBvPE0+IHtcbiAgY29uc3QgdHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgIFZhbGlkYXRpb24ua2V5KFxuICAgICAgQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eUtleV0pXG4gICAgICAgID8gVmFsaWRhdGlvbktleXMuTElTVFxuICAgICAgICA6IFZhbGlkYXRpb25LZXlzLlRZUEVcbiAgICApLFxuICAgIG1vZGVsLFxuICAgIHByb3BlcnR5S2V5IGFzIHN0cmluZ1xuICApO1xuICBjb25zdCBjdXN0b21UeXBlczogYW55ID0gQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eUtleV0pXG4gICAgPyB0eXBlcy5jbGF6elxuICAgIDogdHlwZXMuY3VzdG9tVHlwZXM7XG4gIGlmICghdHlwZXMgfHwgIWN1c3RvbVR5cGVzKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBmaW5kIHR5cGVzIGRlY29yYXRvcnMgZm9yIHByb3BlcnR5ICR7cHJvcGVydHlLZXkgYXMgc3RyaW5nfWBcbiAgICApO1xuXG4gIGNvbnN0IGFsbG93ZWRUeXBlczogc3RyaW5nW10gPSAoXG4gICAgQXJyYXkuaXNBcnJheShjdXN0b21UeXBlcykgPyBbLi4uY3VzdG9tVHlwZXNdIDogW2N1c3RvbVR5cGVzXVxuICApLm1hcCgodCkgPT4gKHR5cGVvZiB0ID09PSBcImZ1bmN0aW9uXCIgPyB0KCkgOiB0KSk7XG4gIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IGFsbG93ZWRUeXBlcy5maW5kKFxuICAgICh0KSA9PiAhY29tbW9tVHlwZXMuaW5jbHVkZXMoYCR7dH1gLnRvTG93ZXJDYXNlKCkpXG4gICk7XG4gIGlmICghY29uc3RydWN0b3JOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFByb3BlcnR5IGtleSAke3Byb3BlcnR5S2V5IGFzIHN0cmluZ30gZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGNvbnN0cnVjdG9yIHR5cGVgXG4gICAgKTtcbiAgY29uc3QgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPE0+IHwgdW5kZWZpbmVkID0gTW9kZWwuZ2V0KGNvbnN0cnVjdG9yTmFtZSk7XG4gIGlmICghY29uc3RydWN0b3IpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7Y29uc3RydWN0b3JOYW1lfWApO1xuXG4gIHJldHVybiBSZXBvc2l0b3J5LmZvck1vZGVsKGNvbnN0cnVjdG9yLCBhbGlhcyk7XG59XG5cbiIsImltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkNyZWF0ZVVwZGF0ZSxcbiAgb25EZWxldGUsXG4gIG9uVXBkYXRlLFxuICBhZnRlckFueSxcbiAgUmVwb3NpdG9yeUZsYWdzLFxuICBDb250ZXh0LFxuICB0aW1lc3RhbXAsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDYXNjYWRlTWV0YWRhdGEsIEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdENhc2NhZGUsIE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgbGlzdCxcbiAgTW9kZWwsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbiAgdHlwZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBSZXBvLCBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3F1ZXJ5L0NvbmRpdGlvblwiO1xuaW1wb3J0IHsgUmVsYXRpb25zTWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgb25lVG9NYW55T25DcmVhdGUsXG4gIG9uZVRvTWFueU9uRGVsZXRlLFxuICBvbmVUb01hbnlPblVwZGF0ZSxcbiAgb25lVG9PbmVPbkNyZWF0ZSxcbiAgb25lVG9PbmVPbkRlbGV0ZSxcbiAgb25lVG9PbmVPblVwZGF0ZSxcbiAgcG9wdWxhdGUgYXMgcG9wLFxufSBmcm9tIFwiLi9jb25zdHJ1Y3Rpb25cIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IHNldHMgdGhlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWwgY2xhc3MgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0cyAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3NcbiAqIEBmdW5jdGlvbiB0YWJsZVxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhYmxlPE9QVFMgPSBzdHJpbmc+KG9wdHM6IE9QVFMpIHtcbiAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWV0YWRhdGEsXG4gICAgICBhcmdzOiBba2V5LCBvcHRzXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIHByb3BlcnR5XG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXBzIGEgbW9kZWwgcHJvcGVydHkgdG8gYSBzcGVjaWZpYyBjb2x1bW4gbmFtZSBpbiB0aGUgZGF0YWJhc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBjb2x1bW5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2x1bW48T1BUUyA9IHN0cmluZz4oY29sdW1uTmFtZT86IE9QVFMpIHtcbiAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTik7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNvbHVtbihrLCBjKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBjb2x1bW4ob2JqOiBhbnksIGF0dHI6IGFueSkge1xuICAgICAgICAgIHJldHVybiBwcm9wTWV0YWRhdGEoaywgYyB8fCBhdHRyKShvYmosIGF0dHIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtrZXksIGNvbHVtbk5hbWVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5kZXggb24gYSBtb2RlbCBwcm9wZXJ0eSBmb3IgaW1wcm92ZWQgcXVlcnkgcGVyZm9ybWFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gYmUgaW5kZXhlZCBpbiB0aGUgZGF0YWJhc2UsIG9wdGlvbmFsbHkgd2l0aCBzcGVjaWZpYyBkaXJlY3Rpb25zIGFuZCBjb21wb3NpdGlvbnNcbiAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb25bXX0gW2RpcmVjdGlvbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2Ygc29ydCBkaXJlY3Rpb25zIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgdG8gY3JlYXRlIGEgY29tcG9zaXRlIGluZGV4XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gaW5kZXhcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleChkaXJlY3Rpb25zPzogT3JkZXJEaXJlY3Rpb25bXSwgY29tcG9zaXRpb25zPzogc3RyaW5nW10pIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YShcbiAgICBSZXBvc2l0b3J5LmtleShcbiAgICAgIGAke1BlcnNpc3RlbmNlS2V5cy5JTkRFWH0ke2NvbXBvc2l0aW9ucyAmJiBjb21wb3NpdGlvbnMubGVuZ3RoID8gYC4ke2NvbXBvc2l0aW9ucy5qb2luKFwiLlwiKX1gIDogXCJcIn1gXG4gICAgKSxcbiAgICB7XG4gICAgICBkaXJlY3Rpb25zOiBkaXJlY3Rpb25zLFxuICAgICAgY29tcG9zaXRpb25zOiBjb21wb3NpdGlvbnMsXG4gICAgfSBhcyBJbmRleE1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVuZm9yY2VzIHVuaXF1ZW5lc3MgY29uc3RyYWludCBkdXJpbmcgbW9kZWwgY3JlYXRpb24gYW5kIHVwZGF0ZVxuICogQHN1bW1hcnkgSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSB0aGUgdW5pcXVlIGRlY29yYXRvciB0byBjaGVjayBpZiBhIHByb3BlcnR5IHZhbHVlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBkYXRhYmFzZVxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgbWV0YWRhdGEgdHlwZVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIG1ldGFkYXRhIGZvciB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIGNoZWNrIGZvciB1bmlxdWVuZXNzXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2hlY2sgaXMgY29tcGxldGUgb3IgcmVqZWN0cyB3aXRoIGEgQ29uZmxpY3RFcnJvclxuICogQGZ1bmN0aW9uIHVuaXF1ZU9uQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVuaXF1ZU9uQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgb2JqZWN0LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShtb2RlbCBhcyBhbnkpW2tleV0pIHJldHVybjtcbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnNlbGVjdCgpXG4gICAgLndoZXJlKENvbmRpdGlvbi5hdHRyaWJ1dGUoa2V5KS5lcShtb2RlbFtrZXldKSlcbiAgICAuZXhlY3V0ZSgpO1xuICBpZiAoZXhpc3RpbmcubGVuZ3RoKVxuICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgYG1vZGVsIGFscmVhZHkgZXhpc3RzIHdpdGggcHJvcGVydHkgJHtrZXkgYXMgc3RyaW5nfSBlcXVhbCB0byAke0pTT04uc3RyaW5naWZ5KChtb2RlbCBhcyBhbnkpW2tleV0sIHVuZGVmaW5lZCwgMil9YFxuICAgICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRhZ3MgYSBwcm9wZXJ0eSBhcyB1bmlxdWVcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVuc3VyZXMgYSBwcm9wZXJ0eSB2YWx1ZSBpcyB1bmlxdWUgYWNyb3NzIGFsbCBpbnN0YW5jZXMgb2YgYSBtb2RlbCBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiB1bmlxdWVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEB1bmlxdWUoKVxuICogICBAcmVxdWlyZWQoKVxuICogICB1c2VybmFtZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlKCkge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVU5JUVVFKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKG9uQ3JlYXRlVXBkYXRlKHVuaXF1ZU9uQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKGtleSwge30pKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHVzZXIgaWRlbnRpZmljYXRpb24gZm9yIG93bmVyc2hpcCB0cmFja2luZ1xuICogQHN1bW1hcnkgSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSB0aGUgY3JlYXRlZEJ5IGFuZCB1cGRhdGVkQnkgZGVjb3JhdG9ycyB0byBzZXQgb3duZXJzaGlwIGluZm9ybWF0aW9uXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBtZXRhZGF0YSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzdG9yZSB0aGUgdXNlciBpZGVudGlmaWVyXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVqZWN0cyB3aXRoIGFuIEF1dGhvcml6YXRpb25FcnJvciBpZiB1c2VyIGlkZW50aWZpY2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWRcbiAqIEBmdW5jdGlvbiBjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBkYXRhOiBWLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgXCJUaGlzIGFkYXB0ZXIgZG9lcyBub3Qgc3VwcG9ydCB1c2VyIGlkZW50aWZpY2F0aW9uXCJcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHJhY2tzIHRoZSBjcmVhdG9yIG9mIGEgbW9kZWwgaW5zdGFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gc3RvcmUgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHVzZXIgd2hvIGNyZWF0ZWQgdGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIERvY3VtZW50IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQGNyZWF0ZWRCeSgpXG4gKiAgIGNyZWF0b3IhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZWRCeSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUob25DcmVhdGUoY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGUpLCBwcm9wTWV0YWRhdGEoa2V5LCB7fSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRyYWNrcyB0aGUgbGFzdCB1cGRhdGVyIG9mIGEgbW9kZWwgaW5zdGFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gc3RvcmUgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHVzZXIgd2hvIGxhc3QgdXBkYXRlZCB0aGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiB1cGRhdGVkQnlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgRG9jdW1lbnQgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAdXBkYXRlZEJ5KClcbiAqICAgbGFzdEVkaXRvciE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlZEJ5KCkge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShvbkNyZWF0ZVVwZGF0ZShjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YShrZXksIHt9KSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZWRBdCgpIHtcbiAgcmV0dXJuIHRpbWVzdGFtcChbT3BlcmF0aW9uS2V5cy5DUkVBVEVdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZWRBdCgpIHtcbiAgcmV0dXJuIHRpbWVzdGFtcCgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtb2RlbHNcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVzdGFibGlzaGVzIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgY3VycmVudCBtb2RlbCBhbmQgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gb25lVG9PbmVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEBvbmVUb09uZShQcm9maWxlKVxuICogICBwcm9maWxlITogc3RyaW5nIHwgUHJvZmlsZTtcbiAqIH1cbiAqXG4gKiBjbGFzcyBQcm9maWxlIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgYmlvITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKiBAc2VlIG9uZVRvTWFueVxuICogQHNlZSBtYW55VG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uZVRvT25lPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGU6IGJvb2xlYW4gPSB0cnVlXG4pIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkUpO1xuICAvLyBNb2RlbC5yZWdpc3RlcihjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgZnVuY3Rpb24gb25lVG9PbmVEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW5cbiAgKSB7XG4gICAgY29uc3QgbWV0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgfTtcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgdHlwZShbXG4gICAgICAgIGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICBdKSxcbiAgICAgIG9uQ3JlYXRlKG9uZVRvT25lT25DcmVhdGUsIG1ldGEpLFxuICAgICAgb25VcGRhdGUob25lVG9PbmVPblVwZGF0ZSwgbWV0YSksXG4gICAgICBvbkRlbGV0ZShvbmVUb09uZU9uRGVsZXRlLCBtZXRhKSxcbiAgICAgIGFmdGVyQW55KHBvcCwgbWV0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBvbmVUb09uZURlYyxcbiAgICAgIGFyZ3M6IFtjbGF6eiwgY2FzY2FkZU9wdGlvbnMsIHBvcHVsYXRlXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBjdXJyZW50IG1vZGVsIGFuZCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gb25lVG9NYW55XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKlxuICogICBAb25lVG9NYW55KEJvb2spXG4gKiAgIGJvb2tzITogc3RyaW5nW10gfCBCb29rW107XG4gKiB9XG4gKlxuICogY2xhc3MgQm9vayBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHRpdGxlITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKiBAc2VlIG9uZVRvT25lXG4gKiBAc2VlIG1hbnlUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lVG9NYW55PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGU6IGJvb2xlYW4gPSB0cnVlXG4pIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19NQU5ZKTtcblxuICBmdW5jdGlvbiBvbmVUb01hbnlEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW5cbiAgKSB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgIH07XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIGxpc3QoW1xuICAgICAgICBjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPixcbiAgICAgICAgU3RyaW5nLFxuICAgICAgICBOdW1iZXIsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgQmlnaW50IGlzIG5vdCBhIGNvbnN0cnVjdG9yXG4gICAgICAgIEJpZ0ludCxcbiAgICAgIF0pLFxuICAgICAgb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgYWZ0ZXJBbnkocG9wLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogb25lVG9NYW55RGVjLFxuICAgICAgYXJnczogW2NsYXp6LCBjYXNjYWRlT3B0aW9ucywgcG9wdWxhdGVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtb2RlbHNcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVzdGFibGlzaGVzIGEgbWFueS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBjdXJyZW50IG1vZGVsIGFuZCBhbm90aGVyIG1vZGVsXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSByZWxhdGVkIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcmVsYXRlZCBtb2RlbCBjbGFzc1xuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9ucz1EZWZhdWx0Q2FzY2FkZV0gLSBPcHRpb25zIGZvciBjYXNjYWRpbmcgb3BlcmF0aW9ucyAoY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BvcHVsYXRlPXRydWVdIC0gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBwb3B1bGF0ZXMgdGhlIHJlbGF0aW9uc2hpcCB3aGVuIHRoZSBtb2RlbCBpcyByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBtYW55VG9PbmVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQm9vayBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHRpdGxlITogc3RyaW5nO1xuICpcbiAqICAgQG1hbnlUb09uZShBdXRob3IpXG4gKiAgIGF1dGhvciE6IHN0cmluZyB8IEF1dGhvcjtcbiAqIH1cbiAqXG4gKiBjbGFzcyBBdXRob3IgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICBuYW1lITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKiBAc2VlIG9uZVRvTWFueVxuICogQHNlZSBvbmVUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFueVRvT25lPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGUgPSB0cnVlXG4pIHtcbiAgLy8gTW9kZWwucmVnaXN0ZXIoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pO1xuXG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX09ORSk7XG5cbiAgZnVuY3Rpb24gbWFueVRvT25lRGVjKFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgIHBvcHVsYXRlOiBib29sZWFuXG4gICkge1xuICAgIGlmICghY2xhenoubmFtZSlcbiAgICAgIGNsYXp6ID0gKGNsYXp6IGFzICgpID0+IENvbnN0cnVjdG9yPE0+KSgpIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICB0eXBlKFtcbiAgICAgICAgY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgIF0pLFxuICAgICAgLy8gb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gYWZ0ZXJBbnkocG9wLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWFueVRvT25lRGVjLFxuICAgICAgYXJnczogW2NsYXp6LCBjYXNjYWRlT3B0aW9ucywgcG9wdWxhdGVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgbWFueS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgY3VycmVudCBtb2RlbCBhbmQgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gbWFueVRvT25lXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEJvb2sgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICB0aXRsZSE6IHN0cmluZztcbiAqXG4gKiAgIEBtYW55VG9PbmUoQXV0aG9yKVxuICogICBhdXRob3IhOiBzdHJpbmcgfCBBdXRob3I7XG4gKiB9XG4gKlxuICogY2xhc3MgQXV0aG9yIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgbmFtZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICogQHNlZSBvbmVUb01hbnlcbiAqIEBzZWUgb25lVG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbnlUb01hbnk8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZSA9IHRydWVcbikge1xuICAvLyBNb2RlbC5yZWdpc3RlcihjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPik7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX01BTlkpO1xuXG4gIGZ1bmN0aW9uIG1hbnlUb01hbnlEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW5cbiAgKSB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgIH07XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIGxpc3QoW1xuICAgICAgICBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgXSksXG4gICAgICAvLyBvbkNyZWF0ZShvbmVUb01hbnlPbkNyZWF0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gb25VcGRhdGUob25lVG9NYW55T25VcGRhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uRGVsZXRlKG9uZVRvTWFueU9uRGVsZXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBhZnRlckFsbChwb3B1bGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YWRhdGEpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBtYW55VG9NYW55RGVjLFxuICAgICAgYXJnczogW2NsYXp6LCBjYXNjYWRlT3B0aW9ucywgcG9wdWxhdGVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iLCJpbXBvcnQge1xuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcCxcbiAgcHJvcE1ldGFkYXRhLFxuICByZXF1aXJlZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgRGVmYXVsdFNlcXVlbmNlT3B0aW9ucyxcbiAgU2VxdWVuY2VPcHRpb25zLFxufSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcbmltcG9ydCB7XG4gIERCS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgb25DcmVhdGUsXG4gIHJlYWRvbmx5LFxuICBSZXBvc2l0b3J5RmxhZ3MsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IGluZGV4IH0gZnJvbSBcIi4uL21vZGVsL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IHNlcXVlbmNlTmFtZUZvck1vZGVsIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBPcmRlckRpcmVjdGlvbiB9IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBhcHBseSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgcHJpbWFyeSBrZXkgY3JlYXRpb25cbiAqIEBzdW1tYXJ5IEhhbmRsZXMgdGhlIGNyZWF0aW9uIG9mIHByaW1hcnkga2V5IHZhbHVlcyBmb3IgbW9kZWxzIHVzaW5nIHNlcXVlbmNlc1xuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUeXBlIHRoYXQgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgdGhhdCBleHRlbmRzIFNlcXVlbmNlT3B0aW9uc1xuICogQHRlbXBsYXRlIEYgLSBUeXBlIHRoYXQgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVHlwZSB0aGF0IGV4dGVuZHMgQ29udGV4dDxGPlxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGV4ZWN1dGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgc2VxdWVuY2Ugb3B0aW9uc1xuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2V0IGFzIHByaW1hcnkga2V5XG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwcmltYXJ5IGtleSBpcyBzZXRcbiAqIEBmdW5jdGlvbiBwa09uQ3JlYXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBwa09uQ3JlYXRlXG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgU2VxdWVuY2VcbiAqXG4gKiAgIE1vZGVsLT4+cGtPbkNyZWF0ZTogQ2FsbCB3aXRoIG1vZGVsIGluc3RhbmNlXG4gKiAgIE5vdGUgb3ZlciBwa09uQ3JlYXRlOiBDaGVjayBpZiBrZXkgYWxyZWFkeSBleGlzdHNcbiAqICAgYWx0IEtleSBleGlzdHMgb3Igbm8gdHlwZSBzcGVjaWZpZWRcbiAqICAgICBwa09uQ3JlYXRlLS0+Pk1vZGVsOiBSZXR1cm4gZWFybHlcbiAqICAgZWxzZSBLZXkgbmVlZHMgdG8gYmUgY3JlYXRlZFxuICogICAgIHBrT25DcmVhdGUtPj5wa09uQ3JlYXRlOiBHZW5lcmF0ZSBzZXF1ZW5jZSBuYW1lIGlmIG5vdCBwcm92aWRlZFxuICogICAgIHBrT25DcmVhdGUtPj5BZGFwdGVyOiBSZXF1ZXN0IFNlcXVlbmNlKGRhdGEpXG4gKiAgICAgQWRhcHRlci0+PlNlcXVlbmNlOiBDcmVhdGUgc2VxdWVuY2VcbiAqICAgICBTZXF1ZW5jZS0tPj5wa09uQ3JlYXRlOiBSZXR1cm4gc2VxdWVuY2VcbiAqICAgICBwa09uQ3JlYXRlLT4+U2VxdWVuY2U6IENhbGwgbmV4dCgpXG4gKiAgICAgU2VxdWVuY2UtLT4+cGtPbkNyZWF0ZTogUmV0dXJuIG5leHQgdmFsdWVcbiAqICAgICBwa09uQ3JlYXRlLT4+TW9kZWw6IFNldCBwcmltYXJ5IGtleSB2YWx1ZVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBrT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBTZXF1ZW5jZU9wdGlvbnMsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZGF0YS50eXBlIHx8ICFkYXRhLmdlbmVyYXRlZCB8fCBtb2RlbFtrZXldKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2V0UHJpbWFyeUtleVZhbHVlID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFyZ2V0OiBNLFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludFxuICApIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICB9KTtcbiAgfTtcblxuICBpZiAoIWRhdGEubmFtZSkgZGF0YS5uYW1lID0gc2VxdWVuY2VOYW1lRm9yTW9kZWwobW9kZWwsIFwicGtcIik7XG4gIGxldCBzZXF1ZW5jZTogU2VxdWVuY2U7XG4gIHRyeSB7XG4gICAgc2VxdWVuY2UgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuU2VxdWVuY2UoZGF0YSk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBpbnN0YW50aWF0ZSBTZXF1ZW5jZSAke2RhdGEubmFtZX06ICR7ZX1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IG5leHQgPSBhd2FpdCBzZXF1ZW5jZS5uZXh0KCk7XG4gIHNldFByaW1hcnlLZXlWYWx1ZShtb2RlbCwga2V5IGFzIHN0cmluZywgbmV4dCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByaW1hcnkgS2V5IERlY29yYXRvclxuICogQHN1bW1hcnkgTWFya3MgYSBwcm9wZXJ0eSBhcyB0aGUgbW9kZWwncyBwcmltYXJ5IGtleSB3aXRoIGF1dG9tYXRpYyBzZXF1ZW5jZSBnZW5lcmF0aW9uXG4gKiBUaGlzIGRlY29yYXRvciBjb21iaW5lcyBtdWx0aXBsZSBiZWhhdmlvcnM6IGl0IG1hcmtzIHRoZSBwcm9wZXJ0eSBhcyB1bmlxdWUsIHJlcXVpcmVkLFxuICogYW5kIGVuc3VyZXMgdGhlIGluZGV4IGlzIGNyZWF0ZWQgcHJvcGVybHkgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBzZXF1ZW5jZSBvcHRpb25zLlxuICogQHBhcmFtIHtPbWl0PFNlcXVlbmNlT3B0aW9ucywgXCJjeWNsZVwiIHwgXCJzdGFydFdpdGhcIiB8IFwiaW5jcmVtZW50QnlcIj59IG9wdHMgLSBPcHRpb25zIGZvciB0aGUgc2VxdWVuY2UgZ2VuZXJhdGlvblxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gbW9kZWwgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIHBrXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcGsoKVxuICogICBpZCE6IHN0cmluZztcbiAqXG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHVzZXJuYW1lITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwayhcbiAgb3B0czogT21pdDxcbiAgICBTZXF1ZW5jZU9wdGlvbnMsXG4gICAgXCJjeWNsZVwiIHwgXCJzdGFydFdpdGhcIiB8IFwiaW5jcmVtZW50QnlcIlxuICA+ID0gRGVmYXVsdFNlcXVlbmNlT3B0aW9uc1xuKSB7XG4gIG9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0U2VxdWVuY2VPcHRpb25zLCBvcHRzLCB7XG4gICAgZ2VuZXJhdGVkOlxuICAgICAgb3B0cy50eXBlICYmIHR5cGVvZiBvcHRzLmdlbmVyYXRlZCA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IHRydWVcbiAgICAgICAgOiBvcHRzLmdlbmVyYXRlZCB8fCBEZWZhdWx0U2VxdWVuY2VPcHRpb25zLmdlbmVyYXRlZCxcbiAgfSkgYXMgU2VxdWVuY2VPcHRpb25zO1xuXG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KERCS2V5cy5JRCk7XG4gIGZ1bmN0aW9uIHBrRGVjKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge1xuICAgIHJldHVybiBmdW5jdGlvbiBwa0RlYyhvYmo6IGFueSwgYXR0cjogYW55KSB7XG4gICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgIGluZGV4KFtPcmRlckRpcmVjdGlvbi5BU0MsIE9yZGVyRGlyZWN0aW9uLkRTQ10pLFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICByZWFkb25seSgpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoa2V5LCBvcHRpb25zKSxcbiAgICAgICAgb25DcmVhdGUocGtPbkNyZWF0ZSwgb3B0aW9ucyksXG4gICAgICAgIHByb3BNZXRhZGF0YShEQktleXMuSUQsIGF0dHIpXG4gICAgICApKG9iaiwgYXR0cik7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBwa0RlYyxcbiAgICAgIGFyZ3M6IFtvcHRzXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiaW1wb3J0IHsgREJPcGVyYXRpb25zLCB0aW1lc3RhbXAgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsQXJnLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNyZWF0ZWRBdCwgdXBkYXRlZEF0IH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIG1vZGVsIGNsYXNzIGZvciBhbGwgZG9tYWluIG1vZGVsc1xuICogQHN1bW1hcnkgQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIE1vZGVsIGNsYXNzIGZyb20gZGVjb3JhdG9yLXZhbGlkYXRpb24gYW5kIGFkZHMgdGltZXN0YW1wIGZ1bmN0aW9uYWxpdHkuXG4gKiBBbGwgZG9tYWluIG1vZGVscyBpbiB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGV4dGVuZCB0aGlzIGNsYXNzIHRvIGluaGVyaXQgY29tbW9uIHByb3BlcnRpZXMgYW5kIGJlaGF2aW9ycy5cbiAqIEBwYXJhbSB7TW9kZWxBcmc8QmFzZU1vZGVsPn0gYXJnIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gZGF0YSBmb3IgdGhlIG1vZGVsXG4gKiBAY2xhc3MgQmFzZU1vZGVsXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHVzZXJuYW1lITogc3RyaW5nO1xuICogICBcbiAqICAgQGVtYWlsKClcbiAqICAgZW1haWwhOiBzdHJpbmc7XG4gKiAgIFxuICogICBjb25zdHJ1Y3RvcihkYXRhPzogTW9kZWxBcmc8VXNlcj4pIHtcbiAqICAgICBzdXBlcihkYXRhKTtcbiAqICAgfVxuICogfVxuICogXG4gKiBjb25zdCB1c2VyID0gbmV3IFVzZXIoeyB1c2VybmFtZTogJ2pvaG4nLCBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRpb24gdGltZXN0YW1wIGZvciB0aGUgbW9kZWxcbiAgICogQHN1bW1hcnkgQXV0b21hdGljYWxseSBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBtb2RlbCBpcyBjcmVhdGVkXG4gICAqL1xuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZE9uITogRGF0ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExhc3QgdXBkYXRlIHRpbWVzdGFtcCBmb3IgdGhlIG1vZGVsXG4gICAqIEBzdW1tYXJ5IEF1dG9tYXRpY2FsbHkgdXBkYXRlZCB0byB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIHdoZW5ldmVyIHRoZSBtb2RlbCBpcyBtb2RpZmllZFxuICAgKi9cbiAgQHVwZGF0ZWRBdCgpXG4gIHVwZGF0ZWRPbiE6IERhdGU7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPEJhc2VNb2RlbD4pIHtcbiAgICBzdXBlcihhcmcpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQYWdpbmdFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBhZ2luYXRpb24gZm9yIGRhdGFiYXNlIHF1ZXJpZXNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIG5hdmlnYXRpbmcgdGhyb3VnaCBwYWdpbmF0ZWQgcXVlcnkgcmVzdWx0c1xuICogXG4gKiBUaGlzIGFic3RyYWN0IGNsYXNzIG1hbmFnZXMgdGhlIHN0YXRlIGFuZCBuYXZpZ2F0aW9uIG9mIHBhZ2luYXRlZCBkYXRhYmFzZSBxdWVyeSByZXN1bHRzLlxuICogSXQgdHJhY2tzIHRoZSBjdXJyZW50IHBhZ2UsIHRvdGFsIHBhZ2VzLCBhbmQgcmVjb3JkIGNvdW50LCBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3JcbiAqIG1vdmluZyBiZXR3ZWVuIHBhZ2VzLlxuICogXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgcGFnaW5hdG9yIG9wZXJhdGVzIG9uXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcGFnaW5hdGVkIHF1ZXJ5IChkZWZhdWx0cyB0byBNW10pXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlIChkZWZhdWx0cyB0byBhbnkpXG4gKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBRLCBhbnksIGFueT59IGFkYXB0ZXIgLSBUaGUgZGF0YWJhc2UgYWRhcHRlciB0byB1c2UgZm9yIGV4ZWN1dGluZyBxdWVyaWVzXG4gKiBAcGFyYW0ge1F9IHF1ZXJ5IC0gVGhlIHF1ZXJ5IHRvIHBhZ2luYXRlXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgcmVjb3JkcyBwZXIgcGFnZVxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBtb2RlbCB0eXBlXG4gKiBAY2xhc3MgUGFnaW5hdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgcGFnaW5hdG9yIGZvciBhIHVzZXIgcXVlcnlcbiAqIGNvbnN0IHVzZXJRdWVyeSA9IGRiLnNlbGVjdCgpLmZyb20oVXNlcik7XG4gKiBjb25zdCBwYWdpbmF0b3IgPSBhd2FpdCB1c2VyUXVlcnkucGFnaW5hdGUoMTApOyAvLyAxMCB1c2VycyBwZXIgcGFnZVxuICogXG4gKiAvLyBHZXQgdGhlIGZpcnN0IHBhZ2Ugb2YgcmVzdWx0c1xuICogY29uc3QgZmlyc3RQYWdlID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UoMSk7XG4gKiBcbiAqIC8vIE5hdmlnYXRlIHRvIHRoZSBuZXh0IHBhZ2VcbiAqIGNvbnN0IHNlY29uZFBhZ2UgPSBhd2FpdCBwYWdpbmF0b3IubmV4dCgpO1xuICogXG4gKiAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhZ2luYXRpb25cbiAqIGNvbnNvbGUubG9nKGBQYWdlICR7cGFnaW5hdG9yLmN1cnJlbnR9IG9mICR7cGFnaW5hdG9yLnRvdGFsfSwgJHtwYWdpbmF0b3IuY291bnR9IHRvdGFsIHJlY29yZHNgKTtcbiAqIFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUGFnaW5hdG9yXG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgRGF0YWJhc2VcbiAqICAgXG4gKiAgIENsaWVudC0+PlBhZ2luYXRvcjogbmV3IFBhZ2luYXRvcihhZGFwdGVyLCBxdWVyeSwgc2l6ZSwgY2xhenopXG4gKiAgIENsaWVudC0+PlBhZ2luYXRvcjogcGFnZSgxKVxuICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IHZhbGlkYXRlUGFnZSgxKVxuICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IHByZXBhcmUocXVlcnkpXG4gKiAgIFBhZ2luYXRvci0+PkFkYXB0ZXI6IGV4ZWN1dGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uXG4gKiAgIEFkYXB0ZXItPj5EYXRhYmFzZTogZXhlY3V0ZSBxdWVyeVxuICogICBEYXRhYmFzZS0tPj5BZGFwdGVyOiByZXR1cm4gcmVzdWx0c1xuICogICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogcmV0dXJuIHJlc3VsdHNcbiAqICAgUGFnaW5hdG9yLS0+PkNsaWVudDogcmV0dXJuIHBhZ2UgcmVzdWx0c1xuICogICBcbiAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBuZXh0KClcbiAqICAgUGFnaW5hdG9yLT4+UGFnaW5hdG9yOiBwYWdlKGN1cnJlbnQgKyAxKVxuICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IHZhbGlkYXRlUGFnZShjdXJyZW50ICsgMSlcbiAqICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogZXhlY3V0ZSBxdWVyeSB3aXRoIHBhZ2luYXRpb25cbiAqICAgQWRhcHRlci0+PkRhdGFiYXNlOiBleGVjdXRlIHF1ZXJ5XG4gKiAgIERhdGFiYXNlLS0+PkFkYXB0ZXI6IHJldHVybiByZXN1bHRzXG4gKiAgIEFkYXB0ZXItLT4+UGFnaW5hdG9yOiByZXR1cm4gcmVzdWx0c1xuICogICBQYWdpbmF0b3ItLT4+Q2xpZW50OiByZXR1cm4gcGFnZSByZXN1bHRzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsLCBSID0gTVtdLCBRID0gYW55PiB7XG4gIHByb3RlY3RlZCBfY3VycmVudFBhZ2UhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBfdG90YWxQYWdlcyE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9yZWNvcmRDb3VudCE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGxpbWl0ITogbnVtYmVyO1xuXG4gIHByaXZhdGUgX3N0YXRlbWVudD86IFE7XG5cbiAgZ2V0IGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRQYWdlO1xuICB9XG5cbiAgZ2V0IHRvdGFsKCkge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFBhZ2VzO1xuICB9XG5cbiAgZ2V0IGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZENvdW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBzdGF0ZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLl9zdGF0ZW1lbnQpIHRoaXMuX3N0YXRlbWVudCA9IHRoaXMucHJlcGFyZSh0aGlzLnF1ZXJ5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVtZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBhZGFwdGVyOiBBZGFwdGVyPGFueSwgUSwgYW55LCBhbnk+LFxuICAgIHByb3RlY3RlZCByZWFkb25seSBxdWVyeTogUSxcbiAgICByZWFkb25seSBzaXplOiBudW1iZXIsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApIHt9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHByZXBhcmUocmF3U3RhdGVtZW50OiBRKTogUTtcblxuICBhc3luYyBuZXh0KCkge1xuICAgIHJldHVybiB0aGlzLnBhZ2UodGhpcy5jdXJyZW50ICsgMSk7XG4gIH1cblxuICBhc3luYyBwcmV2aW91cygpIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlKHRoaXMuY3VycmVudCAtIDEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZhbGlkYXRlUGFnZShwYWdlOiBudW1iZXIpIHtcbiAgICBpZiAocGFnZSA8IDEgfHwgIU51bWJlci5pc0ludGVnZXIocGFnZSkpXG4gICAgICB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXG4gICAgICAgIFwiUGFnZSBudW1iZXIgY2Fubm90IGJlIHVuZGVyIDEgYW5kIG11c3QgYmUgYW4gaW50ZWdlclwiXG4gICAgICApO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdG90YWxQYWdlcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwYWdlID4gdGhpcy5fdG90YWxQYWdlcylcbiAgICAgIHRocm93IG5ldyBQYWdpbmdFcnJvcihcbiAgICAgICAgYE9ubHkgJHt0aGlzLl90b3RhbFBhZ2VzfSBhcmUgYXZhaWxhYmxlLiBDYW5ub3QgZ28gdG8gcGFnZSAke3BhZ2V9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcGFnZTtcbiAgfVxuXG4gIGFic3RyYWN0IHBhZ2UocGFnZT86IG51bWJlcik6IFByb21pc2U8UltdPjtcbn1cbiIsImltcG9ydCB7IHR5cGUgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRvciwgUmF3RXhlY3V0b3IgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHR5cGUge1xuICBGcm9tU2VsZWN0b3IsXG4gIEdyb3VwQnlTZWxlY3RvcixcbiAgT3JkZXJCeVNlbGVjdG9yLFxuICBTZWxlY3RTZWxlY3Rvcixcbn0gZnJvbSBcIi4vc2VsZWN0b3JzXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi9Db25kaXRpb25cIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5LCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi91dGlscy9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvdW50T3B0aW9uLFxuICBEaXN0aW5jdE9wdGlvbixcbiAgTGltaXRPcHRpb24sXG4gIE1heE9wdGlvbixcbiAgTWluT3B0aW9uLFxuICBPZmZzZXRPcHRpb24sXG4gIE9yZGVyQW5kR3JvdXBPcHRpb24sXG4gIFNlbGVjdE9wdGlvbixcbiAgV2hlcmVPcHRpb24sXG59IGZyb20gXCIuL29wdGlvbnNcIjtcbmltcG9ydCB7IFBhZ2luYXRhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvUGFnaW5hdGFibGVcIjtcbmltcG9ydCB7IFBhZ2luYXRvciB9IGZyb20gXCIuL1BhZ2luYXRvclwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgY2xhc3MgZm9yIGRhdGFiYXNlIHF1ZXJ5IHN0YXRlbWVudHNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgZm91bmRhdGlvbiBmb3IgYnVpbGRpbmcgYW5kIGV4ZWN1dGluZyBkYXRhYmFzZSBxdWVyaWVzXG4gKlxuICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBxdWVyeSBidWlsZGVyIHBhdHRlcm4gZm9yIGNvbnN0cnVjdGluZ1xuICogZGF0YWJhc2UgcXVlcmllcy4gSXQgc3VwcG9ydHMgdmFyaW91cyBxdWVyeSBvcGVyYXRpb25zIGxpa2Ugc2VsZWN0LCBmcm9tLFxuICogd2hlcmUsIG9yZGVyQnksIGdyb3VwQnksIGxpbWl0LCBhbmQgb2Zmc2V0LiBJdCBhbHNvIHByb3ZpZGVzIG1ldGhvZHMgZm9yXG4gKiBleGVjdXRpbmcgcXVlcmllcyBhbmQgaGFuZGxpbmcgcGFnaW5hdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlIHNwZWNpZmljIHRvIHRoZSBkYXRhYmFzZSBhZGFwdGVyXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgc3RhdGVtZW50IG9wZXJhdGVzIG9uXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcXVlcnlcbiAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIFEsIGFueSwgYW55Pn0gYWRhcHRlciAtIFRoZSBkYXRhYmFzZSBhZGFwdGVyIHRvIHVzZSBmb3IgZXhlY3V0aW5nIHF1ZXJpZXNcbiAqIEBjbGFzcyBTdGF0ZW1lbnRcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBzdGF0ZW1lbnQgdG8gcXVlcnkgdXNlcnNcbiAqIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBTUUxTdGF0ZW1lbnQoYWRhcHRlcik7XG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuc2VsZWN0KClcbiAqICAgLmZyb20oVXNlcilcbiAqICAgLndoZXJlKENvbmRpdGlvbi5hdHRyaWJ1dGUoXCJzdGF0dXNcIikuZXEoXCJhY3RpdmVcIikpXG4gKiAgIC5vcmRlckJ5KFtcImNyZWF0ZWRBdFwiLCBcIkRFU0NcIl0pXG4gKiAgIC5saW1pdCgxMClcbiAqICAgLmV4ZWN1dGUoKTtcbiAqXG4gKiAvLyBVc2UgcGFnaW5hdGlvblxuICogY29uc3QgcGFnaW5hdG9yID0gYXdhaXQgc3RhdGVtZW50XG4gKiAgIC5zZWxlY3QoKVxuICogICAuZnJvbShVc2VyKVxuICogICAucGFnaW5hdGUoMjApOyAvLyAyMCB1c2VycyBwZXIgcGFnZVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IERhdGFiYXNlXG4gKlxuICogICBDbGllbnQtPj5TdGF0ZW1lbnQ6IHNlbGVjdCgpXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogZnJvbShNb2RlbClcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiB3aGVyZShjb25kaXRpb24pXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogb3JkZXJCeShbZmllbGQsIGRpcmVjdGlvbl0pXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogbGltaXQodmFsdWUpXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogZXhlY3V0ZSgpXG4gKiAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogYnVpbGQoKVxuICogICBTdGF0ZW1lbnQtPj5BZGFwdGVyOiByYXcocXVlcnkpXG4gKiAgIEFkYXB0ZXItPj5EYXRhYmFzZTogZXhlY3V0ZSBxdWVyeVxuICogICBEYXRhYmFzZS0tPj5BZGFwdGVyOiByZXR1cm4gcmVzdWx0c1xuICogICBBZGFwdGVyLS0+PlN0YXRlbWVudDogcmV0dXJuIHByb2Nlc3NlZCByZXN1bHRzXG4gKiAgIFN0YXRlbWVudC0tPj5DbGllbnQ6IHJldHVybiBmaW5hbCByZXN1bHRzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdGF0ZW1lbnQ8USwgTSBleHRlbmRzIE1vZGVsLCBSPlxuICBpbXBsZW1lbnRzIEV4ZWN1dG9yPFI+LCBSYXdFeGVjdXRvcjxRPiwgUGFnaW5hdGFibGU8TSwgUiwgUT5cbntcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdFNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3I8TT5bXTtcbiAgcHJvdGVjdGVkIGRpc3RpbmN0U2VsZWN0b3I/OiBTZWxlY3RTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIG1heFNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3I8TT47XG4gIHByb3RlY3RlZCBtaW5TZWxlY3Rvcj86IFNlbGVjdFNlbGVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgY291bnRTZWxlY3Rvcj86IFNlbGVjdFNlbGVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgZnJvbVNlbGVjdG9yITogQ29uc3RydWN0b3I8TT47XG4gIHByb3RlY3RlZCB3aGVyZUNvbmRpdGlvbj86IENvbmRpdGlvbjxNPjtcbiAgcHJvdGVjdGVkIG9yZGVyQnlTZWxlY3Rvcj86IE9yZGVyQnlTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIGdyb3VwQnlTZWxlY3Rvcj86IEdyb3VwQnlTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIGxpbWl0U2VsZWN0b3I/OiBudW1iZXI7XG4gIHByb3RlY3RlZCBvZmZzZXRTZWxlY3Rvcj86IG51bWJlcjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIGFkYXB0ZXI6IEFkYXB0ZXI8YW55LCBRLCBhbnksIGFueT4pIHt9XG5cbiAgcHJvdGVjdGVkIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gKHRoaXMuYWRhcHRlciBhcyBhbnkpLmxvZy5mb3IoU3RhdGVtZW50KTtcbiAgfVxuXG4gIHNlbGVjdDxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgUyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10sXG4gID4oKTogU2VsZWN0T3B0aW9uPE0sIE1bXT47XG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I6IHJlYWRvbmx5IFsuLi5TXVxuICApOiBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuXG4gIEBmaW5hbCgpXG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I/OiByZWFkb25seSBbLi4uU11cbiAgKTogU2VsZWN0T3B0aW9uPE0sIE1bXT4gfCBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJzZWxlY3RTZWxlY3RvclwiLCB7XG4gICAgICB2YWx1ZTogc2VsZWN0b3IsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMgYXMgU2VsZWN0T3B0aW9uPE0sIE1bXT4gfCBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgZGlzdGluY3Q8UyBleHRlbmRzIFNlbGVjdFNlbGVjdG9yPE0+PihcbiAgICBzZWxlY3RvcjogU1xuICApOiBEaXN0aW5jdE9wdGlvbjxNLCBNW1NdW10+IHtcbiAgICB0aGlzLmRpc3RpbmN0U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcyBhcyBEaXN0aW5jdE9wdGlvbjxNLCBNW1NdW10+O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgbWF4PFMgZXh0ZW5kcyBTZWxlY3RTZWxlY3RvcjxNPj4oc2VsZWN0b3I6IFMpOiBNYXhPcHRpb248TSwgTVtTXT4ge1xuICAgIHRoaXMubWF4U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcyBhcyBNYXhPcHRpb248TSwgTVtTXT47XG4gIH1cblxuICBAZmluYWwoKVxuICBtaW48UyBleHRlbmRzIFNlbGVjdFNlbGVjdG9yPE0+PihzZWxlY3RvcjogUyk6IE1pbk9wdGlvbjxNLCBNW1NdPiB7XG4gICAgdGhpcy5taW5TZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHJldHVybiB0aGlzIGFzIE1pbk9wdGlvbjxNLCBNW1NdPjtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIGNvdW50PFMgZXh0ZW5kcyBTZWxlY3RTZWxlY3RvcjxNPj4oc2VsZWN0b3I/OiBTKTogQ291bnRPcHRpb248TSwgbnVtYmVyPiB7XG4gICAgdGhpcy5jb3VudFNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgcmV0dXJuIHRoaXMgYXMgQ291bnRPcHRpb248TSwgbnVtYmVyPjtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBmcm9tKHNlbGVjdG9yOiBGcm9tU2VsZWN0b3I8TT4pOiBXaGVyZU9wdGlvbjxNLCBSPiB7XG4gICAgdGhpcy5mcm9tU2VsZWN0b3IgPSAoXG4gICAgICB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgPyBNb2RlbC5nZXQoc2VsZWN0b3IpIDogc2VsZWN0b3JcbiAgICApIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihgQ291bGQgbm90IGZpbmQgc2VsZWN0b3IgbW9kZWw6ICR7c2VsZWN0b3J9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBAZmluYWwoKVxuICBwdWJsaWMgd2hlcmUoY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBPcmRlckFuZEdyb3VwT3B0aW9uPE0sIFI+IHtcbiAgICB0aGlzLndoZXJlQ29uZGl0aW9uID0gY29uZGl0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHVibGljIG9yZGVyQnkoXG4gICAgc2VsZWN0b3I6IE9yZGVyQnlTZWxlY3RvcjxNPlxuICApOiBMaW1pdE9wdGlvbjxNLCBSPiAmIE9mZnNldE9wdGlvbjxSPiB7XG4gICAgdGhpcy5vcmRlckJ5U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBncm91cEJ5KHNlbGVjdG9yOiBHcm91cEJ5U2VsZWN0b3I8TT4pOiBMaW1pdE9wdGlvbjxNLCBSPiB7XG4gICAgdGhpcy5ncm91cEJ5U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBsaW1pdCh2YWx1ZTogbnVtYmVyKTogT2Zmc2V0T3B0aW9uPFI+IHtcbiAgICB0aGlzLmxpbWl0U2VsZWN0b3IgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBvZmZzZXQodmFsdWU6IG51bWJlcik6IEV4ZWN1dG9yPFI+IHtcbiAgICB0aGlzLm9mZnNldFNlbGVjdG9yID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBAZmluYWwoKVxuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8Uj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeTogUSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5yYXcocXVlcnkpKSBhcyBSO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogUSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3PFI+KHJhd0lucHV0KTtcbiAgICBpZiAoIXRoaXMuc2VsZWN0U2VsZWN0b3IpIHJldHVybiByZXN1bHRzO1xuICAgIGNvbnN0IHBrQXR0ciA9IGZpbmRQcmltYXJ5S2V5KFxuICAgICAgbmV3ICh0aGlzLmZyb21TZWxlY3RvciBhcyBDb25zdHJ1Y3RvcjxNPikoKVxuICAgICkuaWQ7XG5cbiAgICBjb25zdCBwcm9jZXNzb3IgPSBmdW5jdGlvbiByZWNvcmRQcm9jZXNzb3IoXG4gICAgICB0aGlzOiBTdGF0ZW1lbnQ8USwgTSwgUj4sXG4gICAgICByOiBhbnlcbiAgICApIHtcbiAgICAgIGNvbnN0IGlkID0gcltwa0F0dHJdO1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQoXG4gICAgICAgIHIsXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yIGFzIENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgIHBrQXR0cixcbiAgICAgICAgaWRcbiAgICAgICkgYXMgYW55O1xuICAgIH0uYmluZCh0aGlzIGFzIGFueSk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRzKSkgcmV0dXJuIHJlc3VsdHMubWFwKHByb2Nlc3NvcikgYXMgUjtcbiAgICByZXR1cm4gcHJvY2Vzc29yKHJlc3VsdHMpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnVpbGQoKTogUTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LCAuLi5hcmdzOiBhbnlbXSk6IFE7XG4gIGFic3RyYWN0IHBhZ2luYXRlKHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFE+Pjtcbn1cbiIsIi8qKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAZGVzY3JpcHRpb24gQ29yZSBtb2R1bGUgZm9yIHRoZSBEZWNhZiBUeXBlU2NyaXB0IGZyYW1ld29ya1xuICogQHN1bW1hcnkgVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGZvdW5kYXRpb25hbCBjb21wb25lbnRzIG9mIHRoZSBEZWNhZiBmcmFtZXdvcmssIGluY2x1ZGluZyBpZGVudGl0eSBtYW5hZ2VtZW50LCBcbiAqIG1vZGVsIGRlZmluaXRpb25zLCByZXBvc2l0b3J5IHBhdHRlcm5zLCBwZXJzaXN0ZW5jZSBsYXllciwgcXVlcnkgYnVpbGRpbmcsIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucy5cbiAqIEl0IGV4cG9ydHMgZnVuY3Rpb25hbGl0eSBmcm9tIHZhcmlvdXMgc3VibW9kdWxlcyBhbmQgc2V0cyB1cCB0aGUgaW5qZWN0YWJsZSByZWdpc3RyeSBmb3IgcmVwb3NpdG9yeSBkZWNvcmF0b3JzLlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGVzUmVnaXN0cnkgfSBmcm9tIFwiLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5cbi8vIG92ZXJyaWRlcyB0aGUgcHJldmlvdXMgSW5qZWN0YWJsZXMgcmVnaXN0cnkgdG8gZW5hYmxlIHRoZSBAcmVwb3NpdG9yeSBkZWNvcmF0b3JcbkluamVjdGFibGVzLnNldFJlZ2lzdHJ5KG5ldyBJbmplY3RhYmxlc1JlZ2lzdHJ5KCkpO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9pZGVudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3F1ZXJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuLy9sZWZ0IHRvIGxhc3Qgb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvblxuICogQHN1bW1hcnkgQSBjb25zdGFudCByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIGNvcmUgcGFja2FnZVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJPcmRlckRpcmVjdGlvbiIsIkNhc2NhZGUiLCJQZXJzaXN0ZW5jZUtleXMiLCJCYXNlRXJyb3IiLCJMb2dnaW5nIiwiSW50ZXJuYWxFcnJvciIsIk9wZXJhdGlvbktleXMiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJEZWNvcmF0aW9uIiwiTW9kZWwiLCJEZWZhdWx0Rmxhdm91ciIsIkNvbnRleHQiLCJEZWZhdWx0UmVwb3NpdG9yeUZsYWdzIiwibW9kZWxUb1RyYW5zaWVudCIsIkRCS2V5cyIsIl9fZGVjb3JhdGUiLCJhcHBseSIsIm1ldGFkYXRhIiwiUmVwIiwid3JhcE1ldGhvZFdpdGhDb250ZXh0IiwiZW5mb3JjZURCRGVjb3JhdG9ycyIsIlZhbGlkYXRpb25FcnJvciIsIkRlZmF1bHRTZXBhcmF0b3IiLCJmaW5kUHJpbWFyeUtleSIsIlJlZmxlY3Rpb24iLCJpbmplY3QiLCJNb2RlbEtleXMiLCJpbmplY3RhYmxlIiwic2YiLCJJbmplY3RhYmxlUmVnaXN0cnlJbXAiLCJJbmplY3RhYmxlcyIsIk9wZXJhdG9yIiwiR3JvdXBPcGVyYXRvciIsInJlcXVpcmVkIiwiTm90Rm91bmRFcnJvciIsIlZhbGlkYXRpb24iLCJWYWxpZGF0aW9uS2V5cyIsInByb3BNZXRhZGF0YSIsIkNvbmZsaWN0RXJyb3IiLCJvbkNyZWF0ZVVwZGF0ZSIsIm9uQ3JlYXRlIiwidGltZXN0YW1wIiwicG9wdWxhdGUiLCJwcm9wIiwidHlwZSIsIm9uVXBkYXRlIiwib25EZWxldGUiLCJhZnRlckFueSIsInBvcCIsImxpc3QiLCJyZWFkb25seSIsIl9fbWV0YWRhdGEiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUVBOzs7Ozs7SUFNRztBQUNTQTtJQUFaLENBQUEsVUFBWSxjQUFjLEVBQUE7O0lBRXhCLElBQUEsY0FBQSxDQUFBLEtBQUEsQ0FBQSxHQUFBLEtBQVc7O0lBR1gsSUFBQSxjQUFBLENBQUEsS0FBQSxDQUFBLEdBQUEsTUFBWTtJQUNkLENBQUMsRUFOV0Esc0JBQWMsS0FBZEEsc0JBQWMsR0FNekIs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
|