@decaf-ts/decorator-validation 1.7.20 → 1.7.21
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/decorator-validation.cjs +62 -55
- package/dist/decorator-validation.esm.cjs +62 -55
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/model/decorators.js +1 -8
- package/lib/esm/utils/dates.d.ts +6 -5
- package/lib/esm/utils/dates.js +17 -10
- package/lib/esm/validation/decorators.js +45 -38
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/model/decorators.cjs +1 -8
- package/lib/utils/dates.cjs +17 -10
- package/lib/utils/dates.d.ts +6 -5
- package/lib/validation/decorators.cjs +45 -38
- package/package.json +5 -5
|
@@ -400,13 +400,14 @@
|
|
|
400
400
|
return new Date(year, month - 1, day, hour, minutes, seconds, ms);
|
|
401
401
|
}
|
|
402
402
|
/**
|
|
403
|
-
* @description Binds a specific date format to a Date object's toString and toISOString methods
|
|
404
|
-
* @summary
|
|
405
|
-
* This function
|
|
406
|
-
* the
|
|
403
|
+
* @description Binds a specific date format to a Date object's toString and toISOString methods using a Proxy
|
|
404
|
+
* @summary Wraps a Date object in a Proxy to return a formatted string when toString or toISOString is called.
|
|
405
|
+
* This function uses the Proxy API to intercept method calls and return the date formatted according
|
|
406
|
+
* to the specified format string, while maintaining all other Date functionality.
|
|
407
|
+
* The proxied Date maintains instanceof Date checks and behaves identically to a Date object.
|
|
407
408
|
* @param {Date} [date] The Date object to modify
|
|
408
409
|
* @param {string} [format] The format string to use for formatting the date
|
|
409
|
-
* @return {Date|undefined}
|
|
410
|
+
* @return {Date|undefined} A proxied Date object or undefined if no date was provided
|
|
410
411
|
* @function bindDateToString
|
|
411
412
|
* @memberOf module:decorator-validation
|
|
412
413
|
* @category Model
|
|
@@ -414,18 +415,24 @@
|
|
|
414
415
|
function bindDateToString(date, format) {
|
|
415
416
|
if (!date)
|
|
416
417
|
return;
|
|
417
|
-
const func = () => formatDate(date, format);
|
|
418
418
|
Object.defineProperty(date, "toISOString", {
|
|
419
419
|
enumerable: false,
|
|
420
420
|
configurable: false,
|
|
421
|
-
value:
|
|
421
|
+
value: new Proxy(date.toISOString, {
|
|
422
|
+
apply(target, thisArg) {
|
|
423
|
+
return formatDate(thisArg, format);
|
|
424
|
+
},
|
|
425
|
+
}),
|
|
422
426
|
});
|
|
423
427
|
Object.defineProperty(date, "toString", {
|
|
424
428
|
enumerable: false,
|
|
425
429
|
configurable: false,
|
|
426
|
-
value:
|
|
430
|
+
value: new Proxy(date.toISOString, {
|
|
431
|
+
apply(target, thisArg) {
|
|
432
|
+
return formatDate(thisArg, format);
|
|
433
|
+
},
|
|
434
|
+
}),
|
|
427
435
|
});
|
|
428
|
-
// Object.setPrototypeOf(date, Date.prototype);
|
|
429
436
|
return date;
|
|
430
437
|
}
|
|
431
438
|
/**
|
|
@@ -4509,44 +4516,51 @@
|
|
|
4509
4516
|
*/
|
|
4510
4517
|
function date(format = "dd/MM/yyyy", message = DEFAULT_ERROR_MESSAGES.DATE) {
|
|
4511
4518
|
const key = Validation.key(ValidationKeys.DATE);
|
|
4512
|
-
|
|
4513
|
-
|
|
4514
|
-
|
|
4515
|
-
|
|
4516
|
-
|
|
4517
|
-
|
|
4518
|
-
|
|
4519
|
-
|
|
4520
|
-
|
|
4521
|
-
|
|
4522
|
-
|
|
4523
|
-
|
|
4524
|
-
|
|
4525
|
-
|
|
4526
|
-
|
|
4527
|
-
|
|
4528
|
-
|
|
4529
|
-
|
|
4530
|
-
|
|
4531
|
-
|
|
4532
|
-
|
|
4533
|
-
|
|
4534
|
-
|
|
4535
|
-
|
|
4536
|
-
|
|
4537
|
-
|
|
4538
|
-
|
|
4539
|
-
|
|
4540
|
-
|
|
4541
|
-
|
|
4542
|
-
|
|
4543
|
-
|
|
4544
|
-
|
|
4545
|
-
|
|
4546
|
-
|
|
4547
|
-
|
|
4519
|
+
function dateDec(format, message) {
|
|
4520
|
+
const meta = {
|
|
4521
|
+
[ValidationKeys.FORMAT]: format,
|
|
4522
|
+
message: message,
|
|
4523
|
+
types: [Date.name],
|
|
4524
|
+
description: `defines the attribute as a date with the format ${format}`,
|
|
4525
|
+
async: false,
|
|
4526
|
+
};
|
|
4527
|
+
return function dateDec(target, propertyKey) {
|
|
4528
|
+
const values = new WeakMap();
|
|
4529
|
+
Object.defineProperty(target, propertyKey, {
|
|
4530
|
+
configurable: false,
|
|
4531
|
+
set(newValue) {
|
|
4532
|
+
const descriptor = Object.getOwnPropertyDescriptor(this, propertyKey);
|
|
4533
|
+
if (!descriptor || descriptor.configurable)
|
|
4534
|
+
Object.defineProperty(this, propertyKey, {
|
|
4535
|
+
enumerable: true,
|
|
4536
|
+
configurable: false,
|
|
4537
|
+
get: () => values.get(this),
|
|
4538
|
+
set: (newValue) => {
|
|
4539
|
+
let val;
|
|
4540
|
+
try {
|
|
4541
|
+
val = parseDate(format, newValue);
|
|
4542
|
+
values.set(this, val);
|
|
4543
|
+
}
|
|
4544
|
+
catch (e) {
|
|
4545
|
+
console.error(sf("Failed to parse date: {0}", e.message || e));
|
|
4546
|
+
}
|
|
4547
|
+
},
|
|
4548
|
+
});
|
|
4549
|
+
this[propertyKey] = newValue;
|
|
4550
|
+
},
|
|
4551
|
+
get() {
|
|
4552
|
+
return values.get(this);
|
|
4553
|
+
},
|
|
4554
|
+
});
|
|
4555
|
+
return validationMetadata(date, key, meta)(target, propertyKey);
|
|
4556
|
+
};
|
|
4548
4557
|
}
|
|
4549
|
-
return Decoration.for(key)
|
|
4558
|
+
return Decoration.for(key)
|
|
4559
|
+
.define({
|
|
4560
|
+
decorator: dateDec,
|
|
4561
|
+
args: [format, message],
|
|
4562
|
+
})
|
|
4563
|
+
.apply();
|
|
4550
4564
|
}
|
|
4551
4565
|
/**
|
|
4552
4566
|
* @summary Password Handler Decorator
|
|
@@ -4848,13 +4862,6 @@
|
|
|
4848
4862
|
const newConstructor = function (...args) {
|
|
4849
4863
|
const instance = construct(original, ...args);
|
|
4850
4864
|
bindModelPrototype(instance);
|
|
4851
|
-
// re-apply original constructor
|
|
4852
|
-
Object.defineProperty(instance, "constructor", {
|
|
4853
|
-
writable: false,
|
|
4854
|
-
enumerable: false,
|
|
4855
|
-
configurable: false,
|
|
4856
|
-
value: original,
|
|
4857
|
-
});
|
|
4858
4865
|
// run a builder function if defined with the first argument (The ModelArg)
|
|
4859
4866
|
const builder = Model.getBuilder();
|
|
4860
4867
|
if (builder)
|
|
@@ -4973,7 +4980,7 @@
|
|
|
4973
4980
|
* @const VERSION
|
|
4974
4981
|
* @memberOf module:decorator-validation
|
|
4975
4982
|
*/
|
|
4976
|
-
const VERSION = "1.7.
|
|
4983
|
+
const VERSION = "1.7.21";
|
|
4977
4984
|
|
|
4978
4985
|
exports.ASYNC_META_KEY = ASYNC_META_KEY;
|
|
4979
4986
|
exports.AsyncValidator = AsyncValidator;
|
|
@@ -5060,4 +5067,4 @@
|
|
|
5060
5067
|
exports.validator = validator;
|
|
5061
5068
|
|
|
5062
5069
|
}));
|
|
5063
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLXZhbGlkYXRpb24uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzL2Vycm9ycy50cyIsIi4uL3NyYy9jb25zdGFudHMvdmFsaWRhdGlvbi50cyIsIi4uL3NyYy91dGlscy9jb25zdGFudHMudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL2NvbnN0YW50cy50cyIsIi4uL3NyYy91dGlscy9zdHJpbmdzLnRzIiwiLi4vc3JjL3V0aWxzL2RhdGVzLnRzIiwiLi4vc3JjL3V0aWxzL0RlY29yYXRpb24udHMiLCIuLi9zcmMvdXRpbHMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy91dGlscy9oYXNoaW5nLnRzIiwiLi4vc3JjL3V0aWxzL1BhdGhQcm94eS50cyIsIi4uL3NyYy9tb2RlbC9Nb2RlbEVycm9yRGVmaW5pdGlvbi50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvQmFzZVZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9WYWxpZGF0b3JSZWdpc3RyeS50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRpb24udHMiLCIuLi9zcmMvbW9kZWwvdXRpbHMudHMiLCIuLi9zcmMvbW9kZWwvdmFsaWRhdGlvbi50cyIsIi4uL3NyYy9tb2RlbC9jb25zdGFudHMudHMiLCIuLi9zcmMvbW9kZWwvTW9kZWwudHMiLCIuLi9zcmMvdXRpbHMvc2VyaWFsaXphdGlvbi50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvQXN5bmNWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0RhdGVWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0RpZmZWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1BhdHRlcm5WYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0VtYWlsVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9FcXVhbHNWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL3V0aWxzLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9HcmVhdGVyVGhhblZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9MZXNzVGhhblZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9MaXN0VmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9NYXhMZW5ndGhWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL01heFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvTWluTGVuZ3RoVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9NaW5WYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1Bhc3N3b3JkVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9SZXF1aXJlZFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvU3RlcFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvVHlwZVZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvVVJMVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9tb2RlbC9jb25zdHJ1Y3Rpb24udHMiLCIuLi9zcmMvbW9kZWwvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUyA9IHtcbiAgSU5WQUxJRF9QQVRIOlxuICAgIFwiSW52YWxpZCBwYXRoIGFyZ3VtZW50LiBFeHBlY3RlZCBub24tZW1wdHkgc3RyaW5nIGJ1dCByZWNlaXZlZDogJ3swfSdcIixcbiAgQ09OVEVYVF9OT1RfT0JKRUNUX0NPTVBBUklTT046XG4gICAgXCJVbmFibGUgdG8gYWNjZXNzIHBhcmVudCBhdCBsZXZlbCB7MH0gZm9yIHBhdGggJ3sxfSc6IGN1cnJlbnQgY29udGV4dCBpcyBub3QgYW4gb2JqZWN0XCIsXG4gIFBST1BFUlRZX0lOVkFMSUQ6XG4gICAgXCJGYWlsZWQgdG8gcmVzb2x2ZSBwYXRoIHswfTogcHJvcGVydHkgJ3sxfScgaXMgaW52YWxpZCBvciBkb2VzIG5vdCBleGlzdC5cIixcbiAgUFJPUEVSVFlfTk9UX0VYSVNUOiBcIkZhaWxlZCB0byByZXNvbHZlIHBhdGg6IHByb3BlcnR5ICd7MH0nIGRvZXMgbm90IGV4aXN0LlwiLFxuICBVTlNVUFBPUlRFRF9UWVBFU19DT01QQVJJU09OOlxuICAgIFwiVW5zdXBwb3J0ZWQgdHlwZXMgZm9yIGNvbXBhcmlzb246ICd7MH0nIGFuZCAnezF9J1wiLFxuICBOVUxMX09SX1VOREVGSU5FRF9DT01QQVJJU09OOlxuICAgIFwiQ29tcGFyaXNvbiBmYWlsZWQgZHVlIHRvIG51bGwgb3IgdW5kZWZpbmVkIHZhbHVlXCIsXG4gIElOVkFMSURfREFURV9DT01QQVJJU09OOiBcIkludmFsaWQgRGF0ZSBvYmplY3RzIGFyZSBub3QgY29tcGFyYWJsZVwiLFxuICBUWVBFX01JU01BVENIX0NPTVBBUklTT046XG4gICAgXCJDYW5ub3QgY29tcGFyZSB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzOiB7MH0gYW5kIHsxfS5cIixcbiAgTkFOX0NPTVBBUklTT046IFwiQ29tcGFyaXNvbiBub3Qgc3VwcG9ydGVkIGZvciBOYU4gdmFsdWVzXCIsXG4gIC8vIE5PX1BBUkVOVF9DT01QQVJJU09OOiBcIlVuYWJsZSB0byBhY2Nlc3MgcGFyZW50IGF0IGxldmVsIHswfSBmb3IgcGF0aCAnezF9Jzogbm8gcGFyZW50IGF2YWlsYWJsZVwiLFxuICAvLyBQUk9QRVJUWV9OT1RfRk9VTkQ6IFwiRmFpbGVkIHRvIHJlc29sdmUgcGF0aCB7MH06IHByb3BlcnR5ICd7MX0nIGRvZXMgbm90IGV4aXN0LlwiLFxuICAvLyBQUk9QRVJUWV9OT1RfRk9VTkRfT05fUEFSRU5UOiBcIkZhaWxlZCB0byByZXNvbHZlIHBhdGggezB9OiBwcm9wZXJ0eSAnezF9JyBkb2VzIG5vdCBleGlzdCBvbiBwYXJlbnQuXCIsXG4gIC8vIFBST1BFUlRZX05PVF9GT1VORF9BRlRFUl9QQVJFTlQ6IFwiRmFpbGVkIHRvIHJlc29sdmUgcGF0aCB7MH06IHByb3BlcnR5ICd7MX0nIGRvZXMgbm90IGV4aXN0IGFmdGVyIHsyfSBwYXJlbnQgbGV2ZWwocykuXCIsXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gU3ltYm9sIGtleSBmb3IgdHJhY2tpbmcgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMgaW4gdmFsaWRhdGlvblxuICogQHN1bW1hcnkgU3ltYm9sIHVzZWQgdG8gaW50ZXJuYWxseSB0cmFjayB0aGUgcGFyZW50IG9iamVjdCBkdXJpbmcgbmVzdGVkIHZhbGlkYXRpb25cbiAqXG4gKiBAY29uc3QgVkFMSURBVElPTl9QQVJFTlRfS0VZXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBWQUxJREFUSU9OX1BBUkVOVF9LRVkgPSBTeW1ib2woXCJfcGFyZW50XCIpO1xuZXhwb3J0IGNvbnN0IEFTWU5DX01FVEFfS0VZID0gU3ltYm9sKFwiaXNBc3luY1wiKTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW0gY29udGFpbmluZyBtZXRhZGF0YSBrZXlzIHVzZWQgZm9yIHJlZmxlY3Rpb24gaW4gdGhlIG1vZGVsIHN5c3RlbVxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgdmFyaW91cyBNb2RlbCBrZXlzIHVzZWQgZm9yIHJlZmxlY3Rpb24gYW5kIG1ldGFkYXRhIHN0b3JhZ2UuXG4gKiBUaGVzZSBrZXlzIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIGxpYnJhcnkgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhIGFib3V0IG1vZGVscyxcbiAqIHRoZWlyIHByb3BlcnRpZXMsIGFuZCB0aGVpciBiZWhhdmlvci5cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCAtIFByZWZpeCB0byBhbGwgb3RoZXIga2V5cywgdXNlZCBhcyBhIG5hbWVzcGFjZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRZUEUgLSBLZXkgZm9yIHN0b3JpbmcgZGVzaWduIHR5cGUgaW5mb3JtYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQQVJBTVMgLSBLZXkgZm9yIHN0b3JpbmcgbWV0aG9kIHBhcmFtZXRlciB0eXBlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFVFVSTiAtIEtleSBmb3Igc3RvcmluZyBtZXRob2QgcmV0dXJuIHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNT0RFTCAtIEtleSBmb3IgaWRlbnRpZnlpbmcgbW9kZWwgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBBTkNIT1IgLSBBbmNob3Iga2V5IHRoYXQgc2VydmVzIGFzIGEgZ2hvc3QgcHJvcGVydHkgaW4gdGhlIG1vZGVsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQ09OU1RSVUNUSU9OIC0gS2V5IGZvciBzdG9yaW5nIGNvbnN0cnVjdGlvbiBpbmZvcm1hdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFUVFJJQlVURSAtIEtleSBmb3Igc3RvcmluZyBhdHRyaWJ1dGUgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBIQVNISU5HIC0gS2V5IGZvciBzdG9yaW5nIGhhc2hpbmcgY29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNFUklBTElaQVRJT04gLSBLZXkgZm9yIHN0b3Jpbmcgc2VyaWFsaXphdGlvbiBjb25maWd1cmF0aW9uXG4gKlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBlbnVtIE1vZGVsS2V5cyB7XG4gIFJFRkxFQ1QgPSBcImRlY2FmLm1vZGVsLlwiLFxuICBERVNDUklQVElPTiA9IFwiZGVjYWYuZGVzY3JpcHRpb24uXCIsXG4gIFRZUEUgPSBcImRlc2lnbjp0eXBlXCIsXG4gIFBBUkFNUyA9IFwiZGVzaWduOnBhcmFtdHlwZXNcIixcbiAgUkVUVVJOID0gXCJkZXNpZ246cmV0dXJudHlwZVwiLFxuICBNT0RFTCA9IFwibW9kZWxcIixcbiAgQU5DSE9SID0gXCJfX21vZGVsXCIsXG4gIENPTlNUUlVDVElPTiA9IFwiY29uc3RydWN0ZWQtYnlcIixcbiAgQVRUUklCVVRFID0gXCJfX2F0dHJpYnV0ZXNcIixcbiAgSEFTSElORyA9IFwiaGFzaGluZ1wiLFxuICBTRVJJQUxJWkFUSU9OID0gXCJzZXJpYWxpemF0aW9uXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgZmxhdm91ciBpZGVudGlmaWVyIGZvciB0aGUgZGVjb3JhdG9yIHN5c3RlbVxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZGVmYXVsdCBmbGF2b3VyIHVzZWQgYnkgdGhlIERlY29yYXRpb24gY2xhc3Mgd2hlbiBubyBzcGVjaWZpYyBmbGF2b3VyIGlzIHByb3ZpZGVkLlxuICogVGhpcyBjb25zdGFudCBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGxpYnJhcnkgYXMgdGhlIGZhbGxiYWNrIGZsYXZvdXIgZm9yIGRlY29yYXRvcnMuXG4gKlxuICogQGNvbnN0IHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRGbGF2b3VyID0gXCJkZWNhZlwiO1xuIiwiaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBPYmplY3QtbGlrZSBzZXQgb2Yga2V5cyB1c2VkIGZvciBjb21wYXJpc29uLWJhc2VkIHZhbGlkYXRpb25zLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgY2Fub25pY2FsIG5hbWVzIGZvciB2YWxpZGF0b3JzIHRoYXQgY29tcGFyZSB0d28gdmFsdWVzIChlcXVhbGl0eSBhbmQgb3JkZXJpbmcgY2hlY2tzKS5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvbXBhcmlzb25WYWxpZGF0aW9uS2V5c0RlZlxuICogQHByb3BlcnR5IHtcImVxdWFsc1wifSBFUVVBTFMgVmFsaWRhdGVzIGlmIHR3byB2YWx1ZXMgYXJlIGVxdWFsLlxuICogQHByb3BlcnR5IHtcImRpZmZlcmVudFwifSBESUZGIFZhbGlkYXRlcyBpZiB0d28gdmFsdWVzIGFyZSBkaWZmZXJlbnQuXG4gKiBAcHJvcGVydHkge1wibGVzc1RoYW5cIn0gTEVTU19USEFOIFZhbGlkYXRlcyBpZiBhIHZhbHVlIGlzIGxlc3MgdGhhbiBhbm90aGVyLlxuICogQHByb3BlcnR5IHtcImxlc3NUaGFuT3JFcXVhbFwifSBMRVNTX1RIQU5fT1JfRVFVQUwgVmFsaWRhdGVzIGlmIGEgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGFub3RoZXIuXG4gKiBAcHJvcGVydHkge1wiZ3JlYXRlclRoYW5cIn0gR1JFQVRFUl9USEFOIFZhbGlkYXRlcyBpZiBhIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBhbm90aGVyLlxuICogQHByb3BlcnR5IHtcImdyZWF0ZXJUaGFuT3JFcXVhbFwifSBHUkVBVEVSX1RIQU5fT1JfRVFVQUwgVmFsaWRhdGVzIGlmIGEgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGFub3RoZXIuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXlzIHVzZWQgZm9yIGNvbXBhcmlzb24tYmFzZWQgdmFsaWRhdGlvbnMuXG4gKiBAc3VtbWFyeSBDYW5vbmljYWwga2V5IG5hbWVzIGZvciBjb21wYXJpc29uIHZhbGlkYXRvcnMuXG4gKiBAY29uc3QgQ29tcGFyaXNvblZhbGlkYXRpb25LZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKiBAdHlwZSB7Q29tcGFyaXNvblZhbGlkYXRpb25LZXlzRGVmfVxuICovXG5leHBvcnQgY29uc3QgQ29tcGFyaXNvblZhbGlkYXRpb25LZXlzID0ge1xuICBFUVVBTFM6IFwiZXF1YWxzXCIsXG4gIERJRkY6IFwiZGlmZmVyZW50XCIsXG4gIExFU1NfVEhBTjogXCJsZXNzVGhhblwiLFxuICBMRVNTX1RIQU5fT1JfRVFVQUw6IFwibGVzc1RoYW5PckVxdWFsXCIsXG4gIEdSRUFURVJfVEhBTjogXCJncmVhdGVyVGhhblwiLFxuICBHUkVBVEVSX1RIQU5fT1JfRVFVQUw6IFwiZ3JlYXRlclRoYW5PckVxdWFsXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBPYmplY3QtbGlrZSBzZXQgb2Yga2V5cyB1c2VkIGFjcm9zcyBhbGwgdmFsaWRhdG9ycyBpbiB0aGUgc3lzdGVtLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWVzcGFjZWQga2V5IHByZWZpeCBhbmQgdGhlIGluZGl2aWR1YWwgdmFsaWRhdGlvbiBmbGFncyBmb3IgcnVsZXMgc3VjaCBhcyByZXF1aXJlZCwgbWluL21heCwgbGVuZ3RoLCBwYXR0ZXJucywgdHlwZXMsIGxpc3RzIGFuZCBtb3JlLlxuICogQHR5cGVkZWYge09iamVjdH0gVmFsaWRhdGlvbktleXNEZWZcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUZMRUNUIHByZWZpeGVzIG90aGVycyAobmFtZXNwYWNlIHByZWZpeClcbiAqIEBwcm9wZXJ0eSB7XCJyZXF1aXJlZFwifSBSRVFVSVJFRCBzZXRzIGFzIHJlcXVpcmVkXG4gKiBAcHJvcGVydHkge1wibWluXCJ9IE1JTiBkZWZpbmVzIG1pbiB2YWx1ZVxuICogQHByb3BlcnR5IHtcIm1heFwifSBNQVggZGVmaW5lcyBtYXggdmFsdWVcbiAqIEBwcm9wZXJ0eSB7XCJzdGVwXCJ9IFNURVAgZGVmaW5lcyBzdGVwXG4gKiBAcHJvcGVydHkge1wibWlubGVuZ3RoXCJ9IE1JTl9MRU5HVEggZGVmaW5lcyBtaW4gbGVuZ3RoXG4gKiBAcHJvcGVydHkge1wibWF4bGVuZ3RoXCJ9IE1BWF9MRU5HVEggZGVmaW5lcyBtYXggbGVuZ3RoXG4gKiBAcHJvcGVydHkge1wicGF0dGVyblwifSBQQVRURVJOIGRlZmluZXMgcGF0dGVyblxuICogQHByb3BlcnR5IHtcImVtYWlsXCJ9IEVNQUlMIGRlZmluZXMgZW1haWxcbiAqIEBwcm9wZXJ0eSB7XCJ1cmxcIn0gVVJMIGRlZmluZXMgdXJsXG4gKiBAcHJvcGVydHkge1wiZGF0ZVwifSBEQVRFIGRlZmluZXMgZGF0ZVxuICogQHByb3BlcnR5IHtcInR5cGVcIn0gVFlQRSBkZWZpbmVzIHR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJwYXNzd29yZFwifSBQQVNTV09SRCBkZWZpbmVzIHBhc3N3b3JkXG4gKiBAcHJvcGVydHkge1wibGlzdFwifSBMSVNUIGRlZmluZXMgbGlzdFxuICogQHByb3BlcnR5IHtcInVuaXF1ZVwifSBVTklRVUUgZmxhZ3MgdW5pcXVlbmVzc1xuICogQHByb3BlcnR5IHtcInZhbGlkYXRvclwifSBWQUxJREFUT1IgY3VzdG9tIHZhbGlkYXRvciBpZFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVGhlIGtleXMgdXNlZCBmb3IgdmFsaWRhdGlvbi5cbiAqIEBzdW1tYXJ5IEEgbmFtZXNwYWNlZCBjb2xsZWN0aW9uIG9mIHZhbGlkYXRpb24ga2V5IHN0cmluZ3MgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5LlxuICogQGNvbnN0IFZhbGlkYXRpb25LZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKiBAdHlwZSB7VmFsaWRhdGlvbktleXNEZWZ9XG4gKi9cbmV4cG9ydCBjb25zdCBWYWxpZGF0aW9uS2V5cyA9IHtcbiAgUkVGTEVDVDogYCR7TW9kZWxLZXlzLlJFRkxFQ1R9dmFsaWRhdGlvbi5gLFxuICBEQVRFOiBcImRhdGVcIixcbiAgRU1BSUw6IFwiZW1haWxcIixcbiAgRk9STUFUOiBcImZvcm1hdFwiLFxuICBMSVNUOiBcImxpc3RcIixcbiAgTUFYOiBcIm1heFwiLFxuICBNQVhfTEVOR1RIOiBcIm1heGxlbmd0aFwiLFxuICBNSU46IFwibWluXCIsXG4gIE1JTl9MRU5HVEg6IFwibWlubGVuZ3RoXCIsXG4gIFBBU1NXT1JEOiBcInBhc3N3b3JkXCIsXG4gIFBBVFRFUk46IFwicGF0dGVyblwiLFxuICBSRVFVSVJFRDogXCJyZXF1aXJlZFwiLFxuICBTVEVQOiBcInN0ZXBcIixcbiAgVFlQRTogXCJ0eXBlXCIsXG4gIFVOSVFVRTogXCJ1bmlxdWVcIixcbiAgVVJMOiBcInVybFwiLFxuICBWQUxJREFUT1I6IFwidmFsaWRhdG9yXCIsXG4gIC4uLkNvbXBhcmlzb25WYWxpZGF0aW9uS2V5cyxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIGxpc3Qgb2YgbW9udGggbmFtZXNcbiAqIEBzdW1tYXJ5IFN0b3JlcyBtb250aCBuYW1lcy4gQ2FuIGJlIGNoYW5nZWQgZm9yIGxvY2FsaXphdGlvbiBwdXJwb3Nlc1xuICogQGNvbnN0IE1PTlRIX05BTUVTXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBNT05USF9OQU1FUyA9IFtcbiAgXCJKYW51YXJ5XCIsXG4gIFwiRmVicnVhcnlcIixcbiAgXCJNYXJjaFwiLFxuICBcIkFwcmlsXCIsXG4gIFwiTWF5XCIsXG4gIFwiSnVuZVwiLFxuICBcIkp1bHlcIixcbiAgXCJBdWd1c3RcIixcbiAgXCJTZXB0ZW1iZXJcIixcbiAgXCJPY3RvYmVyXCIsXG4gIFwiTm92ZW1iZXJcIixcbiAgXCJEZWNlbWJlclwiLFxuXTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gbGlzdCBvZiBuYW1lcyBvZiBkYXlzIG9mIHRoZSB3ZWVrXG4gKiBAc3VtbWFyeSBTdG9yZXMgbmFtZXMgZm9yIGRheXMgb2YgdGhlIHdlZWsuIENhbiBiZSBjaGFuZ2VkIGZvciBsb2NhbGl6YXRpb24gcHVycG9zZXNcbiAqIEBjb25zdCBEQVlTX09GX1dFRUtfTkFNRVNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IERBWVNfT0ZfV0VFS19OQU1FUyA9IFtcbiAgXCJTdW5kYXlcIixcbiAgXCJNb25kYXlcIixcbiAgXCJUdWVzZGF5XCIsXG4gIFwiV2VkbmVzZGF5XCIsXG4gIFwiVGh1cnNkYXlcIixcbiAgXCJGcmlkYXlcIixcbiAgXCJTYXR1cmRheVwiLFxuXTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZSBkZWZpbml0aW9uIGZvciBkZWZhdWx0IGVycm9yIG1lc3NhZ2Ugc3RyaW5ncyBrZXllZCBieSB2YWxpZGF0aW9uIHR5cGUuXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdXBwb3J0ZWQgZXJyb3IgbWVzc2FnZSBrZXlzIHdpdGggdGhlaXIgaW50ZW5kZWQgbWVhbmluZzsgdXNlZCB0byBsb2NhbGl6ZSBvciBvdmVycmlkZSBkZWZhdWx0IG1lc3NhZ2VzLlxuICogQHR5cGVkZWYge09iamVjdH0gRGVmYXVsdEVycm9yTWVzc2FnZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVFVSVJFRCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNSU4gZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1JTl9MRU5HVEggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYX0xFTkdUSCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQQVRURVJOIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVNQUlMIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFVSTCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUWVBFIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNURVAgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURSBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBERUZBVUxUIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBU1NXT1JEIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJU1QgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTElTVF9JTlNJREUgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTU9ERUxfTk9UX0ZPVU5EIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB0aGUgZGVmYXVsdCBlcnJvciBtZXNzYWdlc1xuICogQHN1bW1hcnkgTWFwcGluZyBiZXR3ZWVuIHZhbGlkYXRpb24ga2V5cyBhbmQgdGhlaXIgZGVmYXVsdCBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlcy5cbiAqIEBjb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKiBAdHlwZSB7RGVmYXVsdEVycm9yTWVzc2FnZXN9XG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBSRVFVSVJFRDogXCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkXCIsXG4gIE1JTjogXCJUaGUgbWluaW11bSB2YWx1ZSBpcyB7MH1cIixcbiAgTUFYOiBcIlRoZSBtYXhpbXVtIHZhbHVlIGlzIHswfVwiLFxuICBNSU5fTEVOR1RIOiBcIlRoZSBtaW5pbXVtIGxlbmd0aCBpcyB7MH1cIixcbiAgTUFYX0xFTkdUSDogXCJUaGUgbWF4aW11bSBsZW5ndGggaXMgezB9XCIsXG4gIFBBVFRFUk46IFwiVGhlIHZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBwYXR0ZXJuXCIsXG4gIEVNQUlMOiBcIlRoZSB2YWx1ZSBpcyBub3QgYSB2YWxpZCBlbWFpbFwiLFxuICBVUkw6IFwiVGhlIHZhbHVlIGlzIG5vdCBhIHZhbGlkIFVSTFwiLFxuICBUWVBFOiBcIkludmFsaWQgdHlwZS4gRXhwZWN0ZWQgezB9LCByZWNlaXZlZCB7MX1cIixcbiAgU1RFUDogXCJJbnZhbGlkIHZhbHVlLiBOb3QgYSBzdGVwIG9mIHswfVwiLFxuICBEQVRFOiBcIkludmFsaWQgdmFsdWUuIG5vdCBhIHZhbGlkIERhdGVcIixcbiAgREVGQVVMVDogXCJUaGVyZSBpcyBhbiBFcnJvclwiLFxuICBQQVNTV09SRDpcbiAgICBcIk11c3QgYmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGFuZCBjb250YWluIG9uZSBvZiBudW1iZXIsIGxvd2VyIGFuZCB1cHBlciBjYXNlIGxldHRlcnMsIGFuZCBzcGVjaWFsIGNoYXJhY3RlciAoQCQhJSo/Jl8tLiwpXCIsXG4gIExJU1Q6IFwiSW52YWxpZCBsaXN0IG9mIHswfVwiLFxuICBNT0RFTF9OT1RfRk9VTkQ6IFwiTm8gbW9kZWwgcmVnaXN0ZXJlZCB1bmRlciB7MH1cIixcbiAgRVFVQUxTOiBcIlRoaXMgZmllbGQgbXVzdCBiZSBlcXVhbCB0byBmaWVsZCB7MH1cIixcbiAgRElGRjogXCJUaGlzIGZpZWxkIG11c3QgYmUgZGlmZmVyZW50IGZyb20gZmllbGQgezB9XCIsXG4gIExFU1NfVEhBTjogXCJUaGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIGZpZWxkIHswfVwiLFxuICBMRVNTX1RIQU5fT1JfRVFVQUw6IFwiVGhpcyBmaWVsZCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBmaWVsZCB7MH1cIixcbiAgR1JFQVRFUl9USEFOOiBcIlRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gZmllbGQgezB9XCIsXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTDpcbiAgICBcIlRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gZmllbGQgezB9XCIsXG4gIFVOSVFVRTogXCJEdXBsaWNhdGUgZm91bmQsIHRoaXMgZmllbGQgbXVzdCBiZSB1bmlxdWUuXCIsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGRlZmluaXRpb24gZm9yIGRlZmF1bHQgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5zIHVzZWQgaW4gdmFsaWRhdGlvbi5cbiAqIEBzdW1tYXJ5IENhcHR1cmVzIGNvbW1vbiByZWdleCBwYXR0ZXJucyBmb3IgZW1haWwsIFVSTCwgYW5kIHBhc3N3b3JkIHBvbGljaWVzLCBpbmNsdWRpbmcgbmVzdGVkIGdyb3VwaW5nIGZvciBwYXNzd29yZC1yZWxhdGVkIHJ1bGVzLlxuICogQHR5cGVkZWYge09iamVjdH0gRGVmYXVsdFBhdHRlcm5zXG4gKiBAcHJvcGVydHkge1JlZ0V4cH0gRU1BSUwgRW1haWwgYWRkcmVzcyB2YWxpZGF0aW9uIHBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBVUkwgVVJMIHZhbGlkYXRpb24gcGF0dGVyblxuICogQHByb3BlcnR5IHtPYmplY3R9IFBBU1NXT1JEIFBhc3N3b3JkLXJlbGF0ZWQgcmVnZXggcGF0dGVybnNcbiAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBQQVNTV09SRC5DSEFSOF9PTkVfT0ZfRUFDSCBBdCBsZWFzdCA4IGNoYXJzIHdpdGggbG93ZXIsIHVwcGVyLCBudW1iZXIsIGFuZCBzcGVjaWFsIGNoYXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIHZhcmlvdXMgZGVmYXVsdCByZWdleHAgcGF0dGVybnMgdXNlZFxuICogQHN1bW1hcnkgQ29sbGVjdGlvbiBvZiBmcmVxdWVudGx5IHVzZWQgdmFsaWRhdGlvbiBwYXR0ZXJucyBncm91cGVkIHVuZGVyIHNlbWFudGljIGtleXMuXG4gKiBAY29uc3QgREVGQVVMVF9QQVRURVJOU1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICogQHR5cGUge0RlZmF1bHRQYXR0ZXJuc31cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEFUVEVSTlMgPSB7XG4gIEVNQUlMOlxuICAgIC9bYS16QS1aMC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKD86XFwuW2EtekEtWjAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKykqQCg/OlthLXpBLVowLTldKD86W2EtejAtOS1dKlthLXpBLVowLTldKT9cXC4pK1thLXpBLVowLTldKD86W2EtekEtWjAtOS1dKlthLXpBLVowLTldKT8vLFxuICBVUkw6IC9eKD86KD86KD86aHR0cHM/fGZ0cCk6KT9cXC9cXC8pKD86XFxTKyg/OjpcXFMqKT9AKT8oPzooPyEoPzoxMHwxMjcpKD86XFwuXFxkezEsM30pezN9KSg/ISg/OjE2OVxcLjI1NHwxOTJcXC4xNjgpKD86XFwuXFxkezEsM30pezJ9KSg/ITE3MlxcLig/OjFbNi05XXwyXFxkfDNbMC0xXSkoPzpcXC5cXGR7MSwzfSl7Mn0pKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswMV1cXGR8MjJbMC0zXSkoPzpcXC4oPzoxP1xcZHsxLDJ9fDJbMC00XVxcZHwyNVswLTVdKSl7Mn0oPzpcXC4oPzpbMS05XVxcZD98MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC00XSkpfCg/Oig/OlthLXowLTlcXHUwMGExLVxcdWZmZmZdW2EtejAtOVxcdTAwYTEtXFx1ZmZmZl8tXXswLDYyfSk/W2EtejAtOVxcdTAwYTEtXFx1ZmZmZl1cXC4pKyg/OlthLXpcXHUwMGExLVxcdWZmZmZdezIsfVxcLj8pKSg/OjpcXGR7Miw1fSk/KD86Wy8/I11cXFMqKT8kL2ksXG4gIFBBU1NXT1JEOiB7XG4gICAgQ0hBUjhfT05FX09GX0VBQ0g6XG4gICAgICAvXig/PS4qW2Etel0pKD89LipbQS1aXSkoPz0uKlxcZCkoPz0uKltAJCElKj8mX1xcLS4sXSlbQS1aYS16XFxkQCQhJSo/Jl9cXC0uLF17OCx9JC9nLFxuICB9LFxufTtcbiIsIi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBwcm92aWRlIHN0cmluZyBmb3JtYXQgZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIEMjJ3Mgc3RyaW5nLmZvcm1hdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyPn0gW2FyZ3NdIHJlcGxhY2VtZW50cyBtYWRlIGJ5IG9yZGVyIG9mIGFwcGVhcmFuY2UgKHJlcGxhY2VtZW50MCB3aWwgcmVwbGFjZSB7MH0gYW5kIHNvIG9uKVxuICogQHJldHVybiB7c3RyaW5nfSBmb3JtYXR0ZWQgc3RyaW5nXG4gKlxuICogQGZ1bmN0aW9uIHN0cmluZ0Zvcm1hdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdGb3JtYXQoc3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC97KFxcZCspfS9nLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlcikge1xuICAgIHJldHVybiB0eXBlb2YgYXJnc1tudW1iZXJdICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICA/IGFyZ3NbbnVtYmVyXS50b1N0cmluZygpXG4gICAgICA6IFwidW5kZWZpbmVkXCI7XG4gIH0pO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gcHJvdmlkZSBzdHJpbmcgZm9ybWF0IGZ1bmN0aW9uYWxpdHkgc2ltaWxhciB0byBDIydzIHN0cmluZy5mb3JtYXRcbiAqIEBkZXNjcmlwdGlvbiBhbGlhcyBmb3Ige0BsaW5rIHN0cmluZ0Zvcm1hdH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncyByZXBsYWNlbWVudHMgbWFkZSBieSBvcmRlciBvZiBhcHBlYXJhbmNlIChyZXBsYWNlbWVudDAgd2lsIHJlcGxhY2UgezB9IGFuZCBzbyBvbilcbiAqIEByZXR1cm4ge3N0cmluZ30gZm9ybWF0dGVkIHN0cmluZ1xuICpcbiAqIEBmdW5jdGlvbiBzZlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBjb25zdCBzZiA9IHN0cmluZ0Zvcm1hdDtcbiIsImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7XG4gIERBWVNfT0ZfV0VFS19OQU1FUyxcbiAgTU9OVEhfTkFNRVMsXG59IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuL3N0cmluZ3NcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBSZXZlcnNlcyB0aGUgcHJvY2VzcyBmcm9tIHtAbGluayBmb3JtYXREYXRlfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlIHRoZSBkYXRlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgYmFjayBpbnRvIGRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgdGhlIGRhdGUgZm9ybWF0XG4gKiBAcmV0dXJuIHtEYXRlfSB0aGUgZGF0ZSBmcm9tIHRoZSBmb3JtYXQgb3IgdGhlIHN0YW5kYXJkIG5ldyBEYXRlKHtAcHJvcCBkYXRlfSkgaWYgdGhlIHN0cmluZyBjb3VsZG4ndCBiZSBwYXJzZWQgKGFyZSB5b3Ugc3VyZSB0aGUgZm9ybWF0IG1hdGNoZXMgdGhlIHN0cmluZz8pXG4gKlxuICogQGZ1bmN0aW9uIGRhdGVGcm9tRm9ybWF0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGVGcm9tRm9ybWF0KGRhdGU6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcpIHtcbiAgbGV0IGZvcm1hdFJlZ2V4cDogc3RyaW5nID0gZm9ybWF0O1xuXG4gIC8vIEhvdXJcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvaGgvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcImhoXCIsIFwiKD88aG91cj5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvaC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiaFwiLCBcIig/PGhvdXI+XFxcXGR7MSwyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvSEgvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIkhIXCIsIFwiKD88aG91cj5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvSC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiSFwiLCBcIig/PGhvdXI+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gTWludXRlc1xuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9tbS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwibW1cIiwgXCIoPzxtaW51dGVzPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9tLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJtXCIsIFwiKD88bWludXRlcz5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBTZWNvbmRzXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL3NzLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJzc1wiLCBcIig/PHNlY29uZHM+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL3MvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInNcIiwgXCIoPzxzZWNvbmRzPlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIERheVxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9kZC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiZGRcIiwgXCIoPzxkYXk+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL2QvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcImRcIiwgXCIoPzxkYXk+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gRGF5IE9mIFdlZWtcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvRUVFRS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiRUVFRVwiLCBcIig/PGRheW9md2Vlaz5cXFxcdyspXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZHVwZS1lbHNlLWlmXG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvRUVFRS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiRUVFXCIsIFwiKD88ZGF5b2Z3ZWVrPlxcXFx3KylcIik7XG5cbiAgLy8gWWVhclxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC95eXl5LykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJ5eXl5XCIsIFwiKD88eWVhcj5cXFxcZHs0fSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgveXkvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInl5XCIsIFwiKD88eWVhcj5cXFxcZHsyfSlcIik7XG5cbiAgLy8gTW9udGhcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTU1NTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTU1NTVwiLCBcIig/PG1vbnRobmFtZT5cXFxcdyspXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL01NTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTU1NXCIsIFwiKD88bW9udGhuYW1lc21hbGw+XFxcXHcrKVwiKTtcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTU0vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIk1NXCIsIFwiKD88bW9udGg+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL00vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIk1cIiwgXCIoPzxtb250aD5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBNaWxpcyBhbmQgQW0gUG1cbiAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwXG4gICAgLnJlcGxhY2UoXCJTXCIsIFwiKD88bWlsaXM+XFxcXGR7MSwzfSlcIilcbiAgICAucmVwbGFjZShcImFhYVwiLCBcIig/PGFtcG0+XFxcXHd7Mn0pXCIpO1xuXG4gIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoZm9ybWF0UmVnZXhwLCBcImdcIik7XG5cbiAgY29uc3QgbWF0Y2g6IHtcbiAgICBncm91cHM6IHtcbiAgICAgIHllYXI/OiBzdHJpbmc7XG4gICAgICBkYXk/OiBzdHJpbmc7XG4gICAgICBhbXBtPzogc3RyaW5nO1xuICAgICAgaG91cj86IHN0cmluZztcbiAgICAgIG1pbnV0ZXM/OiBzdHJpbmc7XG4gICAgICBzZWNvbmRzPzogc3RyaW5nO1xuICAgICAgbWlsaXM/OiBzdHJpbmc7XG4gICAgICBtb250aG5hbWU/OiBzdHJpbmc7XG4gICAgICBtb250aG5hbWVzbWFsbD86IHN0cmluZztcbiAgICAgIG1vbnRoPzogc3RyaW5nO1xuICAgIH07XG4gIH0gPSByZWdleHAuZXhlYyhkYXRlKSBhcyBhbnk7XG5cbiAgaWYgKCFtYXRjaCB8fCAhbWF0Y2guZ3JvdXBzKSByZXR1cm4gbmV3IERhdGUoZGF0ZSk7XG5cbiAgY29uc3Qgc2FmZVBhcnNlSW50ID0gZnVuY3Rpb24gKG4/OiBzdHJpbmcpIHtcbiAgICBpZiAoIW4pIHJldHVybiAwO1xuICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlSW50KG4pO1xuXG4gICAgcmV0dXJuIGlzTmFOKHJlc3VsdCkgPyAwIDogcmVzdWx0O1xuICB9O1xuXG4gIGNvbnN0IHllYXIgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLnllYXIpO1xuICBjb25zdCBkYXkgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLmRheSk7XG5cbiAgY29uc3QgYW1QbSA9IG1hdGNoLmdyb3Vwcy5hbXBtO1xuICBsZXQgaG91ciA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMuaG91cik7XG5cbiAgaWYgKGFtUG0pIGhvdXIgPSBhbVBtID09PSBcIlBNXCIgPyBob3VyICsgMTIgOiBob3VyO1xuXG4gIGNvbnN0IG1pbnV0ZXMgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLm1pbnV0ZXMpO1xuICBjb25zdCBzZWNvbmRzID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy5zZWNvbmRzKTtcbiAgY29uc3QgbXMgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLm1pbGlzKTtcblxuICBjb25zdCBtb250aE5hbWUgPSBtYXRjaC5ncm91cHMubW9udGhuYW1lO1xuICBjb25zdCBtb250aE5hbWVTbWFsbCA9IG1hdGNoLmdyb3Vwcy5tb250aG5hbWVzbWFsbDtcbiAgbGV0IG1vbnRoOiBudW1iZXIgfCBzdHJpbmcgPSBtYXRjaC5ncm91cHMubW9udGggYXMgc3RyaW5nO1xuICBpZiAobW9udGhOYW1lKSBtb250aCA9IE1PTlRIX05BTUVTLmluZGV4T2YobW9udGhOYW1lKTtcbiAgZWxzZSBpZiAobW9udGhOYW1lU21hbGwpIHtcbiAgICBjb25zdCBtID0gTU9OVEhfTkFNRVMuZmluZCgobSkgPT5cbiAgICAgIG0udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1vbnRoTmFtZVNtYWxsLnRvTG93ZXJDYXNlKCkpXG4gICAgKTtcbiAgICBpZiAoIW0pIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcbiAgICBtb250aCA9IE1PTlRIX05BTUVTLmluZGV4T2YobSk7XG4gIH0gZWxzZSBtb250aCA9IHNhZmVQYXJzZUludChgJHttb250aH1gKTtcblxuICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIsIG1pbnV0ZXMsIHNlY29uZHMsIG1zKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmluZHMgYSBzcGVjaWZpYyBkYXRlIGZvcm1hdCB0byBhIERhdGUgb2JqZWN0J3MgdG9TdHJpbmcgYW5kIHRvSVNPU3RyaW5nIG1ldGhvZHNcbiAqIEBzdW1tYXJ5IE1vZGlmaWVzIGEgRGF0ZSBvYmplY3QgdG8gcmV0dXJuIGEgZm9ybWF0dGVkIHN0cmluZyB3aGVuIHRvU3RyaW5nIG9yIHRvSVNPU3RyaW5nIGlzIGNhbGxlZC5cbiAqIFRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHRvU3RyaW5nIGFuZCB0b0lTT1N0cmluZyBtZXRob2RzIG9mIHRoZSBEYXRlIG9iamVjdCB0byByZXR1cm5cbiAqIHRoZSBkYXRlIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLlxuICogQHBhcmFtIHtEYXRlfSBbZGF0ZV0gVGhlIERhdGUgb2JqZWN0IHRvIG1vZGlmeVxuICogQHBhcmFtIHtzdHJpbmd9IFtmb3JtYXRdIFRoZSBmb3JtYXQgc3RyaW5nIHRvIHVzZSBmb3IgZm9ybWF0dGluZyB0aGUgZGF0ZVxuICogQHJldHVybiB7RGF0ZXx1bmRlZmluZWR9IFRoZSBtb2RpZmllZCBEYXRlIG9iamVjdCBvciB1bmRlZmluZWQgaWYgbm8gZGF0ZSB3YXMgcHJvdmlkZWRcbiAqIEBmdW5jdGlvbiBiaW5kRGF0ZVRvU3RyaW5nXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmREYXRlVG9TdHJpbmcoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCwgZm9ybWF0OiBzdHJpbmcpIHtcbiAgaWYgKCFkYXRlKSByZXR1cm47XG4gIGNvbnN0IGZ1bmMgPSAoKSA9PiBmb3JtYXREYXRlKGRhdGUsIGZvcm1hdCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCBcInRvSVNPU3RyaW5nXCIsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jLFxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGUsIFwidG9TdHJpbmdcIiwge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IGZ1bmMsXG4gIH0pO1xuICAvLyBPYmplY3Quc2V0UHJvdG90eXBlT2YoZGF0ZSwgRGF0ZS5wcm90b3R5cGUpO1xuICByZXR1cm4gZGF0ZTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2FmZWx5IGNoZWNrcyBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgRGF0ZSBvYmplY3RcbiAqIEBzdW1tYXJ5IEEgdXRpbGl0eSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIERhdGUgb2JqZWN0LlxuICogVGhpcyBmdW5jdGlvbiBpcyBtb3JlIHJlbGlhYmxlIHRoYW4gdXNpbmcgaW5zdGFuY2VvZiBEYXRlIGFzIGl0IGFsc28gY2hlY2tzXG4gKiB0aGF0IHRoZSBkYXRlIGlzIG5vdCBOYU4sIHdoaWNoIGNhbiBoYXBwZW4gd2l0aCBpbnZhbGlkIGRhdGUgc3RyaW5ncy5cbiAqIEBwYXJhbSB7YW55fSBkYXRlIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBEYXRlIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKiBAZnVuY3Rpb24gaXNWYWxpZERhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRGF0ZShkYXRlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBkYXRlICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRhdGUpID09PSBcIltvYmplY3QgRGF0ZV1cIiAmJlxuICAgICFOdW1iZXIuaXNOYU4oZGF0ZSlcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIHBhZCBudW1iZXJzXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICpcbiAqIEBmdW5jdGlvbiB0d29EaWdpdFBhZFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0d29EaWdpdFBhZChudW06IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBudW0gPCAxMCA/IFwiMFwiICsgbnVtIDogbnVtLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGF0ZSBGb3JtYXQgSGFuZGxpbmdcbiAqIEBkZXNjcmlwdGlvbiBDb2RlIGZyb20ge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NTI0NjEvaG93LXRvLWZvcm1hdC1hLWphdmFzY3JpcHQtZGF0ZX1cbiAqXG4gKiA8cHJlPlxuICogICAgICBVc2luZyBzaW1pbGFyIGZvcm1hdHRpbmcgYXMgTW9tZW50LmpzLCBDbGFzcyBEYXRlVGltZUZvcm1hdHRlciAoSmF2YSksIGFuZCBDbGFzcyBTaW1wbGVEYXRlRm9ybWF0IChKYXZhKSxcbiAqICAgICAgSSBpbXBsZW1lbnRlZCBhIGNvbXByZWhlbnNpdmUgc29sdXRpb24gZm9ybWF0RGF0ZShkYXRlLCBwYXR0ZXJuU3RyKSB3aGVyZSB0aGUgY29kZSBpcyBlYXN5IHRvIHJlYWQgYW5kIG1vZGlmeS5cbiAqICAgICAgWW91IGNhbiBkaXNwbGF5IGRhdGUsIHRpbWUsIEFNL1BNLCBldGMuXG4gKlxuICogICAgICBEYXRlIGFuZCBUaW1lIFBhdHRlcm5zXG4gKiAgICAgIHl5ID0gMi1kaWdpdCB5ZWFyOyB5eXl5ID0gZnVsbCB5ZWFyXG4gKiAgICAgIE0gPSBkaWdpdCBtb250aDsgTU0gPSAyLWRpZ2l0IG1vbnRoOyBNTU0gPSBzaG9ydCBtb250aCBuYW1lOyBNTU1NID0gZnVsbCBtb250aCBuYW1lXG4gKiAgICAgIEVFRUUgPSBmdWxsIHdlZWtkYXkgbmFtZTsgRUVFID0gc2hvcnQgd2Vla2RheSBuYW1lXG4gKiAgICAgIGQgPSBkaWdpdCBkYXk7IGRkID0gMi1kaWdpdCBkYXlcbiAqICAgICAgaCA9IGhvdXJzIGFtL3BtOyBoaCA9IDItZGlnaXQgaG91cnMgYW0vcG07IEggPSBob3VyczsgSEggPSAyLWRpZ2l0IGhvdXJzXG4gKiAgICAgIG0gPSBtaW51dGVzOyBtbSA9IDItZGlnaXQgbWludXRlczsgYWFhID0gQU0vUE1cbiAqICAgICAgcyA9IHNlY29uZHM7IHNzID0gMi1kaWdpdCBzZWNvbmRzXG4gKiAgICAgIFMgPSBtaWxpc2Vjb25kc1xuICogPC9wcmU+XG4gKlxuICogQHBhcmFtIHtEYXRlfSBkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdHRlcm5TdHJdIGRlZmF1bHRzIHRvICd5eXl5L01NL2RkJ1xuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZm9ybWF0dGVkIGRhdGVcbiAqXG4gKiBAZnVuY3Rpb24gZm9ybWF0RGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGU6IERhdGUsIHBhdHRlcm5TdHI6IHN0cmluZyA9IFwieXl5eS9NTS9kZFwiKSB7XG4gIGNvbnN0IGRheTogbnVtYmVyID0gZGF0ZS5nZXREYXRlKCksXG4gICAgbW9udGg6IG51bWJlciA9IGRhdGUuZ2V0TW9udGgoKSxcbiAgICB5ZWFyOiBudW1iZXIgPSBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgaG91cjogbnVtYmVyID0gZGF0ZS5nZXRIb3VycygpLFxuICAgIG1pbnV0ZTogbnVtYmVyID0gZGF0ZS5nZXRNaW51dGVzKCksXG4gICAgc2Vjb25kOiBudW1iZXIgPSBkYXRlLmdldFNlY29uZHMoKSxcbiAgICBtaWxpc2Vjb25kczogbnVtYmVyID0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSxcbiAgICBoOiBudW1iZXIgPSBob3VyICUgMTIsXG4gICAgaGg6IHN0cmluZyA9IHR3b0RpZ2l0UGFkKGgpLFxuICAgIEhIOiBzdHJpbmcgPSB0d29EaWdpdFBhZChob3VyKSxcbiAgICBtbTogc3RyaW5nID0gdHdvRGlnaXRQYWQobWludXRlKSxcbiAgICBzczogc3RyaW5nID0gdHdvRGlnaXRQYWQoc2Vjb25kKSxcbiAgICBhYWE6IHN0cmluZyA9IGhvdXIgPCAxMiA/IFwiQU1cIiA6IFwiUE1cIixcbiAgICBFRUVFOiBzdHJpbmcgPSBEQVlTX09GX1dFRUtfTkFNRVNbZGF0ZS5nZXREYXkoKV0sXG4gICAgRUVFOiBzdHJpbmcgPSBFRUVFLnN1YnN0cigwLCAzKSxcbiAgICBkZDogc3RyaW5nID0gdHdvRGlnaXRQYWQoZGF5KSxcbiAgICBNOiBudW1iZXIgPSBtb250aCArIDEsXG4gICAgTU06IHN0cmluZyA9IHR3b0RpZ2l0UGFkKE0pLFxuICAgIE1NTU06IHN0cmluZyA9IE1PTlRIX05BTUVTW21vbnRoXSxcbiAgICBNTU06IHN0cmluZyA9IE1NTU0uc3Vic3RyKDAsIDMpLFxuICAgIHl5eXk6IHN0cmluZyA9IHllYXIgKyBcIlwiLFxuICAgIHl5OiBzdHJpbmcgPSB5eXl5LnN1YnN0cigyLCAyKTtcbiAgLy8gY2hlY2tzIHRvIHNlZSBpZiBtb250aCBuYW1lIHdpbGwgYmUgdXNlZFxuICBwYXR0ZXJuU3RyID0gcGF0dGVyblN0clxuICAgIC5yZXBsYWNlKFwiaGhcIiwgaGgpXG4gICAgLnJlcGxhY2UoXCJoXCIsIGgudG9TdHJpbmcoKSlcbiAgICAucmVwbGFjZShcIkhIXCIsIEhIKVxuICAgIC5yZXBsYWNlKFwiSFwiLCBob3VyLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJtbVwiLCBtbSlcbiAgICAucmVwbGFjZShcIm1cIiwgbWludXRlLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJzc1wiLCBzcylcbiAgICAucmVwbGFjZShcInNcIiwgc2Vjb25kLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJTXCIsIG1pbGlzZWNvbmRzLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJkZFwiLCBkZClcbiAgICAucmVwbGFjZShcImRcIiwgZGF5LnRvU3RyaW5nKCkpXG5cbiAgICAucmVwbGFjZShcIkVFRUVcIiwgRUVFRSlcbiAgICAucmVwbGFjZShcIkVFRVwiLCBFRUUpXG4gICAgLnJlcGxhY2UoXCJ5eXl5XCIsIHl5eXkpXG4gICAgLnJlcGxhY2UoXCJ5eVwiLCB5eSlcbiAgICAucmVwbGFjZShcImFhYVwiLCBhYWEpO1xuICBpZiAocGF0dGVyblN0ci5pbmRleE9mKFwiTU1NXCIpID4gLTEpIHtcbiAgICBwYXR0ZXJuU3RyID0gcGF0dGVyblN0ci5yZXBsYWNlKFwiTU1NTVwiLCBNTU1NKS5yZXBsYWNlKFwiTU1NXCIsIE1NTSk7XG4gIH0gZWxzZSB7XG4gICAgcGF0dGVyblN0ciA9IHBhdHRlcm5TdHIucmVwbGFjZShcIk1NXCIsIE1NKS5yZXBsYWNlKFwiTVwiLCBNLnRvU3RyaW5nKCkpO1xuICB9XG4gIHJldHVybiBwYXR0ZXJuU3RyO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFBhcnNlcyBhIGRhdGUgZnJvbSBhIHNwZWNpZmllZCBmb3JtYXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgRGF0ZSB8IG51bWJlcn0gW3ZdXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGF0ZShmb3JtYXQ6IHN0cmluZywgdj86IHN0cmluZyB8IERhdGUgfCBudW1iZXIpIHtcbiAgbGV0IHZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGlmICghdikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBpZiAodiBpbnN0YW5jZW9mIERhdGUpXG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gZGF0ZUZyb21Gb3JtYXQoZm9ybWF0RGF0ZSh2IGFzIERhdGUsIGZvcm1hdCksIGZvcm1hdCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHNmKFwiQ291bGQgbm90IGNvbnZlcnQgZGF0ZSB7MH0gdG8gZm9ybWF0OiB7MX1cIiwgdi50b1N0cmluZygpLCBmb3JtYXQpXG4gICAgICApO1xuICAgIH1cbiAgZWxzZSBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KHYsIGZvcm1hdCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHtcbiAgICBjb25zdCBkID0gbmV3IERhdGUodik7XG4gICAgdmFsdWUgPSBkYXRlRnJvbUZvcm1hdChmb3JtYXREYXRlKGQsIGZvcm1hdCksIGZvcm1hdCk7XG4gIH0gZWxzZSBpZiAoaXNWYWxpZERhdGUodikpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKHYpO1xuICAgICAgdmFsdWUgPSBkYXRlRnJvbUZvcm1hdChmb3JtYXREYXRlKGQsIGZvcm1hdCksIGZvcm1hdCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBzZihcIkNvdWxkIG5vdCBjb252ZXJ0IGRhdGUgezB9IHRvIGZvcm1hdDogezF9XCIsIHYsIGZvcm1hdClcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZSBwcm92aWRlZCAke3Z9YCk7XG4gIH1cbiAgcmV0dXJuIGJpbmREYXRlVG9TdHJpbmcodmFsdWUsIGZvcm1hdCk7XG59XG4iLCJpbXBvcnQge1xuICBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkLFxuICBEZWNvcmF0aW9uQnVpbGRlckVuZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJNaWQsXG4gIERlY29yYXRpb25CdWlsZGVyU3RhcnQsXG4gIEZsYXZvdXJSZXNvbHZlcixcbiAgSURlY29yYXRpb25CdWlsZGVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gZGVmYXVsdEZsYXZvdXJSZXNvbHZlcih0YXJnZXQ6IG9iamVjdCkge1xuICByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG59XG5cbmV4cG9ydCB0eXBlIERlY29yYXRvclR5cGVzID1cbiAgfCBDbGFzc0RlY29yYXRvclxuICB8IFByb3BlcnR5RGVjb3JhdG9yXG4gIHwgTWV0aG9kRGVjb3JhdG9yO1xuXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JGYWN0b3J5ID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBEZWNvcmF0b3JUeXBlcztcblxuZXhwb3J0IHR5cGUgRGVjb3JhdG9yRmFjdG9yeUFyZ3MgPSB7XG4gIGRlY29yYXRvcjogRGVjb3JhdG9yRmFjdG9yeTtcbiAgYXJncz86IGFueVtdO1xuICB0cmFuc2Zvcm0/OiAoYXJnczogYW55W10pID0+IGFueVtdO1xufTtcblxuZXhwb3J0IHR5cGUgRGVjb3JhdG9yRGF0YSA9IERlY29yYXRvclR5cGVzIHwgRGVjb3JhdG9yRmFjdG9yeUFyZ3M7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGRlY29yYXRvciBtYW5hZ2VtZW50IGNsYXNzIHRoYXQgaGFuZGxlcyBmbGF2b3VyZWQgZGVjb3JhdG9yc1xuICogQHN1bW1hcnkgVGhlIERlY29yYXRpb24gY2xhc3MgcHJvdmlkZXMgYSBidWlsZGVyIHBhdHRlcm4gZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBkZWNvcmF0b3JzIHdpdGggZGlmZmVyZW50IGZsYXZvdXJzLlxuICogSXQgc3VwcG9ydHMgcmVnaXN0ZXJpbmcsIGV4dGVuZGluZywgYW5kIGFwcGx5aW5nIGRlY29yYXRvcnMgd2l0aCBjb250ZXh0LWF3YXJlIGZsYXZvdXIgcmVzb2x1dGlvbi5cbiAqIFRoZSBjbGFzcyBpbXBsZW1lbnRzIGEgZmx1ZW50IGludGVyZmFjZSBmb3IgZGVmaW5pbmcsIGV4dGVuZGluZywgYW5kIGFwcGx5aW5nIGRlY29yYXRvcnMgd2l0aCBkaWZmZXJlbnQgZmxhdm91cnMsXG4gKiBhbGxvd2luZyBmb3IgZnJhbWV3b3JrLXNwZWNpZmljIGRlY29yYXRvciBpbXBsZW1lbnRhdGlvbnMgd2hpbGUgbWFpbnRhaW5pbmcgYSBjb25zaXN0ZW50IEFQSS5cbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGRlY29yYXRvciAoQ2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcilcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gT3B0aW9uYWwgZmxhdm91ciBwYXJhbWV0ZXIgZm9yIHRoZSBkZWNvcmF0b3IgY29udGV4dFxuICogQGNsYXNzXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgZGVjb3JhdGlvbiBmb3IgJ2NvbXBvbmVudCcgd2l0aCBkZWZhdWx0IGZsYXZvdXJcbiAqIGNvbnN0IGNvbXBvbmVudERlY29yYXRvciA9IG5ldyBEZWNvcmF0aW9uKClcbiAqICAgLmZvcignY29tcG9uZW50JylcbiAqICAgLmRlZmluZShjdXN0b21Db21wb25lbnREZWNvcmF0b3IpO1xuICpcbiAqIC8vIENyZWF0ZSBhIGZsYXZvdXJlZCBkZWNvcmF0aW9uXG4gKiBjb25zdCB2dWVDb21wb25lbnQgPSBuZXcgRGVjb3JhdGlvbigndnVlJylcbiAqICAgLmZvcignY29tcG9uZW50JylcbiAqICAgLmRlZmluZSh2dWVDb21wb25lbnREZWNvcmF0b3IpO1xuICpcbiAqIC8vIEFwcGx5IHRoZSBkZWNvcmF0aW9uXG4gKiBAY29tcG9uZW50RGVjb3JhdG9yXG4gKiBjbGFzcyBNeUNvbXBvbmVudCB7fVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGVjb3JhdGlvblxuICogICBwYXJ0aWNpcGFudCBSIGFzIEZsYXZvdXJSZXNvbHZlclxuICogICBwYXJ0aWNpcGFudCBGIGFzIERlY29yYXRvckZhY3RvcnlcbiAqXG4gKiAgIEMtPj5EOiBuZXcgRGVjb3JhdGlvbihmbGF2b3VyKVxuICogICBDLT4+RDogZm9yKGtleSlcbiAqICAgQy0+PkQ6IGRlZmluZShkZWNvcmF0b3JzKVxuICogICBELT4+RDogcmVnaXN0ZXIoa2V5LCBmbGF2b3VyLCBkZWNvcmF0b3JzKVxuICogICBELT4+RjogZGVjb3JhdG9yRmFjdG9yeShrZXksIGZsYXZvdXIpXG4gKiAgIEYtPj5SOiByZXNvbHZlKHRhcmdldClcbiAqICAgUi0tPj5GOiByZXNvbHZlZCBmbGF2b3VyXG4gKiAgIEYtPj5GOiBhcHBseSBkZWNvcmF0b3JzXG4gKiAgIEYtLT4+QzogZGVjb3JhdGVkIHRhcmdldFxuICovXG5leHBvcnQgY2xhc3MgRGVjb3JhdGlvbiBpbXBsZW1lbnRzIElEZWNvcmF0aW9uQnVpbGRlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIG1hcCBvZiByZWdpc3RlcmVkIGRlY29yYXRvcnNcbiAgICogQHN1bW1hcnkgU3RvcmVzIGFsbCByZWdpc3RlcmVkIGRlY29yYXRvcnMgb3JnYW5pemVkIGJ5IGtleSBhbmQgZmxhdm91clxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZGVjb3JhdG9yczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICB7XG4gICAgICAgIGRlY29yYXRvcnM/OiBTZXQ8RGVjb3JhdG9yRGF0YT47XG4gICAgICAgIGV4dHJhcz86IFNldDxEZWNvcmF0b3JEYXRhPjtcbiAgICAgIH1cbiAgICA+XG4gID4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIHRvIHJlc29sdmUgZmxhdm91ciBmcm9tIGEgdGFyZ2V0XG4gICAqIEBzdW1tYXJ5IFJlc29sdmVyIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB0aGUgYXBwcm9wcmlhdGUgZmxhdm91ciBmb3IgYSBnaXZlbiB0YXJnZXRcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZsYXZvdXJSZXNvbHZlcjogRmxhdm91clJlc29sdmVyID0gZGVmYXVsdEZsYXZvdXJSZXNvbHZlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldCBvZiBkZWNvcmF0b3JzIGZvciB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqL1xuICBwcml2YXRlIGRlY29yYXRvcnM/OiBTZXQ8RGVjb3JhdG9yRGF0YT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXQgb2YgYWRkaXRpb25hbCBkZWNvcmF0b3JzXG4gICAqL1xuICBwcml2YXRlIGV4dHJhcz86IFNldDxEZWNvcmF0b3JEYXRhPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgZGVjb3JhdG9yIGtleVxuICAgKi9cbiAgcHJpdmF0ZSBrZXk/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmbGF2b3VyOiBzdHJpbmcgPSBEZWZhdWx0Rmxhdm91cikge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGtleSBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBkZWNvcmF0aW9uIGNoYWluIHdpdGggdGhlIHNwZWNpZmllZCBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGRlY29yYXRvclxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlck1pZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICBmb3Ioa2V5OiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlck1pZCB7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgZGVjb3JhdG9ycyB0byB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqIEBzdW1tYXJ5IEludGVybmFsIG1ldGhvZCB0byBhZGQgZGVjb3JhdG9ycyB3aXRoIGFkZG9uIHN1cHBvcnRcbiAgICogQHBhcmFtIHtib29sZWFufSBbYWRkb249ZmFsc2VdIFdoZXRoZXIgdGhlIGRlY29yYXRvcnMgYXJlIGFkZG9uc1xuICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBcnJheSBvZiBkZWNvcmF0b3JzXG4gICAqIEByZXR1cm4ge3RoaXN9IEN1cnJlbnQgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICBwcml2YXRlIGRlY29yYXRlKFxuICAgIGFkZG9uOiBib29sZWFuID0gZmFsc2UsXG4gICAgLi4uZGVjb3JhdG9yczogRGVjb3JhdG9yRGF0YVtdXG4gICk6IHRoaXMge1xuICAgIGlmICghdGhpcy5rZXkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJrZXkgbXVzdCBiZSBwcm92aWRlZCBiZWZvcmUgZGVjb3JhdG9ycyBjYW4gYmUgYWRkZWRcIik7XG4gICAgaWYgKFxuICAgICAgKCFkZWNvcmF0b3JzIHx8ICFkZWNvcmF0b3JzLmxlbmd0aCkgJiZcbiAgICAgICFhZGRvbiAmJlxuICAgICAgdGhpcy5mbGF2b3VyICE9PSBEZWZhdWx0Rmxhdm91clxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJNdXN0IHByb3ZpZGUgb3ZlcnJpZGVzIG9yIGFkZG9ucyB0byBvdmVycmlkZSBvciBleHRlbmQgZGVjYWYncyBkZWNvcmF0b3JzXCJcbiAgICAgICk7XG4gICAgaWYgKHRoaXMuZmxhdm91ciA9PT0gRGVmYXVsdEZsYXZvdXIgJiYgYWRkb24pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWZhdWx0IGZsYXZvdXIgY2Fubm90IGJlIGV4dGVuZGVkXCIpO1xuXG4gICAgdGhpc1thZGRvbiA/IFwiZXh0cmFzXCIgOiBcImRlY29yYXRvcnNcIl0gPSBuZXcgU2V0KFtcbiAgICAgIC4uLih0aGlzW2FkZG9uID8gXCJleHRyYXNcIiA6IFwiZGVjb3JhdG9yc1wiXSB8fCBuZXcgU2V0KCkpLnZhbHVlcygpLFxuICAgICAgLi4uZGVjb3JhdG9ycyxcbiAgICBdKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIHRoZSBiYXNlIGRlY29yYXRvcnNcbiAgICogQHN1bW1hcnkgU2V0cyB0aGUgcHJpbWFyeSBkZWNvcmF0b3JzIGZvciB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqIEBwYXJhbSBkZWNvcmF0b3JzIERlY29yYXRvcnMgdG8gZGVmaW5lXG4gICAqIEByZXR1cm4gQnVpbGRlciBpbnN0YW5jZSBmb3IgZmluaXNoaW5nIHRoZSBjaGFpblxuICAgKi9cbiAgZGVmaW5lKFxuICAgIC4uLmRlY29yYXRvcnM6IERlY29yYXRvckRhdGFbXVxuICApOiBEZWNvcmF0aW9uQnVpbGRlckVuZCAmIERlY29yYXRpb25CdWlsZGVyQnVpbGQge1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRlKGZhbHNlLCAuLi5kZWNvcmF0b3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXh0ZW5kcyBleGlzdGluZyBkZWNvcmF0b3JzXG4gICAqIEBzdW1tYXJ5IEFkZHMgYWRkaXRpb25hbCBkZWNvcmF0b3JzIHRvIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICogQHBhcmFtIGRlY29yYXRvcnMgQWRkaXRpb25hbCBkZWNvcmF0b3JzXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyQnVpbGR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGJ1aWxkaW5nIHRoZSBkZWNvcmF0b3JcbiAgICovXG4gIGV4dGVuZCguLi5kZWNvcmF0b3JzOiBEZWNvcmF0b3JEYXRhW10pOiBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkIHtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZSh0cnVlLCAuLi5kZWNvcmF0b3JzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWNvcmF0b3JGYWN0b3J5KGtleTogc3RyaW5nLCBmOiBzdHJpbmcgPSBEZWZhdWx0Rmxhdm91cikge1xuICAgIGNvbnN0IGNvbnRleHREZWNvcmF0b3IgPSBmdW5jdGlvbiBjb250ZXh0RGVjb3JhdG9yKFxuICAgICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICAgKSB7XG4gICAgICBjb25zdCBmbGF2b3VyID0gRGVjb3JhdGlvbi5mbGF2b3VyUmVzb2x2ZXIodGFyZ2V0KTtcbiAgICAgIGNvbnN0IGNhY2hlID0gRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV07XG4gICAgICBsZXQgZGVjb3JhdG9ycztcbiAgICAgIGNvbnN0IGV4dHJhcyA9IGNhY2hlW2ZsYXZvdXJdXG4gICAgICAgID8gY2FjaGVbZmxhdm91cl0uZXh0cmFzXG4gICAgICAgIDogY2FjaGVbRGVmYXVsdEZsYXZvdXJdLmV4dHJhcztcbiAgICAgIGNvbnN0IGV4dHJhQXJncyA9IFtcbiAgICAgICAgLi4uKChjYWNoZVtEZWZhdWx0Rmxhdm91cl0gYXMgYW55KS5leHRyYXNcbiAgICAgICAgICA/IChjYWNoZVtEZWZhdWx0Rmxhdm91cl0gYXMgYW55KS5leHRyYXMudmFsdWVzKClcbiAgICAgICAgICA6IFtdKSxcbiAgICAgIF0ucmVkdWNlKChhY2N1bTogUmVjb3JkPG51bWJlciwgYW55PiwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZS5hcmdzKSBhY2N1bVtpXSA9IGUuYXJncztcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwge30pO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGNhY2hlICYmXG4gICAgICAgIGNhY2hlW2ZsYXZvdXJdICYmXG4gICAgICAgIGNhY2hlW2ZsYXZvdXJdLmRlY29yYXRvcnMgJiZcbiAgICAgICAgY2FjaGVbZmxhdm91cl0uZGVjb3JhdG9ycy5zaXplXG4gICAgICApIHtcbiAgICAgICAgZGVjb3JhdG9ycyA9IGNhY2hlW2ZsYXZvdXJdLmRlY29yYXRvcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvcmF0b3JzID0gY2FjaGVbRGVmYXVsdEZsYXZvdXJdLmRlY29yYXRvcnM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29yYXRvckFyZ3MgPSBbXG4gICAgICAgIC4uLihjYWNoZVtEZWZhdWx0Rmxhdm91cl0gYXMgYW55KS5kZWNvcmF0b3JzLnZhbHVlcygpLFxuICAgICAgXS5yZWR1Y2UoKGFjY3VtOiBSZWNvcmQ8bnVtYmVyLCBhbnk+LCBlLCBpKSA9PiB7XG4gICAgICAgIGlmIChlLmFyZ3MpIGFjY3VtW2ldID0gZS5hcmdzO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGNvbnN0IHRvQXBwbHkgPSBbXG4gICAgICAgIC4uLihkZWNvcmF0b3JzID8gZGVjb3JhdG9ycy52YWx1ZXMoKSA6IFtdKSxcbiAgICAgICAgLi4uKGV4dHJhcyA/IGV4dHJhcy52YWx1ZXMoKSA6IFtdKSxcbiAgICAgIF07XG5cbiAgICAgIHJldHVybiB0b0FwcGx5LnJlZHVjZShcbiAgICAgICAgKF8sIGQsIGkpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBkKSB7XG4gICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgeyBkZWNvcmF0b3IsIGFyZ3MsIHRyYW5zZm9ybSB9ID0gZCBhcyBEZWNvcmF0b3JGYWN0b3J5QXJncztcbiAgICAgICAgICAgICAgY29uc3QgYXJneiA9XG4gICAgICAgICAgICAgICAgYXJncyB8fCBpIDwgKGRlY29yYXRvcnMgPyBkZWNvcmF0b3JzLnNpemUgOiAwKVxuICAgICAgICAgICAgICAgICAgPyBkZWNvcmF0b3JBcmdzW2ldXG4gICAgICAgICAgICAgICAgICA6IGV4dHJhQXJnc1tpIC0gKGRlY29yYXRvcnMgPyBkZWNvcmF0b3JzLnNpemUgOiAwKV0gfHxcbiAgICAgICAgICAgICAgICAgICAgKGRlY29yYXRvcnMgPyBkZWNvcmF0b3JBcmdzW2kgLSBkZWNvcmF0b3JzLnNpemVdIDogW10pO1xuXG4gICAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gdHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgPyB0cmFuc2Zvcm0oYXJneiB8fCBbXSlcbiAgICAgICAgICAgICAgICA6IGFyZ3ogfHwgW107XG4gICAgICAgICAgICAgIHJldHVybiAoZGVjb3JhdG9yKC4uLnRyYW5zZm9ybWVkKSBhcyBhbnkpKFxuICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgcmV0dXJuIChkIGFzIGFueSkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZGVjb3JhdG9yIHR5cGU6ICR7dHlwZW9mIGR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7IHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IgfVxuICAgICAgKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0RGVjb3JhdG9yLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IFtmLCBrZXldLmpvaW4oXCJfZGVjb3JhdG9yX2Zvcl9cIiksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbnRleHREZWNvcmF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIGZpbmFsIGRlY29yYXRvciBmdW5jdGlvblxuICAgKiBAc3VtbWFyeSBCdWlsZHMgYW5kIHJldHVybnMgdGhlIGRlY29yYXRvciBmYWN0b3J5IGZ1bmN0aW9uXG4gICAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55PywgVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I/KTogYW55fSBUaGUgZ2VuZXJhdGVkIGRlY29yYXRvciBmdW5jdGlvblxuICAgKi9cbiAgYXBwbHkoKTogKFxuICAgIHRhcmdldDogYW55LFxuICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICkgPT4gYW55IHtcbiAgICBpZiAoIXRoaXMua2V5KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8ga2V5IHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIERlY29yYXRpb24ucmVnaXN0ZXIoXG4gICAgICB0aGlzLmtleSxcbiAgICAgIHRoaXMuZmxhdm91cixcbiAgICAgIHRoaXMuZGVjb3JhdG9ycyB8fCBuZXcgU2V0KCksXG4gICAgICB0aGlzLmV4dHJhc1xuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdG9yRmFjdG9yeSh0aGlzLmtleSwgdGhpcy5mbGF2b3VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGRlY29yYXRvcnMgZm9yIGEgc3BlY2lmaWMga2V5IGFuZCBmbGF2b3VyXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIG1ldGhvZCB0byBzdG9yZSBkZWNvcmF0b3JzIGluIHRoZSBzdGF0aWMgcmVnaXN0cnlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBEZWNvcmF0b3Iga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIERlY29yYXRvciBmbGF2b3VyXG4gICAqIEBwYXJhbSBbZGVjb3JhdG9yc10gUHJpbWFyeSBkZWNvcmF0b3JzXG4gICAqIEBwYXJhbSBbZXh0cmFzXSBBZGRpdGlvbmFsIGRlY29yYXRvcnNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZsYXZvdXI6IHN0cmluZyxcbiAgICBkZWNvcmF0b3JzPzogU2V0PERlY29yYXRvckRhdGE+LFxuICAgIGV4dHJhcz86IFNldDxEZWNvcmF0b3JEYXRhPlxuICApIHtcbiAgICBpZiAoIWtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8ga2V5IHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIH1cbiAgICBpZiAoIWRlY29yYXRvcnMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBkZWNvcmF0b3JzIHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIGlmICghZmxhdm91cilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGZsYXZvdXIgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG5cbiAgICBpZiAoIURlY29yYXRpb24uZGVjb3JhdG9yc1trZXldKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XSA9IHt9O1xuICAgIGlmICghRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0pXG4gICAgICBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXSA9IHt9O1xuICAgIGlmIChkZWNvcmF0b3JzKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycztcbiAgICBpZiAoZXh0cmFzKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5leHRyYXMgPSBleHRyYXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGdsb2JhbCBmbGF2b3VyIHJlc29sdmVyXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGRlY29yYXRvciBmbGF2b3Vyc1xuICAgKiBAcGFyYW0ge0ZsYXZvdXJSZXNvbHZlcn0gcmVzb2x2ZXIgRnVuY3Rpb24gdG8gcmVzb2x2ZSBmbGF2b3Vyc1xuICAgKi9cbiAgc3RhdGljIHNldEZsYXZvdXJSZXNvbHZlcihyZXNvbHZlcjogRmxhdm91clJlc29sdmVyKSB7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIHN0YXRpYyBmb3Ioa2V5OiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlck1pZCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKCkuZm9yKGtleSk7XG4gIH1cblxuICBzdGF0aWMgZmxhdm91cmVkQXMoZmxhdm91cjogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVjb3JhdGlvbiB9IGZyb20gXCIuL0RlY29yYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIGZhY3RvcnkgZm9yIG1vZGVsIGF0dHJpYnV0ZXNcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBtYXJrcyBjbGFzcyBwcm9wZXJ0aWVzIGFzIG1vZGVsIGF0dHJpYnV0ZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleT1Nb2RlbEtleXMuQVRUUklCVVRFXSAtIFRoZSBtZXRhZGF0YSBrZXkgdW5kZXIgd2hpY2ggdG8gc3RvcmUgdGhlIHByb3BlcnR5IG5hbWVcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKG9iamVjdCwgYW55Pyk6IHZvaWR9IC0gRGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgcmVnaXN0ZXJzIHRoZSBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIHByb3BcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgcGFydGljaXBhbnQgRCBhcyBEZWNvcmF0b3JcbiAqICAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAqXG4gKiAgICBELT4+TTogQ2hlY2sgaWYga2V5IGV4aXN0c1xuICogICAgYWx0IGtleSBleGlzdHNcbiAqICAgICAgICBNLS0+PkQ6IFJldHVybiBleGlzdGluZyBwcm9wcyBhcnJheVxuICogICAgZWxzZSBrZXkgZG9lc24ndCBleGlzdFxuICogICAgICAgIEQtPj5NOiBDcmVhdGUgbmV3IHByb3BzIGFycmF5XG4gKiAgICBlbmRcbiAqICAgIEQtPj5NOiBDaGVjayBpZiBwcm9wZXJ0eSBleGlzdHNcbiAqICAgIGFsdCBwcm9wZXJ0eSBub3QgaW4gYXJyYXlcbiAqICAgICAgICBELT4+TTogQWRkIHByb3BlcnR5IHRvIGFycmF5XG4gKiAgICBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3Aoa2V5OiBzdHJpbmcgPSBNb2RlbEtleXMuQVRUUklCVVRFKSB7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShmdW5jdGlvbiBwcm9wKG1vZGVsOiBvYmplY3QsIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgICBsZXQgcHJvcHM6IHN0cmluZ1tdO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbCwga2V5KSkge1xuICAgICAgICBwcm9wcyA9IChtb2RlbCBhcyBhbnkpW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kZWwsIGtleSwge1xuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHByb3BzID0gKG1vZGVsIGFzIGFueSlba2V5XTtcbiAgICAgIH1cbiAgICAgIGlmICghcHJvcHMuaW5jbHVkZXMocHJvcGVydHlLZXkgYXMgc3RyaW5nKSlcbiAgICAgICAgcHJvcHMucHVzaChwcm9wZXJ0eUtleSBhcyBzdHJpbmcpO1xuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbWJpbmVkIHByb3BlcnR5IGRlY29yYXRvciBmYWN0b3J5IGZvciBtZXRhZGF0YSBhbmQgYXR0cmlidXRlIG1hcmtpbmdcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBib3RoIG1hcmtzIGEgcHJvcGVydHkgYXMgYSBtb2RlbCBhdHRyaWJ1dGUgYW5kIGFzc2lnbnMgbWV0YWRhdGEgdG8gaXRcbiAqXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBtZXRhZGF0YSBrZXlcbiAqIEBwYXJhbSB7Vn0gdmFsdWUgLSBUaGUgbWV0YWRhdGEgdmFsdWUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHByb3BlcnR5XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gLSBDb21iaW5lZCBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqIEBmdW5jdGlvbiBwcm9wTWV0YWRhdGFcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTWV0YWRhdGE8Vj4oa2V5OiBzdHJpbmcsIHZhbHVlOiBWKSB7XG4gIHJldHVybiBhcHBseShwcm9wKCksIG1ldGFkYXRhPFY+KGtleSwgdmFsdWUpKTtcbn1cbiIsIi8qKlxuICogQHN1bW1hcnkgTWltaWNzIEphdmEncyBTdHJpbmcncyBIYXNoIGltcGxlbWVudGF0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wgfCBEYXRlfSBvYmpcbiAqIEByZXR1cm4ge251bWJlcn0gaGFzaCB2YWx1ZSBvZiBvYmpcbiAqXG4gKiBAZnVuY3Rpb24gaGFzaENvZGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaENvZGUob2JqOiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wgfCBEYXRlKTogc3RyaW5nIHtcbiAgb2JqID0gU3RyaW5nKG9iaik7XG4gIGxldCBoYXNoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBvYmouY2hhckNvZGVBdChpKTtcbiAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgY2hhcmFjdGVyO1xuICAgIGhhc2ggPSBoYXNoICYgaGFzaDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gIH1cbiAgcmV0dXJuIGhhc2gudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRlaCB0eXBlIGZvciBhIEhhc2hpbmcgZnVuY3Rpb25cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgdHlwZSBIYXNoaW5nRnVuY3Rpb24gPSAodmFsdWU6IGFueSwgLi4uYXJnczogYW55W10pID0+IHN0cmluZztcblxuLyoqXG4gKiBAc3VtbWFyeSBIYXNoZXMgYW4gb2JqZWN0IGJ5IGNvbWJpbmluZyB0aGUgaGFzaCBvZiBhbGwgaXRzIHByb3BlcnRpZXNcbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9ialxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgcmVzdWx0aW5nIGhhc2hcbiAqXG4gKiBAZnVuY3Rpb24gaGFzaE9ialxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoT2JqKG9iajogUmVjb3JkPHN0cmluZywgYW55PiB8IGFueVtdKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaFJlZHVjZXIgPSBmdW5jdGlvbiAoaDogbnVtYmVyIHwgc3RyaW5nLCBlbDogYW55KTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICBjb25zdCBlbEhhc2ggPSBoYXNoRnVuY3Rpb24oZWwpO1xuXG4gICAgaWYgKHR5cGVvZiBlbEhhc2ggPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gaGFzaEZ1bmN0aW9uKCgoaCBhcyBzdHJpbmcpIHx8IFwiXCIpICsgaGFzaEZ1bmN0aW9uKGVsKSk7XG5cbiAgICBoID0gaCB8fCAwO1xuICAgIGggPSAoKGggYXMgbnVtYmVyKSA8PCA1KSAtIChoIGFzIG51bWJlcikgKyBlbEhhc2g7XG4gICAgcmV0dXJuIGggJiBoO1xuICB9O1xuXG4gIGNvbnN0IGZ1bmM6IEhhc2hpbmdGdW5jdGlvbiA9IGhhc2hDb2RlO1xuXG4gIGNvbnN0IGhhc2hGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZTogYW55KTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gXCJcIjtcbiAgICBpZiAoW1wic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwic3ltYm9sXCJdLmluZGV4T2YodHlwZW9mIHZhbHVlKSAhPT0gLTEpXG4gICAgICByZXR1cm4gZnVuYyh2YWx1ZS50b1N0cmluZygpKTtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gZnVuYyh2YWx1ZS5nZXRUaW1lKCkpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLnJlZHVjZShoYXNoUmVkdWNlciwgdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gKE9iamVjdC52YWx1ZXModmFsdWUpIGFzIChzdHJpbmcgfCBudW1iZXIpW10pLnJlZHVjZShcbiAgICAgIGhhc2hSZWR1Y2VyLFxuICAgICAgdW5kZWZpbmVkIGFzIHVua25vd24gYXMgc3RyaW5nIHwgbnVtYmVyXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCByZXN1bHQgPSBPYmplY3QudmFsdWVzKG9iaikucmVkdWNlKGhhc2hSZWR1Y2VyLCAwKTtcblxuICByZXR1cm4gKHR5cGVvZiByZXN1bHQgPT09IFwibnVtYmVyXCIgPyBNYXRoLmFicyhyZXN1bHQpIDogcmVzdWx0KS50b1N0cmluZygpO1xufVxuXG5leHBvcnQgY29uc3QgRGVmYXVsdEhhc2hpbmdNZXRob2QgPSBcImRlZmF1bHRcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFuYWdlcyBoYXNoaW5nIG1ldGhvZHMgYW5kIHByb3ZpZGVzIGEgdW5pZmllZCBoYXNoaW5nIGludGVyZmFjZVxuICogQHN1bW1hcnkgQSB1dGlsaXR5IGNsYXNzIHRoYXQgcHJvdmlkZXMgYSByZWdpc3RyeSBmb3IgZGlmZmVyZW50IGhhc2hpbmcgZnVuY3Rpb25zIGFuZCBtZXRob2RzIHRvIGhhc2ggb2JqZWN0cy5cbiAqIFRoZSBjbGFzcyBtYWludGFpbnMgYSBjYWNoZSBvZiByZWdpc3RlcmVkIGhhc2hpbmcgZnVuY3Rpb25zIGFuZCBhbGxvd3Mgc2V0dGluZyBhIGRlZmF1bHQgaGFzaGluZyBtZXRob2QuXG4gKiBJdCBwcmV2ZW50cyBkaXJlY3QgaW5zdGFudGlhdGlvbiBhbmQgcHJvdmlkZXMgc3RhdGljIG1ldGhvZHMgZm9yIHJlZ2lzdHJhdGlvbiBhbmQgaGFzaGluZy5cbiAqXG4gKiBAY2xhc3MgSGFzaGluZ1xuICogQGNhdGVnb3J5IE1vZGVsXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFJlZ2lzdGVyIGEgY3VzdG9tIGhhc2hpbmcgZnVuY3Rpb25cbiAqIEhhc2hpbmcucmVnaXN0ZXIoJ21kNScsIChvYmopID0+IGNyZWF0ZU1ENUhhc2gob2JqKSwgdHJ1ZSk7XG4gKlxuICogLy8gSGFzaCBhbiBvYmplY3QgdXNpbmcgZGVmYXVsdCBtZXRob2RcbiAqIGNvbnN0IGhhc2gxID0gSGFzaGluZy5oYXNoKG15T2JqZWN0KTtcbiAqXG4gKiAvLyBIYXNoIHVzaW5nIHNwZWNpZmljIG1ldGhvZFxuICogY29uc3QgaGFzaDIgPSBIYXNoaW5nLmhhc2gobXlPYmplY3QsICdtZDUnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSGFzaGluZyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCBkZWZhdWx0IGhhc2hpbmcgbWV0aG9kIGlkZW50aWZpZXJcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGN1cnJlbnQ6IHN0cmluZyA9IERlZmF1bHRIYXNoaW5nTWV0aG9kO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2FjaGUgb2YgcmVnaXN0ZXJlZCBoYXNoaW5nIGZ1bmN0aW9uc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY2FjaGU6IFJlY29yZDxzdHJpbmcsIEhhc2hpbmdGdW5jdGlvbj4gPSB7XG4gICAgZGVmYXVsdDogaGFzaE9iaixcbiAgfTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlZ2lzdGVyZWQgaGFzaGluZyBmdW5jdGlvblxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgaGFzaGluZyBmdW5jdGlvbiBmcm9tIHRoZSBjYWNoZSBieSBpdHMga2V5LiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIG1ldGhvZCBpcyBub3QgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBoYXNoaW5nIGZ1bmN0aW9uIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4ge0hhc2hpbmdGdW5jdGlvbn0gVGhlIHJlcXVlc3RlZCBoYXNoaW5nIGZ1bmN0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXQoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIGlmIChrZXkgaW4gdGhpcy5jYWNoZSkgcmV0dXJuIHRoaXMuY2FjaGVba2V5XTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGhhc2hpbmcgbWV0aG9kIHJlZ2lzdGVyZWQgdW5kZXIgJHtrZXl9YCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIG5ldyBoYXNoaW5nIGZ1bmN0aW9uXG4gICAqIEBzdW1tYXJ5IEFkZHMgYSBuZXcgaGFzaGluZyBmdW5jdGlvbiB0byB0aGUgcmVnaXN0cnkuIE9wdGlvbmFsbHkgc2V0cyBpdCBhcyB0aGUgZGVmYXVsdCBtZXRob2QuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIGtleSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGhhc2hpbmcgZnVuY3Rpb25cbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmdW5jOiBIYXNoaW5nRnVuY3Rpb24sXG4gICAgc2V0RGVmYXVsdCA9IGZhbHNlXG4gICk6IHZvaWQge1xuICAgIGlmIChrZXkgaW4gdGhpcy5jYWNoZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSGFzaGluZyBtZXRob2QgJHtrZXl9IGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgIHRoaXMuY2FjaGVba2V5XSA9IGZ1bmM7XG4gICAgaWYgKHNldERlZmF1bHQpIHRoaXMuY3VycmVudCA9IGtleTtcbiAgfVxuXG4gIHN0YXRpYyBoYXNoKG9iajogYW55LCBtZXRob2Q/OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgaWYgKCFtZXRob2QpIHJldHVybiB0aGlzLmdldCh0aGlzLmN1cnJlbnQpKG9iaiwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KG1ldGhvZCkob2JqLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHN0YXRpYyBzZXREZWZhdWx0KG1ldGhvZDogc3RyaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5nZXQobWV0aG9kKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUywgVkFMSURBVElPTl9QQVJFTlRfS0VZIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi9zdHJpbmdzXCI7XG5cbmNvbnN0IGZhbGxiYWNrR2V0UGFyZW50ID0gKHRhcmdldDogYW55KSA9PiB7XG4gIHJldHVybiB0YXJnZXRbVkFMSURBVElPTl9QQVJFTlRfS0VZXTtcbn07XG5cbmNvbnN0IGZhbGxiYWNrR2V0VmFsdWUgPSAodGFyZ2V0OiBhbnksIHByb3A6IHN0cmluZykgPT4ge1xuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIHByb3ApKVxuICAgIHRocm93IG5ldyBFcnJvcihzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlBST1BFUlRZX05PVF9FWElTVCwgcHJvcCkpO1xuICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xufTtcblxuLyoqXG4gKiBQcm94eSBvYmplY3QgdGhhdCBwcm92aWRlcyBwYXRoLWJhc2VkIGFjY2VzcyB0byBuZXN0ZWQgcHJvcGVydGllc1xuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgdGFyZ2V0IG9iamVjdCBiZWluZyBwcm94aWVkXG4gKi9cbmV4cG9ydCB0eXBlIFBhdGhQcm94eTxUPiA9IFQgJiB7XG4gIC8vIFtQUk9YWV9QUk9QXTogYm9vbGVhbjtcbiAgZ2V0VmFsdWVGcm9tUGF0aDogKHBhdGg6IHN0cmluZywgZmFsbGJhY2s/OiBhbnkpID0+IGFueTtcbn07XG5cbi8qKlxuICogU3RhbmRhcmQgcGF0aCByZXNvbHV0aW9uIHV0aWxpdHkgZm9yIGFjY2Vzc2luZyBuZXN0ZWQgb2JqZWN0IHByb3BlcnRpZXMuXG4gKiBQcm92aWRlcyBjb25zaXN0ZW50IGRvdC1ub3RhdGlvbiBhY2Nlc3MgdG8gYm90aCBwYXJlbnQgYW5kIGNoaWxkIHByb3BlcnRpZXNcbiAqIGFjcm9zcyBjb21wbGV4IG9iamVjdCBzdHJ1Y3R1cmVzLlxuICpcbiAqIC0gRG90LW5vdGF0aW9uIHBhdGggcmVzb2x1dGlvbiAoJ29iamVjdC5jaGlsZC5wcm9wZXJ0eScpXG4gKiAtIFBhcmVudCB0cmF2ZXJzYWwgdXNpbmcgJy4uLycgbm90YXRpb25cbiAqIC0gQ29uZmlndXJhYmxlIHByb3BlcnR5IGFjY2VzcyBiZWhhdmlvclxuICogLSBOdWxsL3VuZGVmaW5lZCBzYWZldHkgY2hlY2tzXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXRoUHJveHlFbmdpbmUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHBhdGgtYXdhcmUgcHJveHkgZm9yIHRoZSB0YXJnZXQgb2JqZWN0XG4gICAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIHRhcmdldCBvYmplY3RcbiAgICogQHBhcmFtIHtUfSByb290VGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgdG8gcHJveHlcbiAgICogQHBhcmFtIG9wdHMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIG9wdHMuZ2V0VmFsdWUgLSBDdXN0b20gZnVuY3Rpb24gdG8gZ2V0IHByb3BlcnR5IHZhbHVlXG4gICAqIEBwYXJhbSBvcHRzLmdldFBhcmVudCAtIEN1c3RvbSBmdW5jdGlvbiB0byBnZXQgcGFyZW50IG9iamVjdFxuICAgKiBAcGFyYW0gb3B0cy5pZ25vcmVVbmRlZmluZWQgLSBXaGV0aGVyIHRvIGlnbm9yZSB1bmRlZmluZWQgdmFsdWVzIGluIHBhdGhzXG4gICAqIEBwYXJhbSBvcHRzLmlnbm9yZU51bGwgLSBXaGV0aGVyIHRvIGlnbm9yZSBudWxsIHZhbHVlcyBpbiBwYXRoc1xuICAgKiBAcmV0dXJucyBBIHByb3h5IG9iamVjdCB3aXRoIHBhdGggYWNjZXNzIGNhcGFiaWxpdGllc1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgICByb290VGFyZ2V0OiBULFxuICAgIG9wdHM/OiB7XG4gICAgICBnZXRWYWx1ZT86ICh0YXJnZXQ6IFQsIHByb3A6IHN0cmluZykgPT4gYW55O1xuICAgICAgZ2V0UGFyZW50PzogKHRhcmdldDogVCkgPT4gYW55O1xuICAgICAgaWdub3JlVW5kZWZpbmVkOiBib29sZWFuO1xuICAgICAgaWdub3JlTnVsbDogYm9vbGVhbjtcbiAgICB9XG4gICk6IFBhdGhQcm94eTxUPiB7XG4gICAgY29uc3QgeyBnZXRWYWx1ZSwgZ2V0UGFyZW50LCBpZ25vcmVVbmRlZmluZWQsIGlnbm9yZU51bGwgfSA9IHtcbiAgICAgIGdldFBhcmVudDogZmFsbGJhY2tHZXRQYXJlbnQsXG4gICAgICBnZXRWYWx1ZTogZmFsbGJhY2tHZXRWYWx1ZSxcbiAgICAgIGlnbm9yZU51bGw6IGZhbHNlLFxuICAgICAgaWdub3JlVW5kZWZpbmVkOiBmYWxzZSxcbiAgICAgIC4uLm9wdHMsXG4gICAgfTtcblxuICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHt9IGFzIGFueSwge1xuICAgICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuICAgICAgICBpZiAocHJvcCA9PT0gXCJnZXRWYWx1ZUZyb21QYXRoXCIpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHBhdGg6IHN0cmluZyk6IGFueSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFBhdGhQcm94eUVuZ2luZS5wYXJzZVBhdGgocGF0aCk7XG4gICAgICAgICAgICBsZXQgY3VycmVudDogYW55ID0gcm9vdFRhcmdldDtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgICAgICAgIGlmIChwYXJ0ID09PSBcIi4uXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBnZXRQYXJlbnQoY3VycmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQgfHwgdHlwZW9mIHBhcmVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBzZihcbiAgICAgICAgICAgICAgICAgICAgICBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLkNPTlRFWFRfTk9UX09CSkVDVF9DT01QQVJJU09OLFxuICAgICAgICAgICAgICAgICAgICAgIGkgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgIHBhdGhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IHBhcmVudDsgLy9QYXRoUHJveHlFbmdpbmUuY3JlYXRlKHBhcmVudFRhcmdldCwgb3B0cyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjdXJyZW50ID0gZ2V0VmFsdWUoY3VycmVudCwgcGFydCk7XG4gICAgICAgICAgICAgIGlmICghaWdub3JlVW5kZWZpbmVkICYmIHR5cGVvZiBjdXJyZW50ID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIHNmKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuUFJPUEVSVFlfSU5WQUxJRCwgcGF0aCwgcGFydClcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICghaWdub3JlTnVsbCAmJiBjdXJyZW50ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIHNmKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuUFJPUEVSVFlfSU5WQUxJRCwgcGF0aCwgcGFydClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJveHksIFBST1hZX1BST1AsIHtcbiAgICAvLyAgIHZhbHVlOiB0cnVlLCAvLyBvdmVyd3JpdGUgYnkgcHJveHkgYmVoYXZpb3JcbiAgICAvLyAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIC8vICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAvLyAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAvLyB9KTtcblxuICAgIHJldHVybiBwcm94eSBhcyBQYXRoUHJveHk8VD47XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgcGF0aCBzdHJpbmcgaW50byBpbmRpdmlkdWFsIGNvbXBvbmVudHNcbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBzdHJpbmcgdG8gcGFyc2UgKGUuZy4sIFwidXNlci5hZGRyZXNzLmNpdHlcIilcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgcGF0aCBjb21wb25lbnRzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHBhdGggaXMgaW52YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBpZiAodHlwZW9mIHBhdGggIT09IFwic3RyaW5nXCIgfHwgIXBhdGgudHJpbSgpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKHNmKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuSU5WQUxJRF9QQVRILCBwYXRoKSk7XG4gICAgcmV0dXJuIHBhdGgubWF0Y2goLyhcXC5cXC58W14vLl0rKS9nKSB8fCBbXTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWxFcnJvcnMgfSBmcm9tIFwiLi4vdmFsaWRhdGlvbi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEhlbHBlciBDbGFzcyB0byBob2xkIHRoZSBlcnJvciByZXN1bHRzXG4gKiBAZGVzY3JpcHRpb24gaG9sZHMgZXJyb3IgcmVzdWx0cyBpbiBhbiAnaW5kZXhhYmxlJyBtYW5uZXJcbiAqIHdoaWxlIHN0aWxsIHByb3ZpZGluZyB0aGUgc2FtZSByZXN1bHQgb24gdG9TdHJpbmdcbiAqXG4gKiBAcGFyYW0ge01vZGVsRXJyb3JzfSBlcnJvcnNcbiAqXG4gKiBAY2xhc3MgTW9kZWxFcnJvckRlZmluaXRpb25cbiAqXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsRXJyb3JEZWZpbml0aW9uIHtcbiAgW2luZGV4ZXI6IHN0cmluZ106XG4gICAgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+XG4gICAgfCAoKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkKTtcblxuICBjb25zdHJ1Y3RvcihlcnJvcnM6IE1vZGVsRXJyb3JzKSB7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIGVycm9ycykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlcnJvcnMsIHByb3ApICYmIGVycm9yc1twcm9wXSlcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMgYXMgYW55LCBwcm9wLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBlcnJvcnNbcHJvcF0sXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgT3V0cHV0cyB0aGUgY2xhc3MgdG8gYSBuaWNlIHJlYWRhYmxlIHN0cmluZ1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VsZjogYW55ID0gdGhpcyBhcyBhbnk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNlbGYpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoaykgPT5cbiAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2VsZiwgaykgJiZcbiAgICAgICAgICB0eXBlb2Ygc2VsZltrXSAhPT0gXCJmdW5jdGlvblwiXG4gICAgICApXG4gICAgICAucmVkdWNlKChhY2N1bTogc3RyaW5nLCBwcm9wKSA9PiB7XG4gICAgICAgIGxldCBwcm9wRXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZCA9IE9iamVjdC5rZXlzKHNlbGZbcHJvcF0pLnJlZHVjZShcbiAgICAgICAgICAocHJvcEFjY3VtOiB1bmRlZmluZWQgfCBzdHJpbmcsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwcm9wQWNjdW0pIHByb3BBY2N1bSA9IHNlbGZbcHJvcF1ba2V5XTtcbiAgICAgICAgICAgIGVsc2UgcHJvcEFjY3VtICs9IGBcXG4ke3NlbGZbcHJvcF1ba2V5XX1gO1xuICAgICAgICAgICAgcmV0dXJuIHByb3BBY2N1bTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChwcm9wRXJyb3IpIHtcbiAgICAgICAgICBwcm9wRXJyb3IgPSBgJHtwcm9wfSAtICR7cHJvcEVycm9yfWA7XG4gICAgICAgICAgaWYgKCFhY2N1bSkgYWNjdW0gPSBwcm9wRXJyb3I7XG4gICAgICAgICAgZWxzZSBhY2N1bSArPSBgXFxuJHtwcm9wRXJyb3J9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIFwiXCIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuLi8uLi91dGlscy9zdHJpbmdzXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhQcm94eSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25kaXRpb25hbEFzeW5jIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCB2YWxpZGF0b3JzIGluIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay5cbiAqIEBzdW1tYXJ5IFRoZSBCYXNlVmFsaWRhdG9yIGNsYXNzIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyB2YWxpZGF0b3IgaW1wbGVtZW50YXRpb25zLlxuICogSXQgaGFuZGxlcyB0eXBlIGNoZWNraW5nLCBlcnJvciBtZXNzYWdlIGZvcm1hdHRpbmcsIGFuZCBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdGhhdCBhbGwgdmFsaWRhdG9ycyBtdXN0IGltcGxlbWVudC5cbiAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgZXh0ZW5kZWQgYnkgc3BlY2lmaWMgdmFsaWRhdG9yIGNsYXNzZXMgdGhhdCBkZWZpbmUgdGhlaXIgb3duIHZhbGlkYXRpb24gbG9naWMuXG4gKlxuICogQHRlbXBsYXRlIFYgLSBWYWxpZGF0b3Igb3B0aW9ucyB0eXBlXG4gKiBAdGVtcGxhdGUgSXNBc3luYyAtIFdoZXRoZXIgdGhlIHZhbGlkYXRvciBpcyBhc3luYyAodHJ1ZSkgb3Igc3luYyAoZmFsc2UpLiBEZWZhdWx0IGBmYWxzZWAuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBhc3luYyAtIERlZmluZXMgaWYgdGhlIHZhbGlkYXRvciBpcyBhc3luYyAobXVzdCBtYXRjaCB0aGUgc3ViY2xhc3Mgc2lnbmF0dXJlKVxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBEZWZhdWx0IGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMgKGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0RFRkFVTFR9KVxuICogQHBhcmFtIHtzdHJpbmdbXX0gYWNjZXB0ZWRUeXBlcyAtIFR5cGUgbmFtZXMgdGhhdCB0aGlzIHZhbGlkYXRvciBhY2NlcHRzICh1c2VkIGZvciBydW50aW1lIHR5cGUgY2hlY2tpbmcpXG4gKlxuICogQGNsYXNzIEJhc2VWYWxpZGF0b3JcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIG9mIGEgc3luY2hyb25vdXMgdmFsaWRhdG9yXG4gKiBjbGFzcyBTeW5jVmFsaWRhdG9yIGV4dGVuZHMgQmFzZVZhbGlkYXRvcjxTb21lT3B0aW9ucywgZmFsc2U+IHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoZmFsc2UsIFwiU3luYyB2YWxpZGF0aW9uIGZhaWxlZFwiLCBTdHJpbmcubmFtZSk7XG4gKiAgIH1cbiAqXG4gKiAgIHB1YmxpYyBoYXNFcnJvcnModmFsdWU6IGFueSwgb3B0aW9ucz86IFNvbWVPcHRpb25zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAqICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKHRoaXMubWVzc2FnZSk7XG4gKiAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAqICAgfVxuICogfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIG9mIGFuIGFzeW5jaHJvbm91cyBjdXN0b20gdmFsaWRhdG9yXG4gKiBjbGFzcyBBc3luY1ZhbGlkYXRvciBleHRlbmRzIEJhc2VWYWxpZGF0b3I8U29tZU9wdGlvbnMsIHRydWU+IHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIodHJ1ZSwgXCJBc3luYyB2YWxpZGF0aW9uIGZhaWxlZFwiLCBTdHJpbmcubmFtZSk7XG4gKiAgIH1cbiAqXG4gKiAgIHB1YmxpYyBhc3luYyBoYXNFcnJvcnModmFsdWU6IGFueSwgb3B0aW9ucz86IFNvbWVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzb21lQXN5bmNDaGVjayh2YWx1ZSk7XG4gKiAgICAgaWYgKCFyZXN1bHQpIHJldHVybiB0aGlzLmdldE1lc3NhZ2UodGhpcy5tZXNzYWdlKTtcbiAqICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICogICB9XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIFZhbGlkYXRvciBTdWJjbGFzc1xuICogICBwYXJ0aWNpcGFudCBCIGFzIEJhc2VWYWxpZGF0b3JcbiAqXG4gKiAgIEMtPj5WOiBuZXcgQ3VzdG9tVmFsaWRhdG9yKGFzeW5jLCBtZXNzYWdlKVxuICogICBWLT4+Qjogc3VwZXIoYXN5bmMsIG1lc3NhZ2UsIGFjY2VwdGVkVHlwZXMpXG4gKiAgIEItPj5COiBTdG9yZSBtZXNzYWdlLCBhc3luYyBmbGFnLCBhbmQgYWNjZXB0ZWQgdHlwZXNcbiAqICAgQi0+PkI6IE9wdGlvbmFsbHkgd3JhcCBoYXNFcnJvcnMgd2l0aCB0eXBlIGNoZWNraW5nXG4gKiAgIEMtPj5WOiBoYXNFcnJvcnModmFsdWUsIG9wdGlvbnMpXG4gKiAgIGFsdCB2YWx1ZSB0eXBlIG5vdCBpbiBhY2NlcHRlZFR5cGVzXG4gKiAgICAgQi0tPj5DOiBUeXBlIGVycm9yIG1lc3NhZ2VcbiAqICAgZWxzZSB2YWx1ZSB0eXBlIGlzIGFjY2VwdGVkXG4gKiAgICAgVi0+PlY6IEN1c3RvbSB2YWxpZGF0aW9uIGxvZ2ljXG4gKiAgICAgVi0tPj5DOiBWYWxpZGF0aW9uIHJlc3VsdFxuICogICBlbmRcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVZhbGlkYXRvcjxcbiAgViBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMgPSBWYWxpZGF0b3JPcHRpb25zLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4ge1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFjY2VwdGVkVHlwZXM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgYXN5bmM/OiBBc3luYztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgYXN5bmM6IEFzeW5jLFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREVGQVVMVCxcbiAgICAuLi5hY2NlcHRlZFR5cGVzOiBzdHJpbmdbXVxuICApIHtcbiAgICB0aGlzLmFzeW5jID0gYXN5bmM7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblxuICAgIGlmIChhY2NlcHRlZFR5cGVzLmxlbmd0aCkgdGhpcy5hY2NlcHRlZFR5cGVzID0gYWNjZXB0ZWRUeXBlcztcbiAgICBpZiAodGhpcy5hY2NlcHRlZFR5cGVzKVxuICAgICAgdGhpcy5oYXNFcnJvcnMgPSB0aGlzLmNoZWNrVHlwZUFuZEhhc0Vycm9ycyhcbiAgICAgICAgdGhpcy5oYXNFcnJvcnMuYmluZCh0aGlzKSBhcyBhbnlcbiAgICAgICkgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGb3JtYXRzIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCBvcHRpb25hbCBhcmd1bWVudHNcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIGZvcm1hdHRlZCBlcnJvciBtZXNzYWdlIGJ5IHJlcGxhY2luZyBwbGFjZWhvbGRlcnMgd2l0aCBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIHN0cmluZyBmb3JtYXR0aW5nIHV0aWxpdHkgdG8gZ2VuZXJhdGUgY29uc2lzdGVudCBlcnJvciBtZXNzYWdlc1xuICAgKiBhY3Jvc3MgYWxsIHZhbGlkYXRvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCBwbGFjZWhvbGRlcnNcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgLSBWYWx1ZXMgdG8gaW5zZXJ0IGludG8gdGhlIG1lc3NhZ2UgdGVtcGxhdGVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGVycm9yIG1lc3NhZ2VcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldE1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIHJldHVybiBzZihtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHR5cGUtY2hlY2tpbmcgd3JhcHBlciBhcm91bmQgdGhlIGhhc0Vycm9ycyBtZXRob2RcbiAgICogQHN1bW1hcnkgV3JhcHMgdGhlIGhhc0Vycm9ycyBtZXRob2Qgd2l0aCB0eXBlIHZhbGlkYXRpb24gbG9naWMgdG8gZW5zdXJlIHRoYXRcbiAgICogdGhlIHZhbHVlIGJlaW5nIHZhbGlkYXRlZCBpcyBvZiBhbiBhY2NlcHRlZCB0eXBlIGJlZm9yZSBwZXJmb3JtaW5nIHNwZWNpZmljIHZhbGlkYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgY29uc3RydWN0aW9uIGlmIGFjY2VwdGVkVHlwZXMgYXJlIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1bmJvdW5kIC0gVGhlIG9yaWdpbmFsIGhhc0Vycm9ycyBtZXRob2QgdG8gYmUgd3JhcHBlZFxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyB0eXBlIGNoZWNraW5nIGJlZm9yZSBjYWxsaW5nIHRoZSBvcmlnaW5hbCBtZXRob2RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tUeXBlQW5kSGFzRXJyb3JzKFxuICAgIHVuYm91bmQ6IChcbiAgICAgIHZhbHVlOiBhbnksXG4gICAgICBvcHRpb25zPzogVixcbiAgICAgIHByb3h5PzogUGF0aFByb3h5PGFueT4sXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICkgPT4gQ29uZGl0aW9uYWxBc3luYzxBc3luYywgc3RyaW5nIHwgdW5kZWZpbmVkPlxuICApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKFxuICAgICAgdGhpczogQmFzZVZhbGlkYXRvcixcbiAgICAgIHZhbHVlOiBhbnksXG4gICAgICBvcHRpb25zOiBWLFxuICAgICAgcHJveHk/OiBQYXRoUHJveHk8YW55PixcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhdGhpcy5hY2NlcHRlZFR5cGVzKVxuICAgICAgICByZXR1cm4gdW5ib3VuZCh2YWx1ZSwgb3B0aW9ucywgcHJveHksIC4uLmFyZ3MpO1xuICAgICAgaWYgKCFSZWZsZWN0aW9uLmNoZWNrVHlwZXModmFsdWUsIHRoaXMuYWNjZXB0ZWRUeXBlcykpXG4gICAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgICAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFLFxuICAgICAgICAgIHRoaXMuYWNjZXB0ZWRUeXBlcy5qb2luKFwiLCBcIiksXG4gICAgICAgICAgdHlwZW9mIHZhbHVlXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdW5ib3VuZCh2YWx1ZSwgb3B0aW9ucywgcHJveHksIC4uLmFyZ3MpO1xuICAgIH0uYmluZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIGEgdmFsdWUgYWdhaW5zdCBzcGVjaWZpYyB2YWxpZGF0aW9uIHJ1bGVzXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIHZhbGlkYXRvciBzdWJjbGFzc2VzLlxuICAgKiBUaGlzIG1ldGhvZCBjb250YWlucyB0aGUgY29yZSB2YWxpZGF0aW9uIGxvZ2ljIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdmFsdWVcbiAgICogaXMgdmFsaWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpYyBydWxlcyBvZiB0aGUgdmFsaWRhdG9yLiBJZiB0aGUgdmFsdWUgaXMgdmFsaWQsXG4gICAqIHRoZSBtZXRob2QgcmV0dXJucyB1bmRlZmluZWQ7IG90aGVyd2lzZSwgaXQgcmV0dXJucyBhbiBlcnJvciBtZXNzYWdlLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgViAtIFR5cGUgb2YgdGhlIG9wdGlvbnMgb2JqZWN0IHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgdmFsaWRhdG9yXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge1Z9IFtvcHRpb25zXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgY3VzdG9taXppbmcgdmFsaWRhdGlvbiBiZWhhdmlvclxuICAgKiBAcGFyYW0ge1BhdGhQcm94eTxhbnk+fSBwcm94eSAtXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqXG4gICAqIEBzZWUgTW9kZWwjdmFsaWRhdGVcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zPzogVixcbiAgICBwcm94eT86IFBhdGhQcm94eTxhbnk+XG4gICk6IENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIHN0cmluZyB8IHVuZGVmaW5lZD47XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IER1Y2sgdHlwaW5nIGZvciBWYWxpZGF0b3JzXG4gICAqIEBwYXJhbSB2YWxcbiAgICovXG4gIHN0YXRpYyBpc1ZhbGlkYXRvcih2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWwuY29uc3RydWN0b3IgJiYgISF2YWxbXCJoYXNFcnJvcnNcIl07XG4gIH1cbn1cbiIsImltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgUGF0aFByb3h5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBCYXNlVmFsaWRhdG9yIH0gZnJvbSBcIi4vQmFzZVZhbGlkYXRvclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQWJzdHJhY3QgY2xhc3MgZm9yIGRlZmluaW5nIHN5bmNocm9ub3VzIHZhbGlkYXRvcnMuXG4gKlxuICogVGhpcyBjbGFzcyBleHRlbmRzIHRoZSBiYXNlIHtAbGluayBCYXNlVmFsaWRhdG9yfSBhbmQgZW5mb3JjZXMgdGhhdCBhbnkgaW1wbGVtZW50YXRpb24gb2YgYGhhc0Vycm9yc2AgbXVzdCBiZSBzeW5jaHJvbm91cy5cbiAqXG4gKiBVc2UgdGhpcyB3aGVuIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3MgaXMgaW1tZWRpYXRlIGFuZCBkb2VzIG5vdCByZXF1aXJlIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIGEgc3luY2hyb25vdXMgdmFsaWRhdG9yIHRoYXQgY2hlY2tzIGlmIGEgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhblxuICogY2xhc3MgR3JlYXRlclRoYW5WYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8eyBndD86IG51bWJlciB9PiB7XG4gKiAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IFwiVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gezB9XCIpIHtcbiAqICAgICBzdXBlcihtZXNzYWdlKTtcbiAqICAgfVxuICpcbiAqICAgaGFzRXJyb3JzKHZhbHVlOiBudW1iZXIsIG9wdGlvbnM/OiB7IGd0PzogbnVtYmVyIH0pIHtcbiAqICAgICBjb25zdCBtaW5WYWx1ZSA9IG9wdGlvbnM/Lmd0ID8/IDA7XG4gKiAgICAgaWYgKHZhbHVlIDw9IG1pblZhbHVlKSB7XG4gKiAgICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKCk7XG4gKiAgICAgfVxuICogICAgIHJldHVybiB1bmRlZmluZWQ7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBFeGFtcGxlIHVzYWdlOlxuICogY29uc3QgdmFsaWRhdG9yID0gbmV3IEdyZWF0ZXJUaGFuVmFsaWRhdG9yKCk7XG4gKiBjb25zdCBlcnJvciA9IHZhbGlkYXRvci5oYXNFcnJvcnMoMTAsIHsgZ3Q6IDE1IH0pO1xuICogaWYgKGVycm9yKSB7XG4gKiAgIGNvbnNvbGUubG9nKCdWYWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxNScpXG4gKiB9IGVsc2Uge1xuICogICBjb25zb2xlLmxvZygnVmFsdWUgaXMgdmFsaWQnKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIC0gSWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYGd0YCwgcmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIC0gT3RoZXJ3aXNlLCByZXR1cm5zIGB1bmRlZmluZWRgIGluZGljYXRpbmcgdmFsaWRhdGlvbiBzdWNjZXNzLlxuICpcbiAqIEBzZWUge0BsaW5rIEJhc2VWYWxpZGF0b3J9IEZvciB0aGUgYmFzZSB2YWxpZGF0b3IuXG4gKiBAc2VlIHtAbGluayBWYWxpZGF0b3JPcHRpb25zfSBGb3IgdGhlIGJhc2UgdmFsaWRhdG9yIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBWYWxpZGF0b3I8XG4gIFYgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zID0gVmFsaWRhdG9yT3B0aW9ucyxcbj4gZXh0ZW5kcyBCYXNlVmFsaWRhdG9yPFYsIGZhbHNlPiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkRFRkFVTFQsXG4gICAgLi4uYWNjZXB0ZWRUeXBlczogc3RyaW5nW11cbiAgKSB7XG4gICAgc3VwZXIoZmFsc2UsIG1lc3NhZ2UsIC4uLmFjY2VwdGVkVHlwZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgYSB2YWx1ZSBhZ2FpbnN0IHNwZWNpZmljIHZhbGlkYXRpb24gcnVsZXNcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgdmFsaWRhdG9yIHN1YmNsYXNzZXMuXG4gICAqIFRoaXMgbWV0aG9kIGNvbnRhaW5zIHRoZSBjb3JlIHZhbGlkYXRpb24gbG9naWMgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgYSB2YWx1ZVxuICAgKiBpcyB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljIHJ1bGVzIG9mIHRoZSB2YWxpZGF0b3IuIElmIHRoZSB2YWx1ZSBpcyB2YWxpZCxcbiAgICogdGhlIG1ldGhvZCByZXR1cm5zIHVuZGVmaW5lZDsgb3RoZXJ3aXNlLCBpdCByZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBvZiB0aGUgb3B0aW9ucyBvYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSB2YWxpZGF0b3JcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7Vn0gW29wdGlvbnNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBjdXN0b21pemluZyB2YWxpZGF0aW9uIGJlaGF2aW9yXG4gICAqIEBwYXJhbSB7UGF0aFByb3h5PGFueT59IHByb3h5IC1cbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICpcbiAgICogQHNlZSBNb2RlbCN2YWxpZGF0ZVxuICAgKi9cbiAgYWJzdHJhY3Qgb3ZlcnJpZGUgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9ucz86IFYsXG4gICAgcHJveHk/OiBQYXRoUHJveHk8YW55PlxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3JEZWZpbml0aW9uIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJVmFsaWRhdG9yUmVnaXN0cnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEJhc2UgSW1wbGVtZW50YXRpb24gb2YgYSBWYWxpZGF0b3IgUmVnaXN0cnlcbiAqXG4gKiBAcHJvcCB7VmFsaWRhdG9yW119IFt2YWxpZGF0b3JzXSB0aGUgaW5pdGlhbCB2YWxpZGF0b3JzIHRvIHJlZ2lzdGVyXG4gKlxuICogQGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5XG4gKiBAaW1wbGVtZW50cyBJVmFsaWRhdG9yUmVnaXN0cnk8VD5cbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnk8VCBleHRlbmRzIFZhbGlkYXRvcj5cbiAgaW1wbGVtZW50cyBJVmFsaWRhdG9yUmVnaXN0cnk8VD5cbntcbiAgcHJpdmF0ZSBjYWNoZTogYW55ID0ge307XG4gIHByaXZhdGUgY3VzdG9tS2V5Q2FjaGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoLi4udmFsaWRhdG9yczogKFZhbGlkYXRvckRlZmluaXRpb24gfCBWYWxpZGF0b3IpW10pIHtcbiAgICB0aGlzLmN1c3RvbUtleUNhY2hlID0ge307XG4gICAgdGhpcy5yZWdpc3RlciguLi52YWxpZGF0b3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSByZXRyaWV2ZXMgdGhlIGN1c3RvbSBrZXlzXG4gICAqL1xuICBnZXRDdXN0b21LZXlzKCk6IHsgW2luZGV4ZXI6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jdXN0b21LZXlDYWNoZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgcmV0cmlldmVzIHRoZSByZWdpc3RlcmVkIHZhbGlkYXRvcnMga2V5c1xuICAgKi9cbiAgZ2V0S2V5cygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY2FjaGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHZhbGlkYXRvclxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsaWRhdG9yS2V5IG9uZSBvZiB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzfVxuICAgKiBAcmV0dXJuIHtWYWxpZGF0b3IgfCB1bmRlZmluZWR9IHRoZSByZWdpc3RlcmVkIFZhbGlkYXRvciBvciB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm9ubyBtYXRjaGluZyB0aGUgcHJvdmlkZWQga2V5XG4gICAqL1xuICBnZXQ8VCBleHRlbmRzIFZhbGlkYXRvcj4odmFsaWRhdG9yS2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoISh2YWxpZGF0b3JLZXkgaW4gdGhpcy5jYWNoZSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjbGFzc09ySW5zdGFuY2UgPSB0aGlzLmNhY2hlW3ZhbGlkYXRvcktleV07XG4gICAgaWYgKFZhbGlkYXRvci5pc1ZhbGlkYXRvcihjbGFzc09ySW5zdGFuY2UpKSByZXR1cm4gY2xhc3NPckluc3RhbmNlIGFzIFQ7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBjbGFzc09ySW5zdGFuY2UuZGVmYXVsdCB8fCBjbGFzc09ySW5zdGFuY2U7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgY29uc3RydWN0b3IoKTtcbiAgICB0aGlzLmNhY2hlW3ZhbGlkYXRvcktleV0gPSBpbnN0YW5jZTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCB2YWxpZGF0b3JzIG9udG8gdGhlIHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBwYXJhbSB7VFtdIHwgVmFsaWRhdG9yRGVmaW5pdGlvbltdfSB2YWxpZGF0b3JcbiAgICovXG4gIHJlZ2lzdGVyPFQgZXh0ZW5kcyBWYWxpZGF0b3I+KFxuICAgIC4uLnZhbGlkYXRvcjogKFZhbGlkYXRvckRlZmluaXRpb24gfCBUKVtdXG4gICk6IHZvaWQge1xuICAgIHZhbGlkYXRvci5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICBpZiAoVmFsaWRhdG9yLmlzVmFsaWRhdG9yKHYpKSB7XG4gICAgICAgIC8vIGNvbnN0IGsgPVxuXG4gICAgICAgIGlmICgodiBhcyBWYWxpZGF0b3JEZWZpbml0aW9uKS52YWxpZGF0aW9uS2V5IGluIHRoaXMuY2FjaGUpIHJldHVybjtcbiAgICAgICAgdGhpcy5jYWNoZVsodiBhcyBWYWxpZGF0b3JEZWZpbml0aW9uKS52YWxpZGF0aW9uS2V5XSA9IHY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IHZhbGlkYXRpb25LZXksIHZhbGlkYXRvciwgc2F2ZSB9ID0gdiBhcyBWYWxpZGF0b3JEZWZpbml0aW9uO1xuICAgICAgICBpZiAodmFsaWRhdGlvbktleSBpbiB0aGlzLmNhY2hlKSByZXR1cm47XG4gICAgICAgIHRoaXMuY2FjaGVbdmFsaWRhdGlvbktleV0gPSB2YWxpZGF0b3I7XG4gICAgICAgIGlmICghc2F2ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgb2JqW3ZhbGlkYXRpb25LZXkudG9VcHBlckNhc2UoKV0gPSB2YWxpZGF0aW9uS2V5O1xuXG4gICAgICAgIHRoaXMuY3VzdG9tS2V5Q2FjaGUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmN1c3RvbUtleUNhY2hlLCBvYmopO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JzL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgSVZhbGlkYXRvclJlZ2lzdHJ5LCBWYWxpZGF0b3JEZWZpbml0aW9uIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFZhbGlkYXRvclJlZ2lzdHJ5IH0gZnJvbSBcIi4vVmFsaWRhdG9ycy9WYWxpZGF0b3JSZWdpc3RyeVwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFN0YXRpYyBjbGFzcyBhY3RpbmcgYXMgYSBuYW1lc3BhY2UgZm9yIHRoZSBWYWxpZGF0aW9uXG4gKlxuICogQGNsYXNzIFZhbGlkYXRpb25cbiAqIEBzdGF0aWNcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbiB7XG4gIHByaXZhdGUgc3RhdGljIGFjdGluZ1ZhbGlkYXRvclJlZ2lzdHJ5PzogSVZhbGlkYXRvclJlZ2lzdHJ5PFZhbGlkYXRvcj4gPVxuICAgIHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHN0YXRpYyBsb2FkZWREZWNvcmF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eURlY29yYXRvcj4gPSB7fTtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGFjdGluZyBWYWxpZGF0b3JSZWdpc3RyeVxuICAgKlxuICAgKiBAcGFyYW0ge0lWYWxpZGF0b3JSZWdpc3RyeX0gdmFsaWRhdG9yUmVnaXN0cnkgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmFsaWRhdG9yIFJlZ2lzdHJ5XG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oVmFsaWRhdG9yKTogVmFsaWRhdG9yfSBbbWlncmF0aW9uSGFuZGxlcl0gdGhlIG1ldGhvZCB0byBtYXAgdGhlIHZhbGlkYXRvciBpZiByZXF1aXJlZDtcbiAgICovXG4gIHN0YXRpYyBzZXRSZWdpc3RyeShcbiAgICB2YWxpZGF0b3JSZWdpc3RyeTogSVZhbGlkYXRvclJlZ2lzdHJ5PFZhbGlkYXRvcj4sXG4gICAgbWlncmF0aW9uSGFuZGxlcj86ICh2YWxpZGF0b3I6IFZhbGlkYXRvcikgPT4gVmFsaWRhdG9yXG4gICkge1xuICAgIGlmIChtaWdyYXRpb25IYW5kbGVyICYmIFZhbGlkYXRpb24uYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnkpXG4gICAgICBWYWxpZGF0aW9uLmFjdGluZ1ZhbGlkYXRvclJlZ2lzdHJ5LmdldEtleXMoKS5mb3JFYWNoKChrOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdmFsaWRhdG9yUmVnaXN0cnkuZ2V0KGspO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB2YWxpZGF0b3JSZWdpc3RyeS5yZWdpc3RlcihtaWdyYXRpb25IYW5kbGVyKHZhbGlkYXRvcikpO1xuICAgICAgfSk7XG4gICAgVmFsaWRhdGlvbi5hY3RpbmdWYWxpZGF0b3JSZWdpc3RyeSA9IHZhbGlkYXRvclJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGN1cnJlbnQgVmFsaWRhdG9yUmVnaXN0cnlcbiAgICpcbiAgICogQHJldHVybiBJVmFsaWRhdG9yUmVnaXN0cnksIGRlZmF1bHRzIHRvIHtAbGluayBWYWxpZGF0b3JSZWdpc3RyeX1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldFJlZ2lzdHJ5KCkge1xuICAgIGlmICghVmFsaWRhdGlvbi5hY3RpbmdWYWxpZGF0b3JSZWdpc3RyeSlcbiAgICAgIFZhbGlkYXRpb24uYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnkgPSBuZXcgVmFsaWRhdG9yUmVnaXN0cnkoKTtcbiAgICByZXR1cm4gVmFsaWRhdGlvbi5hY3RpbmdWYWxpZGF0b3JSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSB2YWxpZGF0b3JcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbGlkYXRvcktleSBvbmUgb2YgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5c31cbiAgICogQHJldHVybiB7VmFsaWRhdG9yIHwgdW5kZWZpbmVkfSB0aGUgcmVnaXN0ZXJlZCBWYWxpZGF0b3Igb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGlzIG5vbm8gbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIGtleVxuICAgKi9cbiAgc3RhdGljIGdldDxUIGV4dGVuZHMgVmFsaWRhdG9yPih2YWxpZGF0b3JLZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBWYWxpZGF0aW9uLmdldFJlZ2lzdHJ5KCkuZ2V0KHZhbGlkYXRvcktleSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCB2YWxpZGF0b3JzIG9udG8gdGhlIHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBwYXJhbSB7VFtdIHwgVmFsaWRhdG9yRGVmaW5pdGlvbltdfSB2YWxpZGF0b3JcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcjxUIGV4dGVuZHMgVmFsaWRhdG9yPihcbiAgICAuLi52YWxpZGF0b3I6IChWYWxpZGF0b3JEZWZpbml0aW9uIHwgVClbXVxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gVmFsaWRhdGlvbi5nZXRSZWdpc3RyeSgpLnJlZ2lzdGVyKC4uLnZhbGlkYXRvcik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBrZXkgdG8gc3RvcmUgYXMgTWV0YWRhdGEgdW5kZXIgUmVmbGVjdGlvbnNcbiAgICogQGRlc2NyaXB0aW9uIGNvbmNhdGVuYXRlcyB7QGxpbmsgVmFsaWRhdGlvbktleXMjUkVGTEVDVH0gd2l0aCB0aGUgcHJvdmlkZWQga2V5XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICovXG4gIHN0YXRpYyBrZXkoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gVmFsaWRhdGlvbktleXMuUkVGTEVDVCArIGtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGFsbCByZWdpc3RlcmVkIHZhbGlkYXRpb24ga2V5c1xuICAgKi9cbiAgc3RhdGljIGtleXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVnaXN0cnkoKS5nZXRLZXlzKCk7XG4gIH1cblxuICBzdGF0aWMgcmVnaXN0ZXJEZWNvcmF0b3Ioa2V5OiBzdHJpbmcsIGRlY29yYXRvcjogUHJvcGVydHlEZWNvcmF0b3IpIHtcbiAgICBpZiAoa2V5IGluIHRoaXMubG9hZGVkRGVjb3JhdG9ycykgcmV0dXJuO1xuICAgIHRoaXMubG9hZGVkRGVjb3JhdG9yc1trZXldID0gZGVjb3JhdG9yO1xuICB9XG5cbiAgc3RhdGljIGRlY29yYXRvckZyb21LZXkoa2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoIShrZXkgaW4gdGhpcy5sb2FkZWREZWNvcmF0b3JzKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZGVjb3JhdG9yIHJlZ2lzdGVyZWQgdW5kZXIgJHtrZXl9YCk7XG4gICAgcmV0dXJuIHRoaXMubG9hZGVkRGVjb3JhdG9yc1trZXldO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25hbEFzeW5jIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuL01vZGVsXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbEtleShzdHI6IHN0cmluZykge1xuICByZXR1cm4gTW9kZWxLZXlzLlJFRkxFQ1QgKyBzdHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICBnZXRNb2RlbEtleShNb2RlbEtleXMuTU9ERUwpLFxuICAgIG1vZGVsLmNvbnN0cnVjdG9yXG4gICk7XG4gIGlmICghbWV0YWRhdGEpXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJjb3VsZCBub3QgZmluZCBtZXRhZGF0YSBmb3IgcHJvdmlkZWQgXCIgKyBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgKTtcbiAgcmV0dXJuIG1ldGFkYXRhO1xufVxuXG4vKipcbiAqIFdyYXBzIGEgdmFsdWUgaW4gYSBQcm9taXNlIGlmIHRoZSBgYXN5bmNgIGZsYWcgaXMgdHJ1ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBiZWluZyB3cmFwcGVkLlxuICogQHRlbXBsYXRlIEFzeW5jIC0gQSBib29sZWFuIHR5cGUgdGhhdCBkZXRlcm1pbmVzIGlmIHRoZSByZXN1bHQgc2hvdWxkIGJlIHdyYXBwZWQgaW4gYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gZGlyZWN0bHkgb3Igd3JhcCBpbiBhIFByb21pc2UuXG4gKiBAcGFyYW0gYXN5bmMgLSBJZiB0cnVlLCB0aGUgdmFsdWUgaXMgd3JhcHBlZCBpbiBhIHJlc29sdmVkIFByb21pc2UuIElmIGZhbHNlIG9yIHVuZGVmaW5lZCwgdGhlIHZhbHVlIGlzIHJldHVybmVkIGFzLWlzLlxuICpcbiAqIEByZXR1cm5zIFRoZSBvcmlnaW5hbCB2YWx1ZSBvciBhIFByb21pc2UgcmVzb2x2aW5nIHRvIGl0LCBkZXBlbmRpbmcgb24gdGhlIGBhc3luY2AgZmxhZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ29uZGl0aW9uYWxQcm9taXNlPFQsIEFzeW5jIGV4dGVuZHMgYm9vbGVhbj4oXG4gIHZhbHVlOiBULFxuICBhc3luYz86IEFzeW5jXG4pOiBDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBUPiB7XG4gIHJldHVybiAoYXN5bmMgPyBQcm9taXNlLnJlc29sdmUodmFsdWUpIDogdmFsdWUpIGFzIENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIFQ+O1xufVxuIiwiaW1wb3J0IHsgTW9kZWxFcnJvckRlZmluaXRpb24gfSBmcm9tIFwiLi9Nb2RlbEVycm9yRGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi9Nb2RlbFwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIE1vZGVsRXJyb3JzLFxuICBUeXBlVmFsaWRhdG9yT3B0aW9ucyxcbiAgVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbixcbiAgVmFsaWRhdG9yT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFBhdGhQcm94eUVuZ2luZSB9IGZyb20gXCIuLi91dGlscy9QYXRoUHJveHlcIjtcbmltcG9ydCB7IEFTWU5DX01FVEFfS0VZLCBWQUxJREFUSU9OX1BBUkVOVF9LRVkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25hbEFzeW5jLCBEZWNvcmF0b3JNZXRhZGF0YUFzeW5jIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyB0b0NvbmRpdGlvbmFsUHJvbWlzZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB2YWxpZGF0aW9uIG1ldGFkYXRhIGRlY29yYXRvcnMgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgcHJvcGVydHkgb2YgYSBtb2RlbCxcbiAqIHVzaW5nIHRoZSByZWZsZWN0aXZlIG1ldGFkYXRhIGtleS5cbiAqXG4gKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY2xhc3MgY29udGFpbmluZyB0aGUgZGVjb3JhdGVkIHByb3BlcnR5LlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3AgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2hvc2UgZGVjb3JhdG9ycyBzaG91bGQgYmUgcmV0cmlldmVkLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZmxlY3RLZXkgLSBUaGUgbWV0YWRhdGEga2V5IHVzZWQgdG8gcmV0cmlldmUgdGhlIGRlY29yYXRvcnMuXG4gKiAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgdmFsaWRhdGlvbiBkZWNvcmF0b3JzIGFwcGxpZWQgdG8gdGhlIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0aW9uRGVjb3JhdG9ycyhcbiAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHByb3A6IHN0cmluZyxcbiAgcmVmbGVjdEtleTogc3RyaW5nID0gVmFsaWRhdGlvbktleXMuUkVGTEVDVFxuKTogVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbiB7XG4gIHJldHVybiBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICByZWZsZWN0S2V5LFxuICAgIG1vZGVsLFxuICAgIHByb3BcbiAgKSBhcyB1bmtub3duIGFzIFZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb247XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXRyaWV2ZXMgYWxsIHZhbGlkYXRhYmxlIHByb3BlcnR5IGRlY29yYXRvcnMgZnJvbSBhIGdpdmVuIG1vZGVsLCBleGNsdWRpbmcgc3BlY2lmaWVkIHByb3BlcnRpZXMuXG4gKlxuICogQHN1bW1hcnlcbiAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYSBtb2RlbCBpbnN0YW5jZSwgZmlsdGVyaW5nIG91dCBhbnkgcHJvcGVydGllc1xuICogbGlzdGVkIGluIHRoZSBgcHJvcHNUb0lnbm9yZWAgYXJyYXkuIEZvciBlYWNoIHJlbWFpbmluZyBwcm9wZXJ0eSwgaXQgY2hlY2tzIHdoZXRoZXIgdmFsaWRhdGlvblxuICogZGVjb3JhdG9ycyBhcmUgcHJlc2VudCB1c2luZyBgZ2V0VmFsaWRhdGlvbkRlY29yYXRvcnNgLCBhbmQgaWYgc28sIGNvbGxlY3RzIHRoZW0gaW4gdGhlIHJlc3VsdCBhcnJheS5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIEEgZ2VuZXJpYyBwYXJhbWV0ZXIgZXh0ZW5kaW5nIHRoZSBgTW9kZWxgIGNsYXNzLCByZXByZXNlbnRpbmcgdGhlIG1vZGVsIHR5cGUgYmVpbmcgaW5zcGVjdGVkLlxuICpcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBBbiBpbnN0YW5jZSBvZiBhIGNsYXNzIGV4dGVuZGluZyBgTW9kZWxgIGZyb20gd2hpY2ggdmFsaWRhdGFibGUgcHJvcGVydGllcyB3aWxsIGJlIGV4dHJhY3RlZC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHByb3BzVG9JZ25vcmUgLSBBbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHZhbGlkYXRpb24gaW5zcGVjdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW119IEFuIGFycmF5IG9mIHZhbGlkYXRpb24gZGVjb3JhdG9yIGRlZmluaXRpb25zXG4gKiBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsJ3MgcHJvcGVydGllcywgZXhjbHVkaW5nIHRob3NlIGxpc3RlZCBpbiBgcHJvcHNUb0lnbm9yZWAuXG4gKlxuICogQGZ1bmN0aW9uIGdldFZhbGlkYXRhYmxlUHJvcGVydGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsaWRhdGFibGVQcm9wZXJ0aWVzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNLFxuICBwcm9wc1RvSWdub3JlOiBzdHJpbmdbXVxuKTogVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbltdIHtcbiAgY29uc3QgZGVjb3JhdGVkUHJvcGVydGllczogVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbltdID0gW107XG5cbiAgZm9yIChjb25zdCBwcm9wIGluIG1vZGVsKSB7XG4gICAgaWYgKFxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsLCBwcm9wKSAmJlxuICAgICAgIXByb3BzVG9JZ25vcmUuaW5jbHVkZXMocHJvcClcbiAgICApIHtcbiAgICAgIGNvbnN0IGRlYyA9IGdldFZhbGlkYXRpb25EZWNvcmF0b3JzKG1vZGVsLCBwcm9wKTtcbiAgICAgIGlmIChkZWMpIGRlY29yYXRlZFByb3BlcnRpZXMucHVzaChkZWMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkZWNvcmF0ZWRQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIFNhZmVseSBzZXRzIHRlbXBvcmFyeSBtZXRhZGF0YSBvbiBhbiBvYmplY3RcbiAqL1xuZnVuY3Rpb24gc2V0VGVtcG9yYXJ5Q29udGV4dChcbiAgdGFyZ2V0OiBhbnksXG4gIGtleTogc3ltYm9sIHwgc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93blxuKTogdm9pZCB7XG4gIGlmICghT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpKSB0YXJnZXRba2V5XSA9IHZhbHVlO1xufVxuXG4vKipcbiAqIFNhZmVseSByZW1vdmVzIHRlbXBvcmFyeSBtZXRhZGF0YSBmcm9tIGFuIG9iamVjdFxuICovXG5mdW5jdGlvbiBjbGVhbnVwVGVtcG9yYXJ5Q29udGV4dCh0YXJnZXQ6IGFueSwga2V5OiBzeW1ib2wgfCBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwga2V5KSkgZGVsZXRlIHRhcmdldFtrZXldO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHZhbGlkYXRpb24gd2l0aCB0ZW1wb3JhcnkgY29udGV4dCBhbmQgcmV0dXJucyB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqXG4gKiBAcGFyYW0gbmVzdGVkTW9kZWwgLSBUaGUgaW5zdGFuY2UgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSBwYXJlbnRNb2RlbCAtIFJlZmVyZW5jZSB0byBhIHBhcmVudCBvYmplY3QgZm9yIG5lc3RlZCB2YWxpZGF0aW9uXG4gKiBAcGFyYW0gaXNBc3luYyAtIFdoZXRoZXIgdG8gcGVyZm9ybSBhc3luYyB2YWxpZGF0aW9uXG4gKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCBmcm9tIGhhc0Vycm9ycygpXG4gKi9cbmZ1bmN0aW9uIGdldE5lc3RlZFZhbGlkYXRpb25FcnJvcnM8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgQXN5bmMgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+KFxuICBuZXN0ZWRNb2RlbDogTSxcbiAgcGFyZW50TW9kZWw/OiBNLFxuICBpc0FzeW5jPzogQXN5bmMsXG4gIC4uLnByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAvLyBTZXQgdGVtcG9yYXJ5IGNvbnRleHQgZm9yIG5lc3RlZCBtb2RlbHNcbiAgaWYgKHBhcmVudE1vZGVsKSB7XG4gICAgc2V0VGVtcG9yYXJ5Q29udGV4dChuZXN0ZWRNb2RlbCwgVkFMSURBVElPTl9QQVJFTlRfS0VZLCBwYXJlbnRNb2RlbCk7XG4gIH1cbiAgc2V0VGVtcG9yYXJ5Q29udGV4dChuZXN0ZWRNb2RlbCwgQVNZTkNfTUVUQV9LRVksICEhaXNBc3luYyk7XG5cbiAgY29uc3QgZXJycyA9IG5lc3RlZE1vZGVsLmhhc0Vycm9ycyguLi5wcm9wc1RvSWdub3JlKSBhcyBhbnk7XG4gIGNsZWFudXBUZW1wb3JhcnlDb250ZXh0KG5lc3RlZE1vZGVsLCBWQUxJREFUSU9OX1BBUkVOVF9LRVkpO1xuICBjbGVhbnVwVGVtcG9yYXJ5Q29udGV4dChuZXN0ZWRNb2RlbCwgQVNZTkNfTUVUQV9LRVkpO1xuICByZXR1cm4gZXJycyBhcyBhbnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNoaWxkVmFsdWU8TSBleHRlbmRzIE1vZGVsPihcbiAgcHJvcDogc3RyaW5nLFxuICBjaGlsZFZhbHVlOiBhbnksXG4gIHBhcmVudE1vZGVsOiBNLFxuICBhbGxvd2VkVHlwZXM6IHN0cmluZ1tdLFxuICBhc3luYzogYm9vbGVhbixcbiAgLi4ucHJvcHNUb0lnbm9yZTogc3RyaW5nW11cbik6XG4gIHwgc3RyaW5nXG4gIHwgdW5kZWZpbmVkXG4gIHwgTW9kZWxFcnJvckRlZmluaXRpb25cbiAgfCBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZCB8IE1vZGVsRXJyb3JEZWZpbml0aW9uPiB7XG4gIGxldCBlcnI6XG4gICAgfCBNb2RlbEVycm9yRGVmaW5pdGlvblxuICAgIHwgc3RyaW5nXG4gICAgfCB1bmRlZmluZWRcbiAgICB8IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkIHwgTW9kZWxFcnJvckRlZmluaXRpb24+ID0gdW5kZWZpbmVkO1xuICBsZXQgYXRMZWFzdE9uZU1hdGNoZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBhbGxvd2VkVHlwZSBvZiBhbGxvd2VkVHlwZXMpIHtcbiAgICBjb25zdCBDb25zdHIgPSBNb2RlbC5nZXQoYWxsb3dlZFR5cGUpIGFzIGFueTtcbiAgICBpZiAoIUNvbnN0cikge1xuICAgICAgZXJyID0gbmV3IE1vZGVsRXJyb3JEZWZpbml0aW9uKHtcbiAgICAgICAgW3Byb3BdOiB7XG4gICAgICAgICAgW1ZhbGlkYXRpb25LZXlzLlRZUEVdOiBgVW5hYmxlIHRvIHZlcmlmeSB0eXBlIGNvbnNpc3RlbmN5LCBtaXNzaW5nIG1vZGVsIHJlZ2lzdHJ5IGZvciAke2FsbG93ZWRUeXBlfWAsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hpbGRWYWx1ZSBpbnN0YW5jZW9mIENvbnN0cikge1xuICAgICAgYXRMZWFzdE9uZU1hdGNoZWQgPSB0cnVlO1xuICAgICAgZXJyID0gZ2V0TmVzdGVkVmFsaWRhdGlvbkVycm9ycyhcbiAgICAgICAgY2hpbGRWYWx1ZSxcbiAgICAgICAgcGFyZW50TW9kZWwsXG4gICAgICAgIGFzeW5jLFxuICAgICAgICAuLi5wcm9wc1RvSWdub3JlXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKGF0TGVhc3RPbmVNYXRjaGVkKSByZXR1cm4gZXJyO1xuXG4gIHJldHVybiAoXG4gICAgZXJyIHx8XG4gICAgbmV3IE1vZGVsRXJyb3JEZWZpbml0aW9uKHtcbiAgICAgIFtwcm9wXToge1xuICAgICAgICBbVmFsaWRhdGlvbktleXMuVFlQRV06IGBWYWx1ZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIG9uZSBvZiB0aGUgZXhwZWN0ZWQgdHlwZXM6ICR7YWxsb3dlZFR5cGVzLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgfSxcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVEZWNvcmF0b3I8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgQXN5bmMgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+KFxuICBtb2RlbDogTSxcbiAgdmFsdWU6IGFueSxcbiAgZGVjb3JhdG9yOiBEZWNvcmF0b3JNZXRhZGF0YUFzeW5jLFxuICBhc3luYz86IEFzeW5jXG4pOiBDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgdmFsaWRhdG9yID0gVmFsaWRhdGlvbi5nZXQoZGVjb3JhdG9yLmtleSk7XG4gIGlmICghdmFsaWRhdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHZhbGlkYXRvciBmb3IgJHtkZWNvcmF0b3Iua2V5fWApO1xuICB9XG5cbiAgLy8gc2tpcCBhc3luYyBkZWNvcmF0b3JzIGlmIHZhbGlkYXRlRGVjb3JhdG9ycyBpcyBjYWxsZWQgc3luY2hyb25vdXNseSAoYXN5bmMgPSBmYWxzZSlcbiAgaWYgKCFhc3luYyAmJiBkZWNvcmF0b3IucHJvcHMuYXN5bmMpIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuXG4gIGNvbnN0IGRlY29yYXRvclByb3BzID1cbiAgICBkZWNvcmF0b3Iua2V5ID09PSBNb2RlbEtleXMuVFlQRVxuICAgICAgPyBbZGVjb3JhdG9yLnByb3BzXVxuICAgICAgOiBkZWNvcmF0b3IucHJvcHMgfHwge307XG5cbiAgY29uc3QgY29udGV4dCA9IFBhdGhQcm94eUVuZ2luZS5jcmVhdGUobW9kZWwsIHtcbiAgICBpZ25vcmVVbmRlZmluZWQ6IHRydWUsXG4gICAgaWdub3JlTnVsbDogdHJ1ZSxcbiAgfSk7XG5cbiAgY29uc3QgdmFsaWRhdG9yT3B0aW9uczogVmFsaWRhdG9yT3B0aW9ucyB8IFR5cGVWYWxpZGF0b3JPcHRpb25zID1cbiAgICBkZWNvcmF0b3Iua2V5ID09PSBNb2RlbEtleXMuVFlQRVxuICAgICAgPyB7IHR5cGU6IChkZWNvcmF0b3JQcm9wcyBhcyBhbnkpWzBdLm5hbWUgfVxuICAgICAgOiAoZGVjb3JhdG9yUHJvcHMgYXMgVmFsaWRhdG9yT3B0aW9ucyk7XG5cbiAgY29uc3QgbWF5YmVBc3luY0Vycm9ycyA9IHZhbGlkYXRvci5oYXNFcnJvcnMoXG4gICAgdmFsdWUsXG4gICAgdmFsaWRhdG9yT3B0aW9ucyxcbiAgICBjb250ZXh0XG4gICk7XG5cbiAgcmV0dXJuIHRvQ29uZGl0aW9uYWxQcm9taXNlKG1heWJlQXN5bmNFcnJvcnMsIGFzeW5jKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEV4ZWN1dGVzIHZhbGlkYXRpb24gbG9naWMgZm9yIGEgc2V0IG9mIGRlY29yYXRvcnMgYXBwbGllZCB0byBhIG1vZGVsJ3MgcHJvcGVydHksIGhhbmRsaW5nIGJvdGhcbiAqIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgdmFsaWRhdGlvbnMsIGluY2x1ZGluZyBzdXBwb3J0IGZvciBuZXN0ZWQgdmFsaWRhdGlvbnMgYW5kIGxpc3RzLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBJdGVyYXRlcyBvdmVyIGFuIGFycmF5IG9mIGRlY29yYXRvciBtZXRhZGF0YSBvYmplY3RzIGFuZCBhcHBsaWVzIGVhY2ggdmFsaWRhdGlvbiBydWxlIHRvIHRoZVxuICogcHJvdmlkZWQgdmFsdWUuIEZvciBsaXN0IGRlY29yYXRvcnMgKGBWYWxpZGF0aW9uS2V5cy5MSVNUYCksIGl0IHBlcmZvcm1zIGVsZW1lbnQtd2lzZSB2YWxpZGF0aW9uLFxuICogc3VwcG9ydGluZyBuZXN0ZWQgbW9kZWwgdmFsaWRhdGlvbiBhbmQgdHlwZSBjaGVja3MuIElmIHRoZSBgYXN5bmNgIGZsYWcgaXMgc2V0LCBhc3luY2hyb25vdXNcbiAqIHZhbGlkYXRpb24gaXMgc3VwcG9ydGVkIHVzaW5nIGBQcm9taXNlLmFsbGAuIFRoZSByZXN1bHQgaXMgYSByZWNvcmQgbWFwcGluZyB2YWxpZGF0aW9uIGtleXMgdG9cbiAqIGVycm9yIG1lc3NhZ2VzLCBvciBgdW5kZWZpbmVkYCBpZiBubyBlcnJvcnMgYXJlIGZvdW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBNIC0gQSB0eXBlIHBhcmFtZXRlciBleHRlbmRpbmcgYE1vZGVsYCwgcmVwcmVzZW50aW5nIHRoZSBtb2RlbCB0eXBlIGJlaW5nIHZhbGlkYXRlZC5cbiAqIEB0ZW1wbGF0ZSBBc3luYyAtIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdGhhdCB0aGUgdmFsaWRhdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcCAtIFRoZSBtb2RlbCBmaWVsZCBuYW1lXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkIGFnYWluc3QgdGhlIHByb3ZpZGVkIGRlY29yYXRvcnMuXG4gKiBAcGFyYW0ge0RlY29yYXRvck1ldGFkYXRhQXN5bmNbXX0gZGVjb3JhdG9ycyAtIEFuIGFycmF5IG9mIG1ldGFkYXRhIG9iamVjdHMgcmVwcmVzZW50aW5nIHZhbGlkYXRpb24gZGVjb3JhdG9ycy5cbiAqIEBwYXJhbSB7QXN5bmN9IFthc3luY10gLSBPcHRpb25hbCBmbGFnIGluZGljYXRpbmcgd2hldGhlciB2YWxpZGF0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHJldHVybiB7Q29uZGl0aW9uYWxBc3luYzxBc3luYywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4gfCB1bmRlZmluZWR9XG4gKiBSZXR1cm5zIGVpdGhlciBhIHJlY29yZCBvZiB2YWxpZGF0aW9uIGVycm9ycyAoa2V5ZWQgYnkgdGhlIGRlY29yYXRvciBrZXkpIG9yIGB1bmRlZmluZWRgIGlmIG5vIGVycm9ycyBhcmUgZm91bmQuXG4gKiBJZiBgYXN5bmNgIGlzIHRydWUsIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgc2FtZSBzdHJ1Y3R1cmUuXG4gKlxuICogQGZ1bmN0aW9uIHZhbGlkYXRlRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVEZWNvcmF0b3JzPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgbW9kZWw6IE0sXG4gIHByb3A6IHN0cmluZyxcbiAgdmFsdWU6IGFueSxcbiAgZGVjb3JhdG9yczogRGVjb3JhdG9yTWV0YWRhdGFBc3luY1tdLFxuICBhc3luYz86IEFzeW5jLFxuICAuLi5wcm9wc1RvSWdub3JlOiBzdHJpbmdbXVxuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFByb21pc2U8c3RyaW5nPj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgLy8gc2tpcCBhc3luYyBkZWNvcmF0b3JzIGlmIHZhbGlkYXRlRGVjb3JhdG9ycyBpcyBjYWxsZWQgc3luY2hyb25vdXNseSAoYXN5bmMgPSBmYWxzZSlcbiAgICBpZiAoIWFzeW5jICYmIGRlY29yYXRvci5wcm9wcy5hc3luYykgY29udGludWU7XG5cbiAgICBsZXQgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRlRGVjb3JhdG9yKG1vZGVsLCB2YWx1ZSwgZGVjb3JhdG9yLCBhc3luYyk7XG5cbiAgICAvKlxuICAgIElmIHRoZSBkZWNvcmF0b3IgaXMgYSBsaXN0LCBlYWNoIGVsZW1lbnQgbXVzdCBiZSBjaGVja2VkLlxuICAgIFdoZW4gJ2FzeW5jJyBpcyB0cnVlLCB0aGUgJ2Vycicgd2lsbCBhbHdheXMgYmUgYSBwZW5kaW5nIHByb21pc2UgaW5pdGlhbGx5LFxuICAgIHNvIHRoZSAnIWVycicgY2hlY2sgd2lsbCBldmFsdWF0ZSB0byBmYWxzZSAoZXZlbiBpZiB0aGUgcHJvbWlzZSBsYXRlciByZXNvbHZlcyB3aXRoIG5vIGVycm9ycylcbiAgICAqL1xuICAgIGlmIChkZWNvcmF0b3Iua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUICYmICghdmFsaWRhdGlvbkVycm9ycyB8fCBhc3luYykpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlIGluc3RhbmNlb2YgU2V0ID8gWy4uLnZhbHVlXSA6IHZhbHVlO1xuICAgICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgdHlwZXM6IHN0cmluZ1tdID0gKGRlY29yYXRvci5wcm9wcy5jbGFzcyB8fFxuICAgICAgICAgIGRlY29yYXRvci5wcm9wcy5jbGF6eiB8fFxuICAgICAgICAgIGRlY29yYXRvci5wcm9wcy5jdXN0b21UeXBlcykgYXMgc3RyaW5nW107XG4gICAgICAgIHR5cGVzID0gKEFycmF5LmlzQXJyYXkodHlwZXMpID8gdHlwZXMgOiBbdHlwZXNdKS5tYXAoKGU6IGFueSkgPT4ge1xuICAgICAgICAgIGUgPSB0eXBlb2YgZSA9PT0gXCJmdW5jdGlvblwiICYmICFlLm5hbWUgPyBlKCkgOiBlO1xuICAgICAgICAgIHJldHVybiAoZSBhcyBhbnkpLm5hbWUgPyAoZSBhcyBhbnkpLm5hbWUgOiBlO1xuICAgICAgICB9KSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgYWxsb3dlZFR5cGVzID0gW3R5cGVzXS5mbGF0KCkubWFwKCh0KSA9PiBTdHJpbmcodCkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIC8vIGNvbnN0IHJlc2VydmVkID0gT2JqZWN0LnZhbHVlcyhSZXNlcnZlZE1vZGVscykubWFwKCh2KSA9PiB2LnRvTG93ZXJDYXNlKCkpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgIGNvbnN0IGVycnMgPSB2YWx1ZXMubWFwKChjaGlsZFZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBpZiAoTW9kZWwuaXNNb2RlbCh2KSAmJiAhcmVzZXJ2ZWQuaW5jbHVkZXModikge1xuICAgICAgICAgIGlmIChNb2RlbC5pc01vZGVsKGNoaWxkVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVDaGlsZFZhbHVlKFxuICAgICAgICAgICAgICBwcm9wLFxuICAgICAgICAgICAgICBjaGlsZFZhbHVlLFxuICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgdHlwZXMuZmxhdCgpLFxuICAgICAgICAgICAgICAhIWFzeW5jLFxuICAgICAgICAgICAgICAuLi5wcm9wc1RvSWdub3JlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gcmV0dXJuIGdldE5lc3RlZFZhbGlkYXRpb25FcnJvcnMoY2hpbGRWYWx1ZSwgbW9kZWwsIGFzeW5jKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYWxsb3dlZFR5cGVzLmluY2x1ZGVzKHR5cGVvZiBjaGlsZFZhbHVlKVxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogXCJWYWx1ZSBoYXMgbm8gdmFsaWRhdGFibGUgdHlwZVwiO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzID0gUHJvbWlzZS5hbGwoZXJycykudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbGxFbXB0eSA9IHJlc3VsdC5ldmVyeSgocikgPT4gIXIpO1xuICAgICAgICAgICAgcmV0dXJuIGFsbEVtcHR5ID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICAgICAgICAgIH0pIGFzIGFueTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBhbGxFbXB0eSA9IGVycnMuZXZlcnkoKHI6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gIXIpO1xuICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMgPSBlcnJzLmxlbmd0aCA+IDAgJiYgIWFsbEVtcHR5ID8gZXJycyA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5hbWUgPVxuICAgICAgZGVjb3JhdG9yLmtleSA9PT0gTW9kZWxLZXlzLlRZUEUgPyBWYWxpZGF0aW9uS2V5cy5UWVBFIDogZGVjb3JhdG9yLmtleTtcbiAgICBpZiAodmFsaWRhdGlvbkVycm9ycykgKHJlc3VsdCBhcyBhbnkpW25hbWVdID0gdmFsaWRhdGlvbkVycm9ycztcbiAgfVxuXG4gIGlmICghYXN5bmMpXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID4gMFxuICAgICAgPyAocmVzdWx0IGFzIGFueSlcbiAgICAgIDogKHVuZGVmaW5lZCBhcyBhbnkpO1xuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyZXN1bHQpO1xuICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC52YWx1ZXMocmVzdWx0KSBhcyBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD5bXTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKChyZXNvbHZlZFZhbHVlcykgPT4ge1xuICAgIGNvbnN0IHJlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb2x2ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbCA9IHJlc29sdmVkVmFsdWVzW2ldO1xuICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc1trZXlzW2ldXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlcykubGVuZ3RoID4gMCA/IHJlcyA6IHVuZGVmaW5lZDtcbiAgfSkgYXMgYW55O1xufVxuXG4vKipcbiAqIEBmdW5jdGlvbiB2YWxpZGF0ZVxuICogQHRlbXBsYXRlIE1cbiAqIEB0ZW1wbGF0ZSBBc3luY1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBWYWxpZGF0ZXMgdGhlIHByb3BlcnRpZXMgb2YgYSB7QGxpbmsgTW9kZWx9IGluc3RhbmNlIHVzaW5nIHJlZ2lzdGVyZWQgZGVjb3JhdG9ycy5cbiAqIFN1cHBvcnRzIGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIGZsb3dzLCBkZXBlbmRpbmcgb24gdGhlIGBhc3luY2AgZmxhZy5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhpcyBmdW5jdGlvbiBpbnNwZWN0cyBhIGdpdmVuIG1vZGVsIG9iamVjdCwgaWRlbnRpZmllcyBkZWNvcmF0ZWQgcHJvcGVydGllcyB0aGF0IHJlcXVpcmUgdmFsaWRhdGlvbixcbiAqIGFuZCBhcHBsaWVzIHRoZSBjb3JyZXNwb25kaW5nIHZhbGlkYXRpb24gcnVsZXMuIEl0IGFsc28gc3VwcG9ydHMgbmVzdGVkIG1vZGVsIHZhbGlkYXRpb24gYW5kIGdyYWNlZnVsbHlcbiAqIG1lcmdlcyBhbnkgdmFsaWRhdGlvbiBlcnJvcnMuIEZvciBjb2xsZWN0aW9ucyAoQXJyYXkvU2V0KSwgaXQgZW5mb3JjZXMgdGhlIHByZXNlbmNlIG9mIHRoZSBgQGxpc3RgIGRlY29yYXRvclxuICogYW5kIGNoZWNrcyB0aGUgdHlwZSBvZiBlbGVtZW50cy4gSWYgYSBwcm9wZXJ0eSBpcyBhIG5lc3RlZCBtb2RlbCwgaXQgd2lsbCBjYWxsIGBoYXNFcnJvcnNgIG9uIGl0IGFuZCBmbGF0dGVuXG4gKiB0aGUgbmVzdGVkIGVycm9yIGtleXMgdXNpbmcgZG90IG5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gYmUgdmFsaWRhdGVkLiBNdXN0IGV4dGVuZCBmcm9tIHtAbGluayBNb2RlbH0uXG4gKiBAcGFyYW0ge0FzeW5jfSBbYXN5bmNdIC0gQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB2YWxpZGF0aW9uIHNob3VsZCBiZSBhc3luY2hyb25vdXMuXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcHJvcHNUb0lnbm9yZSAtIEEgdmFyaWFkaWMgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGR1cmluZyB2YWxpZGF0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD59XG4gKiBSZXR1cm5zIGVpdGhlciBhIHtAbGluayBNb2RlbEVycm9yRGVmaW5pdGlvbn0gY29udGFpbmluZyB2YWxpZGF0aW9uIGVycm9ycyxcbiAqIG9yIGB1bmRlZmluZWRgIGlmIG5vIGVycm9ycyBhcmUgZm91bmQuIFdoZW4gYGFzeW5jYCBpcyBgdHJ1ZWAsIHJldHVybnMgYSBQcm9taXNlLlxuICpcbiAqIEBzZWUge0BsaW5rIE1vZGVsfVxuICogQHNlZSB7QGxpbmsgTW9kZWxFcnJvckRlZmluaXRpb259XG4gKiBAc2VlIHtAbGluayB2YWxpZGF0ZURlY29yYXRvcnN9XG4gKiBAc2VlIHtAbGluayBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXN9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICAgIHBhcnRpY2lwYW50IHZhbGlkYXRlXG4gKiAgICAgcGFydGljaXBhbnQgZ2V0VmFsaWRhdGFibGVQcm9wZXJ0aWVzXG4gKiAgICAgcGFydGljaXBhbnQgdmFsaWRhdGVEZWNvcmF0b3JzXG4gKiAgICAgcGFydGljaXBhbnQgTW9kZWxJbnN0YW5jZVxuICogICAgIENhbGxlci0+PnZhbGlkYXRlOiBjYWxsIHdpdGggb2JqLCBhc3luYywgcHJvcHNUb0lnbm9yZVxuICogICAgIHZhbGlkYXRlLT4+Z2V0VmFsaWRhdGFibGVQcm9wZXJ0aWVzOiByZXRyaWV2ZSBkZWNvcmF0ZWQgcHJvcHNcbiAqICAgICBsb29wIGZvciBlYWNoIHByb3BlcnR5XG4gKiAgICAgICAgIHZhbGlkYXRlLT4+dmFsaWRhdGVEZWNvcmF0b3JzOiB2YWxpZGF0ZSB1c2luZyBkZWNvcmF0b3JzXG4gKiAgICAgICAgIGFsdCBpcyBuZXN0ZWQgbW9kZWxcbiAqICAgICAgICAgICAgIHZhbGlkYXRlLT4+TW9kZWxJbnN0YW5jZTogY2FsbCBoYXNFcnJvcnMoKVxuICogICAgICAgICBlbmRcbiAqICAgICBlbmRcbiAqICAgICBhbHQgYXN5bmNcbiAqICAgICAgICAgdmFsaWRhdGUtPj52YWxpZGF0ZTogUHJvbWlzZS5hbGxTZXR0bGVkIGZvciBlcnJvcnNcbiAqICAgICBlbmRcbiAqICAgICB2YWxpZGF0ZS0tPj5DYWxsZXI6IHJldHVybiBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgQXN5bmMgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+KFxuICBtb2RlbDogTSxcbiAgYXN5bmM6IEFzeW5jLFxuICAuLi5wcm9wc1RvSWdub3JlOiBzdHJpbmdbXVxuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZGVjb3JhdGVkUHJvcGVydGllczogVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbltdID1cbiAgICBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXMobW9kZWwsIHByb3BzVG9JZ25vcmUpO1xuXG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICBjb25zdCBuZXN0ZWRFcnJvcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBmb3IgKGNvbnN0IHsgcHJvcCwgZGVjb3JhdG9ycyB9IG9mIGRlY29yYXRlZFByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBwcm9wS2V5ID0gU3RyaW5nKHByb3ApO1xuICAgIGxldCBwcm9wVmFsdWUgPSAobW9kZWwgYXMgYW55KVtwcm9wXTtcblxuICAgIGlmICghZGVjb3JhdG9ycz8ubGVuZ3RoKSBjb250aW51ZTtcblxuICAgIC8vIEdldCB0aGUgZGVmYXVsdCB0eXBlIHZhbGlkYXRvclxuICAgIGNvbnN0IHByaW9yaXR5ID0gW1ZhbGlkYXRpb25LZXlzLlRZUEUsIE1vZGVsS2V5cy5UWVBFXTtcbiAgICBjb25zdCBkZXNpZ25UeXBlRGVjID0gcHJpb3JpdHlcbiAgICAgIC5tYXAoKGtleSkgPT4gZGVjb3JhdG9ycy5maW5kKChkKSA9PiBkLmtleSA9PT0ga2V5KSlcbiAgICAgIC5maW5kKEJvb2xlYW4pO1xuXG4gICAgLy8gRW5zdXJlcyB0aGF0IG9ubHkgb25lIHR5cGUgZGVjb3JhdG9yIHJlbWFpbnMuXG4gICAgaWYgKGRlc2lnblR5cGVEZWM/LmtleSA9PT0gVmFsaWRhdGlvbktleXMuVFlQRSkge1xuICAgICAgZGVjb3JhdG9ycy5zcGxpY2UoXG4gICAgICAgIDAsXG4gICAgICAgIGRlY29yYXRvcnMubGVuZ3RoLFxuICAgICAgICAuLi5kZWNvcmF0b3JzLmZpbHRlcigoZCkgPT4gZC5rZXkgIT09IE1vZGVsS2V5cy5UWVBFKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWRlc2lnblR5cGVEZWMpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZGVzaWduVHlwZSA9XG4gICAgICBkZXNpZ25UeXBlRGVjLnByb3BzLmNsYXNzIHx8XG4gICAgICBkZXNpZ25UeXBlRGVjLnByb3BzLmNsYXp6IHx8XG4gICAgICBkZXNpZ25UeXBlRGVjLnByb3BzLmN1c3RvbVR5cGVzIHx8XG4gICAgICBkZXNpZ25UeXBlRGVjLnByb3BzLm5hbWU7XG5cbiAgICAvLyBUUyBlbWl0cyBcIk9iamVjdFwiIGFzIGRlc2lnbjp0eXBlIGZvciB1bmlvbnMgKHN0cmluZyB8IG51bWJlcikgYW5kIGludGVyc2VjdGlvbnMgKEEgJiBCKS5cbiAgICAvLyBTaW5jZSB0aGlzIG1ldGFkYXRhIGlzIGFtYmlndW91cyBmb3IgdmFsaWRhdGlvbiwgc2tpcCBkZXNpZ246dHlwZSBjaGVja3MgaW4gdGhlc2UgY2FzZXMuXG4gICAgLy8gVG8gZW5mb3JjZSBkZXNpZ246dHlwZSB2YWxpZGF0aW9uIGV4cGxpY2l0bHksIHRoZSBAdHlwZSB2YWxpZGF0b3IgY2FuIGJlIHVzZWQuXG4gICAgaWYgKGRlc2lnblR5cGVEZWMua2V5ID09PSBNb2RlbEtleXMuVFlQRSAmJiBkZXNpZ25UeXBlID09PSBcIk9iamVjdFwiKVxuICAgICAgZGVjb3JhdG9ycy5zaGlmdCgpO1xuXG4gICAgY29uc3QgZGVzaWduVHlwZXMgPSAoXG4gICAgICBBcnJheS5pc0FycmF5KGRlc2lnblR5cGUpID8gZGVzaWduVHlwZSA6IFtkZXNpZ25UeXBlXVxuICAgICkubWFwKChlOiBhbnkpID0+IHtcbiAgICAgIGUgPSB0eXBlb2YgZSA9PT0gXCJmdW5jdGlvblwiICYmICFlLm5hbWUgPyBlKCkgOiBlO1xuICAgICAgcmV0dXJuIChlIGFzIGFueSkubmFtZSA/IChlIGFzIGFueSkubmFtZSA6IGU7XG4gICAgfSkgYXMgc3RyaW5nW107XG5cbiAgICAvLyBIYW5kbGUgYXJyYXkgb3IgU2V0IHR5cGVzIGFuZCBlbmZvcmNlIHRoZSBwcmVzZW5jZSBvZiBAbGlzdCBkZWNvcmF0b3JcbiAgICAvLyBpZiAoW0FycmF5Lm5hbWUsIFNldC5uYW1lXS5pbmNsdWRlcyhkZXNpZ25UeXBlKSkge31cbiAgICBpZiAoZGVzaWduVHlwZXMuc29tZSgodCkgPT4gW0FycmF5Lm5hbWUsIFNldC5uYW1lXS5pbmNsdWRlcyh0KSkpIHtcbiAgICAgIGlmICghZGVjb3JhdG9ycy5zb21lKChkKSA9PiBkLmtleSA9PT0gVmFsaWRhdGlvbktleXMuTElTVCkpIHtcbiAgICAgICAgcmVzdWx0W3Byb3BLZXldID0ge1xuICAgICAgICAgIFtWYWxpZGF0aW9uS2V5cy5UWVBFXTogYEFycmF5IG9yIFNldCBwcm9wZXJ0eSAnJHtwcm9wS2V5fScgcmVxdWlyZXMgYSBAbGlzdCBkZWNvcmF0b3JgLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwcm9wVmFsdWUgJiZcbiAgICAgICAgIShBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkgfHwgcHJvcFZhbHVlIGluc3RhbmNlb2YgU2V0KVxuICAgICAgKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wS2V5XSA9IHtcbiAgICAgICAgICBbVmFsaWRhdGlvbktleXMuVFlQRV06IGBQcm9wZXJ0eSAnJHtTdHJpbmcocHJvcCl9JyBtdXN0IGJlIGVpdGhlciBhbiBBcnJheSBvciBhIFNldGAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgZGVzaWduOnR5cGUgZGVjb3JhdG9yLCBzaW5jZSBAbGlzdCBkZWNvcmF0b3IgYWxyZWFkeSBlbnN1cmVzIHR5cGVcbiAgICAgIGZvciAobGV0IGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChkZWNvcmF0b3JzW2ldLmtleSA9PT0gTW9kZWxLZXlzLlRZUEUpIHtcbiAgICAgICAgICBkZWNvcmF0b3JzLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJvcFZhbHVlID0gcHJvcFZhbHVlIGluc3RhbmNlb2YgU2V0ID8gWy4uLnByb3BWYWx1ZV0gOiBwcm9wVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcEVycm9yczogUmVjb3JkPHN0cmluZywgYW55PiA9XG4gICAgICB2YWxpZGF0ZURlY29yYXRvcnMoXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBwcm9wS2V5LFxuICAgICAgICBwcm9wVmFsdWUsXG4gICAgICAgIGRlY29yYXRvcnMsXG4gICAgICAgIGFzeW5jLFxuICAgICAgICAuLi5wcm9wc1RvSWdub3JlXG4gICAgICApIHx8IHt9O1xuXG4gICAgLy8gQ2hlY2sgZm9yIG5lc3RlZCBwcm9wZXJ0aWVzLlxuICAgIC8vIFRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcHJvY2Vzc2luZywgXCJwcm9wVmFsdWVcIiBtdXN0IGJlIGRlZmluZWQgYW5kIHZhbGlkYXRhYmxlXG4gICAgLy8gbGV0IG5lc3RlZEVycm9yczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IGlzQ29uc3RyID0gTW9kZWwuaXNQcm9wZXJ0eU1vZGVsKG1vZGVsLCBwcm9wS2V5KTtcbiAgICBjb25zdCBoYXNQcm9wVmFsdWUgPSBwcm9wVmFsdWUgIT09IG51bGwgJiYgcHJvcFZhbHVlICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKGlzQ29uc3RyICYmIGhhc1Byb3BWYWx1ZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBwcm9wVmFsdWUgYXMgTW9kZWw7XG4gICAgICBjb25zdCBpc0ludmFsaWRNb2RlbCA9XG4gICAgICAgIHR5cGVvZiBpbnN0YW5jZSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICB0eXBlb2YgaW5zdGFuY2UuaGFzRXJyb3JzICE9PSBcImZ1bmN0aW9uXCI7XG5cbiAgICAgIGlmIChpc0ludmFsaWRNb2RlbCkge1xuICAgICAgICAvLyBwcm9wRXJyb3JzW1ZhbGlkYXRpb25LZXlzLlRZUEVdID0gXCJNb2RlbCBzaG91bGQgYmUgdmFsaWRhdGFibGUgYnV0IGl0J3Mgbm90LlwiO1xuICAgICAgICBjb25zb2xlLndhcm4oXCJNb2RlbCBzaG91bGQgYmUgdmFsaWRhdGFibGUgYnV0IGl0J3Mgbm90LlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IENvbnN0ciA9IChBcnJheS5pc0FycmF5KGRlc2lnblR5cGUpID8gZGVzaWduVHlwZSA6IFtkZXNpZ25UeXBlXSlcbiAgICAgICAgICAubWFwKChkKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGQgPT09IFwiZnVuY3Rpb25cIiAmJiAhZC5uYW1lKSBkID0gZCgpO1xuICAgICAgICAgICAgcmV0dXJuIE1vZGVsLmdldChkLm5hbWUgfHwgZCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmluZCgoZCkgPT4gISFkKSBhcyBhbnk7XG5cbiAgICAgICAgLy8gRW5zdXJlIGluc3RhbmNlIGlzIG9mIHRoZSBleHBlY3RlZCBtb2RlbCBjbGFzcy5cbiAgICAgICAgaWYgKCFDb25zdHIgfHwgIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cikpIHtcbiAgICAgICAgICBwcm9wRXJyb3JzW1ZhbGlkYXRpb25LZXlzLlRZUEVdID0gIUNvbnN0clxuICAgICAgICAgICAgPyBgVW5hYmxlIHRvIHZlcmlmeSB0eXBlIGNvbnNpc3RlbmN5LCBtaXNzaW5nIG1vZGVsIHJlZ2lzdHJ5IGZvciAke2Rlc2lnblR5cGVzLnRvU3RyaW5nKCl9IG9uIHByb3AgJHtwcm9wS2V5fWBcbiAgICAgICAgICAgIDogYFZhbHVlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgJHtDb25zdHIubmFtZX1gO1xuICAgICAgICAgIGRlbGV0ZSBwcm9wRXJyb3JzW01vZGVsS2V5cy5UWVBFXTsgLy8gcmVtb3ZlIGR1cGxpY2F0ZSB0eXBlIGVycm9yXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmVzdGVkRXJyb3JzW3Byb3BLZXldID0gZ2V0TmVzdGVkVmFsaWRhdGlvbkVycm9ycyhcbiAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICBhc3luYyxcbiAgICAgICAgICAgIC4uLnByb3BzVG9JZ25vcmVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHRvIHRoZSByZXN1bHQgaWYgd2UgaGF2ZSBhbnkgZXJyb3JzXG4gICAgLy8gQXN5bmMgbW9kZSByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHVuZGVmaW5lZCB3aGVuIG5vIGVycm9ycyBleGlzdFxuICAgIGlmIChPYmplY3Qua2V5cyhwcm9wRXJyb3JzKS5sZW5ndGggPiAwIHx8IGFzeW5jKVxuICAgICAgcmVzdWx0W3Byb3BLZXldID0gcHJvcEVycm9ycztcblxuICAgIC8vIFRoZW4gbWVyZ2UgYW55IG5lc3RlZCBlcnJvcnNcbiAgICBpZiAoIWFzeW5jKSB7XG4gICAgICBPYmplY3QuZW50cmllcyhuZXN0ZWRFcnJvcnNbcHJvcEtleV0gfHwge30pLmZvckVhY2goKFtrZXksIGVycm9yXSkgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc3VsdFtgJHtwcm9wS2V5fS4ke2tleX1gXSA9IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBTeW5jaHJvbm91cyByZXR1cm5cbiAgaWYgKCFhc3luYykge1xuICAgIHJldHVybiAoXG4gICAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA+IDBcbiAgICAgICAgPyBuZXcgTW9kZWxFcnJvckRlZmluaXRpb24ocmVzdWx0KVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICkgYXMgYW55O1xuICB9XG5cbiAgY29uc3QgbWVyZ2VkOiBhbnkgPSByZXN1bHQ7IC8vIFRPRE86IGFwcGx5IGZpbHRlcmluZ1xuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhtZXJnZWQpO1xuICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC52YWx1ZXMobWVyZ2VkKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcykudGhlbihhc3luYyAocmVzdWx0cykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdDogTW9kZWxFcnJvcnMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgW3BhcmVudFByb3AsIG5lc3RlZEVyclByb21pc2VdIG9mIE9iamVjdC5lbnRyaWVzKG5lc3RlZEVycm9ycykpIHtcbiAgICAgIGNvbnN0IG5lc3RlZFByb3BEZWNFcnJvcnMgPSAoYXdhaXQgbmVzdGVkRXJyUHJvbWlzZSkgYXMgUmVjb3JkPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIGFueVxuICAgICAgPjtcblxuICAgICAgaWYgKG5lc3RlZFByb3BEZWNFcnJvcnMpXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG5lc3RlZFByb3BEZWNFcnJvcnMpLmZvckVhY2goXG4gICAgICAgICAgKFtuZXN0ZWRQcm9wLCBuZXN0ZWRQcm9wRGVjRXJyb3JdKSA9PiB7XG4gICAgICAgICAgICBpZiAobmVzdGVkUHJvcERlY0Vycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmVzdGVkS2V5ID0gW3BhcmVudFByb3AsIG5lc3RlZFByb3BdLmpvaW4oXCIuXCIpO1xuICAgICAgICAgICAgICByZXN1bHRbbmVzdGVkS2V5XSA9IG5lc3RlZFByb3BEZWNFcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgY29uc3QgcmVzID0gcmVzdWx0c1tpXTtcblxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIgJiYgcmVzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpW2tleV0gPSByZXMudmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHJlcy5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAocmVzdWx0IGFzIGFueSlba2V5XSA9XG4gICAgICAgICAgcmVzLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IHJlcy5yZWFzb24ubWVzc2FnZVxuICAgICAgICAgICAgOiBTdHJpbmcocmVzLnJlYXNvbiB8fCBcIlZhbGlkYXRpb24gZmFpbGVkXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA+IDBcbiAgICAgID8gbmV3IE1vZGVsRXJyb3JEZWZpbml0aW9uKHJlc3VsdClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9KSBhcyBhbnk7XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtZXJhdGlvbiBvZiBKYXZhU2NyaXB0IHByaW1pdGl2ZSB0eXBlIGlkZW50aWZpZXJzIHVzZWQgYnkgdGhlIG1vZGVsIHN5c3RlbS5cbiAqIEBzdW1tYXJ5IFJlZmVyZW5jZXMgdGhlIHJlbGV2YW50IEpTIHByaW1pdGl2ZXMgYW5kIHN0YW5kYXJkaXplcyB0aGVpciBzdHJpbmcgcmVwcmVzZW50YXRpb25zIGFjcm9zcyB0aGUgbGlicmFyeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVFJJTkcgcmVmZXJlbmNlcyB0aGUgc3RyaW5nIHByaW1pdGl2ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5VTUJFUiByZWZlcmVuY2VzIHRoZSBudW1iZXIgcHJpbWl0aXZlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQk9PTEVBTiByZWZlcmVuY2VzIHRoZSBib29sZWFuIHByaW1pdGl2ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0lOVCByZWZlcmVuY2VzIHRoZSBiaWdpbnQgcHJpbWl0aXZlXG4gKiBAZW51bSBQcmltaXRpdmVzXG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGVudW0gUHJpbWl0aXZlcyB7XG4gIC8qKiByZWZlcmVuY2VzIHRoZSBzdHJpbmcgcHJpbWl0aXZlICovXG4gIFNUUklORyA9IFwic3RyaW5nXCIsXG4gIC8qKiByZWZlcmVuY2VzIHRoZSBudW1iZXIgcHJpbWl0aXZlICovXG4gIE5VTUJFUiA9IFwibnVtYmVyXCIsXG4gIC8qKiByZWZlcmVuY2VzIHRoZSBib29sZWFuIHByaW1pdGl2ZSAqL1xuICBCT09MRUFOID0gXCJib29sZWFuXCIsXG4gIC8qKiByZWZlcmVuY2VzIHRoZSBiaWdpbnQgcHJpbWl0aXZlICovXG4gIEJJR0lOVCA9IFwiYmlnaW50XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlc2VydmVkIG1vZGVsIG5hbWVzIHdoaWNoIGFyZSBleGNsdWRlZCBmcm9tIG1vZGVsIHJlYnVpbGRpbmcuXG4gKiBAc3VtbWFyeSBSZWZlcmVuY2VzIHRoZSBSZXNlcnZlZCBtb2RlbCBuYW1lcyB0byBpZ25vcmUgZHVyaW5nIE1vZGVsIHJlYnVpbGRpbmcgdG8gYXZvaWQgaW50ZXJmZXJpbmcgd2l0aCBuYXRpdmUgdHlwZXMgYW5kIHNwZWNpYWwgY2FzZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU1RSSU5HXG4gKiBAcHJvcGVydHkge3N0cmluZ30gT0JKRUNUXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVNQkVSXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQk9PTEVBTlxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0lOVFxuICogQHByb3BlcnR5IHtzdHJpbmd9IERBVEVcbiAqIEBlbnVtIFJlc2VydmVkTW9kZWxzXG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGVudW0gUmVzZXJ2ZWRNb2RlbHMge1xuICAvKiogcmVzZXJ2ZWQgbmFtZSBmb3Igc3RyaW5nICovXG4gIFNUUklORyA9IFwic3RyaW5nXCIsXG4gIC8qKiByZXNlcnZlZCBuYW1lIGZvciBvYmplY3QgKi9cbiAgT0JKRUNUID0gXCJvYmplY3RcIixcbiAgLyoqIHJlc2VydmVkIG5hbWUgZm9yIG51bWJlciAqL1xuICBOVU1CRVIgPSBcIm51bWJlclwiLFxuICAvKiogcmVzZXJ2ZWQgbmFtZSBmb3IgYm9vbGVhbiAqL1xuICBCT09MRUFOID0gXCJib29sZWFuXCIsXG4gIC8qKiByZXNlcnZlZCBuYW1lIGZvciBiaWdpbnQgKi9cbiAgQklHSU5UID0gXCJiaWdpbnRcIixcbiAgLyoqIHJlc2VydmVkIG5hbWUgZm9yIERhdGUgKi9cbiAgREFURSA9IFwiZGF0ZVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNpYyBzdXBwb3J0ZWQgSmF2YVNjcmlwdCB0eXBlcyB1c2VkIGJ5IHRoZSB2YWxpZGF0aW9uIHN5c3RlbS5cbiAqIEBzdW1tYXJ5IFJlZmVyZW5jZXMgdGhlIGJhc2ljIHN1cHBvcnRlZCBKUyB0eXBlcyBhcyBzdHJpbmdzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHR5cGUgY2hlY2tpbmcgYW5kIG1ldGFkYXRhLlxuICogQHR5cGVkZWYge09iamVjdH0gSnNUeXBlc1xuICogQHByb3BlcnR5IHtcInN0cmluZ1wifSBzdHJpbmcgU3RyaW5nIHByaW1pdGl2ZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge1wiYXJyYXlcIn0gYXJyYXkgQXJyYXkgdHlwZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge1wibnVtYmVyXCJ9IG51bWJlciBOdW1iZXIgcHJpbWl0aXZlIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7XCJib29sZWFuXCJ9IGJvb2xlYW4gQm9vbGVhbiBwcmltaXRpdmUgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHtcInN5bWJvbFwifSBzeW1ib2wgU3ltYm9sIHByaW1pdGl2ZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge1wiZnVuY3Rpb25cIn0gZnVuY3Rpb24gRnVuY3Rpb24gdHlwZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge1wib2JqZWN0XCJ9IG9iamVjdCBPYmplY3QgdHlwZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge1widW5kZWZpbmVkXCJ9IHVuZGVmaW5lZCBVbmRlZmluZWQgdHlwZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge1wibnVsbFwifSBudWxsIE51bGwgdmFsdWUgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHtcImJpZ2ludFwifSBCSUdJTlQgQmlnSW50IHByaW1pdGl2ZSBpZGVudGlmaWVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBqc1R5cGVzID0gW1xuICBcInN0cmluZ1wiLFxuICBcImFycmF5XCIsXG4gIFwibnVtYmVyXCIsXG4gIFwiYm9vbGVhblwiLFxuICBcInN5bWJvbFwiLFxuICBcImZ1bmN0aW9uXCIsXG4gIFwib2JqZWN0XCIsXG4gIFwidW5kZWZpbmVkXCIsXG4gIFwibnVsbFwiLFxuICBcImJpZ2ludFwiLFxuXTtcbiIsImltcG9ydCB7IFNlcmlhbGl6YXRpb24gfSBmcm9tIFwiLi4vdXRpbHMvc2VyaWFsaXphdGlvblwiO1xuaW1wb3J0IHsgQnVpbGRlclJlZ2lzdHJ5IH0gZnJvbSBcIi4uL3V0aWxzL3JlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBNb2RlbEVycm9yRGVmaW5pdGlvbiB9IGZyb20gXCIuL01vZGVsRXJyb3JEZWZpbml0aW9uXCI7XG5pbXBvcnQge1xuICBDb21wYXJhYmxlLFxuICBDb25zdHJ1Y3RvcixcbiAgSGFzaGFibGUsXG4gIE1vZGVsQXJnLFxuICBNb2RlbEJ1aWxkZXJGdW5jdGlvbixcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgU2VyaWFsaXphYmxlLFxuICBWYWxpZGF0YWJsZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY29yYXRvck1ldGFkYXRhLCBpc0VxdWFsLCBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZSB9IGZyb20gXCIuL3ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEhhc2hpbmcgfSBmcm9tIFwiLi4vdXRpbHMvaGFzaGluZ1wiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi4vdmFsaWRhdGlvbi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsganNUeXBlcywgUmVzZXJ2ZWRNb2RlbHMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldE1ldGFkYXRhLCBnZXRNb2RlbEtleSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25hbEFzeW5jIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBBU1lOQ19NRVRBX0tFWSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxubGV0IG1vZGVsQnVpbGRlckZ1bmN0aW9uOiBNb2RlbEJ1aWxkZXJGdW5jdGlvbiB8IHVuZGVmaW5lZDtcbmxldCBhY3RpbmdNb2RlbFJlZ2lzdHJ5OiBCdWlsZGVyUmVnaXN0cnk8YW55PjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVnaXN0cnkgdHlwZSBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyBtb2RlbCBjb25zdHJ1Y3RvcnNcbiAqIEBzdW1tYXJ5IFRoZSBNb2RlbFJlZ2lzdHJ5IHR5cGUgZGVmaW5lcyBhIHJlZ2lzdHJ5IGZvciBtb2RlbCBjb25zdHJ1Y3RvcnMgdGhhdCBleHRlbmRzXG4gKiB0aGUgQnVpbGRlclJlZ2lzdHJ5IGludGVyZmFjZS4gSXQgcHJvdmlkZXMgYSBzdGFuZGFyZGl6ZWQgd2F5IHRvIHJlZ2lzdGVyLCByZXRyaWV2ZSxcbiAqIGFuZCBidWlsZCBtb2RlbCBpbnN0YW5jZXMsIGVuYWJsaW5nIHRoZSBtb2RlbCBzeXN0ZW0gdG8gd29yayB3aXRoIGRpZmZlcmVudCB0eXBlcyBvZiBtb2RlbHMuXG4gKlxuICogQGludGVyZmFjZSBNb2RlbFJlZ2lzdHJ5XG4gKiBAdGVtcGxhdGUgVCBUeXBlIG9mIG1vZGVsIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQsIG11c3QgZXh0ZW5kIE1vZGVsXG4gKiBAZXh0ZW5kcyBCdWlsZGVyUmVnaXN0cnk8VD5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgdHlwZSBNb2RlbFJlZ2lzdHJ5PFQgZXh0ZW5kcyBNb2RlbD4gPSBCdWlsZGVyUmVnaXN0cnk8VD47XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlZ2lzdHJ5IG1hbmFnZXIgZm9yIG1vZGVsIGNvbnN0cnVjdG9ycyB0aGF0IGVuYWJsZXMgc2VyaWFsaXphdGlvbiBhbmQgcmVidWlsZGluZ1xuICogQHN1bW1hcnkgVGhlIE1vZGVsUmVnaXN0cnlNYW5hZ2VyIGltcGxlbWVudHMgdGhlIE1vZGVsUmVnaXN0cnkgaW50ZXJmYWNlIGFuZCBwcm92aWRlc1xuICogZnVuY3Rpb25hbGl0eSBmb3IgcmVnaXN0ZXJpbmcsIHJldHJpZXZpbmcsIGFuZCBidWlsZGluZyBtb2RlbCBpbnN0YW5jZXMuIEl0IG1haW50YWluc1xuICogYSBjYWNoZSBvZiBtb2RlbCBjb25zdHJ1Y3RvcnMgaW5kZXhlZCBieSBuYW1lLCBhbGxvd2luZyBmb3IgZWZmaWNpZW50IGxvb2t1cCBhbmQgaW5zdGFudGlhdGlvbi5cbiAqIFRoaXMgY2xhc3MgaXMgZXNzZW50aWFsIGZvciB0aGUgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uIG9mIG1vZGVsIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbihSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYm9vbGVhbn0gW3Rlc3RGdW5jdGlvbl0gLSBGdW5jdGlvbiB0byB0ZXN0IGlmIGFuIG9iamVjdCBpcyBhIG1vZGVsLCBkZWZhdWx0cyB0byB7QGxpbmsgTW9kZWwjaXNNb2RlbH1cbiAqXG4gKiBAY2xhc3MgTW9kZWxSZWdpc3RyeU1hbmFnZXJcbiAqIEB0ZW1wbGF0ZSBNIFR5cGUgb2YgbW9kZWwgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCwgbXVzdCBleHRlbmQgTW9kZWxcbiAqIEBpbXBsZW1lbnRzIE1vZGVsUmVnaXN0cnk8TT5cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBtb2RlbCByZWdpc3RyeVxuICogY29uc3QgcmVnaXN0cnkgPSBuZXcgTW9kZWxSZWdpc3RyeU1hbmFnZXIoKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhIG1vZGVsIGNsYXNzXG4gKiByZWdpc3RyeS5yZWdpc3RlcihVc2VyKTtcbiAqXG4gKiAvLyBSZXRyaWV2ZSBhIG1vZGVsIGNvbnN0cnVjdG9yIGJ5IG5hbWVcbiAqIGNvbnN0IFVzZXJDbGFzcyA9IHJlZ2lzdHJ5LmdldChcIlVzZXJcIik7XG4gKlxuICogLy8gQnVpbGQgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIGEgcGxhaW4gb2JqZWN0XG4gKiBjb25zdCB1c2VyRGF0YSA9IHsgbmFtZTogXCJKb2huXCIsIGFnZTogMzAgfTtcbiAqIGNvbnN0IHVzZXIgPSByZWdpc3RyeS5idWlsZCh1c2VyRGF0YSwgXCJVc2VyXCIpO1xuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBSIGFzIE1vZGVsUmVnaXN0cnlNYW5hZ2VyXG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWwgQ2xhc3NcbiAqXG4gKiAgIEMtPj5SOiBuZXcgTW9kZWxSZWdpc3RyeU1hbmFnZXIodGVzdEZ1bmN0aW9uKVxuICogICBDLT4+UjogcmVnaXN0ZXIoTW9kZWxDbGFzcylcbiAqICAgUi0+PlI6IFN0b3JlIGluIGNhY2hlXG4gKiAgIEMtPj5SOiBnZXQoXCJNb2RlbE5hbWVcIilcbiAqICAgUi0tPj5DOiBNb2RlbENsYXNzIGNvbnN0cnVjdG9yXG4gKiAgIEMtPj5SOiBidWlsZChkYXRhLCBcIk1vZGVsTmFtZVwiKVxuICogICBSLT4+UjogR2V0IGNvbnN0cnVjdG9yIGZyb20gY2FjaGVcbiAqICAgUi0+Pk06IG5ldyBNb2RlbENsYXNzKGRhdGEpXG4gKiAgIE0tLT4+UjogTW9kZWwgaW5zdGFuY2VcbiAqICAgUi0tPj5DOiBNb2RlbCBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgTW9kZWxSZWdpc3RyeU1hbmFnZXI8TSBleHRlbmRzIE1vZGVsPHRydWUgfCBmYWxzZT4+XG4gIGltcGxlbWVudHMgTW9kZWxSZWdpc3RyeTxNPlxue1xuICBwcml2YXRlIGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvbnN0cnVjdG9yPE0+PiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHRlc3RGdW5jdGlvbjogKG9iajogb2JqZWN0KSA9PiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHRlc3RGdW5jdGlvbjogKG9iajogUmVjb3JkPHN0cmluZywgYW55PikgPT4gYm9vbGVhbiA9IE1vZGVsLmlzTW9kZWxcbiAgKSB7XG4gICAgdGhpcy50ZXN0RnVuY3Rpb24gPSB0ZXN0RnVuY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIG1vZGVsIGNvbnN0cnVjdG9yIHdpdGggdGhlIHJlZ2lzdHJ5XG4gICAqIEBzdW1tYXJ5IEFkZHMgYSBtb2RlbCBjb25zdHJ1Y3RvciB0byB0aGUgcmVnaXN0cnkgY2FjaGUsIG1ha2luZyBpdCBhdmFpbGFibGUgZm9yXG4gICAqIGxhdGVyIHJldHJpZXZhbCBhbmQgaW5zdGFudGlhdGlvbi4gSWYgbm8gbmFtZSBpcyBwcm92aWRlZCwgdGhlIGNvbnN0cnVjdG9yJ3MgbmFtZVxuICAgKiBwcm9wZXJ0eSBpcyB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3I8TT59IGNvbnN0cnVjdG9yIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBPcHRpb25hbCBuYW1lIHRvIHJlZ2lzdGVyIHRoZSBjb25zdHJ1Y3RvciB1bmRlciwgZGVmYXVsdHMgdG8gY29uc3RydWN0b3IubmFtZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNvbnN0cnVjdG9yIGlzIG5vdCBhIGZ1bmN0aW9uXG4gICAqL1xuICByZWdpc3Rlcihjb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3RvcjxNPiwgbmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJNb2RlbCByZWdpc3RlcmluZyBmYWlsZWQuIE1pc3NpbmcgQ2xhc3MgbmFtZSBvciBjb25zdHJ1Y3RvclwiXG4gICAgICApO1xuICAgIG5hbWUgPSBuYW1lIHx8IGNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhpcy5jYWNoZVtuYW1lXSA9IGNvbnN0cnVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdldHMgYSByZWdpc3RlcmVkIE1vZGVsIHtAbGluayBNb2RlbENvbnN0cnVjdG9yfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IE1vZGVsQ29uc3RydWN0b3I8TT4gfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVtuYW1lXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbY2xhenpdIHdoZW4gcHJvdmlkZWQsIGl0IHdpbGwgYXR0ZW1wdCB0byBmaW5kIHRoZSBtYXRjaGluZyBjb25zdHJ1Y3RvclxuICAgKlxuICAgKiBAdGhyb3dzIEVycm9yIElmIGNsYXp6IGlzIG5vdCBmb3VuZCwgb3Igb2JqIGlzIG5vdCBhIHtAbGluayBNb2RlbH0gbWVhbmluZyBpdCBoYXMgbm8ge0BsaW5rIE1vZGVsS2V5cy5BTkNIT1J9IHByb3BlcnR5XG4gICAqL1xuICBidWlsZChvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSwgY2xheno/OiBzdHJpbmcpOiBNIHtcbiAgICBpZiAoIWNsYXp6ICYmICF0aGlzLnRlc3RGdW5jdGlvbihvYmopKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvdmlkZWQgb2JqIGlzIG5vdCBhIE1vZGVsIG9iamVjdFwiKTtcbiAgICBjb25zdCBuYW1lID0gY2xhenogfHwgTW9kZWwuZ2V0TWV0YWRhdGEob2JqIGFzIGFueSk7XG4gICAgaWYgKCEobmFtZSBpbiB0aGlzLmNhY2hlKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFByb3ZpZGVkIGNsYXNzICR7bmFtZX0gaXMgbm90IGEgcmVnaXN0ZXJlZCBNb2RlbCBvYmplY3RgXG4gICAgICApO1xuICAgIHJldHVybiBuZXcgdGhpcy5jYWNoZVtuYW1lXShvYmopO1xuICB9XG59XG5cbi8qKlxuICogQHN1bW1hcnkgQnVsayBSZWdpc3RlcnMgTW9kZWxzXG4gKiBAZGVzY3JpcHRpb24gVXNlZnVsIHdoZW4gdXNpbmcgYnVuZGxlcnMgdGhhdCBtaWdodCBub3QgZXZhbHVhdGUgYWxsIHRoZSBjb2RlIGF0IG9uY2VcbiAqXG4gKiBAdGVtcGxhdGUgTSBleHRlbmRzIE1vZGVsXG4gKiBAcGFyYW0ge0FycmF5PENvbnN0cnVjdG9yPE0+PiB8IEFycmF5PHtuYW1lOiBzdHJpbmcsIGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxNPn0+fSBbbW9kZWxzXVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVsa01vZGVsUmVnaXN0ZXI8TSBleHRlbmRzIE1vZGVsPihcbiAgLi4ubW9kZWxzOiAoQ29uc3RydWN0b3I8TT4gfCB7IG5hbWU6IHN0cmluZzsgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPE0+IH0pW11cbikge1xuICBtb2RlbHMuZm9yRWFjaChcbiAgICAobTogQ29uc3RydWN0b3I8TT4gfCB7IG5hbWU6IHN0cmluZzsgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPE0+IH0pID0+IHtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxNPiA9IChcbiAgICAgICAgbS5jb25zdHJ1Y3RvciA/IG0uY29uc3RydWN0b3IgOiBtXG4gICAgICApIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgICAgTW9kZWwucmVnaXN0ZXIoY29uc3RydWN0b3IsIChtIGFzIENvbnN0cnVjdG9yPE0+KS5uYW1lKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgQWJzdHJhY3QgY2xhc3MgcmVwcmVzZW50aW5nIGEgVmFsaWRhdGFibGUgTW9kZWwgb2JqZWN0XG4gKiBAZGVzY3JpcHRpb24gTWVhbnQgdG8gYmUgdXNlZCBhcyBhIGJhc2UgY2xhc3MgZm9yIGFsbCBNb2RlbCBjbGFzc2VzXG4gKlxuICogTW9kZWwgb2JqZWN0cyBtdXN0OlxuICogIC0gSGF2ZSBhbGwgdGhlaXIgcmVxdWlyZWQgcHJvcGVydGllcyBtYXJrZWQgd2l0aCAnISc7XG4gKiAgLSBIYXZlIGFsbCB0aGVpciBvcHRpb25hbCBwcm9wZXJ0aWVzIG1hcmtlZCBhcyAnPyc6XG4gKlxuICogQHBhcmFtIHtNb2RlbEFyZzxNb2RlbD59IG1vZGVsIGJhc2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gcG9wdWxhdGUgcHJvcGVydGllcyBmcm9tXG4gKlxuICogQGNsYXNzIE1vZGVsXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqIEBhYnN0cmFjdFxuICogQGltcGxlbWVudHMgVmFsaWRhdGFibGVcbiAqIEBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKiAgICAgIGNsYXNzIENsYXNzTmFtZSB7XG4gKiAgICAgICAgICBAcmVxdWlyZWQoKVxuICogICAgICAgICAgcmVxdWlyZWRQcm9wZXJ0eU5hbWUhOiBQcm9wZXJ0eVR5cGU7XG4gKlxuICogICAgICAgICAgb3B0aW9uYWxQcm9wZXJ0eU5hbWU/OiBQcm9wZXJ0eVR5cGU7XG4gKiAgICAgIH1cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1vZGVsPEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlPlxuICBpbXBsZW1lbnRzXG4gICAgVmFsaWRhdGFibGU8QXN5bmM+LFxuICAgIFNlcmlhbGl6YWJsZSxcbiAgICBIYXNoYWJsZSxcbiAgICBDb21wYXJhYmxlPE1vZGVsPEFzeW5jPj5cbntcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYXJnOiBNb2RlbEFyZzxNb2RlbD4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHt9XG5cbiAgcHVibGljIGlzQXN5bmMoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXMgYXMgYW55O1xuICAgIHJldHVybiAhIShzZWxmW0FTWU5DX01FVEFfS0VZXSA/PyBzZWxmPy5jb25zdHJ1Y3RvcltBU1lOQ19NRVRBX0tFWV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgdGhlIG1vZGVsIG9iamVjdCBhZ2FpbnN0IGl0cyBkZWZpbmVkIHZhbGlkYXRpb24gcnVsZXNcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoZSBvYmplY3QgYWNjb3JkaW5nIHRvIGl0cyBkZWNvcmF0ZWQgcHJvcGVydGllcywgcmV0dXJuaW5nIGFueSB2YWxpZGF0aW9uIGVycm9yc1xuICAgKlxuICAgKiBAcGFyYW0ge2FueVtdfSBbZXhjZXB0aW9uc10gLSBQcm9wZXJ0aWVzIGluIHRoZSBvYmplY3QgdG8gYmUgaWdub3JlZCBmb3IgdGhlIHZhbGlkYXRpb24uIE1hcmtlZCBhcyAnYW55JyB0byBhbGxvdyBmb3IgZXh0ZW5zaW9uIGJ1dCBleHBlY3RzIHN0cmluZ3NcbiAgICogQHJldHVybiB7TW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWR9IC0gUmV0dXJucyBhIE1vZGVsRXJyb3JEZWZpbml0aW9uIG9iamVjdCBpZiB2YWxpZGF0aW9uIGVycm9ycyBleGlzdCwgb3RoZXJ3aXNlIHVuZGVmaW5lZFxuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICAuLi5leGNlcHRpb25zOiBhbnlbXVxuICApOiBDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB2YWxpZGF0ZTxhbnksIEFzeW5jPihcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLmlzQXN5bmMoKSBhcyBhbnksXG4gICAgICAuLi5leGNlcHRpb25zXG4gICAgKSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhpcyBtb2RlbCBpcyBlcXVhbCB0byBhbm90aGVyIG9iamVjdFxuICAgKiBAc3VtbWFyeSBDb21wYXJlIG9iamVjdCBlcXVhbGl0eSByZWN1cnNpdmVseSwgY2hlY2tpbmcgYWxsIHByb3BlcnRpZXMgdW5sZXNzIGV4Y2x1ZGVkXG4gICAqXG4gICAqIEBwYXJhbSB7YW55fSBvYmogLSBPYmplY3QgdG8gY29tcGFyZSB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbZXhjZXB0aW9uc10gLSBQcm9wZXJ0eSBuYW1lcyB0byBiZSBleGNsdWRlZCBmcm9tIHRoZSBjb21wYXJpc29uXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IC0gVHJ1ZSBpZiBvYmplY3RzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwdWJsaWMgZXF1YWxzKG9iajogYW55LCAuLi5leGNlcHRpb25zOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0VxdWFsKHRoaXMsIG9iaiwgLi4uZXhjZXB0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIHRoZSBtb2RlbCB0byBhIHNlcmlhbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHNlcmlhbGl6ZWQgbW9kZWwgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50bHkgZGVmaW5lZCB7QGxpbmsgU2VyaWFsaXplcn1cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSAtIFRoZSBzZXJpYWxpemVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWxcbiAgICovXG4gIHNlcmlhbGl6ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBNb2RlbC5zZXJpYWxpemUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbFxuICAgKiBAc3VtbWFyeSBPdmVycmlkZSB0aGUgaW1wbGVtZW50YXRpb24gZm9yIGpzJ3MgJ3RvU3RyaW5nKCknIHRvIHByb3ZpZGUgYSBtb3JlIHVzZWZ1bCByZXByZXNlbnRhdGlvblxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIGluY2x1ZGluZyBpdHMgY2xhc3MgbmFtZSBhbmQgSlNPTiByZXByZXNlbnRhdGlvblxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyBcIjogXCIgKyBKU09OLnN0cmluZ2lmeSh0aGlzLCB1bmRlZmluZWQsIDIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBoYXNoIHN0cmluZyBmb3IgdGhlIG1vZGVsIG9iamVjdFxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3Igb2JqZWN0IGhhc2gsIHJlbHlpbmcgb24gYSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBKYXZhJ3Mgc3RyaW5nIGhhc2hcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSAtIEEgaGFzaCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBtb2RlbFxuICAgKi9cbiAgcHVibGljIGhhc2goKTogc3RyaW5nIHtcbiAgICByZXR1cm4gTW9kZWwuaGFzaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzZXJpYWxpemVkIHN0cmluZyBiYWNrIGludG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBEZXNlcmlhbGl6ZXMgYSBNb2RlbCBmcm9tIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBzZXJpYWxpemVkIHN0cmluZyB0byBjb252ZXJ0IGJhY2sgdG8gYSBtb2RlbFxuICAgKiBAcmV0dXJuIHthbnl9IC0gVGhlIGRlc2VyaWFsaXplZCBtb2RlbCBpbnN0YW5jZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgZmFpbHMgdG8gcGFyc2UgdGhlIHN0cmluZywgb3IgaWYgaXQgZmFpbHMgdG8gYnVpbGQgdGhlIG1vZGVsXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemUoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBNb2RlbC5rZXkoTW9kZWxLZXlzLlNFUklBTElaQVRJT04pLFxuICAgICAgdGhpcy5jb25zdHJ1Y3RvclxuICAgICk7XG5cbiAgICBpZiAobWV0YWRhdGEgJiYgbWV0YWRhdGEuc2VyaWFsaXplcilcbiAgICAgIHJldHVybiBTZXJpYWxpemF0aW9uLmRlc2VyaWFsaXplKFxuICAgICAgICBzdHIsXG4gICAgICAgIG1ldGFkYXRhLnNlcmlhbGl6ZXIsXG4gICAgICAgIC4uLihtZXRhZGF0YS5hcmdzIHx8IFtdKVxuICAgICAgKTtcbiAgICByZXR1cm4gU2VyaWFsaXphdGlvbi5kZXNlcmlhbGl6ZShzdHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb3BpZXMgcHJvcGVydGllcyBmcm9tIGEgc291cmNlIG9iamVjdCB0byBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFJlcG9wdWxhdGVzIHRoZSBPYmplY3QgcHJvcGVydGllcyB3aXRoIHRoZSBvbmVzIGZyb20gdGhlIG5ldyBvYmplY3RcbiAgICpcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUfSBzZWxmIC0gVGhlIHRhcmdldCBtb2RlbCBpbnN0YW5jZSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtUIHwgUmVjb3JkPHN0cmluZywgYW55Pn0gW29ial0gLSBUaGUgc291cmNlIG9iamVjdCBjb250YWluaW5nIHByb3BlcnRpZXMgdG8gY29weVxuICAgKiBAcmV0dXJuIHtUfSAtIFRoZSB1cGRhdGVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZnJvbU9iamVjdDxUIGV4dGVuZHMgTW9kZWw8YW55Pj4oXG4gICAgc2VsZjogVCxcbiAgICBvYmo/OiBUIHwgUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBUIHtcbiAgICBpZiAoIW9iaikgb2JqID0ge307XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIE1vZGVsLmdldEF0dHJpYnV0ZXMoc2VsZikpIHtcbiAgICAgIChzZWxmIGFzIGFueSlbcHJvcF0gPVxuICAgICAgICAob2JqIGFzIGFueSlbcHJvcF0gPz8gKHNlbGYgYXMgYW55KVtwcm9wXSA/PyB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb3BpZXMgYW5kIHJlYnVpbGRzIHByb3BlcnRpZXMgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSBtb2RlbCBpbnN0YW5jZSwgaGFuZGxpbmcgbmVzdGVkIG1vZGVsc1xuICAgKiBAc3VtbWFyeSBSZXBvcHVsYXRlcyB0aGUgaW5zdGFuY2Ugd2l0aCBwcm9wZXJ0aWVzIGZyb20gdGhlIG5ldyBNb2RlbCBPYmplY3QsIHJlY3Vyc2l2ZWx5IHJlYnVpbGRpbmcgbmVzdGVkIG1vZGVsc1xuICAgKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1R9IHNlbGYgLSBUaGUgdGFyZ2V0IG1vZGVsIGluc3RhbmNlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge1QgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbb2JqXSAtIFRoZSBzb3VyY2Ugb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyB0byBjb3B5XG4gICAqIEByZXR1cm4ge1R9IC0gVGhlIHVwZGF0ZWQgbW9kZWwgaW5zdGFuY2Ugd2l0aCByZWJ1aWx0IG5lc3RlZCBtb2RlbHNcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBNIGFzIE1vZGVsLmZyb21Nb2RlbFxuICAgKiAgIHBhcnRpY2lwYW50IEIgYXMgTW9kZWwuYnVpbGRcbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIFJlZmxlY3Rpb25cbiAgICpcbiAgICogICBDLT4+TTogZnJvbU1vZGVsKHNlbGYsIG9iailcbiAgICogICBNLT4+TTogR2V0IGF0dHJpYnV0ZXMgZnJvbSBzZWxmXG4gICAqICAgbG9vcCBGb3IgZWFjaCBwcm9wZXJ0eVxuICAgKiAgICAgTS0+Pk06IENvcHkgcHJvcGVydHkgZnJvbSBvYmogdG8gc2VsZlxuICAgKiAgICAgYWx0IFByb3BlcnR5IGlzIGEgbW9kZWxcbiAgICogICAgICAgTS0+Pk06IENoZWNrIGlmIHByb3BlcnR5IGlzIGEgbW9kZWxcbiAgICogICAgICAgTS0+PkI6IGJ1aWxkKHByb3BlcnR5LCBtb2RlbFR5cGUpXG4gICAqICAgICAgIEItLT4+TTogUmV0dXJuIGJ1aWx0IG1vZGVsXG4gICAqICAgICBlbHNlIFByb3BlcnR5IGlzIGEgY29tcGxleCB0eXBlXG4gICAqICAgICAgIE0tPj5SOiBHZXQgcHJvcGVydHkgZGVjb3JhdG9yc1xuICAgKiAgICAgICBSLS0+Pk06IFJldHVybiBkZWNvcmF0b3JzXG4gICAqICAgICAgIE0tPj5NOiBGaWx0ZXIgdHlwZSBkZWNvcmF0b3JzXG4gICAqICAgICAgIGFsdCBQcm9wZXJ0eSBpcyBBcnJheS9TZXQgd2l0aCBsaXN0IGRlY29yYXRvclxuICAgKiAgICAgICAgIE0tPj5NOiBQcm9jZXNzIGVhY2ggaXRlbSBpbiBjb2xsZWN0aW9uXG4gICAqICAgICAgICAgbG9vcCBGb3IgZWFjaCBpdGVtXG4gICAqICAgICAgICAgICBNLT4+QjogYnVpbGQoaXRlbSwgaXRlbU1vZGVsVHlwZSlcbiAgICogICAgICAgICAgIEItLT4+TTogUmV0dXJuIGJ1aWx0IG1vZGVsXG4gICAqICAgICAgICAgZW5kXG4gICAqICAgICAgIGVsc2UgUHJvcGVydHkgaXMgYW5vdGhlciBtb2RlbCB0eXBlXG4gICAqICAgICAgICAgTS0+PkI6IGJ1aWxkKHByb3BlcnR5LCBwcm9wZXJ0eVR5cGUpXG4gICAqICAgICAgICAgQi0tPj5NOiBSZXR1cm4gYnVpbHQgbW9kZWxcbiAgICogICAgICAgZW5kXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICogICBNLS0+PkM6IFJldHVybiB1cGRhdGVkIHNlbGZcbiAgICovXG4gIHN0YXRpYyBmcm9tTW9kZWw8VCBleHRlbmRzIE1vZGVsPihzZWxmOiBULCBvYmo/OiBUIHwgUmVjb3JkPHN0cmluZywgYW55Pik6IFQge1xuICAgIGlmICghb2JqKSBvYmogPSB7fTtcblxuICAgIGxldCBkZWNvcmF0b3JzOiBEZWNvcmF0b3JNZXRhZGF0YVtdLCBkZWM6IERlY29yYXRvck1ldGFkYXRhO1xuXG4gICAgY29uc3QgcHJvcHMgPSBNb2RlbC5nZXRBdHRyaWJ1dGVzKHNlbGYpO1xuXG4gICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc2VsZik7XG4gICAgbGV0IGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID1cbiAgICAgICAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID8/XG4gICAgICAgICAgKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0gPz9cbiAgICAgICAgICB1bmRlZmluZWQ7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBwcm9wKTtcbiAgICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8IGRlc2NyaXB0b3Iud3JpdGFibGUpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gd3JpdGUgcHJvcGVydHkgJHtwcm9wfSB0byBtb2RlbDogJHtlfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIChzZWxmIGFzIGFueSlbcHJvcF0gIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwcm9wTSA9IE1vZGVsLmlzUHJvcGVydHlNb2RlbChzZWxmLCBwcm9wKTtcbiAgICAgIGlmIChwcm9wTSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID0gTW9kZWwuYnVpbGQoXG4gICAgICAgICAgICAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSxcbiAgICAgICAgICAgIHR5cGVvZiBwcm9wTSA9PT0gXCJzdHJpbmdcIiA/IHByb3BNIDogdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFsbERlY29yYXRvcnM6IERlY29yYXRvck1ldGFkYXRhW10gPVxuICAgICAgICBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICAgIHNlbGYsXG4gICAgICAgICAgcHJvcFxuICAgICAgICApLmRlY29yYXRvcnM7XG4gICAgICBkZWNvcmF0b3JzID0gYWxsRGVjb3JhdG9ycy5maWx0ZXIoXG4gICAgICAgIChkOiBEZWNvcmF0b3JNZXRhZGF0YSkgPT5cbiAgICAgICAgICBbTW9kZWxLZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLlRZUEUgYXMgc3RyaW5nXS5pbmRleE9mKGQua2V5KSAhPT0gLTFcbiAgICAgICk7XG4gICAgICBpZiAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZhaWxlZCB0byBmaW5kIGRlY29yYXRvcnMgZm9yIHByb3BlcnR5ICR7cHJvcH1gKTtcbiAgICAgIGRlYyA9IGRlY29yYXRvcnMucG9wKCkgYXMgRGVjb3JhdG9yTWV0YWRhdGE7XG4gICAgICBjb25zdCBjbGF6eiA9IGRlYy5wcm9wcy5uYW1lXG4gICAgICAgID8gW2RlYy5wcm9wcy5uYW1lXVxuICAgICAgICA6IChBcnJheS5pc0FycmF5KGRlYy5wcm9wcy5jdXN0b21UeXBlcylcbiAgICAgICAgICAgID8gZGVjLnByb3BzLmN1c3RvbVR5cGVzXG4gICAgICAgICAgICA6IFtkZWMucHJvcHMuY3VzdG9tVHlwZXNdXG4gICAgICAgICAgKS5tYXAoKHQpID0+ICh0eXBlb2YgdCA9PT0gXCJmdW5jdGlvblwiID8gdCgpIDogdCkpO1xuICAgICAgY29uc3QgcmVzZXJ2ZWQgPSBPYmplY3QudmFsdWVzKFJlc2VydmVkTW9kZWxzKS5tYXAoKHYpID0+XG4gICAgICAgIHYudG9Mb3dlckNhc2UoKVxuICAgICAgKSBhcyBzdHJpbmdbXTtcblxuICAgICAgY2xhenouZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGlmIChjLm5hbWUpIGMgPSBjLm5hbWU7XG4gICAgICAgICAgZWxzZSBjID0gYygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNlcnZlZC5pbmRleE9mKGMudG9Mb3dlckNhc2UoKSkgPT09IC0xKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgICAgICAgICAgICBpZiAoYWxsRGVjb3JhdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3REZWMgPSBhbGxEZWNvcmF0b3JzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIChkKSA9PiBkLmtleSA9PT0gVmFsaWRhdGlvbktleXMuTElTVFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChsaXN0RGVjKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjbGF6ek5hbWUgPSAobGlzdERlYy5wcm9wcy5jbGF6eiBhcyBzdHJpbmdbXSkuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAodDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ID0gdHlwZW9mIHQgPT09IFwiZnVuY3Rpb25cIiA/ICh0IGFzIGFueSkoKSA6IHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ID0gKHQgYXMgYW55KS5uYW1lID8gKHQgYXMgYW55KS5uYW1lIDogdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhanNUeXBlcy5pbmNsdWRlcyh0KTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNsYXp6TmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGNsYXp6TmFtZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjbGF6ek5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKGNsYXp6TmFtZSBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICAgIGNsYXp6TmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGNsYXp6TmFtZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjbGF6ek5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKGNsYXp6TmFtZSBhcyBhbnkpLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjID09PSBcIkFycmF5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0gPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgICAgICAgICAgICAgICApW3Byb3BdLm1hcCgoZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcIm9iamVjdFwiLCBcImZ1bmN0aW9uXCJdLmluY2x1ZGVzKHR5cGVvZiBlbCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhenpOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gTW9kZWwuYnVpbGQoZWwsIGNsYXp6TmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBlbDtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09IFwiU2V0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJvYmplY3RcIiwgXCJmdW5jdGlvblwiXS5pbmNsdWRlcyh0eXBlb2YgdikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhenpOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZGQoTW9kZWwuYnVpbGQodiwgY2xhenpOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkZCh2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0gPSBzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxmW3Byb3AgYXMga2V5b2YgdHlwZW9mIHNlbGZdICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgICAgICBNb2RlbC5nZXQoYylcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSA9IE1vZGVsLmJ1aWxkKFxuICAgICAgICAgICAgICAgICAgICAoc2VsZiBhcyBhbnkpW3Byb3BdLFxuICAgICAgICAgICAgICAgICAgICBjXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nLiB3ZSBoYXZlIG5vIHJlZ2lzdHJ5IG9mIHRoaXMgY2xhc3NcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyZXMgdGhlIGdsb2JhbCBtb2RlbCBidWlsZGVyIGZ1bmN0aW9uXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIEdsb2JhbCB7QGxpbmsgTW9kZWxCdWlsZGVyRnVuY3Rpb259IHVzZWQgZm9yIGJ1aWxkaW5nIG1vZGVsIGluc3RhbmNlc1xuICAgKlxuICAgKiBAcGFyYW0ge01vZGVsQnVpbGRlckZ1bmN0aW9ufSBbYnVpbGRlcl0gLSBUaGUgYnVpbGRlciBmdW5jdGlvbiB0byBzZXQgYXMgdGhlIGdsb2JhbCBidWlsZGVyXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0QnVpbGRlcihidWlsZGVyPzogTW9kZWxCdWlsZGVyRnVuY3Rpb24pIHtcbiAgICBtb2RlbEJ1aWxkZXJGdW5jdGlvbiA9IGJ1aWxkZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgZ2xvYmFsIG1vZGVsIGJ1aWxkZXIgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY3VycmVudCBnbG9iYWwge0BsaW5rIE1vZGVsQnVpbGRlckZ1bmN0aW9ufSB1c2VkIGZvciBidWlsZGluZyBtb2RlbCBpbnN0YW5jZXNcbiAgICpcbiAgICogQHJldHVybiB7TW9kZWxCdWlsZGVyRnVuY3Rpb24gfCB1bmRlZmluZWR9IC0gVGhlIGN1cnJlbnQgZ2xvYmFsIGJ1aWxkZXIgZnVuY3Rpb24gb3IgdW5kZWZpbmVkIGlmIG5vdCBzZXRcbiAgICovXG4gIHN0YXRpYyBnZXRCdWlsZGVyKCk6IE1vZGVsQnVpbGRlckZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gbW9kZWxCdWlsZGVyRnVuY3Rpb24gfHwgTW9kZWwuZnJvbU1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgbW9kZWwgcmVnaXN0cnlcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY3VycmVudCB7QGxpbmsgTW9kZWxSZWdpc3RyeU1hbmFnZXJ9IGluc3RhbmNlLCBjcmVhdGluZyBvbmUgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgKlxuICAgKiBAcmV0dXJuIHtNb2RlbFJlZ2lzdHJ5PGFueT59IC0gVGhlIGN1cnJlbnQgbW9kZWwgcmVnaXN0cnksIGRlZmF1bHRzIHRvIGEgbmV3IHtAbGluayBNb2RlbFJlZ2lzdHJ5TWFuYWdlcn0gaWYgbm90IHNldFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVnaXN0cnkoKSB7XG4gICAgaWYgKCFhY3RpbmdNb2RlbFJlZ2lzdHJ5KSBhY3RpbmdNb2RlbFJlZ2lzdHJ5ID0gbmV3IE1vZGVsUmVnaXN0cnlNYW5hZ2VyKCk7XG4gICAgcmV0dXJuIGFjdGluZ01vZGVsUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyZXMgdGhlIG1vZGVsIHJlZ2lzdHJ5IHRvIGJlIHVzZWQgYnkgdGhlIE1vZGVsIHN5c3RlbVxuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBjdXJyZW50IG1vZGVsIHJlZ2lzdHJ5IHRvIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7QnVpbGRlclJlZ2lzdHJ5PGFueT59IG1vZGVsUmVnaXN0cnkgLSBUaGUgbmV3IGltcGxlbWVudGF0aW9uIG9mIFJlZ2lzdHJ5IHRvIHVzZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldFJlZ2lzdHJ5KG1vZGVsUmVnaXN0cnk6IEJ1aWxkZXJSZWdpc3RyeTxhbnk+KSB7XG4gICAgYWN0aW5nTW9kZWxSZWdpc3RyeSA9IG1vZGVsUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIG1vZGVsIGNvbnN0cnVjdG9yIHdpdGggdGhlIG1vZGVsIHJlZ2lzdHJ5XG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBuZXcgbW9kZWwgY2xhc3NlcyB0byBtYWtlIHRoZW0gYXZhaWxhYmxlIGZvciBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb25cbiAgICpcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPFQ+fSBjb25zdHJ1Y3RvciAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gT3B0aW9uYWwgbmFtZSB0byByZWdpc3RlciB0aGUgY29uc3RydWN0b3IgdW5kZXIsIGRlZmF1bHRzIHRvIGNvbnN0cnVjdG9yLm5hbWVcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICpcbiAgICogQHNlZSBNb2RlbFJlZ2lzdHJ5XG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXI8VCBleHRlbmRzIE1vZGVsPihcbiAgICBjb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3RvcjxUPixcbiAgICBuYW1lPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIHJldHVybiBNb2RlbC5nZXRSZWdpc3RyeSgpLnJlZ2lzdGVyKGNvbnN0cnVjdG9yLCBuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVnaXN0ZXJlZCBtb2RlbCBjb25zdHJ1Y3RvciBieSBuYW1lXG4gICAqIEBzdW1tYXJ5IEdldHMgYSByZWdpc3RlcmVkIE1vZGVsIHtAbGluayBNb2RlbENvbnN0cnVjdG9yfSBmcm9tIHRoZSBtb2RlbCByZWdpc3RyeVxuICAgKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCBjb25zdHJ1Y3RvciB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIHtNb2RlbENvbnN0cnVjdG9yPFQ+IHwgdW5kZWZpbmVkfSAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciBpZiBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICAgKlxuICAgKiBAc2VlIE1vZGVsUmVnaXN0cnlcbiAgICovXG4gIHN0YXRpYyBnZXQ8VCBleHRlbmRzIE1vZGVsPihuYW1lOiBzdHJpbmcpOiBNb2RlbENvbnN0cnVjdG9yPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gTW9kZWwuZ2V0UmVnaXN0cnkoKS5nZXQobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIGEgcGxhaW4gb2JqZWN0XG4gICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIHRoZSBtb2RlbCByZWdpc3RyeSwgb3B0aW9uYWxseSBzcGVjaWZ5aW5nIHRoZSBtb2RlbCBjbGFzc1xuICAgKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iaiAtIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIGJ1aWxkIHRoZSBtb2RlbCBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbY2xhenpdIC0gV2hlbiBwcm92aWRlZCwgaXQgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGNvbnN0cnVjdG9yIGJ5IG5hbWVcbiAgICogQHJldHVybiB7VH0gLSBUaGUgYnVpbHQgbW9kZWwgaW5zdGFuY2VcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGNsYXp6IGlzIG5vdCBmb3VuZCwgb3Igb2JqIGlzIG5vdCBhIHtAbGluayBNb2RlbH0gbWVhbmluZyBpdCBoYXMgbm8ge0BsaW5rIE1vZGVsS2V5cy5BTkNIT1J9IHByb3BlcnR5XG4gICAqXG4gICAqIEBzZWUgTW9kZWxSZWdpc3RyeVxuICAgKi9cbiAgc3RhdGljIGJ1aWxkPFQgZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgY2xheno/OiBzdHJpbmdcbiAgKTogVCB7XG4gICAgcmV0dXJuIE1vZGVsLmdldFJlZ2lzdHJ5KCkuYnVpbGQob2JqLCBjbGF6eik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgbW9kZWwgbWV0YWRhdGEgZnJvbSBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEdldHMgdGhlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIG1vZGVsIGluc3RhbmNlLCB0eXBpY2FsbHkgdGhlIG1vZGVsIGNsYXNzIG5hbWVcbiAgICpcbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBnZXQgbWV0YWRhdGEgZnJvbVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gVGhlIG1vZGVsIG1ldGFkYXRhICh0eXBpY2FsbHkgdGhlIGNsYXNzIG5hbWUpXG4gICAqL1xuICBzdGF0aWMgZ2V0TWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSkge1xuICAgIHJldHVybiBnZXRNZXRhZGF0YTxNPihtb2RlbCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhbGwgYXR0cmlidXRlIG5hbWVzIGZyb20gYSBtb2RlbCBjbGFzcyBvciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBHZXRzIGFsbCBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gYSBtb2RlbCwgdHJhdmVyc2luZyB0aGUgcHJvdG90eXBlIGNoYWluIHRvIGluY2x1ZGUgaW5oZXJpdGVkIGF0dHJpYnV0ZXNcbiAgICpcbiAgICogQHRlbXBsYXRlIFZcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxWPiB8IFZ9IG1vZGVsIC0gVGhlIG1vZGVsIGNsYXNzIG9yIGluc3RhbmNlIHRvIGdldCBhdHRyaWJ1dGVzIGZyb21cbiAgICogQHJldHVybiB7c3RyaW5nW119IC0gQXJyYXkgb2YgYXR0cmlidXRlIG5hbWVzIGRlZmluZWQgaW4gdGhlIG1vZGVsXG4gICAqL1xuICBzdGF0aWMgZ2V0QXR0cmlidXRlczxWIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBDb25zdHJ1Y3RvcjxWPiB8IFYpIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHByb3RvdHlwZSA9XG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsXG4gICAgICAgID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZGVsKVxuICAgICAgICA6IChtb2RlbCBhcyBhbnkpLnByb3RvdHlwZTtcbiAgICB3aGlsZSAocHJvdG90eXBlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHByb3BzOiBzdHJpbmdbXSA9IHByb3RvdHlwZVtNb2RlbEtleXMuQVRUUklCVVRFXTtcbiAgICAgIGlmIChwcm9wcykge1xuICAgICAgICByZXN1bHQucHVzaCguLi5wcm9wcyk7XG4gICAgICB9XG4gICAgICBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tcGFyZXMgdHdvIG1vZGVsIGluc3RhbmNlcyBmb3IgZXF1YWxpdHlcbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiB0d28gbW9kZWwgaW5zdGFuY2VzIGFyZSBlcXVhbCBieSBjb21wYXJpbmcgdGhlaXIgcHJvcGVydGllc1xuICAgKlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge019IG9iajEgLSBGaXJzdCBtb2RlbCBpbnN0YW5jZSB0byBjb21wYXJlXG4gICAqIEBwYXJhbSB7TX0gb2JqMiAtIFNlY29uZCBtb2RlbCBpbnN0YW5jZSB0byBjb21wYXJlXG4gICAqIEBwYXJhbSB7YW55W119IFtleGNlcHRpb25zXSAtIFByb3BlcnR5IG5hbWVzIHRvIGV4Y2x1ZGUgZnJvbSBjb21wYXJpc29uXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IC0gVHJ1ZSBpZiB0aGUgbW9kZWxzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBzdGF0aWMgZXF1YWxzPE0gZXh0ZW5kcyBNb2RlbD4ob2JqMTogTSwgb2JqMjogTSwgLi4uZXhjZXB0aW9uczogYW55W10pIHtcbiAgICByZXR1cm4gaXNFcXVhbChvYmoxLCBvYmoyLCAuLi5leGNlcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIGEgbW9kZWwgaW5zdGFuY2UgYWdhaW5zdCBpdHMgdmFsaWRhdGlvbiBydWxlc1xuICAgKiBAc3VtbWFyeSBDaGVja3MgaWYgYSBtb2RlbCBoYXMgdmFsaWRhdGlvbiBlcnJvcnMsIG9wdGlvbmFsbHkgaWdub3Jpbmcgc3BlY2lmaWVkIHByb3BlcnRpZXNcbiAgICpcbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFzeW5jIC0gQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB2YWxpZGF0aW9uIHNob3VsZCBiZSBhc3luY2hyb25vdXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtwcm9wc1RvSWdub3JlXSAtIFByb3BlcnRpZXMgdG8gZXhjbHVkZSBmcm9tIHZhbGlkYXRpb25cbiAgICogQHJldHVybiB7TW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWR9IC0gUmV0dXJucyB2YWxpZGF0aW9uIGVycm9ycyBpZiBhbnksIG90aGVyd2lzZSB1bmRlZmluZWRcbiAgICovXG4gIHN0YXRpYyBoYXNFcnJvcnM8TSBleHRlbmRzIE1vZGVsLCBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZT4oXG4gICAgbW9kZWw6IE0sXG4gICAgYXN5bmM6IEFzeW5jLFxuICAgIC4uLnByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4gICk6IENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHZhbGlkYXRlPGFueSwgQXN5bmM+KG1vZGVsLCBhc3luYywgLi4ucHJvcHNUb0lnbm9yZSkgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIG1vZGVsIGluc3RhbmNlIHRvIGEgc2VyaWFsaXplZCBzdHJpbmdcbiAgICogQHN1bW1hcnkgU2VyaWFsaXplcyBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIHRoZSBjb25maWd1cmVkIHNlcmlhbGl6ZXIgb3IgdGhlIGRlZmF1bHQgb25lXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm4ge3N0cmluZ30gLSBUaGUgc2VyaWFsaXplZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplPE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBNb2RlbC5rZXkoTW9kZWxLZXlzLlNFUklBTElaQVRJT04pLFxuICAgICAgbW9kZWwuY29uc3RydWN0b3JcbiAgICApO1xuXG4gICAgaWYgKG1ldGFkYXRhICYmIG1ldGFkYXRhLnNlcmlhbGl6ZXIpXG4gICAgICByZXR1cm4gU2VyaWFsaXphdGlvbi5zZXJpYWxpemUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIG1ldGFkYXRhLnNlcmlhbGl6ZXIsXG4gICAgICAgIC4uLihtZXRhZGF0YS5hcmdzIHx8IFtdKVxuICAgICAgKTtcbiAgICByZXR1cm4gU2VyaWFsaXphdGlvbi5zZXJpYWxpemUobW9kZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBoYXNoIHN0cmluZyBmb3IgYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgaGFzaCByZXByZXNlbnRhdGlvbiBvZiBhIG1vZGVsIHVzaW5nIHRoZSBjb25maWd1cmVkIGFsZ29yaXRobSBvciB0aGUgZGVmYXVsdCBvbmVcbiAgICpcbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBoYXNoXG4gICAqIEByZXR1cm4ge3N0cmluZ30gLSBUaGUgaGFzaCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBtb2RlbFxuICAgKi9cbiAgc3RhdGljIGhhc2g8TSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+Pihtb2RlbDogTSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIE1vZGVsLmtleShNb2RlbEtleXMuSEFTSElORyksXG4gICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICk7XG5cbiAgICBpZiAobWV0YWRhdGEgJiYgbWV0YWRhdGEuYWxnb3JpdGhtKVxuICAgICAgcmV0dXJuIEhhc2hpbmcuaGFzaChtb2RlbCwgbWV0YWRhdGEuYWxnb3JpdGhtLCAuLi4obWV0YWRhdGEuYXJncyB8fCBbXSkpO1xuICAgIHJldHVybiBIYXNoaW5nLmhhc2gobW9kZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbWV0YWRhdGEga2V5IGZvciB1c2Ugd2l0aCB0aGUgUmVmbGVjdGlvbiBBUElcbiAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBrZXkgdG8gc3RvcmUgYXMgTWV0YWRhdGEgdW5kZXIgUmVmbGVjdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBiYXNlIGtleSB0byBjb25jYXRlbmF0ZSB3aXRoIHRoZSBtb2RlbCByZWZsZWN0aW9uIHByZWZpeFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gVGhlIGNvbXBsZXRlIG1ldGFkYXRhIGtleVxuICAgKi9cbiAgc3RhdGljIGtleShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBnZXRNb2RlbEtleShzdHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBpcyBhIG1vZGVsIGluc3RhbmNlIG9yIGhhcyBtb2RlbCBtZXRhZGF0YVxuICAgKiBAc3VtbWFyeSBDaGVja3Mgd2hldGhlciBhIGdpdmVuIG9iamVjdCBpcyBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgdGhlIE1vZGVsIGNsYXNzIG9yXG4gICAqIGhhcyBtb2RlbCBtZXRhZGF0YSBhdHRhY2hlZCB0byBpdC4gVGhpcyBmdW5jdGlvbiBpcyBlc3NlbnRpYWwgZm9yIHNlcmlhbGl6YXRpb24gYW5kXG4gICAqIGRlc2VyaWFsaXphdGlvbiBwcm9jZXNzZXMsIGFzIGl0IGhlbHBzIGlkZW50aWZ5IG1vZGVsIG9iamVjdHMgdGhhdCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcuXG4gICAqIEl0IHNhZmVseSBoYW5kbGVzIHBvdGVudGlhbCBlcnJvcnMgZHVyaW5nIG1ldGFkYXRhIHJldHJpZXZhbC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0YXJnZXQgLSBUaGUgb2JqZWN0IHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIG9iamVjdCBpcyBhIG1vZGVsIGluc3RhbmNlIG9yIGhhcyBtb2RlbCBtZXRhZGF0YSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQ2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgbW9kZWxcbiAgICogY29uc3QgdXNlciA9IG5ldyBVc2VyKHsgbmFtZTogXCJKb2huXCIgfSk7XG4gICAqIGNvbnN0IGlzVXNlck1vZGVsID0gaXNNb2RlbCh1c2VyKTsgLy8gdHJ1ZVxuICAgKlxuICAgKiAvLyBDaGVjayBhIHBsYWluIG9iamVjdFxuICAgKiBjb25zdCBwbGFpbk9iamVjdCA9IHsgbmFtZTogXCJKb2huXCIgfTtcbiAgICogY29uc3QgaXNQbGFpbk9iamVjdE1vZGVsID0gaXNNb2RlbChwbGFpbk9iamVjdCk7IC8vIGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGlzTW9kZWwodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBNb2RlbCB8fCAhIU1vZGVsLmdldE1ldGFkYXRhKHRhcmdldCBhcyBhbnkpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgcHJvcGVydHkgb2YgYSBtb2RlbCBpcyBpdHNlbGYgYSBtb2RlbCBvciBoYXMgYSBtb2RlbCB0eXBlXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciBhIHNwZWNpZmljIHByb3BlcnR5IG9mIGEgbW9kZWwgaW5zdGFuY2UgaXMgZWl0aGVyIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogb3IgaGFzIGEgdHlwZSB0aGF0IGlzIHJlZ2lzdGVyZWQgYXMgYSBtb2RlbFxuICAgKlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge019IHRhcmdldCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjaGVja1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIC0gVGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IHN0cmluZyB8IHVuZGVmaW5lZH0gLSBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIGEgbW9kZWwgaW5zdGFuY2UsXG4gICAqIHRoZSBtb2RlbCBuYW1lIGlmIHRoZSBwcm9wZXJ0eSBoYXMgYSBtb2RlbCB0eXBlLCBvciB1bmRlZmluZWQgaWYgbm90IGEgbW9kZWxcbiAgICovXG4gIHN0YXRpYyBpc1Byb3BlcnR5TW9kZWw8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgYXR0cmlidXRlOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKE1vZGVsLmlzTW9kZWwoKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVthdHRyaWJ1dGVdKSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKE1vZGVsS2V5cy5UWVBFLCB0YXJnZXQsIGF0dHJpYnV0ZSk7XG4gICAgcmV0dXJuIE1vZGVsLmdldChtZXRhZGF0YS5uYW1lKSA/IG1ldGFkYXRhLm5hbWUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBzdGF0aWMgZGVzY3JpYmU8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LCBrZXk/OiBrZXlvZiBNKSB7XG4gICAgY29uc3QgZGVzY0tleSA9IE1vZGVsLmtleShNb2RlbEtleXMuREVTQ1JJUFRJT04pO1xuICAgIGlmIChrZXkpIHtcbiAgICAgIG1vZGVsID0gbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsIDogbmV3IG1vZGVsKCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhtb2RlbC5jb25zdHJ1Y3Rvciwga2V5LnRvU3RyaW5nKCkpXG4gICAgICAgICAgLmZpbmQoKGspID0+IGsgPT09IGRlc2NLZXkpXG4gICAgICAgICAgPy50b1N0cmluZygpIHx8IG1vZGVsLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIE1vZGVsLmtleShNb2RlbEtleXMuREVTQ1JJUFRJT04pLFxuICAgICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwuY29uc3RydWN0b3IgOiBtb2RlbFxuICAgICAgKSB8fCBtb2RlbC50b1N0cmluZygpXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vbW9kZWwvdHlwZXNcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvTW9kZWxcIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0TWV0YWRhdGEgfSBmcm9tIFwiLi4vbW9kZWwvdXRpbHNcIjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRTZXJpYWxpemF0aW9uTWV0aG9kID0gXCJqc29uXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgYSB7QGxpbmsgU2VyaWFsaXplcn0gaW4gSlNPTiBmb3JtYXRcbiAqIEBkZXNjcmlwdGlvbiBKUydzIG5hdGl2ZSBKU09OLnN0cmluZ2lmeSAodXNlZCBoZXJlKSBpcyBub3QgZGV0ZXJtaW5pc3RpY1xuICogYW5kIHRoZXJlZm9yZSBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGhhc2hpbmcgcHVycG9zZXNcbiAqXG4gKiBUbyBrZWVwIGRlcGVuZGVuY2llcyBsb3csIHdlIHdpbGwgbm90IGltcGxlbWVudCB0aGlzLCBidXQgd2UgcmVjb21tZW5kXG4gKiBpbXBsZW1lbnRpbmcgYSBzaW1pbGFyIHtAbGluayBKU09OU2VyaWFsaXplcn0gdXNpbmcgJ2RldGVybWluaXN0aWMtanNvbicgbGlicmFyaWVzXG4gKlxuICogQGNsYXNzIEpTT05TZXJpYWxpemVyXG4gKiBAaW1wbGVtZW50cyBTZXJpYWxpemVyXG4gKlxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBKU09OU2VyaWFsaXplcjxUIGV4dGVuZHMgTW9kZWw+IGltcGxlbWVudHMgU2VyaWFsaXplcjxUPiB7XG4gIGNvbnN0cnVjdG9yKCkge31cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHByZXBhcmVzIHRoZSBtb2RlbCBmb3Igc2VyaWFsaXphdGlvblxuICAgKiBAZGVzY3JpcHRpb24gcmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiB0aGUgb2JqZWN0LCBjb250YWluaW5nIGFuIGVudW1lcmFibGUge0BsaW5rIE1vZGVsS2V5cyNBTkNIT1J9IHByb3BlcnR5XG4gICAqIHNvIHRoZSBvYmplY3QgY2FuIGJlIHJlY29nbml6ZWQgdXBvbiBkZXNlcmlhbGl6YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtUfSBtb2RlbFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlU2VyaWFsaXplKG1vZGVsOiBUKSB7XG4gICAgLy8gVE9ETzogbmVzdGVkIHByZXNlcmlhbGl6YXRpb24gKHNvIGluY3JlYXNlIHBlcmZvcm1hbmNlIHdoZW4gZGVzZXJpYWxpemluZylcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhKG1vZGVsKTtcbiAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlYnVpbGRzIGEgbW9kZWwgZnJvbSBhIHNlcmlhbGl6YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgZmFpbHMgdG8gcGFyc2UgdGhlIHN0cmluZywgb3IgdG8gYnVpbGQgdGhlIG1vZGVsXG4gICAqL1xuICBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZyk6IFQge1xuICAgIGNvbnN0IGRlc2VyaWFsaXphdGlvbiA9IEpTT04ucGFyc2Uoc3RyKTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBkZXNlcmlhbGl6YXRpb25bTW9kZWxLZXlzLkFOQ0hPUl07XG4gICAgaWYgKCFjbGFzc05hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBjbGFzcyByZWZlcmVuY2UgaW4gc2VyaWFsaXplZCBtb2RlbFwiKTtcbiAgICBjb25zdCBtb2RlbDogVCA9IE1vZGVsLmJ1aWxkKGRlc2VyaWFsaXphdGlvbiwgY2xhc3NOYW1lKSBhcyB1bmtub3duIGFzIFQ7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFNlcmlhbGl6ZXMgYSBtb2RlbFxuICAgKiBAcGFyYW0ge1R9IG1vZGVsXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBmYWlscyB0byBzZXJpYWxpemVcbiAgICovXG4gIHNlcmlhbGl6ZShtb2RlbDogVCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMucHJlU2VyaWFsaXplKG1vZGVsKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlcmlhbGl6YXRpb24ge1xuICBwcml2YXRlIHN0YXRpYyBjdXJyZW50OiBzdHJpbmcgPSBEZWZhdWx0U2VyaWFsaXphdGlvbk1ldGhvZDtcblxuICBwcml2YXRlIHN0YXRpYyBjYWNoZTogUmVjb3JkPHN0cmluZywgU2VyaWFsaXplcjxhbnk+PiA9IHtcbiAgICBqc29uOiBuZXcgSlNPTlNlcmlhbGl6ZXIoKSxcbiAgfTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBwcml2YXRlIHN0YXRpYyBnZXQoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIGlmIChrZXkgaW4gdGhpcy5jYWNoZSkgcmV0dXJuIHRoaXMuY2FjaGVba2V5XTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNlcmlhbGl6YXRpb24gbWV0aG9kIHJlZ2lzdGVyZWQgdW5kZXIgJHtrZXl9YCk7XG4gIH1cblxuICBzdGF0aWMgcmVnaXN0ZXIoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgZnVuYzogQ29uc3RydWN0b3I8U2VyaWFsaXplcjxhbnk+PixcbiAgICBzZXREZWZhdWx0ID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgaWYgKGtleSBpbiB0aGlzLmNhY2hlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXJpYWxpemF0aW9uIG1ldGhvZCAke2tleX0gYWxyZWFkeSByZWdpc3RlcmVkYCk7XG4gICAgdGhpcy5jYWNoZVtrZXldID0gbmV3IGZ1bmMoKTtcbiAgICBpZiAoc2V0RGVmYXVsdCkgdGhpcy5jdXJyZW50ID0ga2V5O1xuICB9XG5cbiAgc3RhdGljIHNlcmlhbGl6ZShvYmo6IGFueSwgbWV0aG9kPzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGlmICghbWV0aG9kKSByZXR1cm4gdGhpcy5nZXQodGhpcy5jdXJyZW50KS5zZXJpYWxpemUob2JqLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5nZXQobWV0aG9kKS5zZXJpYWxpemUob2JqLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShvYmo6IHN0cmluZywgbWV0aG9kPzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGlmICghbWV0aG9kKSByZXR1cm4gdGhpcy5nZXQodGhpcy5jdXJyZW50KS5kZXNlcmlhbGl6ZShvYmosIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmdldChtZXRob2QpLmRlc2VyaWFsaXplKG9iaiwgLi4uYXJncyk7XG4gIH1cblxuICBzdGF0aWMgc2V0RGVmYXVsdChtZXRob2Q6IHN0cmluZykge1xuICAgIHRoaXMuY3VycmVudCA9IHRoaXMuZ2V0KG1ldGhvZCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQYXRoUHJveHkgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IEJhc2VWYWxpZGF0b3IgfSBmcm9tIFwiLi9CYXNlVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBYnN0cmFjdCBjbGFzcyBmb3IgZGVmaW5pbmcgYXN5bmNocm9ub3VzIHZhbGlkYXRvcnMuXG4gKlxuICogVGhpcyBjbGFzcyBleHRlbmRzIHRoZSBiYXNlIGBWYWxpZGF0b3JgIGFuZCBlbmZvcmNlcyB0aGF0IGFueSBpbXBsZW1lbnRhdGlvblxuICogb2YgYGhhc0Vycm9yc2AgbXVzdCBiZSBhc3luY2hyb25vdXMsIGFsd2F5cyByZXR1cm5pbmcgYSBQcm9taXNlLlxuICpcbiAqIFVzZSB0aGlzIHdoZW4gdGhlIHZhbGlkYXRpb24gcHJvY2VzcyBpbnZvbHZlcyBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyxcbiAqIHN1Y2ggYXMgQVBJIGNhbGxzLCBkYXRhYmFzZSBsb29rdXBzLCBvciB0aW1lLWJhc2VkIGNoZWNrcyAoZS5nLiwgdGltZW91dHMpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIG9mIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0b3IgdGhhdCBjb21wYXJlcyB2YWx1ZSBhZ2FpbnN0IGEgdGltZW91dFxuICogY2xhc3MgVGltZW91dFZhbGlkYXRvciBleHRlbmRzIEFzeW5jVmFsaWRhdG9yPHsgdGltZW91dD86IG51bWJlciB9PiB7XG4gKiAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IFwiVmFsaWRhdGlvbiBmYWlsZWQgZHVlIHRvIHRpbWVvdXRcIikge1xuICogICAgIHN1cGVyKG1lc3NhZ2UpO1xuICogICB9XG4gKlxuICogICBhc3luYyBoYXNFcnJvcnModmFsdWU6IG51bWJlciwgb3B0aW9ucz86IHsgdGltZW91dD86IG51bWJlciB9KSB7XG4gKiAgICAgY29uc3QgZGVsYXkgPSBvcHRpb25zPy50aW1lb3V0ID8/IDEwMDtcbiAqXG4gKiAgICAgLy8gYXN5bmMgY2FsbFxuICogICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBzZXRUaW1lb3V0KHJlcywgZGVsYXkpKTtcbiAqXG4gKiAgICAgaWYgKHZhbHVlID4gZGVsYXkpIHtcbiAqICAgICAgIC8vIFJlamVjdHMgdGhlIHZhbGlkYXRpb24gYWZ0ZXIgd2FpdGluZyB0aGUgZGVsYXkgaWYgdmFsdWUgaXMgZ3JlYXRlclxuICogICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmdldE1lc3NhZ2UoKSk7XG4gKiAgICAgfVxuICpcbiAqICAgICAvLyBQYXNzZXMgdGhlIHZhbGlkYXRpb24gYWZ0ZXIgd2FpdGluZyB0aGUgZGVsYXlcbiAqICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBFeGFtcGxlIHVzYWdlOlxuICogY29uc3QgdmFsaWRhdG9yID0gbmV3IFRpbWVvdXRWYWxpZGF0b3IoKTtcbiAqXG4gKiBhc3luYyBmdW5jdGlvbiBydW5WYWxpZGF0aW9uKCkge1xuICogIGNvbnN0IGVycm9yID0gYXdhaXQgdmFsaWRhdG9yLmhhc0Vycm9ycyg1MCwgeyB0aW1lb3V0OiAxMDAgfSk7XG4gKiAgaWYgKGVycm9yKSB7XG4gKiAgICByZXR1cm4gY29uc29sZS5lcnJvcignVmFsaWRhdGlvbiBlcnJvcjonLCBlcnJvcik7XG4gKiAgfVxuICogIGNvbnNvbGUubG9nKCdWYWx1ZSBpcyB2YWxpZCcpO1xuICogfVxuICpcbiAqIGF3YWl0IHJ1blZhbGlkYXRpb24oKTtcbiAqIGBgYFxuICpcbiAqIC0gSWYgYHZhbHVlID4gdGltZW91dGAsIHRoZSB2YWxpZGF0b3Igd2FpdHMgZm9yIHRoZSBkZWxheSBhbmQgdGhlbiByZWplY3RzIHdpdGggYW4gZXJyb3IuXG4gKiAtIElmIGB2YWx1ZSA8PSB0aW1lb3V0YCwgdGhlIHZhbGlkYXRvciB3YWl0cyBmb3IgdGhlIGRlbGF5IGFuZCByZXNvbHZlcyBzdWNjZXNzZnVsbHkgd2l0aCBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAc2VlIHtAbGluayBWYWxpZGF0b3J9IEZvciB0aGUgYmFzZSBzeW5jaHJvbm91cyB2YWxpZGF0b3IuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBc3luY1ZhbGlkYXRvcjxcbiAgViBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMsXG4+IGV4dGVuZHMgQmFzZVZhbGlkYXRvcjxWLCB0cnVlPiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkRFRkFVTFQsXG4gICAgLi4uYWNjZXB0ZWRUeXBlczogc3RyaW5nW11cbiAgKSB7XG4gICAgc3VwZXIodHJ1ZSwgbWVzc2FnZSwgLi4uYWNjZXB0ZWRUeXBlcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFzeW5jaHJvbm91c2x5IHZhbGlkYXRlcyBhIHZhbHVlLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgViAtIFR5cGUgb2YgdGhlIG9wdGlvbiBvYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSB2YWxpZGF0b3JcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7Vn0gW29wdGlvbnNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBjdXN0b21pemluZyB2YWxpZGF0aW9uIGJlaGF2aW9yXG4gICAqIEBwYXJhbSB7UGF0aFByb3h5PGFueT59IHByb3h5IC1cbiAgICogQHJldHVybiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQHNlZSB7QGxpbmsgVmFsaWRhdG9yfVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IG92ZXJyaWRlIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM/OiBWLFxuICAgIHByb3h5PzogUGF0aFByb3h5PGFueT5cbiAgKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uIH0gZnJvbSBcIi4uL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIi4uLy4uL21vZGVsL3R5cGVzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0b3JEZWZpbml0aW9uIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTWFya3MgdGhlIGNsYXNzIGFzIGEgdmFsaWRhdG9yIGZvciBhIGNlcnRhaW4ga2V5LlxuICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyB0aGUgY2xhc3MgaW4gdGhlIHtAbGluayBWYWxpZGF0aW9ufSB3aXRoIHRoZSBwcm92aWRlZCBrZXlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5cyB0aGUgdmFsaWRhdGlvbiBrZXlcbiAqXG4gKiBAZnVuY3Rpb24gdmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRvcjxUIGV4dGVuZHMgVmFsaWRhdG9yPiguLi5rZXlzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gYXBwbHkoXG4gICAgKChvcmlnaW5hbDogQ29uc3RydWN0b3I8VD4pID0+IHtcbiAgICAgIGtleXMuZm9yRWFjaCgoazogc3RyaW5nKSA9PiB7XG4gICAgICAgIFZhbGlkYXRpb24ucmVnaXN0ZXIoe1xuICAgICAgICAgIHZhbGlkYXRvcjogb3JpZ2luYWwsXG4gICAgICAgICAgdmFsaWRhdGlvbktleTogayxcbiAgICAgICAgICBzYXZlOiB0cnVlLFxuICAgICAgICB9IGFzIFZhbGlkYXRvckRlZmluaXRpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb3JpZ2luYWw7XG4gICAgfSkgYXMgQ2xhc3NEZWNvcmF0b3IsXG4gICAgbWV0YWRhdGEoVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuVkFMSURBVE9SKSwga2V5cylcbiAgKTtcbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IERhdGVWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvciBmb3IgY2hlY2tpbmcgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIGRhdGVcbiAqIEBzdW1tYXJ5IFRoZSBEYXRlVmFsaWRhdG9yIGNoZWNrcyBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZSBvYmplY3Qgb3IgYSBzdHJpbmcgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGEgdmFsaWQgZGF0ZS5cbiAqIEl0IHZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSByZXByZXNlbnRzIGEgcmVhbCBkYXRlIGFuZCBub3QgYW4gaW52YWxpZCBkYXRlIGxpa2UgXCIyMDIzLTAyLTMxXCIuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMsIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0RBVEV9XG4gKiBAY2xhc3MgRGF0ZVZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBkYXRlIHZhbGlkYXRvciB3aXRoIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogY29uc3QgZGF0ZVZhbGlkYXRvciA9IG5ldyBEYXRlVmFsaWRhdG9yKCk7XG4gKlxuICogLy8gQ3JlYXRlIGEgZGF0ZSB2YWxpZGF0b3Igd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogY29uc3QgY3VzdG9tRGF0ZVZhbGlkYXRvciA9IG5ldyBEYXRlVmFsaWRhdG9yKFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZVwiKTtcbiAqXG4gKiAvLyBWYWxpZGF0ZSBhIGRhdGVcbiAqIGNvbnN0IHJlc3VsdCA9IGRhdGVWYWxpZGF0b3IuaGFzRXJyb3JzKG5ldyBEYXRlKCkpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogY29uc3QgaW52YWxpZFJlc3VsdCA9IGRhdGVWYWxpZGF0b3IuaGFzRXJyb3JzKFwibm90IGEgZGF0ZVwiKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFYgYXMgRGF0ZVZhbGlkYXRvclxuICpcbiAqICAgQy0+PlY6IG5ldyBEYXRlVmFsaWRhdG9yKG1lc3NhZ2UpXG4gKiAgIEMtPj5WOiBoYXNFcnJvcnModmFsdWUsIG9wdGlvbnMpXG4gKiAgIGFsdCB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgIGVsc2UgdmFsdWUgaXMgc3RyaW5nXG4gKiAgICAgVi0+PlY6IENvbnZlcnQgdG8gRGF0ZVxuICogICBlbmRcbiAqICAgYWx0IERhdGUgaXMgaW52YWxpZCAoTmFOKVxuICogICAgIFYtLT4+QzogRXJyb3IgbWVzc2FnZVxuICogICBlbHNlIERhdGUgaXMgdmFsaWRcbiAqICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgIGVuZFxuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLkRBVEUpXG5leHBvcnQgY2xhc3MgRGF0ZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxEYXRlVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkRBVEUpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBOdW1iZXIubmFtZSwgRGF0ZS5uYW1lLCBTdHJpbmcubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgYSB2YWxpZCBkYXRlXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGF0IHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHZhbGlkIGRhdGUuIElmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZyxcbiAgICogaXQgYXR0ZW1wdHMgdG8gY29udmVydCBpdCB0byBhIERhdGUgb2JqZWN0LiBSZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGRhdGUgaXMgaW52YWxpZCxcbiAgICogb3IgdW5kZWZpbmVkIGlmIHRoZSBkYXRlIGlzIHZhbGlkIG9yIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RGF0ZSB8IHN0cmluZ30gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGUsIGNhbiBiZSBhIERhdGUgb2JqZWN0IG9yIGEgc3RyaW5nXG4gICAqIEBwYXJhbSB7RGF0ZVZhbGlkYXRvck9wdGlvbnN9IFtvcHRpb25zPXt9XSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHZhbGlkYXRvclxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IERhdGUgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogRGF0ZVZhbGlkYXRvck9wdGlvbnMgPSB7fVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcblxuICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUuZ2V0RGF0ZSgpKSkge1xuICAgICAgY29uc3QgeyBtZXNzYWdlID0gXCJcIiB9ID0gb3B0aW9ucztcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UobWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRGlmZlZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgUGF0aFByb3h5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgRGlmZiBWYWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0RpZmZWYWxpZGF0b3J9XG4gKlxuICogQGNsYXNzIERpZmZWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuRElGRilcbmV4cG9ydCBjbGFzcyBEaWZmVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPERpZmZWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRElGRikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0RpZmZWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqIEBwYXJhbSB7UGF0aFByb3h5PGFueT59IGFjY2Vzc29yIC0gUHJveHktbGlrZSBvYmplY3QgdXNlZCB0byByZXNvbHZlIHZhbHVlcyBmcm9tIG5lc3RlZCBzdHJ1Y3R1cmVzIHZpYSBwYXRoIHN0cmluZ3MuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IERpZmZWYWxpZGF0b3JPcHRpb25zLFxuICAgIGFjY2Vzc29yOiBQYXRoUHJveHk8YW55PlxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZTogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSA9IGFjY2Vzc29yLmdldFZhbHVlRnJvbVBhdGgoXG4gICAgICAgIG9wdGlvbnNbVmFsaWRhdGlvbktleXMuRElGRl1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKGUubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiBpc0VxdWFsKHZhbHVlLCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSlcbiAgICAgID8gdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICAgIG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsXG4gICAgICAgICAgb3B0aW9ucy5sYWJlbCB8fCBvcHRpb25zW1ZhbGlkYXRpb25LZXlzLkRJRkZdXG4gICAgICAgIClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHBhcnNpbmcgc3RyaW5nIHBhdHRlcm5zIHdpdGggZmxhZ3NcbiAqIEBzdW1tYXJ5IFRoaXMgcmVndWxhciBleHByZXNzaW9uIGlzIHVzZWQgdG8gcGFyc2Ugc3RyaW5nIHBhdHRlcm5zIGluIHRoZSBmb3JtYXQgXCIvcGF0dGVybi9mbGFnc1wiLlxuICogSXQgY2FwdHVyZXMgdGhlIHBhdHRlcm4gYW5kIGZsYWdzIHNlcGFyYXRlbHksIGFsbG93aW5nIHRoZSBjcmVhdGlvbiBvZiBhIFJlZ0V4cCBvYmplY3RcbiAqIHdpdGggdGhlIGFwcHJvcHJpYXRlIGZsYWdzLlxuICpcbiAqIEBjb25zdCB7UmVnRXhwfVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IHJlZ2V4cFBhcnNlcjogUmVnRXhwID0gbmV3IFJlZ0V4cChcIl4vKC4rKS8oW2dpbXVzXSopJFwiKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHN0cmluZyBtYXRjaGVzIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5cbiAqIEBzdW1tYXJ5IFRoZSBQYXR0ZXJuVmFsaWRhdG9yIGNoZWNrcyBpZiBhIHN0cmluZyB2YWx1ZSBtYXRjaGVzIGEgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLlxuICogSXQgc3VwcG9ydHMgYm90aCBSZWdFeHAgb2JqZWN0cyBhbmQgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBvZiBwYXR0ZXJucywgaW5jbHVkaW5nIHRob3NlIHdpdGggZmxhZ3MuXG4gKiBUaGlzIHZhbGlkYXRvciBpcyB0aGUgZm91bmRhdGlvbiBmb3Igc3BlY2lhbGl6ZWQgdmFsaWRhdG9ycyBsaWtlIEVtYWlsVmFsaWRhdG9yIGFuZCBVUkxWYWxpZGF0b3IsXG4gKiBhbmQgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0aGUgQHBhdHRlcm4gZGVjb3JhdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUEFUVEVSTn1cbiAqXG4gKiBAY2xhc3MgUGF0dGVyblZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHBhdHRlcm4gdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBwYXR0ZXJuVmFsaWRhdG9yID0gbmV3IFBhdHRlcm5WYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBwYXR0ZXJuIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21QYXR0ZXJuVmFsaWRhdG9yID0gbmV3IFBhdHRlcm5WYWxpZGF0b3IoXCJWYWx1ZSBtdXN0IG1hdGNoIHRoZSByZXF1aXJlZCBmb3JtYXRcIik7XG4gKlxuICogLy8gVmFsaWRhdGUgdXNpbmcgYSBSZWdFeHAgb2JqZWN0XG4gKiBjb25zdCByZWdleE9wdGlvbnMgPSB7IHBhdHRlcm46IC9eW0EtWl1bYS16XSskLyB9O1xuICogcGF0dGVyblZhbGlkYXRvci5oYXNFcnJvcnMoXCJIZWxsb1wiLCByZWdleE9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogcGF0dGVyblZhbGlkYXRvci5oYXNFcnJvcnMoXCJoZWxsb1wiLCByZWdleE9wdGlvbnMpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKlxuICogLy8gVmFsaWRhdGUgdXNpbmcgYSBzdHJpbmcgcGF0dGVyblxuICogY29uc3Qgc3RyaW5nT3B0aW9ucyA9IHsgcGF0dGVybjogXCJeXFxcXGR7M30tXFxcXGR7Mn0tXFxcXGR7NH0kXCIgfTtcbiAqIHBhdHRlcm5WYWxpZGF0b3IuaGFzRXJyb3JzKFwiMTIzLTQ1LTY3ODlcIiwgc3RyaW5nT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKlxuICogLy8gVmFsaWRhdGUgdXNpbmcgYSBzdHJpbmcgcGF0dGVybiB3aXRoIGZsYWdzXG4gKiBjb25zdCBmbGFnT3B0aW9ucyA9IHsgcGF0dGVybjogXCIvXmhlbGxvJC9pXCIgfTtcbiAqIHBhdHRlcm5WYWxpZGF0b3IuaGFzRXJyb3JzKFwiSGVsbG9cIiwgZmxhZ09wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIFBhdHRlcm5WYWxpZGF0b3JcbiAqXG4gKiAgIEMtPj5WOiBuZXcgUGF0dGVyblZhbGlkYXRvcihtZXNzYWdlKVxuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdmFsdWUgaXMgZW1wdHlcbiAqICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgIGVsc2UgcGF0dGVybiBpcyBtaXNzaW5nXG4gKiAgICAgVi0tPj5DOiBFcnJvcjogTWlzc2luZyBQYXR0ZXJuXG4gKiAgIGVsc2UgcGF0dGVybiBpcyBzdHJpbmdcbiAqICAgICBWLT4+VjogZ2V0UGF0dGVybihwYXR0ZXJuKVxuICogICBlbmRcbiAqICAgVi0+PlY6IFJlc2V0IHBhdHRlcm4ubGFzdEluZGV4XG4gKiAgIFYtPj5WOiBUZXN0IHZhbHVlIGFnYWluc3QgcGF0dGVyblxuICogICBhbHQgcGF0dGVybiB0ZXN0IHBhc3Nlc1xuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZWxzZSBwYXR0ZXJuIHRlc3QgZmFpbHNcbiAqICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgZW5kXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5QQVRURVJOKVxuZXhwb3J0IGNsYXNzIFBhdHRlcm5WYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8UGF0dGVyblZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVRURVJOKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgXCJzdHJpbmdcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHBhdHRlcm4gdG8gYSBSZWdFeHAgb2JqZWN0XG4gICAqIEBzdW1tYXJ5IFBhcnNlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgY29udmVydHMgaXQgdG8gYSBSZWdFeHAgb2JqZWN0LlxuICAgKiBJdCBoYW5kbGVzIGJvdGggc2ltcGxlIHN0cmluZyBwYXR0ZXJucyBhbmQgcGF0dGVybnMgd2l0aCBmbGFncyBpbiB0aGUgZm9ybWF0IFwiL3BhdHRlcm4vZmxhZ3NcIi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm4gLSBUaGUgc3RyaW5nIHBhdHRlcm4gdG8gY29udmVydFxuICAgKiBAcmV0dXJuIHtSZWdFeHB9IEEgUmVnRXhwIG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIHN0cmluZyBwYXR0ZXJuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldFBhdHRlcm4ocGF0dGVybjogc3RyaW5nKTogUmVnRXhwIHtcbiAgICBpZiAoIXJlZ2V4cFBhcnNlci50ZXN0KHBhdHRlcm4pKSByZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuKTtcbiAgICBjb25zdCBtYXRjaDogYW55ID0gcGF0dGVybi5tYXRjaChyZWdleHBQYXJzZXIpO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKG1hdGNoWzFdLCBtYXRjaFsyXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHN0cmluZyBtYXRjaGVzIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIHN0cmluZyBtYXRjaGVzIHRoZSBwYXR0ZXJuIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy5cbiAgICogSWYgdGhlIHBhdHRlcm4gaXMgcHJvdmlkZWQgYXMgYSBzdHJpbmcsIGl0J3MgY29udmVydGVkIHRvIGEgUmVnRXhwIG9iamVjdCB1c2luZyB0aGUgZ2V0UGF0dGVybiBtZXRob2QuXG4gICAqIFRoZSBtZXRob2QgcmVzZXRzIHRoZSBwYXR0ZXJuJ3MgbGFzdEluZGV4IHByb3BlcnR5IHRvIGVuc3VyZSBjb25zaXN0ZW50IHZhbGlkYXRpb24gcmVzdWx0c1xuICAgKiBmb3IgcGF0dGVybnMgd2l0aCB0aGUgZ2xvYmFsIGZsYWcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBzdHJpbmcgdG8gdmFsaWRhdGUgYWdhaW5zdCB0aGUgcGF0dGVyblxuICAgKiBAcGFyYW0ge1BhdHRlcm5WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGNvbnRhaW5pbmcgdGhlIHBhdHRlcm5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgbm8gcGF0dGVybiBpcyBwcm92aWRlZCBpbiB0aGUgb3B0aW9uc1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUGF0dGVyblZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG5cbiAgICBsZXQgeyBwYXR0ZXJuIH0gPSBvcHRpb25zO1xuICAgIGlmICghcGF0dGVybikgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBQYXR0ZXJuXCIpO1xuICAgIHBhdHRlcm4gPSB0eXBlb2YgcGF0dGVybiA9PT0gXCJzdHJpbmdcIiA/IHRoaXMuZ2V0UGF0dGVybihwYXR0ZXJuKSA6IHBhdHRlcm47XG4gICAgcGF0dGVybi5sYXN0SW5kZXggPSAwOyAvLyByZXNldHMgcGF0dGVybiBwb3NpdGlvbiBmb3IgcmVwZWF0IHZhbGlkYXRpb24gcmVxdWVzdHNcbiAgICByZXR1cm4gIXBhdHRlcm4udGVzdCh2YWx1ZSlcbiAgICAgID8gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgREVGQVVMVF9QQVRURVJOUyxcbiAgVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvciB9IGZyb20gXCIuL1BhdHRlcm5WYWxpZGF0b3JcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvciBmb3IgY2hlY2tpbmcgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXG4gKiBAc3VtbWFyeSBUaGUgRW1haWxWYWxpZGF0b3IgY2hlY2tzIGlmIGEgc3RyaW5nIG1hdGNoZXMgYSBzdGFuZGFyZCBlbWFpbCBhZGRyZXNzIHBhdHRlcm4uXG4gKiBJdCBleHRlbmRzIHRoZSBQYXR0ZXJuVmFsaWRhdG9yIGFuZCB1c2VzIGEgcHJlZGVmaW5lZCBlbWFpbCByZWdleCBwYXR0ZXJuIHRvIHZhbGlkYXRlIGVtYWlsIGFkZHJlc3Nlcy5cbiAqIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEBlbWFpbCBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLCBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNFTUFJTH1cbiAqXG4gKiBAY2xhc3MgRW1haWxWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGFuIGVtYWlsIHZhbGlkYXRvciB3aXRoIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogY29uc3QgZW1haWxWYWxpZGF0b3IgPSBuZXcgRW1haWxWYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYW4gZW1haWwgdmFsaWRhdG9yIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IGN1c3RvbUVtYWlsVmFsaWRhdG9yID0gbmV3IEVtYWlsVmFsaWRhdG9yKFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzc1wiKTtcbiAqXG4gKiAvLyBWYWxpZGF0ZSBhbiBlbWFpbFxuICogY29uc3QgcmVzdWx0ID0gZW1haWxWYWxpZGF0b3IuaGFzRXJyb3JzKFwidXNlckBleGFtcGxlLmNvbVwiKTsgLy8gdW5kZWZpbmVkICh2YWxpZClcbiAqIGNvbnN0IGludmFsaWRSZXN1bHQgPSBlbWFpbFZhbGlkYXRvci5oYXNFcnJvcnMoXCJpbnZhbGlkLWVtYWlsXCIpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEUgYXMgRW1haWxWYWxpZGF0b3JcbiAqICAgcGFydGljaXBhbnQgUCBhcyBQYXR0ZXJuVmFsaWRhdG9yXG4gKlxuICogICBDLT4+RTogbmV3IEVtYWlsVmFsaWRhdG9yKG1lc3NhZ2UpXG4gKiAgIEUtPj5QOiBzdXBlcihtZXNzYWdlKVxuICogICBDLT4+RTogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBFLT4+UDogc3VwZXIuaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zIHdpdGggRU1BSUwgcGF0dGVybilcbiAqICAgUC0tPj5FOiB2YWxpZGF0aW9uIHJlc3VsdFxuICogICBFLS0+PkM6IHZhbGlkYXRpb24gcmVzdWx0XG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5FTUFJTClcbmV4cG9ydCBjbGFzcyBFbWFpbFZhbGlkYXRvciBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkVNQUlMKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIHN0cmluZyBtYXRjaGVzIHRoZSBlbWFpbCBwYXR0ZXJuLlxuICAgKiBUaGlzIG1ldGhvZCBleHRlbmRzIHRoZSBQYXR0ZXJuVmFsaWRhdG9yJ3MgaGFzRXJyb3JzIG1ldGhvZCBieSBlbnN1cmluZ1xuICAgKiB0aGUgZW1haWwgcGF0dGVybiBpcyB1c2VkLCBldmVuIGlmIG5vdCBleHBsaWNpdGx5IHByb3ZpZGVkIGluIHRoZSBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBUaGUgc3RyaW5nIHRvIHZhbGlkYXRlIGFzIGFuIGVtYWlsIGFkZHJlc3NcbiAgICogQHBhcmFtIHtQYXR0ZXJuVmFsaWRhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgUGF0dGVyblZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHt9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHN1cGVyLmhhc0Vycm9ycyh2YWx1ZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG1lc3NhZ2U6IG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsXG4gICAgICBwYXR0ZXJuOiBvcHRpb25zPy5wYXR0ZXJuIHx8IERFRkFVTFRfUEFUVEVSTlMuRU1BSUwsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEVxdWFsc1ZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgUGF0aFByb3h5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgRXF1YWxzIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjRVFVQUxTfVxuICpcbiAqIEBjbGFzcyBFcXVhbHNWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuRVFVQUxTKVxuZXhwb3J0IGNsYXNzIEVxdWFsc1ZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxFcXVhbHNWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRVFVQUxTKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7RXF1YWxzVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1BhdGhQcm94eTxhbnk+fSBhY2Nlc3NvciAtIFByb3h5LWxpa2Ugb2JqZWN0IHVzZWQgdG8gcmVzb2x2ZSB2YWx1ZXMgZnJvbSBuZXN0ZWQgc3RydWN0dXJlcyB2aWEgcGF0aCBzdHJpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zOiBFcXVhbHNWYWxpZGF0b3JPcHRpb25zLFxuICAgIGFjY2Vzc29yOiBQYXRoUHJveHk8YW55PlxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZTogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSA9IGFjY2Vzc29yLmdldFZhbHVlRnJvbVBhdGgoXG4gICAgICAgIG9wdGlvbnNbVmFsaWRhdGlvbktleXMuRVFVQUxTXVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoZS5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRXF1YWwodmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICAgIG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsXG4gICAgICAgICAgb3B0aW9ucy5sYWJlbCB8fCBvcHRpb25zW1ZhbGlkYXRpb25LZXlzLkVRVUFMU11cbiAgICAgICAgKTtcbiAgfVxufVxuXG4vLyBWYWxpZGF0aW9uLnJlZ2lzdGVyKHtcbi8vICAgdmFsaWRhdG9yOiBFcXVhbHNWYWxpZGF0b3IsXG4vLyAgIHZhbGlkYXRpb25LZXk6IFZhbGlkYXRpb25LZXlzLkVRVUFMUyxcbi8vICAgc2F2ZTogZmFsc2UsXG4vLyB9IGFzIFZhbGlkYXRvckRlZmluaXRpb24pO1xuIiwiaW1wb3J0IHsgQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUyB9IGZyb20gXCIuLi8uLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5cbi8vIC8qKlxuLy8gICogU2FmZWx5IHJldHJpZXZlcyBhIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBhIGRvdC1ub3RhdGVkIHBhdGggc3RyaW5nLlxuLy8gICpcbi8vICAqIEB0ZW1wbGF0ZSBUIC0gVGhlIGV4cGVjdGVkIHJldHVybiB0eXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbi8vICAqXG4vLyAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iaiAtIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmcm9tLlxuLy8gICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBBIGRvdC1zZXBhcmF0ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGUgZGVzaXJlZCBwcm9wZXJ0eSAoZS5nLiwgXCJ1c2VyLmFkZHJlc3Muc3RyZWV0XCIpLlxuLy8gICpcbi8vICAqIEByZXR1cm5zIHtUfSAtIFRoZSB2YWx1ZSBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIHBhdGhcbi8vICAqXG4vLyAgKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHBhdGggaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBpZiBhbnkgcGFydCBvZiB0aGUgcGF0aCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgb2JqZWN0LlxuLy8gICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuLy8gICovXG4vLyBleHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVCeVBhdGg8VD4ob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwYXRoOiBzdHJpbmcpOiBUIHtcbi8vICAgaWYgKHR5cGVvZiBwYXRoICE9PSBcInN0cmluZ1wiIHx8ICFwYXRoLnRyaW0oKSkge1xuLy8gICAgIHRocm93IG5ldyBFcnJvcihzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLklOVkFMSURfUEFUSCwgcGF0aCkpO1xuLy8gICB9XG4vL1xuLy8gICAvLyBQcm9jZXNzIHBhcmVudCBkaXJlY3RvcnkgYWNjZXNzICguLi8pXG4vLyAgIGNvbnN0IHBhcmVudEFjY2Vzc29ycyA9IHBhdGgubWF0Y2goL1xcLlxcLlxcLy9nKSB8fCBbXTtcbi8vICAgY29uc3QgcGFyZW50TGV2ZWwgPSBwYXJlbnRBY2Nlc3NvcnMubGVuZ3RoO1xuLy8gICBjb25zdCBjbGVhblBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLlxcLlxcLy9nLCBcIlwiKTtcbi8vXG4vLyAgIC8vIE5hdmlnYXRlIHVwIHRoZSBwYXJlbnQgY2hhaW5cbi8vICAgbGV0IGN1cnJlbnRDb250ZXh0OiBhbnkgPSBvYmo7XG4vLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyZW50TGV2ZWw7IGkrKykge1xuLy8gICAgIGlmICghY3VycmVudENvbnRleHQgfHwgdHlwZW9mIGN1cnJlbnRDb250ZXh0ICE9PSBcIm9iamVjdFwiKSB7XG4vLyAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4vLyAgICAgICAgIHNmKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuQ09OVEVYVF9OT1RfT0JKRUNUX0NPTVBBUklTT04sIGkgKyAxLCBwYXRoKVxuLy8gICAgICAgKTtcbi8vICAgICB9XG4vL1xuLy8gICAgIGlmICghY3VycmVudENvbnRleHRbVkFMSURBVElPTl9QQVJFTlRfS0VZXSkge1xuLy8gICAgICAgdGhyb3cgbmV3IEVycm9yKFxuLy8gICAgICAgICBzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLk5PX1BBUkVOVF9DT01QQVJJU09OLCBpICsgMSwgcGF0aClcbi8vICAgICAgICk7XG4vLyAgICAgfVxuLy9cbi8vICAgICBjdXJyZW50Q29udGV4dCA9IGN1cnJlbnRDb250ZXh0W1ZBTElEQVRJT05fUEFSRU5UX0tFWV07XG4vLyAgIH1cbi8vXG4vLyAgIC8vIFByb2Nlc3MgZG90IG5vdGF0aW9uIHBhdGhcbi8vICAgY29uc3QgcGFydHMgPSBjbGVhblBhdGguc3BsaXQoXCIuXCIpO1xuLy8gICBsZXQgY3VycmVudFZhbHVlOiBhbnkgPSBjdXJyZW50Q29udGV4dDtcbi8vXG4vLyAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuLy8gICAgIGlmIChcbi8vICAgICAgIGN1cnJlbnRWYWx1ZSAhPT0gbnVsbCAmJlxuLy8gICAgICAgdHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuLy8gICAgICAgcGFydCBpbiBjdXJyZW50VmFsdWVcbi8vICAgICApIHtcbi8vICAgICAgIGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50VmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcGFydF07XG4vLyAgICAgfSBlbHNlIHtcbi8vICAgICAgIGNvbnN0IGVycm9yTXNnVGVtcGxhdGUgPVxuLy8gICAgICAgICBwYXJlbnRMZXZlbCA9PT0gMFxuLy8gICAgICAgICAgID8gQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5QUk9QRVJUWV9OT1RfRk9VTkRcbi8vICAgICAgICAgICA6IHBhcmVudExldmVsID09PSAxXG4vLyAgICAgICAgICAgICA/IENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuUFJPUEVSVFlfTk9UX0ZPVU5EX09OX1BBUkVOVFxuLy8gICAgICAgICAgICAgOiBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlBST1BFUlRZX05PVF9GT1VORF9BRlRFUl9QQVJFTlQ7XG4vL1xuLy8gICAgICAgdGhyb3cgbmV3IEVycm9yKHNmKGVycm9yTXNnVGVtcGxhdGUsIHBhdGgsIHBhcnQsIHBhcmVudExldmVsKSk7XG4vLyAgICAgfVxuLy8gICB9XG4vL1xuLy8gICByZXR1cm4gY3VycmVudFZhbHVlIGFzIFQ7XG4vLyB9XG5cbmNvbnN0IGdldFR5cGVOYW1lID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gXCJudWxsXCI7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBcIkRhdGVcIjtcbiAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHJldHVybiBcIk5hTlwiO1xuICBpZiAodmFsdWUgPT09IEluZmluaXR5KSByZXR1cm4gXCJJbmZpbml0eVwiO1xuICBpZiAodmFsdWUgPT09IC1JbmZpbml0eSkgcmV0dXJuIFwiLUluZmluaXR5XCI7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFwiYXJyYXlcIjtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZTtcbn07XG5cbmNvbnN0IGlzU3VwcG9ydGVkID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgdW5kZWZpbmVkIHwgbnVtYmVyIHwgYmlnaW50IHwgRGF0ZSA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIHRydWU7XG5cbiAgLy8gTnVtYmVycyBtdXN0IGJlIGZpbml0ZSAoZXhjbHVkZXMgTmFOLCBJbmZpbml0eSwgLUluZmluaXR5KVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKTtcblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHR3byB2YWx1ZXMgYXJlIGVsaWdpYmxlIGZvciBjb21wYXJpc29uIHVzaW5nID49IG9yIDw9IG9wZXJhdG9ycy5cbiAqXG4gKiBTdXBwb3J0ZWQgdHlwZXM6IGB1bmRlZmluZWRgLCBgbnVtYmVyYCwgYGJpZ2ludGAsIGFuZCBgRGF0ZWAuXG4gKlxuICogQHBhcmFtIGEgLSBUaGUgZmlyc3QgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSBiIC0gVGhlIHNlY29uZCB2YWx1ZSB0byBjb21wYXJlLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGJvdGggdmFsdWVzIGFyZSBvZiBzdXBwb3J0ZWQgdHlwZXMuXG4gKlxuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiBlaXRoZXIgdmFsdWUgaXMgb2YgYW4gdW5zdXBwb3J0ZWQgdHlwZS5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRGb3JHdGVPckx0ZUNvbXBhcmlzb24oYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKGlzU3VwcG9ydGVkKGEpICYmIGlzU3VwcG9ydGVkKGIpKSByZXR1cm4gdHJ1ZTtcblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIHNmKFxuICAgICAgQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5VTlNVUFBPUlRFRF9UWVBFU19DT01QQVJJU09OLFxuICAgICAgZ2V0VHlwZU5hbWUoYSksXG4gICAgICBnZXRUeXBlTmFtZShiKVxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBDb21wYXJlcyB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGUgZmlyc3QgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQuXG4gKiBAZGVzY3JpcHRpb24gU3VwcG9ydHMgbnVtYmVycyBhbmQgZGF0ZXMuIFRocm93cyBhbiBlcnJvciBmb3IgdW5zdXBwb3J0ZWQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHthbnl9IGEgLSBUaGUgZmlyc3QgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7YW55fSBiIC0gVGhlIHNlY29uZCB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYGFgIGlzIGxlc3MgdGhhbiBgYmAsIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgZWl0aGVyIGBhYCBvciBgYmAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiB2YWx1ZXMgYXJlIG9mIG1pc21hdGNoZWQgb3IgdW5zdXBwb3J0ZWQgdHlwZXMuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xlc3NUaGFuKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gIGlmIChbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyhhKSB8fCBbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyhiKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5OVUxMX09SX1VOREVGSU5FRF9DT01QQVJJU09OKTtcblxuICAvLyBWYWxpZGF0ZSB0eXBlIGNvbXBhdGliaWxpdHlcbiAgY29uc3QgYVR5cGUgPSB0eXBlb2YgYTtcbiAgY29uc3QgYlR5cGUgPSB0eXBlb2YgYjtcblxuICBpZiAoYVR5cGUgIT09IGJUeXBlKSB7XG4gICAgLy8gQWxsb3cgbnVtYmVyIFggYmlnaW50XG4gICAgaWYgKGFUeXBlID09PSBcImJpZ2ludFwiICYmIGJUeXBlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIE51bWJlcihhKSA8IChiIGFzIG51bWJlcik7XG4gICAgaWYgKGFUeXBlID09PSBcIm51bWJlclwiICYmIGJUeXBlID09PSBcImJpZ2ludFwiKVxuICAgICAgcmV0dXJuIChhIGFzIG51bWJlcikgPCBOdW1iZXIoYik7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIHNmKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuVFlQRV9NSVNNQVRDSF9DT01QQVJJU09OLCBhVHlwZSwgYlR5cGUpXG4gICAgKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoYVR5cGUgPT09IFwibnVtYmVyXCIgJiYgYlR5cGUgPT09IFwibnVtYmVyXCIpIHx8XG4gICAgKGFUeXBlID09PSBcImJpZ2ludFwiICYmIGJUeXBlID09PSBcImJpZ2ludFwiKVxuICApIHtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGEpIHx8IE51bWJlci5pc05hTihiKSlcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5OQU5fQ09NUEFSSVNPTik7XG4gICAgcmV0dXJuIGEgPCBiO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBEYXRlICYmIGIgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgaWYgKGlzTmFOKGEuZ2V0VGltZSgpKSB8fCBpc05hTihiLmdldFRpbWUoKSkpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuSU5WQUxJRF9EQVRFX0NPTVBBUklTT04pO1xuICAgIHJldHVybiBhLmdldFRpbWUoKSA8IGIuZ2V0VGltZSgpO1xuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICBzZihcbiAgICAgIENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuVU5TVVBQT1JURURfVFlQRVNfQ09NUEFSSVNPTixcbiAgICAgIGdldFR5cGVOYW1lKGEpLFxuICAgICAgZ2V0VHlwZU5hbWUoYilcbiAgICApXG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBhYCBpcyBncmVhdGVyIHRoYW4gYGJgLlxuICogU3VwcG9ydHMgY29tcGFyaXNvbiBmb3IgbnVtYmVycyBhbmQgRGF0ZSBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBhIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlLlxuICogQHBhcmFtIHthbnl9IGIgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGBhYCBpcyBncmVhdGVyIHRoYW4gYGJgLCBvdGhlcndpc2UgZmFsc2UuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IElmIGVpdGhlciBgYWAgb3IgYGJgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgdmFsdWVzIGFyZSBvZiBtaXNtYXRjaGVkIG9yIHVuc3VwcG9ydGVkIHR5cGVzLlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHcmVhdGVyVGhhbihhOiBhbnksIGI6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoW251bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXMoYSkgfHwgW251bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXMoYikpXG4gICAgdGhyb3cgbmV3IEVycm9yKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuTlVMTF9PUl9VTkRFRklORURfQ09NUEFSSVNPTik7XG5cbiAgY29uc3QgYVR5cGUgPSB0eXBlb2YgYTtcbiAgY29uc3QgYlR5cGUgPSB0eXBlb2YgYjtcblxuICBpZiAoYVR5cGUgIT09IGJUeXBlKSB7XG4gICAgLy8gQWxsb3cgbnVtYmVyIFggYmlnaW50XG4gICAgaWYgKGFUeXBlID09PSBcImJpZ2ludFwiICYmIGJUeXBlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIE51bWJlcihhKSA+IChiIGFzIG51bWJlcik7XG4gICAgaWYgKGFUeXBlID09PSBcIm51bWJlclwiICYmIGJUeXBlID09PSBcImJpZ2ludFwiKVxuICAgICAgcmV0dXJuIChhIGFzIG51bWJlcikgPiBOdW1iZXIoYik7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgc2YoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5UWVBFX01JU01BVENIX0NPTVBBUklTT04sIGFUeXBlLCBiVHlwZSlcbiAgICApO1xuICB9XG5cbiAgaWYgKFxuICAgIChhVHlwZSA9PT0gXCJudW1iZXJcIiAmJiBiVHlwZSA9PT0gXCJudW1iZXJcIikgfHxcbiAgICAoYVR5cGUgPT09IFwiYmlnaW50XCIgJiYgYlR5cGUgPT09IFwiYmlnaW50XCIpXG4gICkge1xuICAgIGlmIChOdW1iZXIuaXNOYU4oYSkgfHwgTnVtYmVyLmlzTmFOKGIpKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLk5BTl9DT01QQVJJU09OKTtcbiAgICByZXR1cm4gYSA+IGI7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBpZiAoaXNOYU4oYS5nZXRUaW1lKCkpIHx8IGlzTmFOKGIuZ2V0VGltZSgpKSlcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5JTlZBTElEX0RBVEVfQ09NUEFSSVNPTik7XG4gICAgcmV0dXJuIGEuZ2V0VGltZSgpID4gYi5nZXRUaW1lKCk7XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIHNmKFxuICAgICAgQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5VTlNVUFBPUlRFRF9UWVBFU19DT01QQVJJU09OLFxuICAgICAgZ2V0VHlwZU5hbWUoYSksXG4gICAgICBnZXRUeXBlTmFtZShiKVxuICAgIClcbiAgKTtcbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEdyZWF0ZXJUaGFuVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNHcmVhdGVyVGhhbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhQcm94eSB9IGZyb20gXCIuLi8uLi91dGlscy9QYXRoUHJveHlcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBHcmVhdGVyIFRoYW4gVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNHUkVBVEVSX1RIQU59XG4gKlxuICogQGNsYXNzIEdyZWF0ZXJUaGFuVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTilcbmV4cG9ydCBjbGFzcyBHcmVhdGVyVGhhblZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxHcmVhdGVyVGhhblZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU4pIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtHcmVhdGVyVGhhblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtQYXRoUHJveHk8YW55Pn0gYWNjZXNzb3IgLSBQcm94eS1saWtlIG9iamVjdCB1c2VkIHRvIHJlc29sdmUgdmFsdWVzIGZyb20gbmVzdGVkIHN0cnVjdHVyZXMgdmlhIHBhdGggc3RyaW5ncy5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9uczogR3JlYXRlclRoYW5WYWxpZGF0b3JPcHRpb25zLFxuICAgIGFjY2Vzc29yOiBQYXRoUHJveHk8YW55PlxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZTogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSA9IGFjY2Vzc29yLmdldFZhbHVlRnJvbVBhdGgoXG4gICAgICAgIG9wdGlvbnNbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOXVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoZS5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghaXNHcmVhdGVyVGhhbih2YWx1ZSwgY29tcGFyaXNvblByb3BlcnR5VmFsdWUpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3Iob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICBlLm1lc3NhZ2UsXG4gICAgICAgIG9wdGlvbnMubGFiZWwgfHwgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5dXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzR3JlYXRlclRoYW4sIGlzVmFsaWRGb3JHdGVPckx0ZUNvbXBhcmlzb24gfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBQYXRoUHJveHkgfSBmcm9tIFwiLi4vLi4vdXRpbHMvUGF0aFByb3h5XCI7XG5cbi8qKlxuICogQHN1bW1hcnkgR3JlYXRlciBUaGFuIG9yIEVxdWFsIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjR1JFQVRFUl9USEFOX09SX0VRVUFMfVxuICpcbiAqIEBjbGFzcyBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMKVxuZXhwb3J0IGNsYXNzIEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuR1JFQVRFUl9USEFOX09SX0VRVUFMKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7R3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1BhdGhQcm94eTxhbnk+fSBhY2Nlc3NvciAtIFByb3h5LWxpa2Ugb2JqZWN0IHVzZWQgdG8gcmVzb2x2ZSB2YWx1ZXMgZnJvbSBuZXN0ZWQgc3RydWN0dXJlcyB2aWEgcGF0aCBzdHJpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zOiBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zLFxuICAgIGFjY2Vzc29yOiBQYXRoUHJveHk8YW55PlxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZTogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSA9IGFjY2Vzc29yLmdldFZhbHVlRnJvbVBhdGgoXG4gICAgICAgIG9wdGlvbnNbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMXVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoZS5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChcbiAgICAgICAgKGlzVmFsaWRGb3JHdGVPckx0ZUNvbXBhcmlzb24odmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKSAmJlxuICAgICAgICAgIGlzRXF1YWwodmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKSkgfHxcbiAgICAgICAgaXNHcmVhdGVyVGhhbih2YWx1ZSwgY29tcGFyaXNvblByb3BlcnR5VmFsdWUpXG4gICAgICApXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgIGUubWVzc2FnZSxcbiAgICAgICAgb3B0aW9ucy5sYWJlbCB8fCBvcHRpb25zW1ZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTF1cbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMZXNzVGhhblZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzTGVzc1RoYW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBQYXRoUHJveHkgfSBmcm9tIFwiLi4vLi4vdXRpbHMvUGF0aFByb3h5XCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTGVzcyBUaGFuIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTEVTU19USEFOfVxuICpcbiAqIEBjbGFzcyBMZXNzVGhhblZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU4pXG5leHBvcnQgY2xhc3MgTGVzc1RoYW5WYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8TGVzc1RoYW5WYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTEVTU19USEFOKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7TGVzc1RoYW5WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqIEBwYXJhbSB7UGF0aFByb3h5PGFueT59IGFjY2Vzc29yIC0gUHJveHktbGlrZSBvYmplY3QgdXNlZCB0byByZXNvbHZlIHZhbHVlcyBmcm9tIG5lc3RlZCBzdHJ1Y3R1cmVzIHZpYSBwYXRoIHN0cmluZ3MuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IExlc3NUaGFuVmFsaWRhdG9yT3B0aW9ucyxcbiAgICBhY2Nlc3NvcjogUGF0aFByb3h5PGFueT5cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY29tcGFyaXNvblByb3BlcnR5VmFsdWU6IGFueTtcbiAgICB0cnkge1xuICAgICAgY29tcGFyaXNvblByb3BlcnR5VmFsdWUgPSBhY2Nlc3Nvci5nZXRWYWx1ZUZyb21QYXRoKFxuICAgICAgICBvcHRpb25zW1ZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKGUubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoIWlzTGVzc1RoYW4odmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShcbiAgICAgICAgZS5tZXNzYWdlLFxuICAgICAgICBvcHRpb25zLmxhYmVsIHx8IG9wdGlvbnNbVmFsaWRhdGlvbktleXMuTEVTU19USEFOXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7IExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzTGVzc1RoYW4sIGlzVmFsaWRGb3JHdGVPckx0ZUNvbXBhcmlzb24gfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBQYXRoUHJveHkgfSBmcm9tIFwiLi4vLi4vdXRpbHMvUGF0aFByb3h5XCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTGVzcyBUaGFuIG9yIEVxdWFsIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTEVTU19USEFOX09SX0VRVUFMfVxuICpcbiAqIEBjbGFzcyBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMKVxuZXhwb3J0IGNsYXNzIExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTEVTU19USEFOX09SX0VRVUFMKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7TGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1BhdGhQcm94eTxhbnk+fSBhY2Nlc3NvciAtIFByb3h5LWxpa2Ugb2JqZWN0IHVzZWQgdG8gcmVzb2x2ZSB2YWx1ZXMgZnJvbSBuZXN0ZWQgc3RydWN0dXJlcyB2aWEgcGF0aCBzdHJpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zOiBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zLFxuICAgIGFjY2Vzc29yOiBQYXRoUHJveHk8YW55PlxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZTogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSA9IGFjY2Vzc29yLmdldFZhbHVlRnJvbVBhdGgoXG4gICAgICAgIG9wdGlvbnNbVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMXVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoZS5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChcbiAgICAgICAgKGlzVmFsaWRGb3JHdGVPckx0ZUNvbXBhcmlzb24odmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKSAmJlxuICAgICAgICAgIGlzRXF1YWwodmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKSkgfHxcbiAgICAgICAgaXNMZXNzVGhhbih2YWx1ZSwgY29tcGFyaXNvblByb3BlcnR5VmFsdWUpXG4gICAgICApXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgIGUubWVzc2FnZSxcbiAgICAgICAgb3B0aW9ucy5sYWJlbCB8fCBvcHRpb25zW1ZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTF1cbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMaXN0VmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vLi4vbW9kZWxcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBlbGVtZW50cyBpbiBhIGxpc3Qgb3Igc2V0IG1hdGNoIGV4cGVjdGVkIHR5cGVzXG4gKiBAc3VtbWFyeSBUaGUgTGlzdFZhbGlkYXRvciB2YWxpZGF0ZXMgdGhhdCBhbGwgZWxlbWVudHMgaW4gYW4gYXJyYXkgb3IgU2V0IG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlcy5cbiAqIEl0IGNoZWNrcyBlYWNoIGVsZW1lbnQgYWdhaW5zdCBhIGxpc3Qgb2YgYWxsb3dlZCBjbGFzcyB0eXBlcyBhbmQgZW5zdXJlcyB0eXBlIGNvbnNpc3RlbmN5LlxuICogVGhpcyB2YWxpZGF0b3IgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0aGUgQGxpc3QgZGVjb3JhdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTElTVH1cbiAqXG4gKiBAY2xhc3MgTGlzdFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIGxpc3QgdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBsaXN0VmFsaWRhdG9yID0gbmV3IExpc3RWYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBsaXN0IHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21MaXN0VmFsaWRhdG9yID0gbmV3IExpc3RWYWxpZGF0b3IoXCJBbGwgaXRlbXMgbXVzdCBiZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGVcIik7XG4gKlxuICogLy8gVmFsaWRhdGUgYSBsaXN0XG4gKiBjb25zdCBvcHRpb25zID0geyBjbGF6ejogW1wiU3RyaW5nXCIsIFwiTnVtYmVyXCJdIH07XG4gKiBjb25zdCByZXN1bHQgPSBsaXN0VmFsaWRhdG9yLmhhc0Vycm9ycyhbXCJ0ZXN0XCIsIDEyM10sIG9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogY29uc3QgaW52YWxpZFJlc3VsdCA9IGxpc3RWYWxpZGF0b3IuaGFzRXJyb3JzKFtuZXcgRGF0ZSgpXSwgb3B0aW9ucyk7IC8vIFJldHVybnMgZXJyb3IgbWVzc2FnZSAoaW52YWxpZClcbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBMaXN0VmFsaWRhdG9yXG4gKlxuICogICBDLT4+VjogbmV3IExpc3RWYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgQy0+PlY6IGhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucylcbiAqICAgYWx0IHZhbHVlIGlzIGVtcHR5XG4gKiAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICBlbHNlIHZhbHVlIGhhcyBlbGVtZW50c1xuICogICAgIFYtPj5WOiBDaGVjayBlYWNoIGVsZW1lbnQncyB0eXBlXG4gKiAgICAgYWx0IEFsbCBlbGVtZW50cyBtYXRjaCBhbGxvd2VkIHR5cGVzXG4gKiAgICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgICAgZWxzZSBTb21lIGVsZW1lbnRzIGRvbid0IG1hdGNoXG4gKiAgICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5MSVNUKVxuZXhwb3J0IGNsYXNzIExpc3RWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8TGlzdFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MSVNUKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgQXJyYXkubmFtZSwgU2V0Lm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYWxsIGVsZW1lbnRzIGluIGEgbGlzdCBvciBzZXQgbWF0Y2ggdGhlIGV4cGVjdGVkIHR5cGVzXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGF0IGVhY2ggZWxlbWVudCBpbiB0aGUgcHJvdmlkZWQgYXJyYXkgb3IgU2V0IG1hdGNoZXMgb25lIG9mIHRoZVxuICAgKiBjbGFzcyB0eXBlcyBzcGVjaWZpZWQgaW4gdGhlIG9wdGlvbnMuIEZvciBvYmplY3QgdHlwZXMsIGl0IGNoZWNrcyB0aGUgY29uc3RydWN0b3IgbmFtZSxcbiAgICogYW5kIGZvciBwcmltaXRpdmUgdHlwZXMsIGl0IGNvbXBhcmVzIGFnYWluc3QgdGhlIGxvd2VyY2FzZSB0eXBlIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7YW55W10gfCBTZXQ8YW55Pn0gdmFsdWUgLSBUaGUgYXJyYXkgb3IgU2V0IHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7TGlzdFZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgY29udGFpbmluZyB0aGUgYWxsb3dlZCBjbGFzcyB0eXBlc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55W10gfCBTZXQ8YW55PixcbiAgICBvcHRpb25zOiBMaXN0VmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdmFsdWUgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpID8gIXZhbHVlLmxlbmd0aCA6ICF2YWx1ZS5zaXplKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2xhenogPSAoXG4gICAgICBBcnJheS5pc0FycmF5KG9wdGlvbnMuY2xhenopID8gb3B0aW9ucy5jbGF6eiA6IFtvcHRpb25zLmNsYXp6XVxuICAgICkubWFwKChjKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGMgPT09IFwic3RyaW5nXCIpIHJldHVybiBjO1xuICAgICAgaWYgKCFjLm5hbWUpIHJldHVybiAoYyBhcyAoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSgpLm5hbWU7XG4gICAgICByZXR1cm4gYy5uYW1lO1xuICAgIH0pO1xuICAgIGxldCB2YWw6IGFueSxcbiAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgIGZvciAoXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBpIDwgKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubGVuZ3RoIDogdmFsdWUuc2l6ZSk7XG4gICAgICBpKytcbiAgICApIHtcbiAgICAgIHZhbCA9ICh2YWx1ZSBhcyBhbnkpW2ldO1xuICAgICAgc3dpdGNoICh0eXBlb2YgdmFsKSB7XG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgaXNWYWxpZCA9IGNsYXp6LmluY2x1ZGVzKCgodmFsID8/IHt9KSBhcyBvYmplY3QpLmNvbnN0cnVjdG9yPy5uYW1lKTsgLy8gbnVsbCBpcyBhbiBvYmplY3RcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpc1ZhbGlkID0gY2xhenouc29tZSgoYzogc3RyaW5nKSA9PiB0eXBlb2YgdmFsID09PSBjLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc1ZhbGlkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgY2xhenopO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzLCBERUZBVUxUX0VSUk9SX01FU1NBR0VTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTWF4aW11bSBMZW5ndGggVmFsaWRhdG9yXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIHN0cmluZ3MgYW5kIEFycmF5cyBvbiB0aGVpciBtYXhpbXVtIGxlbmd0aFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUFYX0xFTkdUSH1cbiAqXG4gKiBAY2xhc3MgTWluTGVuZ3RoVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgpXG5leHBvcnQgY2xhc3MgTWF4TGVuZ3RoVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NQVhfTEVOR1RIKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgU3RyaW5nLm5hbWUsIEFycmF5Lm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge01heExlbmd0aFZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBhbnlbXSxcbiAgICBvcHRpb25zOiBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBvcHRpb25zLm1heGxlbmd0aFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgb3B0aW9ucy5tYXhsZW5ndGgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWF4VmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3IgZm9yIGNoZWNraW5nIGlmIGEgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGEgbWF4aW11bVxuICogQHN1bW1hcnkgVGhlIE1heFZhbGlkYXRvciBjaGVja3MgaWYgYSBudW1lcmljIHZhbHVlLCBkYXRlLCBvciBzdHJpbmcgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXG4gKiBhIHNwZWNpZmllZCBtYXhpbXVtIHZhbHVlLiBJdCBzdXBwb3J0cyBjb21wYXJpbmcgbnVtYmVycyBkaXJlY3RseSwgZGF0ZXMgY2hyb25vbG9naWNhbGx5LFxuICogYW5kIHN0cmluZ3MgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEBtYXggZGVjb3JhdG9yLlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMsIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01BWH1cbiAqIFxuICogQGNsYXNzIE1heFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBtYXggdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBtYXhWYWxpZGF0b3IgPSBuZXcgTWF4VmFsaWRhdG9yKCk7XG4gKiBcbiAqIC8vIENyZWF0ZSBhIG1heCB2YWxpZGF0b3Igd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogY29uc3QgY3VzdG9tTWF4VmFsaWRhdG9yID0gbmV3IE1heFZhbGlkYXRvcihcIlZhbHVlIG11c3Qgbm90IGV4Y2VlZCB7MH1cIik7XG4gKiBcbiAqIC8vIFZhbGlkYXRlIGEgbnVtYmVyXG4gKiBjb25zdCBudW1PcHRpb25zID0geyBtYXg6IDEwMCwgbWVzc2FnZTogXCJOdW1iZXIgdG9vIGxhcmdlXCIgfTtcbiAqIGNvbnN0IG51bVJlc3VsdCA9IG1heFZhbGlkYXRvci5oYXNFcnJvcnMoNTAsIG51bU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogY29uc3QgaW52YWxpZE51bVJlc3VsdCA9IG1heFZhbGlkYXRvci5oYXNFcnJvcnMoMTUwLCBudW1PcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogXG4gKiAvLyBWYWxpZGF0ZSBhIGRhdGVcbiAqIGNvbnN0IGRhdGVPcHRpb25zID0geyBtYXg6IG5ldyBEYXRlKDIwMjMsIDExLCAzMSkgfTtcbiAqIGNvbnN0IGRhdGVSZXN1bHQgPSBtYXhWYWxpZGF0b3IuaGFzRXJyb3JzKG5ldyBEYXRlKDIwMjMsIDUsIDE1KSwgZGF0ZU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogYGBgXG4gKiBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBNYXhWYWxpZGF0b3JcbiAqICAgXG4gKiAgIEMtPj5WOiBuZXcgTWF4VmFsaWRhdG9yKG1lc3NhZ2UpXG4gKiAgIEMtPj5WOiBoYXNFcnJvcnModmFsdWUsIG9wdGlvbnMpXG4gKiAgIGFsdCB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgIGVsc2UgdmFsdWUgaXMgRGF0ZSBhbmQgbWF4IGlzIG5vdCBEYXRlXG4gKiAgICAgVi0+PlY6IENvbnZlcnQgbWF4IHRvIERhdGVcbiAqICAgICBhbHQgY29udmVyc2lvbiBmYWlsc1xuICogICAgICAgVi0tPj5DOiBFcnJvcjogSW52YWxpZCBNYXggcGFyYW1cbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIGFsdCB2YWx1ZSA+IG1heFxuICogICAgIFYtLT4+QzogRXJyb3IgbWVzc2FnZVxuICogICBlbHNlIHZhbHVlIDw9IG1heFxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZW5kXG4gKiBcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuTUFYKVxuZXhwb3J0IGNsYXNzIE1heFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxNYXhWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUFYKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgXCJudW1iZXJcIiwgXCJEYXRlXCIsIFwic3RyaW5nXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYSBtYXhpbXVtXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGF0IHRoZSBwcm92aWRlZCB2YWx1ZSBkb2VzIG5vdCBleGNlZWQgdGhlIG1heGltdW0gdmFsdWVcbiAgICogc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zLiBGb3IgZGF0ZXMsIGl0IHBlcmZvcm1zIGNocm9ub2xvZ2ljYWwgY29tcGFyaXNvbixcbiAgICogY29udmVydGluZyBzdHJpbmcgcmVwcmVzZW50YXRpb25zIHRvIERhdGUgb2JqZWN0cyBpZiBuZWNlc3NhcnkuIEZvciBudW1iZXJzXG4gICAqIGFuZCBzdHJpbmdzLCBpdCBwZXJmb3JtcyBkaXJlY3QgY29tcGFyaXNvbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXIgfCBEYXRlIHwgc3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge01heFZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgY29udGFpbmluZyB0aGUgbWF4aW11bSB2YWx1ZVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogTWF4VmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcblxuICAgIGxldCB7IG1heCB9ID0gb3B0aW9ucztcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICEobWF4IGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgIG1heCA9IG5ldyBEYXRlKG1heCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKG1heC5nZXREYXRlKCkpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIE1heCBwYXJhbSBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA+IG1heFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgbWF4KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNaW5pbXVtIExlbmd0aCBWYWxpZGF0b3JcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgc3RyaW5ncyBhbmQgQXJyYXlzIG9uIHRoZWlyIG1pbmltdW0gbGVuZ3RoXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNSU5fTEVOR1RIfVxuICpcbiAqIEBjbGFzcyBNaW5MZW5ndGhWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSClcbmV4cG9ydCBjbGFzcyBNaW5MZW5ndGhWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8TWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1JTl9MRU5HVEgpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBTdHJpbmcubmFtZSwgQXJyYXkubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBhbnlbXSxcbiAgICBvcHRpb25zOiBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPCBvcHRpb25zLm1pbmxlbmd0aFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgb3B0aW9ucy5taW5sZW5ndGgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWluVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3IgZm9yIGNoZWNraW5nIGlmIGEgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGEgbWluaW11bVxuICogQHN1bW1hcnkgVGhlIE1pblZhbGlkYXRvciBjaGVja3MgaWYgYSBudW1lcmljIHZhbHVlLCBkYXRlLCBvciBzdHJpbmcgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXG4gKiBhIHNwZWNpZmllZCBtaW5pbXVtIHZhbHVlLiBJdCBzdXBwb3J0cyBjb21wYXJpbmcgbnVtYmVycyBkaXJlY3RseSwgZGF0ZXMgY2hyb25vbG9naWNhbGx5LFxuICogYW5kIHN0cmluZ3MgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEBtaW4gZGVjb3JhdG9yLlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMsIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTn1cbiAqIFxuICogQGNsYXNzIE1pblZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBtaW4gdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBtaW5WYWxpZGF0b3IgPSBuZXcgTWluVmFsaWRhdG9yKCk7XG4gKiBcbiAqIC8vIENyZWF0ZSBhIG1pbiB2YWxpZGF0b3Igd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogY29uc3QgY3VzdG9tTWluVmFsaWRhdG9yID0gbmV3IE1pblZhbGlkYXRvcihcIlZhbHVlIG11c3QgYmUgYXQgbGVhc3QgezB9XCIpO1xuICogXG4gKiAvLyBWYWxpZGF0ZSBhIG51bWJlclxuICogY29uc3QgbnVtT3B0aW9ucyA9IHsgbWluOiAxMCwgbWVzc2FnZTogXCJOdW1iZXIgdG9vIHNtYWxsXCIgfTtcbiAqIGNvbnN0IG51bVJlc3VsdCA9IG1pblZhbGlkYXRvci5oYXNFcnJvcnMoNTAsIG51bU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogY29uc3QgaW52YWxpZE51bVJlc3VsdCA9IG1pblZhbGlkYXRvci5oYXNFcnJvcnMoNSwgbnVtT3B0aW9ucyk7IC8vIFJldHVybnMgZXJyb3IgbWVzc2FnZSAoaW52YWxpZClcbiAqIFxuICogLy8gVmFsaWRhdGUgYSBkYXRlXG4gKiBjb25zdCBkYXRlT3B0aW9ucyA9IHsgbWluOiBuZXcgRGF0ZSgyMDIzLCAwLCAxKSB9O1xuICogY29uc3QgZGF0ZVJlc3VsdCA9IG1pblZhbGlkYXRvci5oYXNFcnJvcnMobmV3IERhdGUoMjAyMywgNSwgMTUpLCBkYXRlT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBgYGBcbiAqIFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIE1pblZhbGlkYXRvclxuICogICBcbiAqICAgQy0+PlY6IG5ldyBNaW5WYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgQy0+PlY6IGhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucylcbiAqICAgYWx0IHZhbHVlIGlzIHVuZGVmaW5lZFxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZWxzZSB2YWx1ZSBpcyBEYXRlIGFuZCBtaW4gaXMgbm90IERhdGVcbiAqICAgICBWLT4+VjogQ29udmVydCBtaW4gdG8gRGF0ZVxuICogICAgIGFsdCBjb252ZXJzaW9uIGZhaWxzXG4gKiAgICAgICBWLS0+PkM6IEVycm9yOiBJbnZhbGlkIE1pbiBwYXJhbVxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgYWx0IHZhbHVlIDwgbWluXG4gKiAgICAgVi0tPj5DOiBFcnJvciBtZXNzYWdlXG4gKiAgIGVsc2UgdmFsdWUgPj0gbWluXG4gKiAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICBlbmRcbiAqIFxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5NSU4pXG5leHBvcnQgY2xhc3MgTWluVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPE1pblZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NSU4pIHtcbiAgICBzdXBlcihtZXNzYWdlLCBcIm51bWJlclwiLCBcIkRhdGVcIiwgXCJzdHJpbmdcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBhIG1pbmltdW1cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBsZXNzIHRoYW4gdGhlIG1pbmltdW0gdmFsdWVcbiAgICogc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zLiBGb3IgZGF0ZXMsIGl0IHBlcmZvcm1zIGNocm9ub2xvZ2ljYWwgY29tcGFyaXNvbixcbiAgICogY29udmVydGluZyBzdHJpbmcgcmVwcmVzZW50YXRpb25zIHRvIERhdGUgb2JqZWN0cyBpZiBuZWNlc3NhcnkuIEZvciBudW1iZXJzXG4gICAqIGFuZCBzdHJpbmdzLCBpdCBwZXJmb3JtcyBkaXJlY3QgY29tcGFyaXNvbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXIgfCBEYXRlIHwgc3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge01pblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgY29udGFpbmluZyB0aGUgbWluaW11bSB2YWx1ZVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogTWluVmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcblxuICAgIGxldCB7IG1pbiB9ID0gb3B0aW9ucztcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICEobWluIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgIG1pbiA9IG5ldyBEYXRlKG1pbik7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKG1pbi5nZXREYXRlKCkpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIE1pbiBwYXJhbSBkZWZpbmVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgPCBtaW5cbiAgICAgID8gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsIG1pbilcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQYXR0ZXJuVmFsaWRhdG9yIH0gZnJvbSBcIi4vUGF0dGVyblZhbGlkYXRvclwiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgREVGQVVMVF9QQVRURVJOUyxcbiAgVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBIYW5kbGVzIFBhc3N3b3JkIFZhbGlkYXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Vycm9yTWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUEFTU1dPUkR9XG4gKlxuICogQGNsYXNzIFBhc3N3b3JkVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBQYXR0ZXJuVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5QQVNTV09SRClcbmV4cG9ydCBjbGFzcyBQYXNzd29yZFZhbGlkYXRvciBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVNTV09SRCkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1BhdHRlcm5WYWxpZGF0b3JPcHRpb25zfSBbb3B0aW9ucz17fV1cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBQYXR0ZXJuVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zID0ge31cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKHZhbHVlLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgIFtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXTpcbiAgICAgICAgb3B0aW9ucz8ucGF0dGVybiB8fCBERUZBVUxUX1BBVFRFUk5TLlBBU1NXT1JELkNIQVI4X09ORV9PRl9FQUNILFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvciBmb3IgY2hlY2tpbmcgaWYgYSB2YWx1ZSBpcyBwcmVzZW50IGFuZCBub3QgZW1wdHlcbiAqIEBzdW1tYXJ5IFRoZSBSZXF1aXJlZFZhbGlkYXRvciBlbnN1cmVzIHRoYXQgYSB2YWx1ZSBpcyBwcm92aWRlZCBhbmQgbm90IGVtcHR5LlxuICogSXQgaGFuZGxlcyBkaWZmZXJlbnQgdHlwZXMgb2YgdmFsdWVzIGFwcHJvcHJpYXRlbHk6IGZvciBib29sZWFucyBhbmQgbnVtYmVycyxcbiAqIGl0IGNoZWNrcyBpZiB0aGV5J3JlIHVuZGVmaW5lZDsgZm9yIG90aGVyIHR5cGVzIChzdHJpbmdzLCBhcnJheXMsIG9iamVjdHMpLFxuICogaXQgY2hlY2tzIGlmIHRoZXkncmUgZmFsc3kuIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEByZXF1aXJlZCBkZWNvcmF0b3JcbiAqIGFuZCBpcyBvZnRlbiB0aGUgZmlyc3QgdmFsaWRhdGlvbiBhcHBsaWVkIHRvIGltcG9ydGFudCBmaWVsZHMuXG4gKiBcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUkVRVUlSRUR9XG4gKiBcbiAqIEBjbGFzcyBSZXF1aXJlZFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSByZXF1aXJlZCB2YWxpZGF0b3Igd2l0aCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IHJlcXVpcmVkVmFsaWRhdG9yID0gbmV3IFJlcXVpcmVkVmFsaWRhdG9yKCk7XG4gKiBcbiAqIC8vIENyZWF0ZSBhIHJlcXVpcmVkIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21SZXF1aXJlZFZhbGlkYXRvciA9IG5ldyBSZXF1aXJlZFZhbGlkYXRvcihcIlRoaXMgZmllbGQgaXMgbWFuZGF0b3J5XCIpO1xuICogXG4gKiAvLyBWYWxpZGF0ZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFsdWVzXG4gKiByZXF1aXJlZFZhbGlkYXRvci5oYXNFcnJvcnMoXCJIZWxsb1wiKTsgLy8gdW5kZWZpbmVkICh2YWxpZClcbiAqIHJlcXVpcmVkVmFsaWRhdG9yLmhhc0Vycm9ycyhcIlwiKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogcmVxdWlyZWRWYWxpZGF0b3IuaGFzRXJyb3JzKDApOyAvLyB1bmRlZmluZWQgKHZhbGlkIC0gMCBpcyBhIHZhbGlkIG51bWJlcilcbiAqIHJlcXVpcmVkVmFsaWRhdG9yLmhhc0Vycm9ycyhudWxsKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogcmVxdWlyZWRWYWxpZGF0b3IuaGFzRXJyb3JzKFtdKTsgLy8gdW5kZWZpbmVkICh2YWxpZCAtIGVtcHR5IGFycmF5IGlzIHN0aWxsIGFuIGFycmF5KVxuICogYGBgXG4gKiBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBSZXF1aXJlZFZhbGlkYXRvclxuICogICBcbiAqICAgQy0+PlY6IG5ldyBSZXF1aXJlZFZhbGlkYXRvcihtZXNzYWdlKVxuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdHlwZW9mIHZhbHVlIGlzIGJvb2xlYW4gb3IgbnVtYmVyXG4gKiAgICAgYWx0IHZhbHVlIGlzIHVuZGVmaW5lZFxuICogICAgICAgVi0tPj5DOiBFcnJvciBtZXNzYWdlXG4gKiAgICAgZWxzZSB2YWx1ZSBpcyBkZWZpbmVkXG4gKiAgICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgICAgZW5kXG4gKiAgIGVsc2Ugb3RoZXIgdHlwZXNcbiAqICAgICBhbHQgdmFsdWUgaXMgZmFsc3kgKG51bGwsIHVuZGVmaW5lZCwgZW1wdHkgc3RyaW5nKVxuICogICAgICAgVi0tPj5DOiBFcnJvciBtZXNzYWdlXG4gKiAgICAgZWxzZSB2YWx1ZSBpcyB0cnV0aHlcbiAqICAgICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiBcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuUkVRVUlSRUQpXG5leHBvcnQgY2xhc3MgUmVxdWlyZWRWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlJFUVVJUkVEKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzIHByZXNlbnQgYW5kIG5vdCBlbXB0eVxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhhdCB0aGUgcHJvdmlkZWQgdmFsdWUgZXhpc3RzIGFuZCBpcyBub3QgZW1wdHkuXG4gICAqIFRoZSB2YWxpZGF0aW9uIGxvZ2ljIHZhcmllcyBieSB0eXBlOlxuICAgKiAtIEZvciBib29sZWFucyBhbmQgbnVtYmVyczogY2hlY2tzIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAgICogLSBGb3Igb3RoZXIgdHlwZXMgKHN0cmluZ3MsIGFycmF5cywgb2JqZWN0cyk6IGNoZWNrcyBpZiB0aGUgdmFsdWUgaXMgZmFsc3lcbiAgICpcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7VmFsaWRhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IFZhbGlkYXRvck9wdGlvbnMgPSB7fVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAhdmFsdWVcbiAgICAgICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU3RlcFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBTdGVwIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjU1RFUH1cbiAqXG4gKiBAY2xhc3MgU3RlcFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5TVEVQKVxuZXhwb3J0IGNsYXNzIFN0ZXBWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8U3RlcFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5TVEVQKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgXCJudW1iZXJcIiwgXCJzdHJpbmdcIik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGVwXG4gICAqIEBwYXJhbSB7U3RlcFZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBudW1iZXIgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogU3RlcFZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSkgJSBOdW1iZXIob3B0aW9ucy5zdGVwKSAhPT0gMFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgb3B0aW9ucy5zdGVwKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tIFwiLi4vVmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgVHlwZVZhbGlkYXRvck9wdGlvbnMsXG4gIFZhbGlkYXRvckRlZmluaXRpb24sXG4gIFZhbGlkYXRvck9wdGlvbnMsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3IgZm9yIGNoZWNraW5nIGlmIGEgdmFsdWUgaXMgb2YgdGhlIGV4cGVjdGVkIHR5cGUocylcbiAqIEBzdW1tYXJ5IFRoZSBUeXBlVmFsaWRhdG9yIGVuc3VyZXMgdGhhdCBhIHZhbHVlIG1hdGNoZXMgb25lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXMuXG4gKiBJdCBjYW4gdmFsaWRhdGUgYWdhaW5zdCBhIHNpbmdsZSB0eXBlLCBtdWx0aXBsZSB0eXBlcywgb3IgYSB0eXBlIHdpdGggYSBzcGVjaWZpYyBuYW1lLlxuICogVGhpcyB2YWxpZGF0b3IgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0aGUgQHR5cGUgZGVjb3JhdG9yIGFuZCBpcyBmdW5kYW1lbnRhbCBmb3JcbiAqIGVuc3VyaW5nIHR5cGUgc2FmZXR5IGluIHZhbGlkYXRlZCBtb2RlbHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLCBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNUWVBFfVxuICpcbiAqIEBjbGFzcyBUeXBlVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgdHlwZSB2YWxpZGF0b3Igd2l0aCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IHR5cGVWYWxpZGF0b3IgPSBuZXcgVHlwZVZhbGlkYXRvcigpO1xuICpcbiAqIC8vIENyZWF0ZSBhIHR5cGUgdmFsaWRhdG9yIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IGN1c3RvbVR5cGVWYWxpZGF0b3IgPSBuZXcgVHlwZVZhbGlkYXRvcihcIlZhbHVlIG11c3QgYmUgb2YgdHlwZSB7MH0sIGJ1dCBnb3QgezF9XCIpO1xuICpcbiAqIC8vIFZhbGlkYXRlIGFnYWluc3QgYSBzaW5nbGUgdHlwZVxuICogY29uc3Qgc3RyaW5nT3B0aW9ucyA9IHsgdHlwZXM6IFwic3RyaW5nXCIgfTtcbiAqIHR5cGVWYWxpZGF0b3IuaGFzRXJyb3JzKFwiaGVsbG9cIiwgc3RyaW5nT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiB0eXBlVmFsaWRhdG9yLmhhc0Vycm9ycygxMjMsIHN0cmluZ09wdGlvbnMpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKlxuICogLy8gVmFsaWRhdGUgYWdhaW5zdCBtdWx0aXBsZSB0eXBlc1xuICogY29uc3QgbXVsdGlPcHRpb25zID0geyB0eXBlczogW1wic3RyaW5nXCIsIFwibnVtYmVyXCJdIH07XG4gKiB0eXBlVmFsaWRhdG9yLmhhc0Vycm9ycyhcImhlbGxvXCIsIG11bHRpT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiB0eXBlVmFsaWRhdG9yLmhhc0Vycm9ycygxMjMsIG11bHRpT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiB0eXBlVmFsaWRhdG9yLmhhc0Vycm9ycyh0cnVlLCBtdWx0aU9wdGlvbnMpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKlxuICogLy8gVmFsaWRhdGUgYWdhaW5zdCBhIGNsYXNzIHR5cGVcbiAqIGNvbnN0IGNsYXNzT3B0aW9ucyA9IHsgdHlwZXM6IHsgbmFtZTogXCJEYXRlXCIgfSB9O1xuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnMobmV3IERhdGUoKSwgY2xhc3NPcHRpb25zKTsgLy8gdW5kZWZpbmVkICh2YWxpZClcbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBUeXBlVmFsaWRhdG9yXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVmbGVjdGlvblxuICpcbiAqICAgQy0+PlY6IG5ldyBUeXBlVmFsaWRhdG9yKG1lc3NhZ2UpXG4gKiAgIEMtPj5WOiBoYXNFcnJvcnModmFsdWUsIG9wdGlvbnMpXG4gKiAgIGFsdCB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgIGVsc2UgdmFsdWUgaXMgZGVmaW5lZFxuICogICAgIFYtPj5SOiBldmFsdWF0ZURlc2lnblR5cGVzKHZhbHVlLCB0eXBlcylcbiAqICAgICBhbHQgdHlwZSBldmFsdWF0aW9uIHBhc3Nlc1xuICogICAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICAgIGVsc2UgdHlwZSBldmFsdWF0aW9uIGZhaWxzXG4gKiAgICAgICBWLT4+VjogRm9ybWF0IGVycm9yIG1lc3NhZ2Ugd2l0aCB0eXBlIGluZm9cbiAqICAgICAgIFYtLT4+QzogRXJyb3IgbWVzc2FnZVxuICogICAgIGVuZFxuICogICBlbmRcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLlRZUEUpXG5leHBvcnQgY2xhc3MgVHlwZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxUeXBlVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRZUEUpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgdmFsdWUgaXMgb2YgdGhlIGV4cGVjdGVkIHR5cGUocylcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIHZhbHVlIG1hdGNoZXMgb25lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXMuXG4gICAqIEl0IHVzZXMgdGhlIFJlZmxlY3Rpb24gdXRpbGl0eSB0byBldmFsdWF0ZSBpZiB0aGUgdmFsdWUncyB0eXBlIG1hdGNoZXMgdGhlIGV4cGVjdGVkIHR5cGVzLlxuICAgKiBUaGUgbWV0aG9kIHNraXBzIHZhbGlkYXRpb24gZm9yIHVuZGVmaW5lZCB2YWx1ZXMgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIFJlcXVpcmVkVmFsaWRhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtUeXBlVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBjb250YWluaW5nIHRoZSBleHBlY3RlZCB0eXBlc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zOiBUeXBlVmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47IC8vIERvbid0IHRyeSBhbmQgZW5mb3JjZSB0eXBlIGlmIHVuZGVmaW5lZFxuXG4gICAgY29uc3QgeyB0eXBlLCBtZXNzYWdlLCBjdXN0b21UeXBlcyB9ID0gb3B0aW9ucztcblxuICAgIGxldCB0cyA9IGN1c3RvbVR5cGVzIHx8IHR5cGU7XG4gICAgdHMgPSAoQXJyYXkuaXNBcnJheSh0cykgPyB0cyA6IFt0c10pLm1hcCgodCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0ID09PSBcInN0cmluZ1wiKSByZXR1cm4gdDtcbiAgICAgIGlmICh0eXBlb2YgdCA9PT0gXCJmdW5jdGlvblwiICYmICF0Lm5hbWUpIHQgPSAodCBhcyAoKSA9PiBzdHJpbmcpKCk7XG4gICAgICByZXR1cm4gKHQgYXMgYW55KS5uYW1lIHx8IHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIVJlZmxlY3Rpb24uZXZhbHVhdGVEZXNpZ25UeXBlcyh2YWx1ZSwgdHMgYXMgYW55KSlcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgIG1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLFxuICAgICAgICB0eXBlb2YgdHMgPT09IFwic3RyaW5nXCIgPyB0cyA6IEFycmF5LmlzQXJyYXkodHMpID8gdHMuam9pbihcIiwgXCIpIDogdHMsXG4gICAgICAgIHR5cGVvZiB2YWx1ZVxuICAgICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciB0aGUgVHlwZVZhbGlkYXRvciB3aXRoIHRoZSBWYWxpZGF0aW9uIHJlZ2lzdHJ5XG4gKiBAc3VtbWFyeSBUaGlzIHJlZ2lzdHJhdGlvbiBhc3NvY2lhdGVzIHRoZSBUeXBlVmFsaWRhdG9yIHdpdGggdGhlIE1vZGVsS2V5cy5UWVBFIGtleSxcbiAqIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgZm9yIHZhbGlkYXRpbmcgZGVzaWduIHR5cGVzLiBUaGUgc2F2ZSBmbGFnIGlzIHNldCB0byBmYWxzZVxuICogdG8gcHJldmVudCB0aGUgdmFsaWRhdG9yIGZyb20gYmVpbmcgc2F2ZWQgaW4gdGhlIHN0YW5kYXJkIHZhbGlkYXRvciByZWdpc3RyeS5cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cblZhbGlkYXRpb24ucmVnaXN0ZXIoe1xuICB2YWxpZGF0b3I6IFR5cGVWYWxpZGF0b3IgYXMgVmFsaWRhdG9yT3B0aW9ucyxcbiAgdmFsaWRhdGlvbktleTogTW9kZWxLZXlzLlRZUEUsXG4gIHNhdmU6IGZhbHNlLFxufSBhcyBWYWxpZGF0b3JEZWZpbml0aW9uKTtcbiIsImltcG9ydCB7XG4gIFZhbGlkYXRpb25LZXlzLFxuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBERUZBVUxUX1BBVFRFUk5TLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFBhdHRlcm5WYWxpZGF0b3IgfSBmcm9tIFwiLi9QYXR0ZXJuVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3IgZm9yIGNoZWNraW5nIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgVVJMXG4gKiBAc3VtbWFyeSBUaGUgVVJMVmFsaWRhdG9yIGNoZWNrcyBpZiBhIHN0cmluZyBtYXRjaGVzIGEgc3RhbmRhcmQgVVJMIHBhdHRlcm4uXG4gKiBJdCBleHRlbmRzIHRoZSBQYXR0ZXJuVmFsaWRhdG9yIGFuZCB1c2VzIGEgcm9idXN0IFVSTCByZWdleCBwYXR0ZXJuIHRvIHZhbGlkYXRlIHdlYiBhZGRyZXNzZXMuXG4gKiBUaGUgcGF0dGVybiBpcyBzb3VyY2VkIGZyb20ge0BsaW5rIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2RwZXJpbmkvNzI5Mjk0fSBhbmQgaXMgd2lkZWx5XG4gKiByZWNvZ25pemVkIGZvciBpdHMgYWNjdXJhY3kgaW4gdmFsaWRhdGluZyBVUkxzLiBUaGlzIHZhbGlkYXRvciBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIHRoZSBAdXJsIGRlY29yYXRvci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMsIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1VSTH1cbiAqXG4gKiBAY2xhc3MgVVJMVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBQYXR0ZXJuVmFsaWRhdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIFVSTCB2YWxpZGF0b3Igd2l0aCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IHVybFZhbGlkYXRvciA9IG5ldyBVUkxWYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBVUkwgdmFsaWRhdG9yIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IGN1c3RvbVVybFZhbGlkYXRvciA9IG5ldyBVUkxWYWxpZGF0b3IoXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCB3ZWIgYWRkcmVzc1wiKTtcbiAqXG4gKiAvLyBWYWxpZGF0ZSBhIFVSTFxuICogY29uc3QgcmVzdWx0ID0gdXJsVmFsaWRhdG9yLmhhc0Vycm9ycyhcImh0dHBzOi8vZXhhbXBsZS5jb21cIik7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBjb25zdCBpbnZhbGlkUmVzdWx0ID0gdXJsVmFsaWRhdG9yLmhhc0Vycm9ycyhcIm5vdC1hLXVybFwiKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVSTFZhbGlkYXRvclxuICogICBwYXJ0aWNpcGFudCBQIGFzIFBhdHRlcm5WYWxpZGF0b3JcbiAqXG4gKiAgIEMtPj5VOiBuZXcgVVJMVmFsaWRhdG9yKG1lc3NhZ2UpXG4gKiAgIFUtPj5QOiBzdXBlcihtZXNzYWdlKVxuICogICBDLT4+VTogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBVLT4+UDogc3VwZXIuaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zIHdpdGggVVJMIHBhdHRlcm4pXG4gKiAgIFAtLT4+VTogdmFsaWRhdGlvbiByZXN1bHRcbiAqICAgVS0tPj5DOiB2YWxpZGF0aW9uIHJlc3VsdFxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuVVJMKVxuZXhwb3J0IGNsYXNzIFVSTFZhbGlkYXRvciBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlVSTCkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBVUkxcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIHN0cmluZyBtYXRjaGVzIHRoZSBVUkwgcGF0dGVybi5cbiAgICogVGhpcyBtZXRob2QgZXh0ZW5kcyB0aGUgUGF0dGVyblZhbGlkYXRvcidzIGhhc0Vycm9ycyBtZXRob2QgYnkgZW5zdXJpbmdcbiAgICogdGhlIFVSTCBwYXR0ZXJuIGlzIHVzZWQsIGV2ZW4gaWYgbm90IGV4cGxpY2l0bHkgcHJvdmlkZWQgaW4gdGhlIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBzdHJpbmcgdG8gdmFsaWRhdGUgYXMgYSBVUkxcbiAgICogQHBhcmFtIHtQYXR0ZXJuVmFsaWRhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgUGF0dGVyblZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHt9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHN1cGVyLmhhc0Vycm9ycyh2YWx1ZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG1lc3NhZ2U6IG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsXG4gICAgICBwYXR0ZXJuOiBvcHRpb25zLnBhdHRlcm4gfHwgREVGQVVMVF9QQVRURVJOUy5VUkwsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7XG4gIENvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zLFxuICBEYXRlVmFsaWRhdG9yT3B0aW9ucyxcbiAgRGlmZlZhbGlkYXRvck9wdGlvbnMsXG4gIEVxdWFsc1ZhbGlkYXRvck9wdGlvbnMsXG4gIEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMsXG4gIEdyZWF0ZXJUaGFuVmFsaWRhdG9yT3B0aW9ucyxcbiAgTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyxcbiAgTGVzc1RoYW5WYWxpZGF0b3JPcHRpb25zLFxuICBMaXN0VmFsaWRhdG9yT3B0aW9ucyxcbiAgTWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyxcbiAgTWF4VmFsaWRhdG9yT3B0aW9ucyxcbiAgTWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyxcbiAgTWluVmFsaWRhdG9yT3B0aW9ucyxcbiAgUGF0dGVyblZhbGlkYXRvck9wdGlvbnMsXG4gIFN0ZXBWYWxpZGF0b3JPcHRpb25zLFxuICBWYWxpZGF0aW9uTWV0YWRhdGEsXG4gIFZhbGlkYXRvck9wdGlvbnMsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBERUZBVUxUX1BBVFRFUk5TLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIi4vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4uL3V0aWxzL3N0cmluZ3NcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIi4uL21vZGVsL3R5cGVzXCI7XG5pbXBvcnQgeyBwYXJzZURhdGUgfSBmcm9tIFwiLi4vdXRpbHMvZGF0ZXNcIjtcbmltcG9ydCB7IHByb3BNZXRhZGF0YSB9IGZyb20gXCIuLi91dGlscy9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uIH0gZnJvbSBcIi4vVmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRGVjb3JhdGlvbiB9IGZyb20gXCIuLi91dGlscy9EZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBhcHBseSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgQVNZTkNfTUVUQV9LRVkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbWJpbmVkIHByb3BlcnR5IGRlY29yYXRvciBmYWN0b3J5IGZvciBtZXRhZGF0YSBhbmQgYXR0cmlidXRlIG1hcmtpbmdcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBib3RoIG1hcmtzIGEgcHJvcGVydHkgYXMgYSBtb2RlbCBhdHRyaWJ1dGUgYW5kIGFzc2lnbnMgbWV0YWRhdGEgdG8gaXRcbiAqXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtQcm9wZXJ0eURlY29yYXRvcn0gZGVjb3JhdG9yIC0gVGhlIG1ldGFkYXRhIGtleVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBtZXRhZGF0YSBrZXlcbiAqIEBwYXJhbSB7Vn0gdmFsdWUgLSBUaGUgbWV0YWRhdGEgdmFsdWUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHByb3BlcnR5XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gLSBDb21iaW5lZCBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqIEBmdW5jdGlvbiB2YWxpZGF0aW9uTWV0YWRhdGFcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0aW9uTWV0YWRhdGE8Vj4oZGVjb3JhdG9yOiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogVikge1xuICBWYWxpZGF0aW9uLnJlZ2lzdGVyRGVjb3JhdG9yKGtleSwgZGVjb3JhdG9yKTtcbiAgcmV0dXJuIGFwcGx5KHByb3BNZXRhZGF0YTxWPihrZXksIHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3luYygpIHtcbiAgcmV0dXJuIChtb2RlbDogb2JqZWN0KTogdm9pZCA9PiB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIEFTWU5DX01FVEFfS0VZKSlcbiAgICAgIChtb2RlbCBhcyBhbnkpW0FTWU5DX01FVEFfS0VZXSA9IHRydWU7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IG1hcmtzIGEgZmllbGQgYXMgcmVxdWlyZWRcbiAqIEBzdW1tYXJ5IE1hcmtzIHRoZSBwcm9wZXJ0eSBhcyByZXF1aXJlZCwgY2F1c2luZyB2YWxpZGF0aW9uIHRvIGZhaWwgaWYgdGhlIHByb3BlcnR5IGlzIHVuZGVmaW5lZCwgbnVsbCwgb3IgZW1wdHkuXG4gKiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjUkVRVUlSRUR9LlxuICogVGhpcyBkZWNvcmF0b3IgaXMgY29tbW9ubHkgdXNlZCBhcyB0aGUgZmlyc3QgdmFsaWRhdGlvbiBzdGVwIGZvciBpbXBvcnRhbnQgZmllbGRzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBUaGUgZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscy4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUkVRVUlSRUR9XG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKlxuICogQGZ1bmN0aW9uIHJlcXVpcmVkXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEByZXF1aXJlZChcIkVtYWlsIGFkZHJlc3MgaXMgbWFuZGF0b3J5XCIpXG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVRVUlSRUQpIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuUkVRVUlSRUQpO1xuICBjb25zdCBtZXRhOiBWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBhdHRyaWJ1dGUgYXMgcmVxdWlyZWRgLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPFZhbGlkYXRvck9wdGlvbnM+LFxuICAgICAgYXJnczogW3JlcXVpcmVkLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGVuZm9yY2VzIGEgbWluaW11bSB2YWx1ZSBjb25zdHJhaW50XG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgbWluaW11bSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LCBjYXVzaW5nIHZhbGlkYXRpb24gdG8gZmFpbCBpZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgbWluaW11bS5cbiAqIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNNSU59LlxuICogVGhpcyBkZWNvcmF0b3Igd29ya3Mgd2l0aCBudW1lcmljIHZhbHVlcyBhbmQgZGF0ZXMuXG4gKlxuICogQHBhcmFtIHtudW1iZXIgfCBEYXRlIHwgc3RyaW5nfSB2YWx1ZSAtIFRoZSBtaW5pbXVtIHZhbHVlIGFsbG93ZWQuIEZvciBkYXRlcywgY2FuIGJlIGEgRGF0ZSBvYmplY3Qgb3IgYSBzdHJpbmcgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGEgZGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNSU59XG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKlxuICogQGZ1bmN0aW9uIG1pblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgUHJvZHVjdCB7XG4gKiAgIEBtaW4oMClcbiAqICAgcHJpY2U6IG51bWJlcjtcbiAqXG4gKiAgIEBtaW4obmV3IERhdGUoMjAyMywgMCwgMSksIFwiRGF0ZSBtdXN0IGJlIGFmdGVyIEphbnVhcnkgMSwgMjAyM1wiKVxuICogICByZWxlYXNlRGF0ZTogRGF0ZTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWluKFxuICB2YWx1ZTogbnVtYmVyIHwgRGF0ZSB8IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NSU5cbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5NSU4pO1xuICBjb25zdCBtZXRhOiBNaW5WYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5NSU5dOiB2YWx1ZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbTnVtYmVyLm5hbWUsIERhdGUubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBtYXggdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBhcyAke3ZhbHVlfSAoYXBwbGllcyB0byBudW1iZXJzIG9yIERhdGVzKWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGE8TWluVmFsaWRhdG9yT3B0aW9ucz4sXG4gICAgICBhcmdzOiBbbWluLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1heGltdW0gdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eVxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNNQVh9XG4gKlxuICogQHBhcmFtIHtudW1iZXIgfCBEYXRlfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUFYfVxuICpcbiAqIEBmdW5jdGlvbiBtYXhcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXgoXG4gIHZhbHVlOiBudW1iZXIgfCBEYXRlIHwgc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1BWFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLk1BWCk7XG4gIGNvbnN0IG1ldGE6IE1heFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLk1BWF06IHZhbHVlLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtOdW1iZXIubmFtZSwgRGF0ZS5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIG1heCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGFzICR7dmFsdWV9IChhcHBsaWVzIHRvIG51bWJlcnMgb3IgRGF0ZXMpYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YTxNYXhWYWxpZGF0b3JPcHRpb25zPixcbiAgICAgIGFyZ3M6IFttYXgsIGtleSwgbWV0YV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgc3RlcCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1NURVB9XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNTVEVQfVxuICpcbiAqIEBmdW5jdGlvbiBzdGVwXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3RlcChcbiAgdmFsdWU6IG51bWJlcixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5TVEVQXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuU1RFUCk7XG4gIGNvbnN0IG1ldGE6IFN0ZXBWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5TVEVQXTogdmFsdWUsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW051bWJlci5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIHN0ZXAgb2YgdGhlIGF0dHJpYnV0ZSBhcyAke3ZhbHVlfWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGE8U3RlcFZhbGlkYXRvck9wdGlvbnM+LFxuICAgICAgYXJnczogW3N0ZXAsIGtleSwgbWV0YV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgbWluaW11bSBsZW5ndGggZm9yIHRoZSBwcm9wZXJ0eVxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNNSU5fTEVOR1RIfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUlOX0xFTkdUSH1cbiAqXG4gKiBAZnVuY3Rpb24gbWlubGVuZ3RoXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWlubGVuZ3RoKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1JTl9MRU5HVEhcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIKTtcbiAgY29uc3QgbWV0YTogTWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSF06IHZhbHVlLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtTdHJpbmcubmFtZSwgQXJyYXkubmFtZSwgU2V0Lm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgbWluIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlIGFzICR7dmFsdWV9IChhcHBsaWVzIHRvIHN0cmluZ3Mgb3IgbGlzdHMpYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YTxNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zPixcbiAgICAgIGFyZ3M6IFttaW5sZW5ndGgsIGtleSwgbWV0YV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgbWF4aW11bSBsZW5ndGggZm9yIHRoZSBwcm9wZXJ0eVxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNNQVhfTEVOR1RIfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUFYX0xFTkdUSH1cbiAqXG4gKiBAZnVuY3Rpb24gbWF4bGVuZ3RoXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4bGVuZ3RoKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1BWF9MRU5HVEhcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIKTtcbiAgY29uc3QgbWV0YTogTWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSF06IHZhbHVlLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtTdHJpbmcubmFtZSwgQXJyYXkubmFtZSwgU2V0Lm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgbWF4IGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlIGFzICR7dmFsdWV9IChhcHBsaWVzIHRvIHN0cmluZ3Mgb3IgbGlzdHMpYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YTxNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zPixcbiAgICAgIGFyZ3M6IFttYXhsZW5ndGgsIGtleSwgbWV0YV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgUmVnRXhwIHBhdHRlcm4gdGhlIHByb3BlcnR5IG11c3QgcmVzcGVjdFxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNQQVRURVJOfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUEFUVEVSTn1cbiAqXG4gKiBAZnVuY3Rpb24gcGF0dGVyblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdHRlcm4oXG4gIHZhbHVlOiBSZWdFeHAgfCBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUEFUVEVSTlxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlBBVFRFUk4pO1xuICBjb25zdCBtZXRhOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuUEFUVEVSTl06XG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKCksXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGFzc2lnbnMgdGhlICR7dmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKCl9IHBhdHRlcm4gdG8gdGhlIGF0dHJpYnV0ZWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGE8UGF0dGVyblZhbGlkYXRvck9wdGlvbnM+LFxuICAgICAgYXJnczogW3BhdHRlcm4sIGtleSwgbWV0YV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBwcm9wZXJ0eSBhcyBhbiBlbWFpbFxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNFTUFJTH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNFTUFJTH1cbiAqXG4gKiBAZnVuY3Rpb24gZW1haWxcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbWFpbChtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkVNQUlMKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkVNQUlMKTtcbiAgY29uc3QgbWV0YTogUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOiBERUZBVUxUX1BBVFRFUk5TLkVNQUlMLnRvU3RyaW5nKCksXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogXCJtYXJrcyB0aGUgYXR0cmlidXRlIGFzIGFuIGVtYWlsXCIsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGE8UGF0dGVyblZhbGlkYXRvck9wdGlvbnM+LFxuICAgICAgYXJnczogW2VtYWlsLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgcHJvcGVydHkgYXMgYW4gVVJMXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1VSTH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNVUkx9XG4gKlxuICogQGZ1bmN0aW9uIHVybFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybChtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlVSTCkge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5VUkwpO1xuICBjb25zdCBtZXRhOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuUEFUVEVSTl06IERFRkFVTFRfUEFUVEVSTlMuVVJMLnRvU3RyaW5nKCksXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogXCJtYXJrcyB0aGUgYXR0cmlidXRlIGFzIGFuIHVybFwiLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zPixcbiAgICAgIGFyZ3M6IFt1cmwsIGtleSwgbWV0YV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlTWV0YWRhdGEgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zIHtcbiAgY3VzdG9tVHlwZXM6IChzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSlbXSB8IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEVuZm9yY2VzIHR5cGUgdmVyaWZpY2F0aW9uXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1RZUEV9XG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IHN0cmluZ30gdHlwZXMgYWNjZXB0ZWQgdHlwZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1RZUEV9XG4gKlxuICogQGZ1bmN0aW9uIHR5cGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlKFxuICB0eXBlczogKHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpKVtdIHwgc3RyaW5nIHwgKCgpID0+IHN0cmluZyksXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVFlQRVxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlRZUEUpO1xuICBjb25zdCBtZXRhOiBUeXBlTWV0YWRhdGEgPSB7XG4gICAgY3VzdG9tVHlwZXM6IHR5cGVzLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgZGVzY3JpcHRpb246IFwiZGVmaW5lcyB0aGUgYWNjZXB0ZWQgdHlwZXMgZm9yIHRoZSBhdHRyaWJ1dGVcIixcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YTxUeXBlTWV0YWRhdGE+LFxuICAgICAgYXJnczogW3R5cGUsIGtleSwgbWV0YV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRlTWV0YWRhdGEgZXh0ZW5kcyBEYXRlVmFsaWRhdG9yT3B0aW9ucyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEYXRlIEhhbmRsZXIgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI0RBVEV9XG4gKlxuICogV2lsbCBlbmZvcmNlIHNlcmlhbGl6YXRpb24gYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCBmb3JtYXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IGFjY2VwdGVkIGZvcm1hdCBhY2NvcmRpbmcgdG8ge0BsaW5rIGZvcm1hdERhdGV9XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNEQVRFfVxuICpcbiAqIEBmdW5jdGlvbiBkYXRlXG4gKlxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGUoXG4gIGZvcm1hdDogc3RyaW5nID0gXCJkZC9NTS95eXl5XCIsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREFURVxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkRBVEUpO1xuICBjb25zdCBtZXRhOiBEYXRlTWV0YWRhdGEgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLkZPUk1BVF06IGZvcm1hdCxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbRGF0ZS5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIGF0dHJpYnV0ZSBhcyBhIGRhdGUgd2l0aCB0aGUgZm9ybWF0ICR7Zm9ybWF0fWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICBmdW5jdGlvbiBkYXRlRGVjKHRhcmdldDogUmVjb3JkPHN0cmluZywgYW55PiwgcHJvcGVydHlLZXk/OiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBzZXQodGhpczogYW55LCBuZXdWYWx1ZTogc3RyaW5nIHwgRGF0ZSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIGlmICghZGVzY3JpcHRvciB8fCBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSlcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiB2YWx1ZXMuZ2V0KHRoaXMpLFxuICAgICAgICAgICAgc2V0OiAobmV3VmFsdWU6IHN0cmluZyB8IERhdGUgfCBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHZhbDogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YWwgPSBwYXJzZURhdGUoZm9ybWF0LCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnNldCh0aGlzLCB2YWwpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHNmKFwiRmFpbGVkIHRvIHBhcnNlIGRhdGU6IHswfVwiLCBlLm1lc3NhZ2UgfHwgZSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzW3Byb3BlcnR5S2V5XSA9IG5ld1ZhbHVlO1xuICAgICAgfSxcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcy5nZXQodGhpcyk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGEoZGF0ZSwga2V5LCBtZXRhKSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgfVxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KS5kZWZpbmUoZGF0ZURlYykuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBQYXNzd29yZCBIYW5kbGVyIERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNQQVNTV09SRH1cbiAqXG4gKiBAcGFyYW0ge1JlZ0V4cH0gW3BhdHRlcm5dIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1BBVFRFUk5TI0NIQVI4X09ORV9PRl9FQUNIfVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUEFTU1dPUkR9XG4gKlxuICogQGZ1bmN0aW9uIHBhc3N3b3JkXG4gKlxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhc3N3b3JkKFxuICBwYXR0ZXJuOiBSZWdFeHAgPSBERUZBVUxUX1BBVFRFUk5TLlBBU1NXT1JELkNIQVI4X09ORV9PRl9FQUNILFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlBBU1NXT1JEXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuUEFTU1dPUkQpO1xuICBjb25zdCBtZXRhOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuUEFUVEVSTl06IHBhdHRlcm4udG9TdHJpbmcoKSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgYXR0cmlidXRlIGFzIGEgcGFzc3dvcmRgLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhLFxuICAgICAgYXJnczogW3Bhc3N3b3JkLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdE1ldGFkYXRhIGV4dGVuZHMgTGlzdFZhbGlkYXRvck9wdGlvbnMge1xuICB0eXBlOiBcIkFycmF5XCIgfCBcIlNldFwiO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IExpc3QgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gQWxzbyBzZXRzIHRoZSB7QGxpbmsgdHlwZX0gdG8gdGhlIHByb3ZpZGVkIGNvbGxlY3Rpb25cbiAqXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3J9IGNsYXp6XG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvbGxlY3Rpb25dIFRoZSBjb2xsZWN0aW9uIGJlaW5nIHVzZWQuIGRlZmF1bHRzIHRvIEFycmF5XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0xJU1R9XG4gKlxuICogQGZ1bmN0aW9uIGxpc3RcbiAqXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdChcbiAgY2xheno6XG4gICAgfCBDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PilcbiAgICB8IChDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pKVtdLFxuICBjb2xsZWN0aW9uOiBcIkFycmF5XCIgfCBcIlNldFwiID0gXCJBcnJheVwiLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxJU1Rcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MSVNUKTtcbiAgY29uc3QgbWV0YTogTGlzdE1ldGFkYXRhID0ge1xuICAgIGNsYXp6OiAoQXJyYXkuaXNBcnJheShjbGF6eilcbiAgICAgID8gY2xhenoubWFwKChjKSA9PiAoYy5uYW1lID8gYy5uYW1lIDogYykpXG4gICAgICA6IFtjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IGNsYXp6XSkgYXMgKFxuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pXG4gICAgKVtdLFxuICAgIHR5cGU6IGNvbGxlY3Rpb24sXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBhc3luYzogZmFsc2UsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBhdHRyaWJ1dGUgYXMgYSAke2NvbGxlY3Rpb259IG9mICR7KGNsYXp6IGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PikubmFtZX1gLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGEsXG4gICAgICBhcmdzOiBbbGlzdCwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNldCBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBXcmFwcGVyIGZvciB7QGxpbmsgbGlzdH0gd2l0aCB0aGUgJ1NldCcgQ29sbGVjdGlvblxuICpcbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcn0gY2xhenpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTElTVH1cbiAqXG4gKiBAZnVuY3Rpb24gc2V0XG4gKlxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldChcbiAgY2xheno6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MSVNUXG4pIHtcbiAgcmV0dXJuIGxpc3QoY2xhenosIFwiU2V0XCIsIG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlY2xhcmVzIHRoYXQgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IGJlIGVxdWFsIHRvIGFub3RoZXIgc3BlY2lmaWVkIHByb3BlcnR5LlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5cy5FUVVBTFN9IHZhbGlkYXRvciB0byBlbnN1cmUgdGhlIGRlY29yYXRlZCB2YWx1ZSBtYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5VG9Db21wYXJlIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbXBhcmUgZXF1YWxpdHkgYWdhaW5zdC5cbiAqIEBwYXJhbSB7Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgdmFsaWRhdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhYmVsXSAtIFRoZSBsYWJlbCB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5tZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuRVFVQUxTXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGJlIHJldHVybmVkIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBlcXVhbGl0eSB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBlcVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBvcHRpb25zPzogT21pdDxDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9ucywgXCJhc3luY1wiIHwgXCJkZXNjcmlwdGlvblwiPlxuICAvLyBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkVRVUFMU1xuKSB7XG4gIGNvbnN0IGVxdWFsc09wdGlvbnM6IEVxdWFsc1ZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbGFiZWw6IG9wdGlvbnM/LmxhYmVsIHx8IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIG1lc3NhZ2U6IG9wdGlvbnM/Lm1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5FUVVBTFMsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkVRVUFMU106IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyBhdHRyaWJ1dGUgYXMgZXF1YWwgdG8gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBlcSxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5FUVVBTFMpLFxuICAgIHsgLi4uZXF1YWxzT3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgZGlmZmVyZW50IGZyb20gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkRJRkZ9IHZhbGlkYXRvciB0byBlbnN1cmUgdGhlIGRlY29yYXRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGRpZmZlcmVuY2UgYWdhaW5zdC5cbiAqIEBwYXJhbSB7Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgdmFsaWRhdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhYmVsXSAtIFRoZSBsYWJlbCB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5tZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuRElGRl0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBiZSByZXR1cm5lZCBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgZGlmZmVyZW5jZSB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBkaWZmXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZihcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnMsIFwiYXN5bmNcIiB8IFwiZGVzY3JpcHRpb25cIj5cbikge1xuICBjb25zdCBkaWZmT3B0aW9uczogRGlmZlZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbGFiZWw6IG9wdGlvbnM/LmxhYmVsIHx8IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIG1lc3NhZ2U6IG9wdGlvbnM/Lm1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5ESUZGLFxuICAgIFtWYWxpZGF0aW9uS2V5cy5ESUZGXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBkaWZmZXJlbnQgdG8gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBkaWZmLFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkRJRkYpLFxuICAgIHtcbiAgICAgIC4uLmRpZmZPcHRpb25zLFxuICAgICAgYXN5bmM6IGZhbHNlLFxuICAgIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgbGVzcyB0aGFuIGFub3RoZXIgc3BlY2lmaWVkIHByb3BlcnR5LlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU59IHZhbGlkYXRvciB0byBlbnN1cmUgdGhlIGRlY29yYXRlZCB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlUb0NvbXBhcmUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSB2YWxpZGF0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWxdIC0gVGhlIGxhYmVsIHRleHQgZGlzcGxheWVkIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5dIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gYmUgcmV0dXJuZWQgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGxlc3MgdGhhbiB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBsdFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGx0KFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBvcHRpb25zPzogT21pdDxDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9ucywgXCJhc3luY1wiIHwgXCJkZXNjcmlwdGlvblwiPlxuKSB7XG4gIGNvbnN0IGx0T3B0aW9uczogTGVzc1RoYW5WYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIGxhYmVsOiBvcHRpb25zPy5sYWJlbCB8fCBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBtZXNzYWdlOiBvcHRpb25zPy5tZXNzYWdlIHx8IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTEVTU19USEFOLFxuICAgIFtWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5dOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgYXR0cmlidXRlIGFzIGxlc3MgdGhhbiB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGx0LFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTiksXG4gICAgeyAuLi5sdE9wdGlvbnMsIGFzeW5jOiBmYWxzZSB9IGFzIFZhbGlkYXRpb25NZXRhZGF0YVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlY2xhcmVzIHRoYXQgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IGJlIGVxdWFsIG9yIGxlc3MgdGhhbiBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMfSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoZSBkZWNvcmF0ZWQgdmFsdWUgaXMgZXF1YWwgb3IgbGVzcyB0aGFuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5VG9Db21wYXJlIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqIEBwYXJhbSB7Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgdmFsaWRhdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhYmVsXSAtIFRoZSBsYWJlbCB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5tZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuTEVTU19USEFOX09SX0VRVUFMXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGJlIHJldHVybmVkIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBsZXNzIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gbHRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbHRlKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBvcHRpb25zPzogT21pdDxDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9ucywgXCJhc3luY1wiIHwgXCJkZXNjcmlwdGlvblwiPlxuKSB7XG4gIGNvbnN0IGx0ZU9wdGlvbnM6IExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbGFiZWw6IG9wdGlvbnM/LmxhYmVsIHx8IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIG1lc3NhZ2U6IG9wdGlvbnM/Lm1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5fT1JfRVFVQUwsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTF06IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyBhdHRyaWJ1dGUgYXMgbGVzcyBvciBlcXVhbCB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGx0ZSxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUwpLFxuICAgIHsgLi4ubHRlT3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgZ3JlYXRlciB0aGFuIGFub3RoZXIgc3BlY2lmaWVkIHByb3BlcnR5LlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU59IHZhbGlkYXRvciB0byBlbnN1cmUgdGhlIGRlY29yYXRlZCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlUb0NvbXBhcmUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSB2YWxpZGF0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWxdIC0gVGhlIGxhYmVsIHRleHQgZGlzcGxheWVkIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5dIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gYmUgcmV0dXJuZWQgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGdyZWF0ZXIgdGhhbiB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBndFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGd0KFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBvcHRpb25zPzogT21pdDxDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9ucywgXCJhc3luY1wiIHwgXCJkZXNjcmlwdGlvblwiPlxuKSB7XG4gIGNvbnN0IGd0T3B0aW9uczogR3JlYXRlclRoYW5WYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIGxhYmVsOiBvcHRpb25zPy5sYWJlbCB8fCBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBtZXNzYWdlOiBvcHRpb25zPy5tZXNzYWdlIHx8IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuR1JFQVRFUl9USEFOLFxuICAgIFtWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5dOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgYXR0cmlidXRlIGFzIGdyZWF0ZXIgdGhhbiAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGd0LFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTiksXG4gICAgeyAuLi5ndE9wdGlvbnMsIGFzeW5jOiBmYWxzZSB9IGFzIFZhbGlkYXRpb25NZXRhZGF0YVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlY2xhcmVzIHRoYXQgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IGJlIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMfSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoZSBkZWNvcmF0ZWQgdmFsdWUgaXMgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5VG9Db21wYXJlIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqIEBwYXJhbSB7Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgdmFsaWRhdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhYmVsXSAtIFRoZSBsYWJlbCB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5tZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuR1JFQVRFUl9USEFOX09SX0VRVUFMXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGJlIHJldHVybmVkIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZ3RlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ3RlKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBvcHRpb25zPzogT21pdDxDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9ucywgXCJhc3luY1wiIHwgXCJkZXNjcmlwdGlvblwiPlxuKSB7XG4gIGNvbnN0IGd0ZU9wdGlvbnM6IEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbGFiZWw6IG9wdGlvbnM/LmxhYmVsIHx8IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIG1lc3NhZ2U6IG9wdGlvbnM/Lm1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5fT1JfRVFVQUwsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTF06IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyBhdHRyaWJ1dGUgYXMgZ3JlYXRlciBvciBlcXVhbCB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGd0ZSxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUwpLFxuICAgIHsgLi4uZ3RlT3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuL01vZGVsXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYW4gaW5zdGFuY2UgYnkgaW52b2tpbmcgYSBjb25zdHJ1Y3RvciB3aXRoIGR5bmFtaWMgYXJndW1lbnRzLlxuICogQHN1bW1hcnkgT3ZlcnJpZGVzIHN0YW5kYXJkIGNvbnN0cnVjdGlvbiBwYXR0ZXJucyBieSB3cmFwcGluZyB0aGUgZ2l2ZW4gY29uc3RydWN0b3IgdG8gYWxsb3cgc3ByZWFkIGFyZ3VtZW50IGludm9jYXRpb24gd2hpbGUgcHJlc2VydmluZyB0aGUgcHJvdG90eXBlIGNoYWluLlxuICogQHRlbXBsYXRlIE0gdGhlIG1vZGVsIGluc3RhbmNlIHR5cGVcbiAqIEBwYXJhbSB7YW55fSBjb25zdHJ1Y3RvciBUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW52b2tlLlxuICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gKiBAcmV0dXJuIHtNfSBUaGUgbmV3bHkgY29uc3RydWN0ZWQgaW5zdGFuY2UuXG4gKiBAZnVuY3Rpb24gY29uc3RydWN0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdHJ1Y3Q8TSBleHRlbmRzIE1vZGVsPihcbiAgY29uc3RydWN0b3I6IGFueSxcbiAgLi4uYXJnczogYW55W11cbik6IE0ge1xuICBjb25zdCBfY29uc3RyID0gKC4uLmFyZ3o6IGFueVtdKSA9PiBuZXcgY29uc3RydWN0b3IoLi4uYXJneik7XG4gIF9jb25zdHIucHJvdG90eXBlID0gY29uc3RydWN0b3IucHJvdG90eXBlO1xuICByZXR1cm4gX2NvbnN0ciguLi5hcmdzKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVjdXJzaXZlbHkgZmluZHMgdGhlIGxhc3QgcHJvdG90eXBlIGluIHRoZSBjaGFpbiBiZWZvcmUgcmVhY2hpbmcgT2JqZWN0LnByb3RvdHlwZS5cbiAqIEBzdW1tYXJ5IFdhbGtzIHVwIHRoZSBwcm90b3R5cGUgY2hhaW4gdG8gbG9jYXRlIHRoZSBtb3N0IGRlcml2ZWQgcHJvdG90eXBlIHRoYXQgc3RpbGwgcHJlY2VkZXMgdGhlIGJhc2UgT2JqZWN0IHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmogVGhlIG9iamVjdCB3aG9zZSBwcm90b3R5cGUgY2hhaW4gd2lsbCBiZSBpbnNwZWN0ZWQuXG4gKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBsYXN0IHByb3RvdHlwZSBiZWZvcmUgT2JqZWN0LnByb3RvdHlwZSwgb3IgdGhlIGlucHV0IG9iamVjdCBpZiBpdHMgcHJvdG90eXBlIGlzIE9iamVjdC5wcm90b3R5cGUuXG4gKiBAZnVuY3Rpb24gZmluZExhc3RQcm90b0JlZm9yZU9iamVjdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3RQcm90b0JlZm9yZU9iamVjdChvYmo6IG9iamVjdCk6IG9iamVjdCB7XG4gIGxldCBwcm90b3R5cGU6IGFueSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICBpZiAocHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlKSByZXR1cm4gb2JqO1xuICB3aGlsZSAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSk7XG4gICAgaWYgKHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIHByb3RvdHlwZTtcbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBwcm90b3R5cGU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgcHJvcGVyIHByb3RvdHlwZVwiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmluZHMgdGhlIE1vZGVsIGNsYXNzIGFzIHRoZSByb290IHByb3RvdHlwZSBvZiB0aGUgcHJvdmlkZWQgaW5zdGFuY2Ugd2hlbiBub3QgYWxyZWFkeSBhIE1vZGVsLlxuICogQHN1bW1hcnkgRW5zdXJlcyBvYmplY3RzIGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgTW9kZWwgaW5oZXJpdGFuY2UgY2hhaW4gZ2FpbiBNb2RlbCBhcyB0aGVpciB1bHRpbWF0ZSBwcm90b3R5cGUgdG8gYWNjZXNzIG1vZGVsIHV0aWxpdGllcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gb2JqIFRoZSBvYmplY3QgdG8gYmluZCB0byB0aGUgTW9kZWwgcHJvdG90eXBlIGNoYWluLlxuICogQHJldHVybiB7dm9pZH1cbiAqIEBmdW5jdGlvbiBiaW5kTW9kZWxQcm90b3R5cGVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEZuIGFzIGJpbmRNb2RlbFByb3RvdHlwZVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1vZGVsLnByb3RvdHlwZVxuICogICBDYWxsZXItPj5Gbjogb2JqXG4gKiAgIGFsdCBvYmogaW5zdGFuY2VvZiBNb2RlbFxuICogICAgIEZuLS0+PkNhbGxlcjogcmV0dXJuXG4gKiAgIGVsc2Ugb2JqIGNoYWluIGVuZHMgYXQgT2JqZWN0LnByb3RvdHlwZVxuICogICAgIEZuLT4+Rm46IHNldFByb3RvdHlwZU9mKG9iaiwgTSlcbiAqICAgICBGbi0tPj5DYWxsZXI6IHJldHVyblxuICogICBlbHNlIGRlZXAgcHJvdG90eXBlIGNoYWluXG4gKiAgICAgRm4tPj5Gbjogd2FsayBwcm90b3R5cGVzXG4gKiAgICAgRm4tPj5Gbjogc2V0UHJvdG90eXBlT2YobGFzdCwgTSlcbiAqICAgICBGbi0tPj5DYWxsZXI6IHJldHVyblxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRNb2RlbFByb3RvdHlwZShvYmo6IHVua25vd24pIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIE1vZGVsKSByZXR1cm47XG5cbiAgZnVuY3Rpb24gYmluZFByb3RvdHlwZShvYmpUb092ZXJyaWRlOiB1bmtub3duLCBwcm90b3R5cGU6IG9iamVjdCkge1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihvYmpUb092ZXJyaWRlLCBwcm90b3R5cGUpO1xuICB9XG5cbiAgY29uc3QgcHJvdG90eXBlOiBhbnkgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgaWYgKHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIHJldHVybiBiaW5kUHJvdG90eXBlKG9iaiwgTW9kZWwucHJvdG90eXBlKTtcbiAgfVxuICB3aGlsZSAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgY29uc3QgcHJvdCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgIGlmIChcbiAgICAgIHByb3QgPT09IE9iamVjdC5wcm90b3R5cGUgfHxcbiAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90KSA9PT0gT2JqZWN0LnByb3RvdHlwZVxuICAgICkge1xuICAgICAgcmV0dXJuIGJpbmRQcm90b3R5cGUocHJvdG90eXBlLCBNb2RlbC5wcm90b3R5cGUpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBwcm9wZXIgcHJvdG90eXBlIHRvIGJpbmRcIik7XG59XG4iLCJpbXBvcnQgeyBiaW5kTW9kZWxQcm90b3R5cGUsIGNvbnN0cnVjdCB9IGZyb20gXCIuL2NvbnN0cnVjdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi9Nb2RlbFwiO1xuaW1wb3J0IHsgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IERlY29yYXRpb24sIERlY29yYXRpb25LZXlzLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxCYXNlRGVjb3JhdG9yKG9yaWdpbmFsOiBhbnkpIHtcbiAgLy8gdGhlIG5ldyBjb25zdHJ1Y3RvciBiZWhhdmlvdXJcbiAgY29uc3QgbmV3Q29uc3RydWN0b3I6IGFueSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGluc3RhbmNlOiBSZXR1cm5UeXBlPHR5cGVvZiBvcmlnaW5hbD4gPSBjb25zdHJ1Y3Qob3JpZ2luYWwsIC4uLmFyZ3MpO1xuICAgIGJpbmRNb2RlbFByb3RvdHlwZShpbnN0YW5jZSk7XG5cbiAgICAvLyByZS1hcHBseSBvcmlnaW5hbCBjb25zdHJ1Y3RvclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0YW5jZSwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogb3JpZ2luYWwsXG4gICAgfSk7XG5cbiAgICAvLyBydW4gYSBidWlsZGVyIGZ1bmN0aW9uIGlmIGRlZmluZWQgd2l0aCB0aGUgZmlyc3QgYXJndW1lbnQgKFRoZSBNb2RlbEFyZylcbiAgICBjb25zdCBidWlsZGVyID0gTW9kZWwuZ2V0QnVpbGRlcigpO1xuICAgIGlmIChidWlsZGVyKSBidWlsZGVyKGluc3RhbmNlLCBhcmdzLmxlbmd0aCA/IGFyZ3NbMF0gOiB1bmRlZmluZWQpO1xuXG4gICAgbWV0YWRhdGEoTW9kZWwua2V5KE1vZGVsS2V5cy5NT0RFTCksIG9yaWdpbmFsLm5hbWUpKGluc3RhbmNlLmNvbnN0cnVjdG9yKTtcblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcblxuICAvLyBjb3B5IHByb3RvdHlwZSBzbyBpbnN0YW5jZW9mIG9wZXJhdG9yIHN0aWxsIHdvcmtzXG4gIG5ld0NvbnN0cnVjdG9yLnByb3RvdHlwZSA9IG9yaWdpbmFsLnByb3RvdHlwZTtcblxuICBtZXRhZGF0YShNb2RlbC5rZXkoTW9kZWxLZXlzLk1PREVMKSwgb3JpZ2luYWwubmFtZSkob3JpZ2luYWwpO1xuXG4gIFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKG9yaWdpbmFsKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAga2V5LFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShrZXksIG9yaWdpbmFsKSxcbiAgICAgIG5ld0NvbnN0cnVjdG9yXG4gICAgKTtcbiAgfSk7XG4gIC8vIFNldHMgdGhlIHByb3BlciBjb25zdHJ1Y3RvciBuYW1lIGZvciB0eXBlIHZlcmlmaWNhdGlvblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3Q29uc3RydWN0b3IsIFwibmFtZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogb3JpZ2luYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWUsXG4gIH0pO1xuICAvL1xuICAvLyBhbmNob3JzIHRoZSBvcmlnaW5hbCBjb25zdHJ1Y3RvciBmb3IgZnV0dXJlIHJlZmVyZW5jZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3Q29uc3RydWN0b3IsIE1vZGVsS2V5cy5BTkNIT1IsIHtcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogb3JpZ2luYWwsXG4gIH0pO1xuXG4gIE1ldGFkYXRhLnNldChuZXdDb25zdHJ1Y3RvciwgRGVjb3JhdGlvbktleXMuQ09OU1RSVUNUT1IsIG9yaWdpbmFsKTtcbiAgLy9cbiAgLy8gLy8gYW5jaG9ycyB0aGUgbmV3IGNvbnN0cnVjdG9yIGZvciBmdXR1cmUgcmVmZXJlbmNlXG4gIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcmlnaW5hbCwgTW9kZWxLZXlzLkFOQ0hPUiwge1xuICAvLyAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgLy8gICBlbnVtZXJhYmxlOiB0cnVlLFxuICAvLyAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gIC8vICAgdmFsdWU6IG5ld0NvbnN0cnVjdG9yLFxuICAvLyB9KTtcblxuICBNb2RlbC5yZWdpc3RlcihuZXdDb25zdHJ1Y3Rvciwgb3JpZ2luYWwubmFtZSk7XG5cbiAgLy8gcmV0dXJuIG5ldyBjb25zdHJ1Y3RvciAod2lsbCBvdmVycmlkZSBvcmlnaW5hbClcbiAgcmV0dXJuIG5ld0NvbnN0cnVjdG9yO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBjbGFzcyBhcyBhIE1vZGVsIGNsYXNzXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiAtIFJlZ2lzdGVycyB0aGUgY2xhc3MgdW5kZXIgdGhlIG1vZGVsIHJlZ2lzdHJ5IHNvIGl0IGNhbiBiZSBlYXNpbHkgcmVidWlsdDtcbiAqIC0gT3ZlcnJpZGVzIHRoZSBjbGFzcyBjb25zdHJ1Y3RvcjtcbiAqIC0gUnVucyB0aGUgZ2xvYmFsIHtAbGluayBNb2RlbEJ1aWxkZXJGdW5jdGlvbn0gaWYgZGVmaW5lZDtcbiAqXG4gKiBAZnVuY3Rpb24gbW9kZWxcbiAqXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWwoKSB7XG4gIGNvbnN0IGtleSA9IE1vZGVsLmtleShNb2RlbEtleXMuTU9ERUwpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KS5kZWZpbmUobW9kZWxCYXNlRGVjb3JhdG9yKS5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGhhc2hpbmcgYWxnb3JpdGhtIHRvIHVzZSBvbiB0aGUgbW9kZWxcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIC0gUmVnaXN0ZXJzIHRoZSBjbGFzcyB1bmRlciB0aGUgbW9kZWwgcmVnaXN0cnkgc28gaXQgY2FuIGJlIGVhc2lseSByZWJ1aWx0O1xuICogLSBPdmVycmlkZXMgdGhlIGNsYXNzIGNvbnN0cnVjdG9yO1xuICogLSBSdW5zIHRoZSBnbG9iYWwge0BsaW5rIE1vZGVsQnVpbGRlckZ1bmN0aW9ufSBpZiBkZWZpbmVkO1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbGdvcml0aG0gdGhlIGFsZ29yaXRobSB0byB1c2VcbiAqXG4gKiBAZnVuY3Rpb24gaGFzaGVkQnlcbiAqXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaGVkQnkoYWxnb3JpdGhtOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gIHJldHVybiBtZXRhZGF0YShNb2RlbC5rZXkoTW9kZWxLZXlzLkhBU0hJTkcpLCB7XG4gICAgYWxnb3JpdGhtOiBhbGdvcml0aG0sXG4gICAgYXJnczogYXJncyxcbiAgfSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgc2VyaWFsaXphdGlvbiBhbGdvcml0aG0gdG8gdXNlIG9uIHRoZSBtb2RlbFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXJpYWxpemVyIHRoZSBhbGdvcml0aG0gdG8gdXNlXG4gKlxuICogQGZ1bmN0aW9uIHNlcmlhbGl6ZWRCeVxuICpcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVkQnkoc2VyaWFsaXplcjogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICByZXR1cm4gbWV0YWRhdGEoTW9kZWwua2V5KE1vZGVsS2V5cy5TRVJJQUxJWkFUSU9OKSwge1xuICAgIHNlcmlhbGl6ZXI6IHNlcmlhbGl6ZXIsXG4gICAgYXJnczogYXJncyxcbiAgfSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgQXBwbGllcyBkZXNjcmlwdGl2ZSBtZXRhZGF0YSB0byBhIGNsYXNzLCBwcm9wZXJ0eSBvciBtZXRob2RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gdGhlIGRlc2NyaXB0aW9uIHRvIGFwcGx5XG4gKlxuICogQGZ1bmN0aW9uIGRlc2NyaXB0aW9uXG4gKlxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgcmV0dXJuIG1ldGFkYXRhKE1vZGVsLmtleShNb2RlbEtleXMuREVTQ1JJUFRJT04pLCBkZXNjcmlwdGlvbik7XG59XG4iLCIvKipcbiAqIEBtb2R1bGUgZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBUeXBlU2NyaXB0IGRlY29yYXRvci1iYXNlZCB2YWxpZGF0aW9uIGxpYnJhcnlcbiAqIEBzdW1tYXJ5IFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIGZyYW1ld29yayB1c2luZyBUeXBlU2NyaXB0IGRlY29yYXRvcnMuXG4gKiBJdCBleHBvc2VzIHV0aWxpdHkgZnVuY3Rpb25zLCB2YWxpZGF0aW9uIGRlY29yYXRvcnMsIGFuZCBtb2RlbC1yZWxhdGVkIGZ1bmN0aW9uYWxpdHkgZm9yXG4gKiBpbXBsZW1lbnRpbmcgdHlwZS1zYWZlLCBkZWNsYXJhdGl2ZSB2YWxpZGF0aW9uIGluIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zLlxuICovXG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSByZWZsZWN0aW9uIHBhY2thZ2VcbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHBhY2thZ2VcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIk1vZGVsS2V5cyIsImFwcGx5IiwibWV0YWRhdGEiLCJSZWZsZWN0aW9uIiwiUHJpbWl0aXZlcyIsIlJlc2VydmVkTW9kZWxzIiwiaXNFcXVhbCIsIkRhdGVWYWxpZGF0b3IiLCJfX2RlY29yYXRlIiwiRGlmZlZhbGlkYXRvciIsIlBhdHRlcm5WYWxpZGF0b3IiLCJFbWFpbFZhbGlkYXRvciIsIkVxdWFsc1ZhbGlkYXRvciIsIkdyZWF0ZXJUaGFuVmFsaWRhdG9yIiwiR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yIiwiTGVzc1RoYW5WYWxpZGF0b3IiLCJMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3IiLCJMaXN0VmFsaWRhdG9yIiwiTWF4TGVuZ3RoVmFsaWRhdG9yIiwiTWF4VmFsaWRhdG9yIiwiTWluTGVuZ3RoVmFsaWRhdG9yIiwiTWluVmFsaWRhdG9yIiwiUGFzc3dvcmRWYWxpZGF0b3IiLCJSZXF1aXJlZFZhbGlkYXRvciIsIlN0ZXBWYWxpZGF0b3IiLCJUeXBlVmFsaWRhdG9yIiwiVVJMVmFsaWRhdG9yIiwiTWV0YWRhdGEiLCJEZWNvcmF0aW9uS2V5cyIsIkRlY29yYXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFhLFVBQUEseUJBQXlCLEdBQUc7SUFDdkMsSUFBQSxZQUFZLEVBQ1Ysc0VBQXNFO0lBQ3hFLElBQUEsNkJBQTZCLEVBQzNCLHVGQUF1RjtJQUN6RixJQUFBLGdCQUFnQixFQUNkLDBFQUEwRTtJQUM1RSxJQUFBLGtCQUFrQixFQUFFLHdEQUF3RDtJQUM1RSxJQUFBLDRCQUE0QixFQUMxQixtREFBbUQ7SUFDckQsSUFBQSw0QkFBNEIsRUFDMUIsa0RBQWtEO0lBQ3BELElBQUEsdUJBQXVCLEVBQUUseUNBQXlDO0lBQ2xFLElBQUEsd0JBQXdCLEVBQ3RCLHdEQUF3RDtJQUMxRCxJQUFBLGNBQWMsRUFBRSx5Q0FBeUM7Ozs7Ozs7SUNmM0Q7Ozs7OztJQU1HO1VBQ1UscUJBQXFCLEdBQUcsTUFBTSxDQUFDLFNBQVM7VUFDeEMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxTQUFTOztJQ1I5Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBcUJHO0FBQ1NBO0lB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
|
|
5070
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLXZhbGlkYXRpb24uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzL2Vycm9ycy50cyIsIi4uL3NyYy9jb25zdGFudHMvdmFsaWRhdGlvbi50cyIsIi4uL3NyYy91dGlscy9jb25zdGFudHMudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL2NvbnN0YW50cy50cyIsIi4uL3NyYy91dGlscy9zdHJpbmdzLnRzIiwiLi4vc3JjL3V0aWxzL2RhdGVzLnRzIiwiLi4vc3JjL3V0aWxzL0RlY29yYXRpb24udHMiLCIuLi9zcmMvdXRpbHMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy91dGlscy9oYXNoaW5nLnRzIiwiLi4vc3JjL3V0aWxzL1BhdGhQcm94eS50cyIsIi4uL3NyYy9tb2RlbC9Nb2RlbEVycm9yRGVmaW5pdGlvbi50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvQmFzZVZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9WYWxpZGF0b3JSZWdpc3RyeS50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRpb24udHMiLCIuLi9zcmMvbW9kZWwvdXRpbHMudHMiLCIuLi9zcmMvbW9kZWwvdmFsaWRhdGlvbi50cyIsIi4uL3NyYy9tb2RlbC9jb25zdGFudHMudHMiLCIuLi9zcmMvbW9kZWwvTW9kZWwudHMiLCIuLi9zcmMvdXRpbHMvc2VyaWFsaXphdGlvbi50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvQXN5bmNWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0RhdGVWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0RpZmZWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1BhdHRlcm5WYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0VtYWlsVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9FcXVhbHNWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL3V0aWxzLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9HcmVhdGVyVGhhblZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9MZXNzVGhhblZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9MaXN0VmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9NYXhMZW5ndGhWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL01heFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvTWluTGVuZ3RoVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9NaW5WYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1Bhc3N3b3JkVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9SZXF1aXJlZFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvU3RlcFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvVHlwZVZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvVVJMVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9tb2RlbC9jb25zdHJ1Y3Rpb24udHMiLCIuLi9zcmMvbW9kZWwvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUyA9IHtcbiAgSU5WQUxJRF9QQVRIOlxuICAgIFwiSW52YWxpZCBwYXRoIGFyZ3VtZW50LiBFeHBlY3RlZCBub24tZW1wdHkgc3RyaW5nIGJ1dCByZWNlaXZlZDogJ3swfSdcIixcbiAgQ09OVEVYVF9OT1RfT0JKRUNUX0NPTVBBUklTT046XG4gICAgXCJVbmFibGUgdG8gYWNjZXNzIHBhcmVudCBhdCBsZXZlbCB7MH0gZm9yIHBhdGggJ3sxfSc6IGN1cnJlbnQgY29udGV4dCBpcyBub3QgYW4gb2JqZWN0XCIsXG4gIFBST1BFUlRZX0lOVkFMSUQ6XG4gICAgXCJGYWlsZWQgdG8gcmVzb2x2ZSBwYXRoIHswfTogcHJvcGVydHkgJ3sxfScgaXMgaW52YWxpZCBvciBkb2VzIG5vdCBleGlzdC5cIixcbiAgUFJPUEVSVFlfTk9UX0VYSVNUOiBcIkZhaWxlZCB0byByZXNvbHZlIHBhdGg6IHByb3BlcnR5ICd7MH0nIGRvZXMgbm90IGV4aXN0LlwiLFxuICBVTlNVUFBPUlRFRF9UWVBFU19DT01QQVJJU09OOlxuICAgIFwiVW5zdXBwb3J0ZWQgdHlwZXMgZm9yIGNvbXBhcmlzb246ICd7MH0nIGFuZCAnezF9J1wiLFxuICBOVUxMX09SX1VOREVGSU5FRF9DT01QQVJJU09OOlxuICAgIFwiQ29tcGFyaXNvbiBmYWlsZWQgZHVlIHRvIG51bGwgb3IgdW5kZWZpbmVkIHZhbHVlXCIsXG4gIElOVkFMSURfREFURV9DT01QQVJJU09OOiBcIkludmFsaWQgRGF0ZSBvYmplY3RzIGFyZSBub3QgY29tcGFyYWJsZVwiLFxuICBUWVBFX01JU01BVENIX0NPTVBBUklTT046XG4gICAgXCJDYW5ub3QgY29tcGFyZSB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzOiB7MH0gYW5kIHsxfS5cIixcbiAgTkFOX0NPTVBBUklTT046IFwiQ29tcGFyaXNvbiBub3Qgc3VwcG9ydGVkIGZvciBOYU4gdmFsdWVzXCIsXG4gIC8vIE5PX1BBUkVOVF9DT01QQVJJU09OOiBcIlVuYWJsZSB0byBhY2Nlc3MgcGFyZW50IGF0IGxldmVsIHswfSBmb3IgcGF0aCAnezF9Jzogbm8gcGFyZW50IGF2YWlsYWJsZVwiLFxuICAvLyBQUk9QRVJUWV9OT1RfRk9VTkQ6IFwiRmFpbGVkIHRvIHJlc29sdmUgcGF0aCB7MH06IHByb3BlcnR5ICd7MX0nIGRvZXMgbm90IGV4aXN0LlwiLFxuICAvLyBQUk9QRVJUWV9OT1RfRk9VTkRfT05fUEFSRU5UOiBcIkZhaWxlZCB0byByZXNvbHZlIHBhdGggezB9OiBwcm9wZXJ0eSAnezF9JyBkb2VzIG5vdCBleGlzdCBvbiBwYXJlbnQuXCIsXG4gIC8vIFBST1BFUlRZX05PVF9GT1VORF9BRlRFUl9QQVJFTlQ6IFwiRmFpbGVkIHRvIHJlc29sdmUgcGF0aCB7MH06IHByb3BlcnR5ICd7MX0nIGRvZXMgbm90IGV4aXN0IGFmdGVyIHsyfSBwYXJlbnQgbGV2ZWwocykuXCIsXG59O1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gU3ltYm9sIGtleSBmb3IgdHJhY2tpbmcgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMgaW4gdmFsaWRhdGlvblxuICogQHN1bW1hcnkgU3ltYm9sIHVzZWQgdG8gaW50ZXJuYWxseSB0cmFjayB0aGUgcGFyZW50IG9iamVjdCBkdXJpbmcgbmVzdGVkIHZhbGlkYXRpb25cbiAqXG4gKiBAY29uc3QgVkFMSURBVElPTl9QQVJFTlRfS0VZXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBWQUxJREFUSU9OX1BBUkVOVF9LRVkgPSBTeW1ib2woXCJfcGFyZW50XCIpO1xuZXhwb3J0IGNvbnN0IEFTWU5DX01FVEFfS0VZID0gU3ltYm9sKFwiaXNBc3luY1wiKTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW0gY29udGFpbmluZyBtZXRhZGF0YSBrZXlzIHVzZWQgZm9yIHJlZmxlY3Rpb24gaW4gdGhlIG1vZGVsIHN5c3RlbVxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgdmFyaW91cyBNb2RlbCBrZXlzIHVzZWQgZm9yIHJlZmxlY3Rpb24gYW5kIG1ldGFkYXRhIHN0b3JhZ2UuXG4gKiBUaGVzZSBrZXlzIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIGxpYnJhcnkgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhIGFib3V0IG1vZGVscyxcbiAqIHRoZWlyIHByb3BlcnRpZXMsIGFuZCB0aGVpciBiZWhhdmlvci5cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCAtIFByZWZpeCB0byBhbGwgb3RoZXIga2V5cywgdXNlZCBhcyBhIG5hbWVzcGFjZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRZUEUgLSBLZXkgZm9yIHN0b3JpbmcgZGVzaWduIHR5cGUgaW5mb3JtYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQQVJBTVMgLSBLZXkgZm9yIHN0b3JpbmcgbWV0aG9kIHBhcmFtZXRlciB0eXBlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFVFVSTiAtIEtleSBmb3Igc3RvcmluZyBtZXRob2QgcmV0dXJuIHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNT0RFTCAtIEtleSBmb3IgaWRlbnRpZnlpbmcgbW9kZWwgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBBTkNIT1IgLSBBbmNob3Iga2V5IHRoYXQgc2VydmVzIGFzIGEgZ2hvc3QgcHJvcGVydHkgaW4gdGhlIG1vZGVsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQ09OU1RSVUNUSU9OIC0gS2V5IGZvciBzdG9yaW5nIGNvbnN0cnVjdGlvbiBpbmZvcm1hdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFUVFJJQlVURSAtIEtleSBmb3Igc3RvcmluZyBhdHRyaWJ1dGUgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBIQVNISU5HIC0gS2V5IGZvciBzdG9yaW5nIGhhc2hpbmcgY29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNFUklBTElaQVRJT04gLSBLZXkgZm9yIHN0b3Jpbmcgc2VyaWFsaXphdGlvbiBjb25maWd1cmF0aW9uXG4gKlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBlbnVtIE1vZGVsS2V5cyB7XG4gIFJFRkxFQ1QgPSBcImRlY2FmLm1vZGVsLlwiLFxuICBERVNDUklQVElPTiA9IFwiZGVjYWYuZGVzY3JpcHRpb24uXCIsXG4gIFRZUEUgPSBcImRlc2lnbjp0eXBlXCIsXG4gIFBBUkFNUyA9IFwiZGVzaWduOnBhcmFtdHlwZXNcIixcbiAgUkVUVVJOID0gXCJkZXNpZ246cmV0dXJudHlwZVwiLFxuICBNT0RFTCA9IFwibW9kZWxcIixcbiAgQU5DSE9SID0gXCJfX21vZGVsXCIsXG4gIENPTlNUUlVDVElPTiA9IFwiY29uc3RydWN0ZWQtYnlcIixcbiAgQVRUUklCVVRFID0gXCJfX2F0dHJpYnV0ZXNcIixcbiAgSEFTSElORyA9IFwiaGFzaGluZ1wiLFxuICBTRVJJQUxJWkFUSU9OID0gXCJzZXJpYWxpemF0aW9uXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgZmxhdm91ciBpZGVudGlmaWVyIGZvciB0aGUgZGVjb3JhdG9yIHN5c3RlbVxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZGVmYXVsdCBmbGF2b3VyIHVzZWQgYnkgdGhlIERlY29yYXRpb24gY2xhc3Mgd2hlbiBubyBzcGVjaWZpYyBmbGF2b3VyIGlzIHByb3ZpZGVkLlxuICogVGhpcyBjb25zdGFudCBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGxpYnJhcnkgYXMgdGhlIGZhbGxiYWNrIGZsYXZvdXIgZm9yIGRlY29yYXRvcnMuXG4gKlxuICogQGNvbnN0IHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRGbGF2b3VyID0gXCJkZWNhZlwiO1xuIiwiaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBPYmplY3QtbGlrZSBzZXQgb2Yga2V5cyB1c2VkIGZvciBjb21wYXJpc29uLWJhc2VkIHZhbGlkYXRpb25zLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgY2Fub25pY2FsIG5hbWVzIGZvciB2YWxpZGF0b3JzIHRoYXQgY29tcGFyZSB0d28gdmFsdWVzIChlcXVhbGl0eSBhbmQgb3JkZXJpbmcgY2hlY2tzKS5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvbXBhcmlzb25WYWxpZGF0aW9uS2V5c0RlZlxuICogQHByb3BlcnR5IHtcImVxdWFsc1wifSBFUVVBTFMgVmFsaWRhdGVzIGlmIHR3byB2YWx1ZXMgYXJlIGVxdWFsLlxuICogQHByb3BlcnR5IHtcImRpZmZlcmVudFwifSBESUZGIFZhbGlkYXRlcyBpZiB0d28gdmFsdWVzIGFyZSBkaWZmZXJlbnQuXG4gKiBAcHJvcGVydHkge1wibGVzc1RoYW5cIn0gTEVTU19USEFOIFZhbGlkYXRlcyBpZiBhIHZhbHVlIGlzIGxlc3MgdGhhbiBhbm90aGVyLlxuICogQHByb3BlcnR5IHtcImxlc3NUaGFuT3JFcXVhbFwifSBMRVNTX1RIQU5fT1JfRVFVQUwgVmFsaWRhdGVzIGlmIGEgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGFub3RoZXIuXG4gKiBAcHJvcGVydHkge1wiZ3JlYXRlclRoYW5cIn0gR1JFQVRFUl9USEFOIFZhbGlkYXRlcyBpZiBhIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBhbm90aGVyLlxuICogQHByb3BlcnR5IHtcImdyZWF0ZXJUaGFuT3JFcXVhbFwifSBHUkVBVEVSX1RIQU5fT1JfRVFVQUwgVmFsaWRhdGVzIGlmIGEgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGFub3RoZXIuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXlzIHVzZWQgZm9yIGNvbXBhcmlzb24tYmFzZWQgdmFsaWRhdGlvbnMuXG4gKiBAc3VtbWFyeSBDYW5vbmljYWwga2V5IG5hbWVzIGZvciBjb21wYXJpc29uIHZhbGlkYXRvcnMuXG4gKiBAY29uc3QgQ29tcGFyaXNvblZhbGlkYXRpb25LZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKiBAdHlwZSB7Q29tcGFyaXNvblZhbGlkYXRpb25LZXlzRGVmfVxuICovXG5leHBvcnQgY29uc3QgQ29tcGFyaXNvblZhbGlkYXRpb25LZXlzID0ge1xuICBFUVVBTFM6IFwiZXF1YWxzXCIsXG4gIERJRkY6IFwiZGlmZmVyZW50XCIsXG4gIExFU1NfVEhBTjogXCJsZXNzVGhhblwiLFxuICBMRVNTX1RIQU5fT1JfRVFVQUw6IFwibGVzc1RoYW5PckVxdWFsXCIsXG4gIEdSRUFURVJfVEhBTjogXCJncmVhdGVyVGhhblwiLFxuICBHUkVBVEVSX1RIQU5fT1JfRVFVQUw6IFwiZ3JlYXRlclRoYW5PckVxdWFsXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBPYmplY3QtbGlrZSBzZXQgb2Yga2V5cyB1c2VkIGFjcm9zcyBhbGwgdmFsaWRhdG9ycyBpbiB0aGUgc3lzdGVtLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWVzcGFjZWQga2V5IHByZWZpeCBhbmQgdGhlIGluZGl2aWR1YWwgdmFsaWRhdGlvbiBmbGFncyBmb3IgcnVsZXMgc3VjaCBhcyByZXF1aXJlZCwgbWluL21heCwgbGVuZ3RoLCBwYXR0ZXJucywgdHlwZXMsIGxpc3RzIGFuZCBtb3JlLlxuICogQHR5cGVkZWYge09iamVjdH0gVmFsaWRhdGlvbktleXNEZWZcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUZMRUNUIHByZWZpeGVzIG90aGVycyAobmFtZXNwYWNlIHByZWZpeClcbiAqIEBwcm9wZXJ0eSB7XCJyZXF1aXJlZFwifSBSRVFVSVJFRCBzZXRzIGFzIHJlcXVpcmVkXG4gKiBAcHJvcGVydHkge1wibWluXCJ9IE1JTiBkZWZpbmVzIG1pbiB2YWx1ZVxuICogQHByb3BlcnR5IHtcIm1heFwifSBNQVggZGVmaW5lcyBtYXggdmFsdWVcbiAqIEBwcm9wZXJ0eSB7XCJzdGVwXCJ9IFNURVAgZGVmaW5lcyBzdGVwXG4gKiBAcHJvcGVydHkge1wibWlubGVuZ3RoXCJ9IE1JTl9MRU5HVEggZGVmaW5lcyBtaW4gbGVuZ3RoXG4gKiBAcHJvcGVydHkge1wibWF4bGVuZ3RoXCJ9IE1BWF9MRU5HVEggZGVmaW5lcyBtYXggbGVuZ3RoXG4gKiBAcHJvcGVydHkge1wicGF0dGVyblwifSBQQVRURVJOIGRlZmluZXMgcGF0dGVyblxuICogQHByb3BlcnR5IHtcImVtYWlsXCJ9IEVNQUlMIGRlZmluZXMgZW1haWxcbiAqIEBwcm9wZXJ0eSB7XCJ1cmxcIn0gVVJMIGRlZmluZXMgdXJsXG4gKiBAcHJvcGVydHkge1wiZGF0ZVwifSBEQVRFIGRlZmluZXMgZGF0ZVxuICogQHByb3BlcnR5IHtcInR5cGVcIn0gVFlQRSBkZWZpbmVzIHR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJwYXNzd29yZFwifSBQQVNTV09SRCBkZWZpbmVzIHBhc3N3b3JkXG4gKiBAcHJvcGVydHkge1wibGlzdFwifSBMSVNUIGRlZmluZXMgbGlzdFxuICogQHByb3BlcnR5IHtcInVuaXF1ZVwifSBVTklRVUUgZmxhZ3MgdW5pcXVlbmVzc1xuICogQHByb3BlcnR5IHtcInZhbGlkYXRvclwifSBWQUxJREFUT1IgY3VzdG9tIHZhbGlkYXRvciBpZFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVGhlIGtleXMgdXNlZCBmb3IgdmFsaWRhdGlvbi5cbiAqIEBzdW1tYXJ5IEEgbmFtZXNwYWNlZCBjb2xsZWN0aW9uIG9mIHZhbGlkYXRpb24ga2V5IHN0cmluZ3MgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5LlxuICogQGNvbnN0IFZhbGlkYXRpb25LZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKiBAdHlwZSB7VmFsaWRhdGlvbktleXNEZWZ9XG4gKi9cbmV4cG9ydCBjb25zdCBWYWxpZGF0aW9uS2V5cyA9IHtcbiAgUkVGTEVDVDogYCR7TW9kZWxLZXlzLlJFRkxFQ1R9dmFsaWRhdGlvbi5gLFxuICBEQVRFOiBcImRhdGVcIixcbiAgRU1BSUw6IFwiZW1haWxcIixcbiAgRk9STUFUOiBcImZvcm1hdFwiLFxuICBMSVNUOiBcImxpc3RcIixcbiAgTUFYOiBcIm1heFwiLFxuICBNQVhfTEVOR1RIOiBcIm1heGxlbmd0aFwiLFxuICBNSU46IFwibWluXCIsXG4gIE1JTl9MRU5HVEg6IFwibWlubGVuZ3RoXCIsXG4gIFBBU1NXT1JEOiBcInBhc3N3b3JkXCIsXG4gIFBBVFRFUk46IFwicGF0dGVyblwiLFxuICBSRVFVSVJFRDogXCJyZXF1aXJlZFwiLFxuICBTVEVQOiBcInN0ZXBcIixcbiAgVFlQRTogXCJ0eXBlXCIsXG4gIFVOSVFVRTogXCJ1bmlxdWVcIixcbiAgVVJMOiBcInVybFwiLFxuICBWQUxJREFUT1I6IFwidmFsaWRhdG9yXCIsXG4gIC4uLkNvbXBhcmlzb25WYWxpZGF0aW9uS2V5cyxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIGxpc3Qgb2YgbW9udGggbmFtZXNcbiAqIEBzdW1tYXJ5IFN0b3JlcyBtb250aCBuYW1lcy4gQ2FuIGJlIGNoYW5nZWQgZm9yIGxvY2FsaXphdGlvbiBwdXJwb3Nlc1xuICogQGNvbnN0IE1PTlRIX05BTUVTXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBNT05USF9OQU1FUyA9IFtcbiAgXCJKYW51YXJ5XCIsXG4gIFwiRmVicnVhcnlcIixcbiAgXCJNYXJjaFwiLFxuICBcIkFwcmlsXCIsXG4gIFwiTWF5XCIsXG4gIFwiSnVuZVwiLFxuICBcIkp1bHlcIixcbiAgXCJBdWd1c3RcIixcbiAgXCJTZXB0ZW1iZXJcIixcbiAgXCJPY3RvYmVyXCIsXG4gIFwiTm92ZW1iZXJcIixcbiAgXCJEZWNlbWJlclwiLFxuXTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gbGlzdCBvZiBuYW1lcyBvZiBkYXlzIG9mIHRoZSB3ZWVrXG4gKiBAc3VtbWFyeSBTdG9yZXMgbmFtZXMgZm9yIGRheXMgb2YgdGhlIHdlZWsuIENhbiBiZSBjaGFuZ2VkIGZvciBsb2NhbGl6YXRpb24gcHVycG9zZXNcbiAqIEBjb25zdCBEQVlTX09GX1dFRUtfTkFNRVNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IERBWVNfT0ZfV0VFS19OQU1FUyA9IFtcbiAgXCJTdW5kYXlcIixcbiAgXCJNb25kYXlcIixcbiAgXCJUdWVzZGF5XCIsXG4gIFwiV2VkbmVzZGF5XCIsXG4gIFwiVGh1cnNkYXlcIixcbiAgXCJGcmlkYXlcIixcbiAgXCJTYXR1cmRheVwiLFxuXTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZSBkZWZpbml0aW9uIGZvciBkZWZhdWx0IGVycm9yIG1lc3NhZ2Ugc3RyaW5ncyBrZXllZCBieSB2YWxpZGF0aW9uIHR5cGUuXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzdXBwb3J0ZWQgZXJyb3IgbWVzc2FnZSBrZXlzIHdpdGggdGhlaXIgaW50ZW5kZWQgbWVhbmluZzsgdXNlZCB0byBsb2NhbGl6ZSBvciBvdmVycmlkZSBkZWZhdWx0IG1lc3NhZ2VzLlxuICogQHR5cGVkZWYge09iamVjdH0gRGVmYXVsdEVycm9yTWVzc2FnZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVFVSVJFRCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNSU4gZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1JTl9MRU5HVEggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYX0xFTkdUSCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQQVRURVJOIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVNQUlMIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFVSTCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUWVBFIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNURVAgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURSBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBERUZBVUxUIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBU1NXT1JEIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJU1QgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTElTVF9JTlNJREUgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTU9ERUxfTk9UX0ZPVU5EIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB0aGUgZGVmYXVsdCBlcnJvciBtZXNzYWdlc1xuICogQHN1bW1hcnkgTWFwcGluZyBiZXR3ZWVuIHZhbGlkYXRpb24ga2V5cyBhbmQgdGhlaXIgZGVmYXVsdCBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlcy5cbiAqIEBjb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKiBAdHlwZSB7RGVmYXVsdEVycm9yTWVzc2FnZXN9XG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBSRVFVSVJFRDogXCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkXCIsXG4gIE1JTjogXCJUaGUgbWluaW11bSB2YWx1ZSBpcyB7MH1cIixcbiAgTUFYOiBcIlRoZSBtYXhpbXVtIHZhbHVlIGlzIHswfVwiLFxuICBNSU5fTEVOR1RIOiBcIlRoZSBtaW5pbXVtIGxlbmd0aCBpcyB7MH1cIixcbiAgTUFYX0xFTkdUSDogXCJUaGUgbWF4aW11bSBsZW5ndGggaXMgezB9XCIsXG4gIFBBVFRFUk46IFwiVGhlIHZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBwYXR0ZXJuXCIsXG4gIEVNQUlMOiBcIlRoZSB2YWx1ZSBpcyBub3QgYSB2YWxpZCBlbWFpbFwiLFxuICBVUkw6IFwiVGhlIHZhbHVlIGlzIG5vdCBhIHZhbGlkIFVSTFwiLFxuICBUWVBFOiBcIkludmFsaWQgdHlwZS4gRXhwZWN0ZWQgezB9LCByZWNlaXZlZCB7MX1cIixcbiAgU1RFUDogXCJJbnZhbGlkIHZhbHVlLiBOb3QgYSBzdGVwIG9mIHswfVwiLFxuICBEQVRFOiBcIkludmFsaWQgdmFsdWUuIG5vdCBhIHZhbGlkIERhdGVcIixcbiAgREVGQVVMVDogXCJUaGVyZSBpcyBhbiBFcnJvclwiLFxuICBQQVNTV09SRDpcbiAgICBcIk11c3QgYmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGFuZCBjb250YWluIG9uZSBvZiBudW1iZXIsIGxvd2VyIGFuZCB1cHBlciBjYXNlIGxldHRlcnMsIGFuZCBzcGVjaWFsIGNoYXJhY3RlciAoQCQhJSo/Jl8tLiwpXCIsXG4gIExJU1Q6IFwiSW52YWxpZCBsaXN0IG9mIHswfVwiLFxuICBNT0RFTF9OT1RfRk9VTkQ6IFwiTm8gbW9kZWwgcmVnaXN0ZXJlZCB1bmRlciB7MH1cIixcbiAgRVFVQUxTOiBcIlRoaXMgZmllbGQgbXVzdCBiZSBlcXVhbCB0byBmaWVsZCB7MH1cIixcbiAgRElGRjogXCJUaGlzIGZpZWxkIG11c3QgYmUgZGlmZmVyZW50IGZyb20gZmllbGQgezB9XCIsXG4gIExFU1NfVEhBTjogXCJUaGlzIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIGZpZWxkIHswfVwiLFxuICBMRVNTX1RIQU5fT1JfRVFVQUw6IFwiVGhpcyBmaWVsZCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBmaWVsZCB7MH1cIixcbiAgR1JFQVRFUl9USEFOOiBcIlRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gZmllbGQgezB9XCIsXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTDpcbiAgICBcIlRoaXMgZmllbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gZmllbGQgezB9XCIsXG4gIFVOSVFVRTogXCJEdXBsaWNhdGUgZm91bmQsIHRoaXMgZmllbGQgbXVzdCBiZSB1bmlxdWUuXCIsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGRlZmluaXRpb24gZm9yIGRlZmF1bHQgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5zIHVzZWQgaW4gdmFsaWRhdGlvbi5cbiAqIEBzdW1tYXJ5IENhcHR1cmVzIGNvbW1vbiByZWdleCBwYXR0ZXJucyBmb3IgZW1haWwsIFVSTCwgYW5kIHBhc3N3b3JkIHBvbGljaWVzLCBpbmNsdWRpbmcgbmVzdGVkIGdyb3VwaW5nIGZvciBwYXNzd29yZC1yZWxhdGVkIHJ1bGVzLlxuICogQHR5cGVkZWYge09iamVjdH0gRGVmYXVsdFBhdHRlcm5zXG4gKiBAcHJvcGVydHkge1JlZ0V4cH0gRU1BSUwgRW1haWwgYWRkcmVzcyB2YWxpZGF0aW9uIHBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBVUkwgVVJMIHZhbGlkYXRpb24gcGF0dGVyblxuICogQHByb3BlcnR5IHtPYmplY3R9IFBBU1NXT1JEIFBhc3N3b3JkLXJlbGF0ZWQgcmVnZXggcGF0dGVybnNcbiAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBQQVNTV09SRC5DSEFSOF9PTkVfT0ZfRUFDSCBBdCBsZWFzdCA4IGNoYXJzIHdpdGggbG93ZXIsIHVwcGVyLCBudW1iZXIsIGFuZCBzcGVjaWFsIGNoYXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIHZhcmlvdXMgZGVmYXVsdCByZWdleHAgcGF0dGVybnMgdXNlZFxuICogQHN1bW1hcnkgQ29sbGVjdGlvbiBvZiBmcmVxdWVudGx5IHVzZWQgdmFsaWRhdGlvbiBwYXR0ZXJucyBncm91cGVkIHVuZGVyIHNlbWFudGljIGtleXMuXG4gKiBAY29uc3QgREVGQVVMVF9QQVRURVJOU1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICogQHR5cGUge0RlZmF1bHRQYXR0ZXJuc31cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEFUVEVSTlMgPSB7XG4gIEVNQUlMOlxuICAgIC9bYS16QS1aMC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKD86XFwuW2EtekEtWjAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKykqQCg/OlthLXpBLVowLTldKD86W2EtejAtOS1dKlthLXpBLVowLTldKT9cXC4pK1thLXpBLVowLTldKD86W2EtekEtWjAtOS1dKlthLXpBLVowLTldKT8vLFxuICBVUkw6IC9eKD86KD86KD86aHR0cHM/fGZ0cCk6KT9cXC9cXC8pKD86XFxTKyg/OjpcXFMqKT9AKT8oPzooPyEoPzoxMHwxMjcpKD86XFwuXFxkezEsM30pezN9KSg/ISg/OjE2OVxcLjI1NHwxOTJcXC4xNjgpKD86XFwuXFxkezEsM30pezJ9KSg/ITE3MlxcLig/OjFbNi05XXwyXFxkfDNbMC0xXSkoPzpcXC5cXGR7MSwzfSl7Mn0pKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswMV1cXGR8MjJbMC0zXSkoPzpcXC4oPzoxP1xcZHsxLDJ9fDJbMC00XVxcZHwyNVswLTVdKSl7Mn0oPzpcXC4oPzpbMS05XVxcZD98MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC00XSkpfCg/Oig/OlthLXowLTlcXHUwMGExLVxcdWZmZmZdW2EtejAtOVxcdTAwYTEtXFx1ZmZmZl8tXXswLDYyfSk/W2EtejAtOVxcdTAwYTEtXFx1ZmZmZl1cXC4pKyg/OlthLXpcXHUwMGExLVxcdWZmZmZdezIsfVxcLj8pKSg/OjpcXGR7Miw1fSk/KD86Wy8/I11cXFMqKT8kL2ksXG4gIFBBU1NXT1JEOiB7XG4gICAgQ0hBUjhfT05FX09GX0VBQ0g6XG4gICAgICAvXig/PS4qW2Etel0pKD89LipbQS1aXSkoPz0uKlxcZCkoPz0uKltAJCElKj8mX1xcLS4sXSlbQS1aYS16XFxkQCQhJSo/Jl9cXC0uLF17OCx9JC9nLFxuICB9LFxufTtcbiIsIi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBwcm92aWRlIHN0cmluZyBmb3JtYXQgZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIEMjJ3Mgc3RyaW5nLmZvcm1hdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyPn0gW2FyZ3NdIHJlcGxhY2VtZW50cyBtYWRlIGJ5IG9yZGVyIG9mIGFwcGVhcmFuY2UgKHJlcGxhY2VtZW50MCB3aWwgcmVwbGFjZSB7MH0gYW5kIHNvIG9uKVxuICogQHJldHVybiB7c3RyaW5nfSBmb3JtYXR0ZWQgc3RyaW5nXG4gKlxuICogQGZ1bmN0aW9uIHN0cmluZ0Zvcm1hdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdGb3JtYXQoc3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC97KFxcZCspfS9nLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlcikge1xuICAgIHJldHVybiB0eXBlb2YgYXJnc1tudW1iZXJdICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICA/IGFyZ3NbbnVtYmVyXS50b1N0cmluZygpXG4gICAgICA6IFwidW5kZWZpbmVkXCI7XG4gIH0pO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gcHJvdmlkZSBzdHJpbmcgZm9ybWF0IGZ1bmN0aW9uYWxpdHkgc2ltaWxhciB0byBDIydzIHN0cmluZy5mb3JtYXRcbiAqIEBkZXNjcmlwdGlvbiBhbGlhcyBmb3Ige0BsaW5rIHN0cmluZ0Zvcm1hdH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncyByZXBsYWNlbWVudHMgbWFkZSBieSBvcmRlciBvZiBhcHBlYXJhbmNlIChyZXBsYWNlbWVudDAgd2lsIHJlcGxhY2UgezB9IGFuZCBzbyBvbilcbiAqIEByZXR1cm4ge3N0cmluZ30gZm9ybWF0dGVkIHN0cmluZ1xuICpcbiAqIEBmdW5jdGlvbiBzZlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBjb25zdCBzZiA9IHN0cmluZ0Zvcm1hdDtcbiIsImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7XG4gIERBWVNfT0ZfV0VFS19OQU1FUyxcbiAgTU9OVEhfTkFNRVMsXG59IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuL3N0cmluZ3NcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBSZXZlcnNlcyB0aGUgcHJvY2VzcyBmcm9tIHtAbGluayBmb3JtYXREYXRlfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlIHRoZSBkYXRlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgYmFjayBpbnRvIGRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgdGhlIGRhdGUgZm9ybWF0XG4gKiBAcmV0dXJuIHtEYXRlfSB0aGUgZGF0ZSBmcm9tIHRoZSBmb3JtYXQgb3IgdGhlIHN0YW5kYXJkIG5ldyBEYXRlKHtAcHJvcCBkYXRlfSkgaWYgdGhlIHN0cmluZyBjb3VsZG4ndCBiZSBwYXJzZWQgKGFyZSB5b3Ugc3VyZSB0aGUgZm9ybWF0IG1hdGNoZXMgdGhlIHN0cmluZz8pXG4gKlxuICogQGZ1bmN0aW9uIGRhdGVGcm9tRm9ybWF0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGVGcm9tRm9ybWF0KGRhdGU6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcpIHtcbiAgbGV0IGZvcm1hdFJlZ2V4cDogc3RyaW5nID0gZm9ybWF0O1xuXG4gIC8vIEhvdXJcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvaGgvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcImhoXCIsIFwiKD88aG91cj5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvaC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiaFwiLCBcIig/PGhvdXI+XFxcXGR7MSwyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvSEgvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIkhIXCIsIFwiKD88aG91cj5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvSC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiSFwiLCBcIig/PGhvdXI+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gTWludXRlc1xuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9tbS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwibW1cIiwgXCIoPzxtaW51dGVzPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9tLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJtXCIsIFwiKD88bWludXRlcz5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBTZWNvbmRzXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL3NzLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJzc1wiLCBcIig/PHNlY29uZHM+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL3MvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInNcIiwgXCIoPzxzZWNvbmRzPlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIERheVxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9kZC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiZGRcIiwgXCIoPzxkYXk+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL2QvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcImRcIiwgXCIoPzxkYXk+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gRGF5IE9mIFdlZWtcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvRUVFRS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiRUVFRVwiLCBcIig/PGRheW9md2Vlaz5cXFxcdyspXCIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZHVwZS1lbHNlLWlmXG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvRUVFRS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiRUVFXCIsIFwiKD88ZGF5b2Z3ZWVrPlxcXFx3KylcIik7XG5cbiAgLy8gWWVhclxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC95eXl5LykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJ5eXl5XCIsIFwiKD88eWVhcj5cXFxcZHs0fSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgveXkvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInl5XCIsIFwiKD88eWVhcj5cXFxcZHsyfSlcIik7XG5cbiAgLy8gTW9udGhcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTU1NTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTU1NTVwiLCBcIig/PG1vbnRobmFtZT5cXFxcdyspXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL01NTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTU1NXCIsIFwiKD88bW9udGhuYW1lc21hbGw+XFxcXHcrKVwiKTtcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTU0vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIk1NXCIsIFwiKD88bW9udGg+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL00vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIk1cIiwgXCIoPzxtb250aD5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBNaWxpcyBhbmQgQW0gUG1cbiAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwXG4gICAgLnJlcGxhY2UoXCJTXCIsIFwiKD88bWlsaXM+XFxcXGR7MSwzfSlcIilcbiAgICAucmVwbGFjZShcImFhYVwiLCBcIig/PGFtcG0+XFxcXHd7Mn0pXCIpO1xuXG4gIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoZm9ybWF0UmVnZXhwLCBcImdcIik7XG5cbiAgY29uc3QgbWF0Y2g6IHtcbiAgICBncm91cHM6IHtcbiAgICAgIHllYXI/OiBzdHJpbmc7XG4gICAgICBkYXk/OiBzdHJpbmc7XG4gICAgICBhbXBtPzogc3RyaW5nO1xuICAgICAgaG91cj86IHN0cmluZztcbiAgICAgIG1pbnV0ZXM/OiBzdHJpbmc7XG4gICAgICBzZWNvbmRzPzogc3RyaW5nO1xuICAgICAgbWlsaXM/OiBzdHJpbmc7XG4gICAgICBtb250aG5hbWU/OiBzdHJpbmc7XG4gICAgICBtb250aG5hbWVzbWFsbD86IHN0cmluZztcbiAgICAgIG1vbnRoPzogc3RyaW5nO1xuICAgIH07XG4gIH0gPSByZWdleHAuZXhlYyhkYXRlKSBhcyBhbnk7XG5cbiAgaWYgKCFtYXRjaCB8fCAhbWF0Y2guZ3JvdXBzKSByZXR1cm4gbmV3IERhdGUoZGF0ZSk7XG5cbiAgY29uc3Qgc2FmZVBhcnNlSW50ID0gZnVuY3Rpb24gKG4/OiBzdHJpbmcpIHtcbiAgICBpZiAoIW4pIHJldHVybiAwO1xuICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlSW50KG4pO1xuXG4gICAgcmV0dXJuIGlzTmFOKHJlc3VsdCkgPyAwIDogcmVzdWx0O1xuICB9O1xuXG4gIGNvbnN0IHllYXIgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLnllYXIpO1xuICBjb25zdCBkYXkgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLmRheSk7XG5cbiAgY29uc3QgYW1QbSA9IG1hdGNoLmdyb3Vwcy5hbXBtO1xuICBsZXQgaG91ciA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMuaG91cik7XG5cbiAgaWYgKGFtUG0pIGhvdXIgPSBhbVBtID09PSBcIlBNXCIgPyBob3VyICsgMTIgOiBob3VyO1xuXG4gIGNvbnN0IG1pbnV0ZXMgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLm1pbnV0ZXMpO1xuICBjb25zdCBzZWNvbmRzID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy5zZWNvbmRzKTtcbiAgY29uc3QgbXMgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLm1pbGlzKTtcblxuICBjb25zdCBtb250aE5hbWUgPSBtYXRjaC5ncm91cHMubW9udGhuYW1lO1xuICBjb25zdCBtb250aE5hbWVTbWFsbCA9IG1hdGNoLmdyb3Vwcy5tb250aG5hbWVzbWFsbDtcbiAgbGV0IG1vbnRoOiBudW1iZXIgfCBzdHJpbmcgPSBtYXRjaC5ncm91cHMubW9udGggYXMgc3RyaW5nO1xuICBpZiAobW9udGhOYW1lKSBtb250aCA9IE1PTlRIX05BTUVTLmluZGV4T2YobW9udGhOYW1lKTtcbiAgZWxzZSBpZiAobW9udGhOYW1lU21hbGwpIHtcbiAgICBjb25zdCBtID0gTU9OVEhfTkFNRVMuZmluZCgobSkgPT5cbiAgICAgIG0udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1vbnRoTmFtZVNtYWxsLnRvTG93ZXJDYXNlKCkpXG4gICAgKTtcbiAgICBpZiAoIW0pIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcbiAgICBtb250aCA9IE1PTlRIX05BTUVTLmluZGV4T2YobSk7XG4gIH0gZWxzZSBtb250aCA9IHNhZmVQYXJzZUludChgJHttb250aH1gKTtcblxuICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIsIG1pbnV0ZXMsIHNlY29uZHMsIG1zKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmluZHMgYSBzcGVjaWZpYyBkYXRlIGZvcm1hdCB0byBhIERhdGUgb2JqZWN0J3MgdG9TdHJpbmcgYW5kIHRvSVNPU3RyaW5nIG1ldGhvZHMgdXNpbmcgYSBQcm94eVxuICogQHN1bW1hcnkgV3JhcHMgYSBEYXRlIG9iamVjdCBpbiBhIFByb3h5IHRvIHJldHVybiBhIGZvcm1hdHRlZCBzdHJpbmcgd2hlbiB0b1N0cmluZyBvciB0b0lTT1N0cmluZyBpcyBjYWxsZWQuXG4gKiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIFByb3h5IEFQSSB0byBpbnRlcmNlcHQgbWV0aG9kIGNhbGxzIGFuZCByZXR1cm4gdGhlIGRhdGUgZm9ybWF0dGVkIGFjY29yZGluZ1xuICogdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLCB3aGlsZSBtYWludGFpbmluZyBhbGwgb3RoZXIgRGF0ZSBmdW5jdGlvbmFsaXR5LlxuICogVGhlIHByb3hpZWQgRGF0ZSBtYWludGFpbnMgaW5zdGFuY2VvZiBEYXRlIGNoZWNrcyBhbmQgYmVoYXZlcyBpZGVudGljYWxseSB0byBhIERhdGUgb2JqZWN0LlxuICogQHBhcmFtIHtEYXRlfSBbZGF0ZV0gVGhlIERhdGUgb2JqZWN0IHRvIG1vZGlmeVxuICogQHBhcmFtIHtzdHJpbmd9IFtmb3JtYXRdIFRoZSBmb3JtYXQgc3RyaW5nIHRvIHVzZSBmb3IgZm9ybWF0dGluZyB0aGUgZGF0ZVxuICogQHJldHVybiB7RGF0ZXx1bmRlZmluZWR9IEEgcHJveGllZCBEYXRlIG9iamVjdCBvciB1bmRlZmluZWQgaWYgbm8gZGF0ZSB3YXMgcHJvdmlkZWRcbiAqIEBmdW5jdGlvbiBiaW5kRGF0ZVRvU3RyaW5nXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmREYXRlVG9TdHJpbmcoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCwgZm9ybWF0OiBzdHJpbmcpIHtcbiAgaWYgKCFkYXRlKSByZXR1cm47XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCBcInRvSVNPU3RyaW5nXCIsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBuZXcgUHJveHkoZGF0ZS50b0lTT1N0cmluZywge1xuICAgICAgYXBwbHkodGFyZ2V0OiBhbnksIHRoaXNBcmc6IGFueSkge1xuICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZSh0aGlzQXJnLCBmb3JtYXQpO1xuICAgICAgfSxcbiAgICB9KSxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCBcInRvU3RyaW5nXCIsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBuZXcgUHJveHkoZGF0ZS50b0lTT1N0cmluZywge1xuICAgICAgYXBwbHkodGFyZ2V0OiBhbnksIHRoaXNBcmc6IGFueSkge1xuICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZSh0aGlzQXJnLCBmb3JtYXQpO1xuICAgICAgfSxcbiAgICB9KSxcbiAgfSk7XG4gIHJldHVybiBkYXRlO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTYWZlbHkgY2hlY2tzIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBEYXRlIG9iamVjdFxuICogQHN1bW1hcnkgQSB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgRGF0ZSBvYmplY3QuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIG1vcmUgcmVsaWFibGUgdGhhbiB1c2luZyBpbnN0YW5jZW9mIERhdGUgYXMgaXQgYWxzbyBjaGVja3NcbiAqIHRoYXQgdGhlIGRhdGUgaXMgbm90IE5hTiwgd2hpY2ggY2FuIGhhcHBlbiB3aXRoIGludmFsaWQgZGF0ZSBzdHJpbmdzLlxuICogQHBhcmFtIHthbnl9IGRhdGUgVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIERhdGUgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2VcbiAqIEBmdW5jdGlvbiBpc1ZhbGlkRGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWREYXRlKGRhdGU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGRhdGUgJiZcbiAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGF0ZSkgPT09IFwiW29iamVjdCBEYXRlXVwiICYmXG4gICAgIU51bWJlci5pc05hTihkYXRlKVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gcGFkIG51bWJlcnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKlxuICogQGZ1bmN0aW9uIHR3b0RpZ2l0UGFkXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR3b0RpZ2l0UGFkKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIG51bSA8IDEwID8gXCIwXCIgKyBudW0gOiBudW0udG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEYXRlIEZvcm1hdCBIYW5kbGluZ1xuICogQGRlc2NyaXB0aW9uIENvZGUgZnJvbSB7QGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzU1MjQ2MS9ob3ctdG8tZm9ybWF0LWEtamF2YXNjcmlwdC1kYXRlfVxuICpcbiAqIDxwcmU+XG4gKiAgICAgIFVzaW5nIHNpbWlsYXIgZm9ybWF0dGluZyBhcyBNb21lbnQuanMsIENsYXNzIERhdGVUaW1lRm9ybWF0dGVyIChKYXZhKSwgYW5kIENsYXNzIFNpbXBsZURhdGVGb3JtYXQgKEphdmEpLFxuICogICAgICBJIGltcGxlbWVudGVkIGEgY29tcHJlaGVuc2l2ZSBzb2x1dGlvbiBmb3JtYXREYXRlKGRhdGUsIHBhdHRlcm5TdHIpIHdoZXJlIHRoZSBjb2RlIGlzIGVhc3kgdG8gcmVhZCBhbmQgbW9kaWZ5LlxuICogICAgICBZb3UgY2FuIGRpc3BsYXkgZGF0ZSwgdGltZSwgQU0vUE0sIGV0Yy5cbiAqXG4gKiAgICAgIERhdGUgYW5kIFRpbWUgUGF0dGVybnNcbiAqICAgICAgeXkgPSAyLWRpZ2l0IHllYXI7IHl5eXkgPSBmdWxsIHllYXJcbiAqICAgICAgTSA9IGRpZ2l0IG1vbnRoOyBNTSA9IDItZGlnaXQgbW9udGg7IE1NTSA9IHNob3J0IG1vbnRoIG5hbWU7IE1NTU0gPSBmdWxsIG1vbnRoIG5hbWVcbiAqICAgICAgRUVFRSA9IGZ1bGwgd2Vla2RheSBuYW1lOyBFRUUgPSBzaG9ydCB3ZWVrZGF5IG5hbWVcbiAqICAgICAgZCA9IGRpZ2l0IGRheTsgZGQgPSAyLWRpZ2l0IGRheVxuICogICAgICBoID0gaG91cnMgYW0vcG07IGhoID0gMi1kaWdpdCBob3VycyBhbS9wbTsgSCA9IGhvdXJzOyBISCA9IDItZGlnaXQgaG91cnNcbiAqICAgICAgbSA9IG1pbnV0ZXM7IG1tID0gMi1kaWdpdCBtaW51dGVzOyBhYWEgPSBBTS9QTVxuICogICAgICBzID0gc2Vjb25kczsgc3MgPSAyLWRpZ2l0IHNlY29uZHNcbiAqICAgICAgUyA9IG1pbGlzZWNvbmRzXG4gKiA8L3ByZT5cbiAqXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0dGVyblN0cl0gZGVmYXVsdHMgdG8gJ3l5eXkvTU0vZGQnXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBmb3JtYXR0ZWQgZGF0ZVxuICpcbiAqIEBmdW5jdGlvbiBmb3JtYXREYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSwgcGF0dGVyblN0cjogc3RyaW5nID0gXCJ5eXl5L01NL2RkXCIpIHtcbiAgY29uc3QgZGF5OiBudW1iZXIgPSBkYXRlLmdldERhdGUoKSxcbiAgICBtb250aDogbnVtYmVyID0gZGF0ZS5nZXRNb250aCgpLFxuICAgIHllYXI6IG51bWJlciA9IGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICBob3VyOiBudW1iZXIgPSBkYXRlLmdldEhvdXJzKCksXG4gICAgbWludXRlOiBudW1iZXIgPSBkYXRlLmdldE1pbnV0ZXMoKSxcbiAgICBzZWNvbmQ6IG51bWJlciA9IGRhdGUuZ2V0U2Vjb25kcygpLFxuICAgIG1pbGlzZWNvbmRzOiBudW1iZXIgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpLFxuICAgIGg6IG51bWJlciA9IGhvdXIgJSAxMixcbiAgICBoaDogc3RyaW5nID0gdHdvRGlnaXRQYWQoaCksXG4gICAgSEg6IHN0cmluZyA9IHR3b0RpZ2l0UGFkKGhvdXIpLFxuICAgIG1tOiBzdHJpbmcgPSB0d29EaWdpdFBhZChtaW51dGUpLFxuICAgIHNzOiBzdHJpbmcgPSB0d29EaWdpdFBhZChzZWNvbmQpLFxuICAgIGFhYTogc3RyaW5nID0gaG91ciA8IDEyID8gXCJBTVwiIDogXCJQTVwiLFxuICAgIEVFRUU6IHN0cmluZyA9IERBWVNfT0ZfV0VFS19OQU1FU1tkYXRlLmdldERheSgpXSxcbiAgICBFRUU6IHN0cmluZyA9IEVFRUUuc3Vic3RyKDAsIDMpLFxuICAgIGRkOiBzdHJpbmcgPSB0d29EaWdpdFBhZChkYXkpLFxuICAgIE06IG51bWJlciA9IG1vbnRoICsgMSxcbiAgICBNTTogc3RyaW5nID0gdHdvRGlnaXRQYWQoTSksXG4gICAgTU1NTTogc3RyaW5nID0gTU9OVEhfTkFNRVNbbW9udGhdLFxuICAgIE1NTTogc3RyaW5nID0gTU1NTS5zdWJzdHIoMCwgMyksXG4gICAgeXl5eTogc3RyaW5nID0geWVhciArIFwiXCIsXG4gICAgeXk6IHN0cmluZyA9IHl5eXkuc3Vic3RyKDIsIDIpO1xuICAvLyBjaGVja3MgdG8gc2VlIGlmIG1vbnRoIG5hbWUgd2lsbCBiZSB1c2VkXG4gIHBhdHRlcm5TdHIgPSBwYXR0ZXJuU3RyXG4gICAgLnJlcGxhY2UoXCJoaFwiLCBoaClcbiAgICAucmVwbGFjZShcImhcIiwgaC50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwiSEhcIiwgSEgpXG4gICAgLnJlcGxhY2UoXCJIXCIsIGhvdXIudG9TdHJpbmcoKSlcbiAgICAucmVwbGFjZShcIm1tXCIsIG1tKVxuICAgIC5yZXBsYWNlKFwibVwiLCBtaW51dGUudG9TdHJpbmcoKSlcbiAgICAucmVwbGFjZShcInNzXCIsIHNzKVxuICAgIC5yZXBsYWNlKFwic1wiLCBzZWNvbmQudG9TdHJpbmcoKSlcbiAgICAucmVwbGFjZShcIlNcIiwgbWlsaXNlY29uZHMudG9TdHJpbmcoKSlcbiAgICAucmVwbGFjZShcImRkXCIsIGRkKVxuICAgIC5yZXBsYWNlKFwiZFwiLCBkYXkudG9TdHJpbmcoKSlcblxuICAgIC5yZXBsYWNlKFwiRUVFRVwiLCBFRUVFKVxuICAgIC5yZXBsYWNlKFwiRUVFXCIsIEVFRSlcbiAgICAucmVwbGFjZShcInl5eXlcIiwgeXl5eSlcbiAgICAucmVwbGFjZShcInl5XCIsIHl5KVxuICAgIC5yZXBsYWNlKFwiYWFhXCIsIGFhYSk7XG4gIGlmIChwYXR0ZXJuU3RyLmluZGV4T2YoXCJNTU1cIikgPiAtMSkge1xuICAgIHBhdHRlcm5TdHIgPSBwYXR0ZXJuU3RyLnJlcGxhY2UoXCJNTU1NXCIsIE1NTU0pLnJlcGxhY2UoXCJNTU1cIiwgTU1NKTtcbiAgfSBlbHNlIHtcbiAgICBwYXR0ZXJuU3RyID0gcGF0dGVyblN0ci5yZXBsYWNlKFwiTU1cIiwgTU0pLnJlcGxhY2UoXCJNXCIsIE0udG9TdHJpbmcoKSk7XG4gIH1cbiAgcmV0dXJuIHBhdHRlcm5TdHI7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUGFyc2VzIGEgZGF0ZSBmcm9tIGEgc3BlY2lmaWVkIGZvcm1hdFxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdFxuICogQHBhcmFtIHtzdHJpbmcgfCBEYXRlIHwgbnVtYmVyfSBbdl1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRlKGZvcm1hdDogc3RyaW5nLCB2Pzogc3RyaW5nIHwgRGF0ZSB8IG51bWJlcikge1xuICBsZXQgdmFsdWU6IERhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKCF2KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGlmICh2IGluc3RhbmNlb2YgRGF0ZSlcbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBkYXRlRnJvbUZvcm1hdChmb3JtYXREYXRlKHYgYXMgRGF0ZSwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgc2YoXCJDb3VsZCBub3QgY29udmVydCBkYXRlIHswfSB0byBmb3JtYXQ6IHsxfVwiLCB2LnRvU3RyaW5nKCksIGZvcm1hdClcbiAgICAgICk7XG4gICAgfVxuICBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgIHZhbHVlID0gZGF0ZUZyb21Gb3JtYXQodiwgZm9ybWF0KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikge1xuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2KTtcbiAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KGZvcm1hdERhdGUoZCwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgfSBlbHNlIGlmIChpc1ZhbGlkRGF0ZSh2KSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkID0gbmV3IERhdGUodik7XG4gICAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KGZvcm1hdERhdGUoZCwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHNmKFwiQ291bGQgbm90IGNvbnZlcnQgZGF0ZSB7MH0gdG8gZm9ybWF0OiB7MX1cIiwgdiwgZm9ybWF0KVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIHByb3ZpZGVkICR7dn1gKTtcbiAgfVxuICByZXR1cm4gYmluZERhdGVUb1N0cmluZyh2YWx1ZSwgZm9ybWF0KTtcbn1cbiIsImltcG9ydCB7XG4gIERlY29yYXRpb25CdWlsZGVyQnVpbGQsXG4gIERlY29yYXRpb25CdWlsZGVyRW5kLFxuICBEZWNvcmF0aW9uQnVpbGRlck1pZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCxcbiAgRmxhdm91clJlc29sdmVyLFxuICBJRGVjb3JhdGlvbkJ1aWxkZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Rmxhdm91ciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5mdW5jdGlvbiBkZWZhdWx0Rmxhdm91clJlc29sdmVyKHRhcmdldDogb2JqZWN0KSB7XG4gIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbn1cblxuZXhwb3J0IHR5cGUgRGVjb3JhdG9yVHlwZXMgPVxuICB8IENsYXNzRGVjb3JhdG9yXG4gIHwgUHJvcGVydHlEZWNvcmF0b3JcbiAgfCBNZXRob2REZWNvcmF0b3I7XG5cbmV4cG9ydCB0eXBlIERlY29yYXRvckZhY3RvcnkgPSAoLi4uYXJnczogYW55W10pID0+IERlY29yYXRvclR5cGVzO1xuXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JGYWN0b3J5QXJncyA9IHtcbiAgZGVjb3JhdG9yOiBEZWNvcmF0b3JGYWN0b3J5O1xuICBhcmdzPzogYW55W107XG4gIHRyYW5zZm9ybT86IChhcmdzOiBhbnlbXSkgPT4gYW55W107XG59O1xuXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JEYXRhID0gRGVjb3JhdG9yVHlwZXMgfCBEZWNvcmF0b3JGYWN0b3J5QXJncztcbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgZGVjb3JhdG9yIG1hbmFnZW1lbnQgY2xhc3MgdGhhdCBoYW5kbGVzIGZsYXZvdXJlZCBkZWNvcmF0b3JzXG4gKiBAc3VtbWFyeSBUaGUgRGVjb3JhdGlvbiBjbGFzcyBwcm92aWRlcyBhIGJ1aWxkZXIgcGF0dGVybiBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIGRlY29yYXRvcnMgd2l0aCBkaWZmZXJlbnQgZmxhdm91cnMuXG4gKiBJdCBzdXBwb3J0cyByZWdpc3RlcmluZywgZXh0ZW5kaW5nLCBhbmQgYXBwbHlpbmcgZGVjb3JhdG9ycyB3aXRoIGNvbnRleHQtYXdhcmUgZmxhdm91ciByZXNvbHV0aW9uLlxuICogVGhlIGNsYXNzIGltcGxlbWVudHMgYSBmbHVlbnQgaW50ZXJmYWNlIGZvciBkZWZpbmluZywgZXh0ZW5kaW5nLCBhbmQgYXBwbHlpbmcgZGVjb3JhdG9ycyB3aXRoIGRpZmZlcmVudCBmbGF2b3VycyxcbiAqIGFsbG93aW5nIGZvciBmcmFtZXdvcmstc3BlY2lmaWMgZGVjb3JhdG9yIGltcGxlbWVudGF0aW9ucyB3aGlsZSBtYWludGFpbmluZyBhIGNvbnNpc3RlbnQgQVBJLlxuICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgZGVjb3JhdG9yIChDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yKVxuICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyXSBPcHRpb25hbCBmbGF2b3VyIHBhcmFtZXRlciBmb3IgdGhlIGRlY29yYXRvciBjb250ZXh0XG4gKiBAY2xhc3NcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBkZWNvcmF0aW9uIGZvciAnY29tcG9uZW50JyB3aXRoIGRlZmF1bHQgZmxhdm91clxuICogY29uc3QgY29tcG9uZW50RGVjb3JhdG9yID0gbmV3IERlY29yYXRpb24oKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKGN1c3RvbUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQ3JlYXRlIGEgZmxhdm91cmVkIGRlY29yYXRpb25cbiAqIGNvbnN0IHZ1ZUNvbXBvbmVudCA9IG5ldyBEZWNvcmF0aW9uKCd2dWUnKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKHZ1ZUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQXBwbHkgdGhlIGRlY29yYXRpb25cbiAqIEBjb21wb25lbnREZWNvcmF0b3JcbiAqIGNsYXNzIE15Q29tcG9uZW50IHt9XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEZWNvcmF0aW9uXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgRmxhdm91clJlc29sdmVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgRGVjb3JhdG9yRmFjdG9yeVxuICpcbiAqICAgQy0+PkQ6IG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpXG4gKiAgIEMtPj5EOiBmb3Ioa2V5KVxuICogICBDLT4+RDogZGVmaW5lKGRlY29yYXRvcnMpXG4gKiAgIEQtPj5EOiByZWdpc3RlcihrZXksIGZsYXZvdXIsIGRlY29yYXRvcnMpXG4gKiAgIEQtPj5GOiBkZWNvcmF0b3JGYWN0b3J5KGtleSwgZmxhdm91cilcbiAqICAgRi0+PlI6IHJlc29sdmUodGFyZ2V0KVxuICogICBSLS0+PkY6IHJlc29sdmVkIGZsYXZvdXJcbiAqICAgRi0+PkY6IGFwcGx5IGRlY29yYXRvcnNcbiAqICAgRi0tPj5DOiBkZWNvcmF0ZWQgdGFyZ2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNvcmF0aW9uIGltcGxlbWVudHMgSURlY29yYXRpb25CdWlsZGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWFwIG9mIHJlZ2lzdGVyZWQgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBTdG9yZXMgYWxsIHJlZ2lzdGVyZWQgZGVjb3JhdG9ycyBvcmdhbml6ZWQgYnkga2V5IGFuZCBmbGF2b3VyXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBkZWNvcmF0b3JzOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIHtcbiAgICAgICAgZGVjb3JhdG9ycz86IFNldDxEZWNvcmF0b3JEYXRhPjtcbiAgICAgICAgZXh0cmFzPzogU2V0PERlY29yYXRvckRhdGE+O1xuICAgICAgfVxuICAgID5cbiAgPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gdG8gcmVzb2x2ZSBmbGF2b3VyIGZyb20gYSB0YXJnZXRcbiAgICogQHN1bW1hcnkgUmVzb2x2ZXIgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHRoZSBhcHByb3ByaWF0ZSBmbGF2b3VyIGZvciBhIGdpdmVuIHRhcmdldFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZmxhdm91clJlc29sdmVyOiBGbGF2b3VyUmVzb2x2ZXIgPSBkZWZhdWx0Rmxhdm91clJlc29sdmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0IG9mIGRlY29yYXRvcnMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICovXG4gIHByaXZhdGUgZGVjb3JhdG9ycz86IFNldDxEZWNvcmF0b3JEYXRhPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldCBvZiBhZGRpdGlvbmFsIGRlY29yYXRvcnNcbiAgICovXG4gIHByaXZhdGUgZXh0cmFzPzogU2V0PERlY29yYXRvckRhdGE+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCBkZWNvcmF0b3Iga2V5XG4gICAqL1xuICBwcml2YXRlIGtleT86IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZsYXZvdXI6IHN0cmluZyA9IERlZmF1bHRGbGF2b3VyKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUga2V5IGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IGRlY29yYXRpb24gY2hhaW4gd2l0aCB0aGUgc3BlY2lmaWVkIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBpZGVudGlmaWVyIGZvciB0aGUgZGVjb3JhdG9yXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyTWlkfSBCdWlsZGVyIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmdcbiAgICovXG4gIGZvcihrZXk6IHN0cmluZyk6IERlY29yYXRpb25CdWlsZGVyTWlkIHtcbiAgICB0aGlzLmtleSA9IGtleTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBkZWNvcmF0b3JzIHRvIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICogQHN1bW1hcnkgSW50ZXJuYWwgbWV0aG9kIHRvIGFkZCBkZWNvcmF0b3JzIHdpdGggYWRkb24gc3VwcG9ydFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthZGRvbj1mYWxzZV0gV2hldGhlciB0aGUgZGVjb3JhdG9ycyBhcmUgYWRkb25zXG4gICAqIEBwYXJhbSBkZWNvcmF0b3JzIEFycmF5IG9mIGRlY29yYXRvcnNcbiAgICogQHJldHVybiB7dGhpc30gQ3VycmVudCBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHByaXZhdGUgZGVjb3JhdGUoXG4gICAgYWRkb246IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAuLi5kZWNvcmF0b3JzOiBEZWNvcmF0b3JEYXRhW11cbiAgKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLmtleSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImtleSBtdXN0IGJlIHByb3ZpZGVkIGJlZm9yZSBkZWNvcmF0b3JzIGNhbiBiZSBhZGRlZFwiKTtcbiAgICBpZiAoXG4gICAgICAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKSAmJlxuICAgICAgIWFkZG9uICYmXG4gICAgICB0aGlzLmZsYXZvdXIgIT09IERlZmF1bHRGbGF2b3VyXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk11c3QgcHJvdmlkZSBvdmVycmlkZXMgb3IgYWRkb25zIHRvIG92ZXJyaWRlIG9yIGV4dGVuZCBkZWNhZidzIGRlY29yYXRvcnNcIlxuICAgICAgKTtcbiAgICBpZiAodGhpcy5mbGF2b3VyID09PSBEZWZhdWx0Rmxhdm91ciAmJiBhZGRvbilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlZmF1bHQgZmxhdm91ciBjYW5ub3QgYmUgZXh0ZW5kZWRcIik7XG5cbiAgICB0aGlzW2FkZG9uID8gXCJleHRyYXNcIiA6IFwiZGVjb3JhdG9yc1wiXSA9IG5ldyBTZXQoW1xuICAgICAgLi4uKHRoaXNbYWRkb24gPyBcImV4dHJhc1wiIDogXCJkZWNvcmF0b3JzXCJdIHx8IG5ldyBTZXQoKSkudmFsdWVzKCksXG4gICAgICAuLi5kZWNvcmF0b3JzLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIGJhc2UgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBwcmltYXJ5IGRlY29yYXRvcnMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICogQHBhcmFtIGRlY29yYXRvcnMgRGVjb3JhdG9ycyB0byBkZWZpbmVcbiAgICogQHJldHVybiBCdWlsZGVyIGluc3RhbmNlIGZvciBmaW5pc2hpbmcgdGhlIGNoYWluXG4gICAqL1xuICBkZWZpbmUoXG4gICAgLi4uZGVjb3JhdG9yczogRGVjb3JhdG9yRGF0YVtdXG4gICk6IERlY29yYXRpb25CdWlsZGVyRW5kICYgRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCB7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdGUoZmFsc2UsIC4uLmRlY29yYXRvcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeHRlbmRzIGV4aXN0aW5nIGRlY29yYXRvcnNcbiAgICogQHN1bW1hcnkgQWRkcyBhZGRpdGlvbmFsIGRlY29yYXRvcnMgdG8gdGhlIGN1cnJlbnQgY29udGV4dFxuICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBZGRpdGlvbmFsIGRlY29yYXRvcnNcbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJCdWlsZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgYnVpbGRpbmcgdGhlIGRlY29yYXRvclxuICAgKi9cbiAgZXh0ZW5kKC4uLmRlY29yYXRvcnM6IERlY29yYXRvckRhdGFbXSk6IERlY29yYXRpb25CdWlsZGVyQnVpbGQge1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRlKHRydWUsIC4uLmRlY29yYXRvcnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlY29yYXRvckZhY3Rvcnkoa2V5OiBzdHJpbmcsIGY6IHN0cmluZyA9IERlZmF1bHRGbGF2b3VyKSB7XG4gICAgY29uc3QgY29udGV4dERlY29yYXRvciA9IGZ1bmN0aW9uIGNvbnRleHREZWNvcmF0b3IoXG4gICAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgICApIHtcbiAgICAgIGNvbnN0IGZsYXZvdXIgPSBEZWNvcmF0aW9uLmZsYXZvdXJSZXNvbHZlcih0YXJnZXQpO1xuICAgICAgY29uc3QgY2FjaGUgPSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XTtcbiAgICAgIGxldCBkZWNvcmF0b3JzO1xuICAgICAgY29uc3QgZXh0cmFzID0gY2FjaGVbZmxhdm91cl1cbiAgICAgICAgPyBjYWNoZVtmbGF2b3VyXS5leHRyYXNcbiAgICAgICAgOiBjYWNoZVtEZWZhdWx0Rmxhdm91cl0uZXh0cmFzO1xuICAgICAgY29uc3QgZXh0cmFBcmdzID0gW1xuICAgICAgICAuLi4oKGNhY2hlW0RlZmF1bHRGbGF2b3VyXSBhcyBhbnkpLmV4dHJhc1xuICAgICAgICAgID8gKGNhY2hlW0RlZmF1bHRGbGF2b3VyXSBhcyBhbnkpLmV4dHJhcy52YWx1ZXMoKVxuICAgICAgICAgIDogW10pLFxuICAgICAgXS5yZWR1Y2UoKGFjY3VtOiBSZWNvcmQ8bnVtYmVyLCBhbnk+LCBlLCBpKSA9PiB7XG4gICAgICAgIGlmIChlLmFyZ3MpIGFjY3VtW2ldID0gZS5hcmdzO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgY2FjaGUgJiZcbiAgICAgICAgY2FjaGVbZmxhdm91cl0gJiZcbiAgICAgICAgY2FjaGVbZmxhdm91cl0uZGVjb3JhdG9ycyAmJlxuICAgICAgICBjYWNoZVtmbGF2b3VyXS5kZWNvcmF0b3JzLnNpemVcbiAgICAgICkge1xuICAgICAgICBkZWNvcmF0b3JzID0gY2FjaGVbZmxhdm91cl0uZGVjb3JhdG9ycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlY29yYXRvcnMgPSBjYWNoZVtEZWZhdWx0Rmxhdm91cl0uZGVjb3JhdG9ycztcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVjb3JhdG9yQXJncyA9IFtcbiAgICAgICAgLi4uKGNhY2hlW0RlZmF1bHRGbGF2b3VyXSBhcyBhbnkpLmRlY29yYXRvcnMudmFsdWVzKCksXG4gICAgICBdLnJlZHVjZSgoYWNjdW06IFJlY29yZDxudW1iZXIsIGFueT4sIGUsIGkpID0+IHtcbiAgICAgICAgaWYgKGUuYXJncykgYWNjdW1baV0gPSBlLmFyZ3M7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgY29uc3QgdG9BcHBseSA9IFtcbiAgICAgICAgLi4uKGRlY29yYXRvcnMgPyBkZWNvcmF0b3JzLnZhbHVlcygpIDogW10pLFxuICAgICAgICAuLi4oZXh0cmFzID8gZXh0cmFzLnZhbHVlcygpIDogW10pLFxuICAgICAgXTtcblxuICAgICAgcmV0dXJuIHRvQXBwbHkucmVkdWNlKFxuICAgICAgICAoXywgZCwgaSkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgICAgICAgICBjb25zdCB7IGRlY29yYXRvciwgYXJncywgdHJhbnNmb3JtIH0gPSBkIGFzIERlY29yYXRvckZhY3RvcnlBcmdzO1xuICAgICAgICAgICAgICBjb25zdCBhcmd6ID1cbiAgICAgICAgICAgICAgICBhcmdzIHx8IGkgPCAoZGVjb3JhdG9ycyA/IGRlY29yYXRvcnMuc2l6ZSA6IDApXG4gICAgICAgICAgICAgICAgICA/IGRlY29yYXRvckFyZ3NbaV1cbiAgICAgICAgICAgICAgICAgIDogZXh0cmFBcmdzW2kgLSAoZGVjb3JhdG9ycyA/IGRlY29yYXRvcnMuc2l6ZSA6IDApXSB8fFxuICAgICAgICAgICAgICAgICAgICAoZGVjb3JhdG9ycyA/IGRlY29yYXRvckFyZ3NbaSAtIGRlY29yYXRvcnMuc2l6ZV0gOiBbXSk7XG5cbiAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSB0cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICA/IHRyYW5zZm9ybShhcmd6IHx8IFtdKVxuICAgICAgICAgICAgICAgIDogYXJneiB8fCBbXTtcbiAgICAgICAgICAgICAgcmV0dXJuIChkZWNvcmF0b3IoLi4udHJhbnNmb3JtZWQpIGFzIGFueSkoXG4gICAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgICByZXR1cm4gKGQgYXMgYW55KSh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBkZWNvcmF0b3IgdHlwZTogJHt0eXBlb2YgZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHsgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvciB9XG4gICAgICApO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRleHREZWNvcmF0b3IsIFwibmFtZVwiLCB7XG4gICAgICB2YWx1ZTogW2YsIGtleV0uam9pbihcIl9kZWNvcmF0b3JfZm9yX1wiKSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gY29udGV4dERlY29yYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgZmluYWwgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gICAqIEBzdW1tYXJ5IEJ1aWxkcyBhbmQgcmV0dXJucyB0aGUgZGVjb3JhdG9yIGZhY3RvcnkgZnVuY3Rpb25cbiAgICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnk/LCBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcj8pOiBhbnl9IFRoZSBnZW5lcmF0ZWQgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gICAqL1xuICBhcHBseSgpOiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgKSA9PiBhbnkge1xuICAgIGlmICghdGhpcy5rZXkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBrZXkgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG4gICAgRGVjb3JhdGlvbi5yZWdpc3RlcihcbiAgICAgIHRoaXMua2V5LFxuICAgICAgdGhpcy5mbGF2b3VyLFxuICAgICAgdGhpcy5kZWNvcmF0b3JzIHx8IG5ldyBTZXQoKSxcbiAgICAgIHRoaXMuZXh0cmFzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0b3JGYWN0b3J5KHRoaXMua2V5LCB0aGlzLmZsYXZvdXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgZGVjb3JhdG9ycyBmb3IgYSBzcGVjaWZpYyBrZXkgYW5kIGZsYXZvdXJcbiAgICogQHN1bW1hcnkgSW50ZXJuYWwgbWV0aG9kIHRvIHN0b3JlIGRlY29yYXRvcnMgaW4gdGhlIHN0YXRpYyByZWdpc3RyeVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IERlY29yYXRvciBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgRGVjb3JhdG9yIGZsYXZvdXJcbiAgICogQHBhcmFtIFtkZWNvcmF0b3JzXSBQcmltYXJ5IGRlY29yYXRvcnNcbiAgICogQHBhcmFtIFtleHRyYXNdIEFkZGl0aW9uYWwgZGVjb3JhdG9yc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVnaXN0ZXIoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgZmxhdm91cjogc3RyaW5nLFxuICAgIGRlY29yYXRvcnM/OiBTZXQ8RGVjb3JhdG9yRGF0YT4sXG4gICAgZXh0cmFzPzogU2V0PERlY29yYXRvckRhdGE+XG4gICkge1xuICAgIGlmICgha2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBrZXkgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG4gICAgfVxuICAgIGlmICghZGVjb3JhdG9ycylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGRlY29yYXRvcnMgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG4gICAgaWYgKCFmbGF2b3VyKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gZmxhdm91ciBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcblxuICAgIGlmICghRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV0pIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldID0ge307XG4gICAgaWYgKCFEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXSlcbiAgICAgIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdID0ge307XG4gICAgaWYgKGRlY29yYXRvcnMpIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzO1xuICAgIGlmIChleHRyYXMpIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdLmV4dHJhcyA9IGV4dHJhcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgZ2xvYmFsIGZsYXZvdXIgcmVzb2x2ZXJcbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgZGVjb3JhdG9yIGZsYXZvdXJzXG4gICAqIEBwYXJhbSB7Rmxhdm91clJlc29sdmVyfSByZXNvbHZlciBGdW5jdGlvbiB0byByZXNvbHZlIGZsYXZvdXJzXG4gICAqL1xuICBzdGF0aWMgc2V0Rmxhdm91clJlc29sdmVyKHJlc29sdmVyOiBGbGF2b3VyUmVzb2x2ZXIpIHtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgc3RhdGljIGZvcihrZXk6IHN0cmluZyk6IERlY29yYXRpb25CdWlsZGVyTWlkIHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oKS5mb3Ioa2V5KTtcbiAgfVxuXG4gIHN0YXRpYyBmbGF2b3VyZWRBcyhmbGF2b3VyOiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlclN0YXJ0IHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZmxhdm91cik7XG4gIH1cbn1cbiIsImltcG9ydCB7IGFwcGx5LCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uIH0gZnJvbSBcIi4vRGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgZmFjdG9yeSBmb3IgbW9kZWwgYXR0cmlidXRlc1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IG1hcmtzIGNsYXNzIHByb3BlcnRpZXMgYXMgbW9kZWwgYXR0cmlidXRlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5PU1vZGVsS2V5cy5BVFRSSUJVVEVdIC0gVGhlIG1ldGFkYXRhIGtleSB1bmRlciB3aGljaCB0byBzdG9yZSB0aGUgcHJvcGVydHkgbmFtZVxuICogQHJldHVybiB7ZnVuY3Rpb24ob2JqZWN0LCBhbnk/KTogdm9pZH0gLSBEZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCByZWdpc3RlcnMgdGhlIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gcHJvcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgICBwYXJ0aWNpcGFudCBEIGFzIERlY29yYXRvclxuICogICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICpcbiAqICAgIEQtPj5NOiBDaGVjayBpZiBrZXkgZXhpc3RzXG4gKiAgICBhbHQga2V5IGV4aXN0c1xuICogICAgICAgIE0tLT4+RDogUmV0dXJuIGV4aXN0aW5nIHByb3BzIGFycmF5XG4gKiAgICBlbHNlIGtleSBkb2Vzbid0IGV4aXN0XG4gKiAgICAgICAgRC0+Pk06IENyZWF0ZSBuZXcgcHJvcHMgYXJyYXlcbiAqICAgIGVuZFxuICogICAgRC0+Pk06IENoZWNrIGlmIHByb3BlcnR5IGV4aXN0c1xuICogICAgYWx0IHByb3BlcnR5IG5vdCBpbiBhcnJheVxuICogICAgICAgIEQtPj5NOiBBZGQgcHJvcGVydHkgdG8gYXJyYXlcbiAqICAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcChrZXk6IHN0cmluZyA9IE1vZGVsS2V5cy5BVFRSSUJVVEUpIHtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKGZ1bmN0aW9uIHByb3AobW9kZWw6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICAgIGxldCBwcm9wczogc3RyaW5nW107XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsLCBrZXkpKSB7XG4gICAgICAgIHByb3BzID0gKG1vZGVsIGFzIGFueSlba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwga2V5LCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgdmFsdWU6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgcHJvcHMgPSAobW9kZWwgYXMgYW55KVtrZXldO1xuICAgICAgfVxuICAgICAgaWYgKCFwcm9wcy5pbmNsdWRlcyhwcm9wZXJ0eUtleSBhcyBzdHJpbmcpKVxuICAgICAgICBwcm9wcy5wdXNoKHByb3BlcnR5S2V5IGFzIHN0cmluZyk7XG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tYmluZWQgcHJvcGVydHkgZGVjb3JhdG9yIGZhY3RvcnkgZm9yIG1ldGFkYXRhIGFuZCBhdHRyaWJ1dGUgbWFya2luZ1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IGJvdGggbWFya3MgYSBwcm9wZXJ0eSBhcyBhIG1vZGVsIGF0dHJpYnV0ZSBhbmQgYXNzaWducyBtZXRhZGF0YSB0byBpdFxuICpcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIG1ldGFkYXRhIGtleVxuICogQHBhcmFtIHtWfSB2YWx1ZSAtIFRoZSBtZXRhZGF0YSB2YWx1ZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcHJvcGVydHlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSAtIENvbWJpbmVkIGRlY29yYXRvciBmdW5jdGlvblxuICogQGZ1bmN0aW9uIHByb3BNZXRhZGF0YVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BNZXRhZGF0YTxWPihrZXk6IHN0cmluZywgdmFsdWU6IFYpIHtcbiAgcmV0dXJuIGFwcGx5KHByb3AoKSwgbWV0YWRhdGE8Vj4oa2V5LCB2YWx1ZSkpO1xufVxuIiwiLyoqXG4gKiBAc3VtbWFyeSBNaW1pY3MgSmF2YSdzIFN0cmluZydzIEhhc2ggaW1wbGVtZW50YXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IHN5bWJvbCB8IERhdGV9IG9ialxuICogQHJldHVybiB7bnVtYmVyfSBoYXNoIHZhbHVlIG9mIG9ialxuICpcbiAqIEBmdW5jdGlvbiBoYXNoQ29kZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoQ29kZShvYmo6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCB8IERhdGUpOiBzdHJpbmcge1xuICBvYmogPSBTdHJpbmcob2JqKTtcbiAgbGV0IGhhc2ggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoYXJhY3RlciA9IG9iai5jaGFyQ29kZUF0KGkpO1xuICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBjaGFyYWN0ZXI7XG4gICAgaGFzaCA9IGhhc2ggJiBoYXNoOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgfVxuICByZXR1cm4gaGFzaC50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGVoIHR5cGUgZm9yIGEgSGFzaGluZyBmdW5jdGlvblxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCB0eXBlIEhhc2hpbmdGdW5jdGlvbiA9ICh2YWx1ZTogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gc3RyaW5nO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEhhc2hlcyBhbiBvYmplY3QgYnkgY29tYmluaW5nIHRoZSBoYXNoIG9mIGFsbCBpdHMgcHJvcGVydGllc1xuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSByZXN1bHRpbmcgaGFzaFxuICpcbiAqIEBmdW5jdGlvbiBoYXNoT2JqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hPYmoob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgYW55W10pOiBzdHJpbmcge1xuICBjb25zdCBoYXNoUmVkdWNlciA9IGZ1bmN0aW9uIChoOiBudW1iZXIgfCBzdHJpbmcsIGVsOiBhbnkpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIGNvbnN0IGVsSGFzaCA9IGhhc2hGdW5jdGlvbihlbCk7XG5cbiAgICBpZiAodHlwZW9mIGVsSGFzaCA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiBoYXNoRnVuY3Rpb24oKChoIGFzIHN0cmluZykgfHwgXCJcIikgKyBoYXNoRnVuY3Rpb24oZWwpKTtcblxuICAgIGggPSBoIHx8IDA7XG4gICAgaCA9ICgoaCBhcyBudW1iZXIpIDw8IDUpIC0gKGggYXMgbnVtYmVyKSArIGVsSGFzaDtcbiAgICByZXR1cm4gaCAmIGg7XG4gIH07XG5cbiAgY29uc3QgZnVuYzogSGFzaGluZ0Z1bmN0aW9uID0gaGFzaENvZGU7XG5cbiAgY29uc3QgaGFzaEZ1bmN0aW9uID0gZnVuY3Rpb24gKHZhbHVlOiBhbnkpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBcIlwiO1xuICAgIGlmIChbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJzeW1ib2xcIl0uaW5kZXhPZih0eXBlb2YgdmFsdWUpICE9PSAtMSlcbiAgICAgIHJldHVybiBmdW5jKHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBmdW5jKHZhbHVlLmdldFRpbWUoKSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUucmVkdWNlKGhhc2hSZWR1Y2VyLCB1bmRlZmluZWQpO1xuICAgIHJldHVybiAoT2JqZWN0LnZhbHVlcyh2YWx1ZSkgYXMgKHN0cmluZyB8IG51bWJlcilbXSkucmVkdWNlKFxuICAgICAgaGFzaFJlZHVjZXIsXG4gICAgICB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBzdHJpbmcgfCBudW1iZXJcbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IHJlc3VsdCA9IE9iamVjdC52YWx1ZXMob2JqKS5yZWR1Y2UoaGFzaFJlZHVjZXIsIDApO1xuXG4gIHJldHVybiAodHlwZW9mIHJlc3VsdCA9PT0gXCJudW1iZXJcIiA/IE1hdGguYWJzKHJlc3VsdCkgOiByZXN1bHQpLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0SGFzaGluZ01ldGhvZCA9IFwiZGVmYXVsdFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYW5hZ2VzIGhhc2hpbmcgbWV0aG9kcyBhbmQgcHJvdmlkZXMgYSB1bmlmaWVkIGhhc2hpbmcgaW50ZXJmYWNlXG4gKiBAc3VtbWFyeSBBIHV0aWxpdHkgY2xhc3MgdGhhdCBwcm92aWRlcyBhIHJlZ2lzdHJ5IGZvciBkaWZmZXJlbnQgaGFzaGluZyBmdW5jdGlvbnMgYW5kIG1ldGhvZHMgdG8gaGFzaCBvYmplY3RzLlxuICogVGhlIGNsYXNzIG1haW50YWlucyBhIGNhY2hlIG9mIHJlZ2lzdGVyZWQgaGFzaGluZyBmdW5jdGlvbnMgYW5kIGFsbG93cyBzZXR0aW5nIGEgZGVmYXVsdCBoYXNoaW5nIG1ldGhvZC5cbiAqIEl0IHByZXZlbnRzIGRpcmVjdCBpbnN0YW50aWF0aW9uIGFuZCBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBmb3IgcmVnaXN0cmF0aW9uIGFuZCBoYXNoaW5nLlxuICpcbiAqIEBjbGFzcyBIYXNoaW5nXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gUmVnaXN0ZXIgYSBjdXN0b20gaGFzaGluZyBmdW5jdGlvblxuICogSGFzaGluZy5yZWdpc3RlcignbWQ1JywgKG9iaikgPT4gY3JlYXRlTUQ1SGFzaChvYmopLCB0cnVlKTtcbiAqXG4gKiAvLyBIYXNoIGFuIG9iamVjdCB1c2luZyBkZWZhdWx0IG1ldGhvZFxuICogY29uc3QgaGFzaDEgPSBIYXNoaW5nLmhhc2gobXlPYmplY3QpO1xuICpcbiAqIC8vIEhhc2ggdXNpbmcgc3BlY2lmaWMgbWV0aG9kXG4gKiBjb25zdCBoYXNoMiA9IEhhc2hpbmcuaGFzaChteU9iamVjdCwgJ21kNScpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBIYXNoaW5nIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IGRlZmF1bHQgaGFzaGluZyBtZXRob2QgaWRlbnRpZmllclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY3VycmVudDogc3RyaW5nID0gRGVmYXVsdEhhc2hpbmdNZXRob2Q7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDYWNoZSBvZiByZWdpc3RlcmVkIGhhc2hpbmcgZnVuY3Rpb25zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjYWNoZTogUmVjb3JkPHN0cmluZywgSGFzaGluZ0Z1bmN0aW9uPiA9IHtcbiAgICBkZWZhdWx0OiBoYXNoT2JqLFxuICB9O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVnaXN0ZXJlZCBoYXNoaW5nIGZ1bmN0aW9uXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgYSBoYXNoaW5nIGZ1bmN0aW9uIGZyb20gdGhlIGNhY2hlIGJ5IGl0cyBrZXkuIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbWV0aG9kIGlzIG5vdCByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIGhhc2hpbmcgZnVuY3Rpb24gdG8gcmV0cmlldmVcbiAgICogQHJldHVybiB7SGFzaGluZ0Z1bmN0aW9ufSBUaGUgcmVxdWVzdGVkIGhhc2hpbmcgZnVuY3Rpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldChrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKGtleSBpbiB0aGlzLmNhY2hlKSByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gaGFzaGluZyBtZXRob2QgcmVnaXN0ZXJlZCB1bmRlciAke2tleX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgbmV3IGhhc2hpbmcgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgQWRkcyBhIG5ldyBoYXNoaW5nIGZ1bmN0aW9uIHRvIHRoZSByZWdpc3RyeS4gT3B0aW9uYWxseSBzZXRzIGl0IGFzIHRoZSBkZWZhdWx0IG1ldGhvZC5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUga2V5IGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgaGFzaGluZyBmdW5jdGlvblxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZ1bmM6IEhhc2hpbmdGdW5jdGlvbixcbiAgICBzZXREZWZhdWx0ID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgaWYgKGtleSBpbiB0aGlzLmNhY2hlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIYXNoaW5nIG1ldGhvZCAke2tleX0gYWxyZWFkeSByZWdpc3RlcmVkYCk7XG4gICAgdGhpcy5jYWNoZVtrZXldID0gZnVuYztcbiAgICBpZiAoc2V0RGVmYXVsdCkgdGhpcy5jdXJyZW50ID0ga2V5O1xuICB9XG5cbiAgc3RhdGljIGhhc2gob2JqOiBhbnksIG1ldGhvZD86IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICBpZiAoIW1ldGhvZCkgcmV0dXJuIHRoaXMuZ2V0KHRoaXMuY3VycmVudCkob2JqLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5nZXQobWV0aG9kKShvYmosIC4uLmFyZ3MpO1xuICB9XG5cbiAgc3RhdGljIHNldERlZmF1bHQobWV0aG9kOiBzdHJpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmdldChtZXRob2QpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLCBWQUxJREFUSU9OX1BBUkVOVF9LRVkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuL3N0cmluZ3NcIjtcblxuY29uc3QgZmFsbGJhY2tHZXRQYXJlbnQgPSAodGFyZ2V0OiBhbnkpID0+IHtcbiAgcmV0dXJuIHRhcmdldFtWQUxJREFUSU9OX1BBUkVOVF9LRVldO1xufTtcblxuY29uc3QgZmFsbGJhY2tHZXRWYWx1ZSA9ICh0YXJnZXQ6IGFueSwgcHJvcDogc3RyaW5nKSA9PiB7XG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgcHJvcCkpXG4gICAgdGhyb3cgbmV3IEVycm9yKHNmKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuUFJPUEVSVFlfTk9UX0VYSVNULCBwcm9wKSk7XG4gIHJldHVybiB0YXJnZXRbcHJvcF07XG59O1xuXG4vKipcbiAqIFByb3h5IG9iamVjdCB0aGF0IHByb3ZpZGVzIHBhdGgtYmFzZWQgYWNjZXNzIHRvIG5lc3RlZCBwcm9wZXJ0aWVzXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSB0YXJnZXQgb2JqZWN0IGJlaW5nIHByb3hpZWRcbiAqL1xuZXhwb3J0IHR5cGUgUGF0aFByb3h5PFQ+ID0gVCAmIHtcbiAgLy8gW1BST1hZX1BST1BdOiBib29sZWFuO1xuICBnZXRWYWx1ZUZyb21QYXRoOiAocGF0aDogc3RyaW5nLCBmYWxsYmFjaz86IGFueSkgPT4gYW55O1xufTtcblxuLyoqXG4gKiBTdGFuZGFyZCBwYXRoIHJlc29sdXRpb24gdXRpbGl0eSBmb3IgYWNjZXNzaW5nIG5lc3RlZCBvYmplY3QgcHJvcGVydGllcy5cbiAqIFByb3ZpZGVzIGNvbnNpc3RlbnQgZG90LW5vdGF0aW9uIGFjY2VzcyB0byBib3RoIHBhcmVudCBhbmQgY2hpbGQgcHJvcGVydGllc1xuICogYWNyb3NzIGNvbXBsZXggb2JqZWN0IHN0cnVjdHVyZXMuXG4gKlxuICogLSBEb3Qtbm90YXRpb24gcGF0aCByZXNvbHV0aW9uICgnb2JqZWN0LmNoaWxkLnByb3BlcnR5JylcbiAqIC0gUGFyZW50IHRyYXZlcnNhbCB1c2luZyAnLi4vJyBub3RhdGlvblxuICogLSBDb25maWd1cmFibGUgcHJvcGVydHkgYWNjZXNzIGJlaGF2aW9yXG4gKiAtIE51bGwvdW5kZWZpbmVkIHNhZmV0eSBjaGVja3NcbiAqL1xuZXhwb3J0IGNsYXNzIFBhdGhQcm94eUVuZ2luZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGF0aC1hd2FyZSBwcm94eSBmb3IgdGhlIHRhcmdldCBvYmplY3RcbiAgICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgdGFyZ2V0IG9iamVjdFxuICAgKiBAcGFyYW0ge1R9IHJvb3RUYXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0byBwcm94eVxuICAgKiBAcGFyYW0gb3B0cyAtIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0cy5nZXRWYWx1ZSAtIEN1c3RvbSBmdW5jdGlvbiB0byBnZXQgcHJvcGVydHkgdmFsdWVcbiAgICogQHBhcmFtIG9wdHMuZ2V0UGFyZW50IC0gQ3VzdG9tIGZ1bmN0aW9uIHRvIGdldCBwYXJlbnQgb2JqZWN0XG4gICAqIEBwYXJhbSBvcHRzLmlnbm9yZVVuZGVmaW5lZCAtIFdoZXRoZXIgdG8gaWdub3JlIHVuZGVmaW5lZCB2YWx1ZXMgaW4gcGF0aHNcbiAgICogQHBhcmFtIG9wdHMuaWdub3JlTnVsbCAtIFdoZXRoZXIgdG8gaWdub3JlIG51bGwgdmFsdWVzIGluIHBhdGhzXG4gICAqIEByZXR1cm5zIEEgcHJveHkgb2JqZWN0IHdpdGggcGF0aCBhY2Nlc3MgY2FwYWJpbGl0aWVzXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICAgIHJvb3RUYXJnZXQ6IFQsXG4gICAgb3B0cz86IHtcbiAgICAgIGdldFZhbHVlPzogKHRhcmdldDogVCwgcHJvcDogc3RyaW5nKSA9PiBhbnk7XG4gICAgICBnZXRQYXJlbnQ/OiAodGFyZ2V0OiBUKSA9PiBhbnk7XG4gICAgICBpZ25vcmVVbmRlZmluZWQ6IGJvb2xlYW47XG4gICAgICBpZ25vcmVOdWxsOiBib29sZWFuO1xuICAgIH1cbiAgKTogUGF0aFByb3h5PFQ+IHtcbiAgICBjb25zdCB7IGdldFZhbHVlLCBnZXRQYXJlbnQsIGlnbm9yZVVuZGVmaW5lZCwgaWdub3JlTnVsbCB9ID0ge1xuICAgICAgZ2V0UGFyZW50OiBmYWxsYmFja0dldFBhcmVudCxcbiAgICAgIGdldFZhbHVlOiBmYWxsYmFja0dldFZhbHVlLFxuICAgICAgaWdub3JlTnVsbDogZmFsc2UsXG4gICAgICBpZ25vcmVVbmRlZmluZWQ6IGZhbHNlLFxuICAgICAgLi4ub3B0cyxcbiAgICB9O1xuXG4gICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkoe30gYXMgYW55LCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmIChwcm9wID09PSBcImdldFZhbHVlRnJvbVBhdGhcIikge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAocGF0aDogc3RyaW5nKTogYW55IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gUGF0aFByb3h5RW5naW5lLnBhcnNlUGF0aChwYXRoKTtcbiAgICAgICAgICAgIGxldCBjdXJyZW50OiBhbnkgPSByb290VGFyZ2V0O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgICAgaWYgKHBhcnQgPT09IFwiLi5cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGdldFBhcmVudChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCB8fCB0eXBlb2YgcGFyZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIHNmKFxuICAgICAgICAgICAgICAgICAgICAgIENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuQ09OVEVYVF9OT1RfT0JKRUNUX0NPTVBBUklTT04sXG4gICAgICAgICAgICAgICAgICAgICAgaSArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgcGF0aFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gcGFyZW50OyAvL1BhdGhQcm94eUVuZ2luZS5jcmVhdGUocGFyZW50VGFyZ2V0LCBvcHRzKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGN1cnJlbnQgPSBnZXRWYWx1ZShjdXJyZW50LCBwYXJ0KTtcbiAgICAgICAgICAgICAgaWYgKCFpZ25vcmVVbmRlZmluZWQgJiYgdHlwZW9mIGN1cnJlbnQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgc2YoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5QUk9QRVJUWV9JTlZBTElELCBwYXRoLCBwYXJ0KVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKCFpZ25vcmVOdWxsICYmIGN1cnJlbnQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgc2YoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5QUk9QRVJUWV9JTlZBTElELCBwYXRoLCBwYXJ0KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm94eSwgUFJPWFlfUFJPUCwge1xuICAgIC8vICAgdmFsdWU6IHRydWUsIC8vIG92ZXJ3cml0ZSBieSBwcm94eSBiZWhhdmlvclxuICAgIC8vICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgLy8gICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIC8vICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIC8vIH0pO1xuXG4gICAgcmV0dXJuIHByb3h5IGFzIFBhdGhQcm94eTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYSBwYXRoIHN0cmluZyBpbnRvIGluZGl2aWR1YWwgY29tcG9uZW50c1xuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHN0cmluZyB0byBwYXJzZSAoZS5nLiwgXCJ1c2VyLmFkZHJlc3MuY2l0eVwiKVxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBwYXRoIGNvbXBvbmVudHNcbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgcGF0aCBpcyBpbnZhbGlkXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwYXJzZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gXCJzdHJpbmdcIiB8fCAhcGF0aC50cmltKCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3Ioc2YoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5JTlZBTElEX1BBVEgsIHBhdGgpKTtcbiAgICByZXR1cm4gcGF0aC5tYXRjaCgvKFxcLlxcLnxbXi8uXSspL2cpIHx8IFtdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbEVycm9ycyB9IGZyb20gXCIuLi92YWxpZGF0aW9uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgSGVscGVyIENsYXNzIHRvIGhvbGQgdGhlIGVycm9yIHJlc3VsdHNcbiAqIEBkZXNjcmlwdGlvbiBob2xkcyBlcnJvciByZXN1bHRzIGluIGFuICdpbmRleGFibGUnIG1hbm5lclxuICogd2hpbGUgc3RpbGwgcHJvdmlkaW5nIHRoZSBzYW1lIHJlc3VsdCBvbiB0b1N0cmluZ1xuICpcbiAqIEBwYXJhbSB7TW9kZWxFcnJvcnN9IGVycm9yc1xuICpcbiAqIEBjbGFzcyBNb2RlbEVycm9yRGVmaW5pdGlvblxuICpcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgTW9kZWxFcnJvckRlZmluaXRpb24ge1xuICBbaW5kZXhlcjogc3RyaW5nXTpcbiAgICB8IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD5cbiAgICB8ICgoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQpO1xuXG4gIGNvbnN0cnVjdG9yKGVycm9yczogTW9kZWxFcnJvcnMpIHtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gZXJyb3JzKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9ycywgcHJvcCkgJiYgZXJyb3JzW3Byb3BdKVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyBhcyBhbnksIHByb3AsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgdmFsdWU6IGVycm9yc1twcm9wXSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBPdXRwdXRzIHRoZSBjbGFzcyB0byBhIG5pY2UgcmVhZGFibGUgc3RyaW5nXG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWxmOiBhbnkgPSB0aGlzIGFzIGFueTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc2VsZilcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChrKSA9PlxuICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZWxmLCBrKSAmJlxuICAgICAgICAgIHR5cGVvZiBzZWxmW2tdICE9PSBcImZ1bmN0aW9uXCJcbiAgICAgIClcbiAgICAgIC5yZWR1Y2UoKGFjY3VtOiBzdHJpbmcsIHByb3ApID0+IHtcbiAgICAgICAgbGV0IHByb3BFcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gT2JqZWN0LmtleXMoc2VsZltwcm9wXSkucmVkdWNlKFxuICAgICAgICAgIChwcm9wQWNjdW06IHVuZGVmaW5lZCB8IHN0cmluZywga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXByb3BBY2N1bSkgcHJvcEFjY3VtID0gc2VsZltwcm9wXVtrZXldO1xuICAgICAgICAgICAgZWxzZSBwcm9wQWNjdW0gKz0gYFxcbiR7c2VsZltwcm9wXVtrZXldfWA7XG4gICAgICAgICAgICByZXR1cm4gcHJvcEFjY3VtO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHByb3BFcnJvcikge1xuICAgICAgICAgIHByb3BFcnJvciA9IGAke3Byb3B9IC0gJHtwcm9wRXJyb3J9YDtcbiAgICAgICAgICBpZiAoIWFjY3VtKSBhY2N1bSA9IHByb3BFcnJvcjtcbiAgICAgICAgICBlbHNlIGFjY3VtICs9IGBcXG4ke3Byb3BFcnJvcn1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgXCJcIik7XG4gIH1cbn1cbiIsImltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3N0cmluZ3NcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgUGF0aFByb3h5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IENvbmRpdGlvbmFsQXN5bmMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIHZhbGlkYXRvcnMgaW4gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLlxuICogQHN1bW1hcnkgVGhlIEJhc2VWYWxpZGF0b3IgY2xhc3MgcHJvdmlkZXMgdGhlIGZvdW5kYXRpb24gZm9yIGFsbCBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbnMuXG4gKiBJdCBoYW5kbGVzIHR5cGUgY2hlY2tpbmcsIGVycm9yIG1lc3NhZ2UgZm9ybWF0dGluZywgYW5kIGRlZmluZXMgdGhlIGludGVyZmFjZSB0aGF0IGFsbCB2YWxpZGF0b3JzIG11c3QgaW1wbGVtZW50LlxuICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBleHRlbmRlZCBieSBzcGVjaWZpYyB2YWxpZGF0b3IgY2xhc3NlcyB0aGF0IGRlZmluZSB0aGVpciBvd24gdmFsaWRhdGlvbiBsb2dpYy5cbiAqXG4gKiBAdGVtcGxhdGUgViAtIFZhbGlkYXRvciBvcHRpb25zIHR5cGVcbiAqIEB0ZW1wbGF0ZSBJc0FzeW5jIC0gV2hldGhlciB0aGUgdmFsaWRhdG9yIGlzIGFzeW5jICh0cnVlKSBvciBzeW5jIChmYWxzZSkuIERlZmF1bHQgYGZhbHNlYC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFzeW5jIC0gRGVmaW5lcyBpZiB0aGUgdmFsaWRhdG9yIGlzIGFzeW5jIChtdXN0IG1hdGNoIHRoZSBzdWJjbGFzcyBzaWduYXR1cmUpXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIERlZmF1bHQgZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscyAoZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjREVGQVVMVH0pXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhY2NlcHRlZFR5cGVzIC0gVHlwZSBuYW1lcyB0aGF0IHRoaXMgdmFsaWRhdG9yIGFjY2VwdHMgKHVzZWQgZm9yIHJ1bnRpbWUgdHlwZSBjaGVja2luZylcbiAqXG4gKiBAY2xhc3MgQmFzZVZhbGlkYXRvclxuICogQGFic3RyYWN0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgb2YgYSBzeW5jaHJvbm91cyB2YWxpZGF0b3JcbiAqIGNsYXNzIFN5bmNWYWxpZGF0b3IgZXh0ZW5kcyBCYXNlVmFsaWRhdG9yPFNvbWVPcHRpb25zLCBmYWxzZT4ge1xuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICBzdXBlcihmYWxzZSwgXCJTeW5jIHZhbGlkYXRpb24gZmFpbGVkXCIsIFN0cmluZy5uYW1lKTtcbiAqICAgfVxuICpcbiAqICAgcHVibGljIGhhc0Vycm9ycyh2YWx1ZTogYW55LCBvcHRpb25zPzogU29tZU9wdGlvbnMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICogICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB0aGlzLmdldE1lc3NhZ2UodGhpcy5tZXNzYWdlKTtcbiAqICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICogICB9XG4gKiB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgb2YgYW4gYXN5bmNocm9ub3VzIGN1c3RvbSB2YWxpZGF0b3JcbiAqIGNsYXNzIEFzeW5jVmFsaWRhdG9yIGV4dGVuZHMgQmFzZVZhbGlkYXRvcjxTb21lT3B0aW9ucywgdHJ1ZT4ge1xuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICBzdXBlcih0cnVlLCBcIkFzeW5jIHZhbGlkYXRpb24gZmFpbGVkXCIsIFN0cmluZy5uYW1lKTtcbiAqICAgfVxuICpcbiAqICAgcHVibGljIGFzeW5jIGhhc0Vycm9ycyh2YWx1ZTogYW55LCBvcHRpb25zPzogU29tZU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICogICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNvbWVBc3luY0NoZWNrKHZhbHVlKTtcbiAqICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZSh0aGlzLm1lc3NhZ2UpO1xuICogICAgIHJldHVybiB1bmRlZmluZWQ7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFYgYXMgVmFsaWRhdG9yIFN1YmNsYXNzXG4gKiAgIHBhcnRpY2lwYW50IEIgYXMgQmFzZVZhbGlkYXRvclxuICpcbiAqICAgQy0+PlY6IG5ldyBDdXN0b21WYWxpZGF0b3IoYXN5bmMsIG1lc3NhZ2UpXG4gKiAgIFYtPj5COiBzdXBlcihhc3luYywgbWVzc2FnZSwgYWNjZXB0ZWRUeXBlcylcbiAqICAgQi0+PkI6IFN0b3JlIG1lc3NhZ2UsIGFzeW5jIGZsYWcsIGFuZCBhY2NlcHRlZCB0eXBlc1xuICogICBCLT4+QjogT3B0aW9uYWxseSB3cmFwIGhhc0Vycm9ycyB3aXRoIHR5cGUgY2hlY2tpbmdcbiAqICAgQy0+PlY6IGhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucylcbiAqICAgYWx0IHZhbHVlIHR5cGUgbm90IGluIGFjY2VwdGVkVHlwZXNcbiAqICAgICBCLS0+PkM6IFR5cGUgZXJyb3IgbWVzc2FnZVxuICogICBlbHNlIHZhbHVlIHR5cGUgaXMgYWNjZXB0ZWRcbiAqICAgICBWLT4+VjogQ3VzdG9tIHZhbGlkYXRpb24gbG9naWNcbiAqICAgICBWLS0+PkM6IFZhbGlkYXRpb24gcmVzdWx0XG4gKiAgIGVuZFxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlVmFsaWRhdG9yPFxuICBWIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyA9IFZhbGlkYXRvck9wdGlvbnMsXG4gIEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPiB7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbiAgcmVhZG9ubHkgYWNjZXB0ZWRUeXBlcz86IHN0cmluZ1tdO1xuICByZWFkb25seSBhc3luYz86IEFzeW5jO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBhc3luYzogQXN5bmMsXG4gICAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5ERUZBVUxULFxuICAgIC4uLmFjY2VwdGVkVHlwZXM6IHN0cmluZ1tdXG4gICkge1xuICAgIHRoaXMuYXN5bmMgPSBhc3luYztcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuXG4gICAgaWYgKGFjY2VwdGVkVHlwZXMubGVuZ3RoKSB0aGlzLmFjY2VwdGVkVHlwZXMgPSBhY2NlcHRlZFR5cGVzO1xuICAgIGlmICh0aGlzLmFjY2VwdGVkVHlwZXMpXG4gICAgICB0aGlzLmhhc0Vycm9ycyA9IHRoaXMuY2hlY2tUeXBlQW5kSGFzRXJyb3JzKFxuICAgICAgICB0aGlzLmhhc0Vycm9ycy5iaW5kKHRoaXMpIGFzIGFueVxuICAgICAgKSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZvcm1hdHMgYW4gZXJyb3IgbWVzc2FnZSB3aXRoIG9wdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgZm9ybWF0dGVkIGVycm9yIG1lc3NhZ2UgYnkgcmVwbGFjaW5nIHBsYWNlaG9sZGVycyB3aXRoIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogVGhpcyBtZXRob2QgdXNlcyB0aGUgc3RyaW5nIGZvcm1hdHRpbmcgdXRpbGl0eSB0byBnZW5lcmF0ZSBjb25zaXN0ZW50IGVycm9yIG1lc3NhZ2VzXG4gICAqIGFjcm9zcyBhbGwgdmFsaWRhdG9ycy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0ZW1wbGF0ZSB3aXRoIHBsYWNlaG9sZGVyc1xuICAgKiBAcGFyYW0gey4uLmFueX0gYXJncyAtIFZhbHVlcyB0byBpbnNlcnQgaW50byB0aGUgbWVzc2FnZSB0ZW1wbGF0ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0TWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgcmV0dXJuIHNmKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgdHlwZS1jaGVja2luZyB3cmFwcGVyIGFyb3VuZCB0aGUgaGFzRXJyb3JzIG1ldGhvZFxuICAgKiBAc3VtbWFyeSBXcmFwcyB0aGUgaGFzRXJyb3JzIG1ldGhvZCB3aXRoIHR5cGUgdmFsaWRhdGlvbiBsb2dpYyB0byBlbnN1cmUgdGhhdFxuICAgKiB0aGUgdmFsdWUgYmVpbmcgdmFsaWRhdGVkIGlzIG9mIGFuIGFjY2VwdGVkIHR5cGUgYmVmb3JlIHBlcmZvcm1pbmcgc3BlY2lmaWMgdmFsaWRhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBjb25zdHJ1Y3Rpb24gaWYgYWNjZXB0ZWRUeXBlcyBhcmUgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHVuYm91bmQgLSBUaGUgb3JpZ2luYWwgaGFzRXJyb3JzIG1ldGhvZCB0byBiZSB3cmFwcGVkXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIHR5cGUgY2hlY2tpbmcgYmVmb3JlIGNhbGxpbmcgdGhlIG9yaWdpbmFsIG1ldGhvZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja1R5cGVBbmRIYXNFcnJvcnMoXG4gICAgdW5ib3VuZDogKFxuICAgICAgdmFsdWU6IGFueSxcbiAgICAgIG9wdGlvbnM/OiBWLFxuICAgICAgcHJveHk/OiBQYXRoUHJveHk8YW55PixcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKSA9PiBDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBzdHJpbmcgfCB1bmRlZmluZWQ+XG4gICkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoXG4gICAgICB0aGlzOiBCYXNlVmFsaWRhdG9yLFxuICAgICAgdmFsdWU6IGFueSxcbiAgICAgIG9wdGlvbnM6IFYsXG4gICAgICBwcm94eT86IFBhdGhQcm94eTxhbnk+LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLmFjY2VwdGVkVHlwZXMpXG4gICAgICAgIHJldHVybiB1bmJvdW5kKHZhbHVlLCBvcHRpb25zLCBwcm94eSwgLi4uYXJncyk7XG4gICAgICBpZiAoIVJlZmxlY3Rpb24uY2hlY2tUeXBlcyh2YWx1ZSwgdGhpcy5hY2NlcHRlZFR5cGVzKSlcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShcbiAgICAgICAgICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRZUEUsXG4gICAgICAgICAgdGhpcy5hY2NlcHRlZFR5cGVzLmpvaW4oXCIsIFwiKSxcbiAgICAgICAgICB0eXBlb2YgdmFsdWVcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB1bmJvdW5kKHZhbHVlLCBvcHRpb25zLCBwcm94eSwgLi4uYXJncyk7XG4gICAgfS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgYSB2YWx1ZSBhZ2FpbnN0IHNwZWNpZmljIHZhbGlkYXRpb24gcnVsZXNcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgdmFsaWRhdG9yIHN1YmNsYXNzZXMuXG4gICAqIFRoaXMgbWV0aG9kIGNvbnRhaW5zIHRoZSBjb3JlIHZhbGlkYXRpb24gbG9naWMgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgYSB2YWx1ZVxuICAgKiBpcyB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljIHJ1bGVzIG9mIHRoZSB2YWxpZGF0b3IuIElmIHRoZSB2YWx1ZSBpcyB2YWxpZCxcbiAgICogdGhlIG1ldGhvZCByZXR1cm5zIHVuZGVmaW5lZDsgb3RoZXJ3aXNlLCBpdCByZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBvZiB0aGUgb3B0aW9ucyBvYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSB2YWxpZGF0b3JcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7Vn0gW29wdGlvbnNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBjdXN0b21pemluZyB2YWxpZGF0aW9uIGJlaGF2aW9yXG4gICAqIEBwYXJhbSB7UGF0aFByb3h5PGFueT59IHByb3h5IC1cbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICpcbiAgICogQHNlZSBNb2RlbCN2YWxpZGF0ZVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM/OiBWLFxuICAgIHByb3h5PzogUGF0aFByb3h5PGFueT5cbiAgKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcblxuICAvKipcbiAgICogQHN1bW1hcnkgRHVjayB0eXBpbmcgZm9yIFZhbGlkYXRvcnNcbiAgICogQHBhcmFtIHZhbFxuICAgKi9cbiAgc3RhdGljIGlzVmFsaWRhdG9yKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbC5jb25zdHJ1Y3RvciAmJiAhIXZhbFtcImhhc0Vycm9yc1wiXTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQYXRoUHJveHkgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IEJhc2VWYWxpZGF0b3IgfSBmcm9tIFwiLi9CYXNlVmFsaWRhdG9yXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBYnN0cmFjdCBjbGFzcyBmb3IgZGVmaW5pbmcgc3luY2hyb25vdXMgdmFsaWRhdG9ycy5cbiAqXG4gKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIGJhc2Uge0BsaW5rIEJhc2VWYWxpZGF0b3J9IGFuZCBlbmZvcmNlcyB0aGF0IGFueSBpbXBsZW1lbnRhdGlvbiBvZiBgaGFzRXJyb3JzYCBtdXN0IGJlIHN5bmNocm9ub3VzLlxuICpcbiAqIFVzZSB0aGlzIHdoZW4gdGhlIHZhbGlkYXRpb24gcHJvY2VzcyBpcyBpbW1lZGlhdGUgYW5kIGRvZXMgbm90IHJlcXVpcmUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgb2YgYSBzeW5jaHJvbm91cyB2YWxpZGF0b3IgdGhhdCBjaGVja3MgaWYgYSBudW1iZXIgaXMgZ3JlYXRlciB0aGFuXG4gKiBjbGFzcyBHcmVhdGVyVGhhblZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjx7IGd0PzogbnVtYmVyIH0+IHtcbiAqICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gXCJWYWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB7MH1cIikge1xuICogICAgIHN1cGVyKG1lc3NhZ2UpO1xuICogICB9XG4gKlxuICogICBoYXNFcnJvcnModmFsdWU6IG51bWJlciwgb3B0aW9ucz86IHsgZ3Q/OiBudW1iZXIgfSkge1xuICogICAgIGNvbnN0IG1pblZhbHVlID0gb3B0aW9ucz8uZ3QgPz8gMDtcbiAqICAgICBpZiAodmFsdWUgPD0gbWluVmFsdWUpIHtcbiAqICAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoKTtcbiAqICAgICB9XG4gKiAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIEV4YW1wbGUgdXNhZ2U6XG4gKiBjb25zdCB2YWxpZGF0b3IgPSBuZXcgR3JlYXRlclRoYW5WYWxpZGF0b3IoKTtcbiAqIGNvbnN0IGVycm9yID0gdmFsaWRhdG9yLmhhc0Vycm9ycygxMCwgeyBndDogMTUgfSk7XG4gKiBpZiAoZXJyb3IpIHtcbiAqICAgY29uc29sZS5sb2coJ1ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDE1JylcbiAqIH0gZWxzZSB7XG4gKiAgIGNvbnNvbGUubG9nKCdWYWx1ZSBpcyB2YWxpZCcpO1xuICogfVxuICogYGBgXG4gKlxuICogLSBJZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgZ3RgLCByZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlLlxuICogLSBPdGhlcndpc2UsIHJldHVybnMgYHVuZGVmaW5lZGAgaW5kaWNhdGluZyB2YWxpZGF0aW9uIHN1Y2Nlc3MuXG4gKlxuICogQHNlZSB7QGxpbmsgQmFzZVZhbGlkYXRvcn0gRm9yIHRoZSBiYXNlIHZhbGlkYXRvci5cbiAqIEBzZWUge0BsaW5rIFZhbGlkYXRvck9wdGlvbnN9IEZvciB0aGUgYmFzZSB2YWxpZGF0b3Igb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZhbGlkYXRvcjxcbiAgViBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMgPSBWYWxpZGF0b3JPcHRpb25zLFxuPiBleHRlbmRzIEJhc2VWYWxpZGF0b3I8ViwgZmFsc2U+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREVGQVVMVCxcbiAgICAuLi5hY2NlcHRlZFR5cGVzOiBzdHJpbmdbXVxuICApIHtcbiAgICBzdXBlcihmYWxzZSwgbWVzc2FnZSwgLi4uYWNjZXB0ZWRUeXBlcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBhIHZhbHVlIGFnYWluc3Qgc3BlY2lmaWMgdmFsaWRhdGlvbiBydWxlc1xuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGFsbCB2YWxpZGF0b3Igc3ViY2xhc3Nlcy5cbiAgICogVGhpcyBtZXRob2QgY29udGFpbnMgdGhlIGNvcmUgdmFsaWRhdGlvbiBsb2dpYyB0aGF0IGRldGVybWluZXMgd2hldGhlciBhIHZhbHVlXG4gICAqIGlzIHZhbGlkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWMgcnVsZXMgb2YgdGhlIHZhbGlkYXRvci4gSWYgdGhlIHZhbHVlIGlzIHZhbGlkLFxuICAgKiB0aGUgbWV0aG9kIHJldHVybnMgdW5kZWZpbmVkOyBvdGhlcndpc2UsIGl0IHJldHVybnMgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICpcbiAgICogQHRlbXBsYXRlIFYgLSBUeXBlIG9mIHRoZSBvcHRpb25zIG9iamVjdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIHZhbGlkYXRvclxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtWfSBbb3B0aW9uc10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGN1c3RvbWl6aW5nIHZhbGlkYXRpb24gYmVoYXZpb3JcbiAgICogQHBhcmFtIHtQYXRoUHJveHk8YW55Pn0gcHJveHkgLVxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKlxuICAgKiBAc2VlIE1vZGVsI3ZhbGlkYXRlXG4gICAqL1xuICBhYnN0cmFjdCBvdmVycmlkZSBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zPzogVixcbiAgICBwcm94eT86IFBhdGhQcm94eTxhbnk+XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvckRlZmluaXRpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IElWYWxpZGF0b3JSZWdpc3RyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgQmFzZSBJbXBsZW1lbnRhdGlvbiBvZiBhIFZhbGlkYXRvciBSZWdpc3RyeVxuICpcbiAqIEBwcm9wIHtWYWxpZGF0b3JbXX0gW3ZhbGlkYXRvcnNdIHRoZSBpbml0aWFsIHZhbGlkYXRvcnMgdG8gcmVnaXN0ZXJcbiAqXG4gKiBAY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnlcbiAqIEBpbXBsZW1lbnRzIElWYWxpZGF0b3JSZWdpc3RyeTxUPlxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeTxUIGV4dGVuZHMgVmFsaWRhdG9yPlxuICBpbXBsZW1lbnRzIElWYWxpZGF0b3JSZWdpc3RyeTxUPlxue1xuICBwcml2YXRlIGNhY2hlOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBjdXN0b21LZXlDYWNoZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICBjb25zdHJ1Y3RvciguLi52YWxpZGF0b3JzOiAoVmFsaWRhdG9yRGVmaW5pdGlvbiB8IFZhbGlkYXRvcilbXSkge1xuICAgIHRoaXMuY3VzdG9tS2V5Q2FjaGUgPSB7fTtcbiAgICB0aGlzLnJlZ2lzdGVyKC4uLnZhbGlkYXRvcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHJldHJpZXZlcyB0aGUgY3VzdG9tIGtleXNcbiAgICovXG4gIGdldEN1c3RvbUtleXMoKTogeyBbaW5kZXhlcjogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmN1c3RvbUtleUNhY2hlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSByZXRyaWV2ZXMgdGhlIHJlZ2lzdGVyZWQgdmFsaWRhdG9ycyBrZXlzXG4gICAqL1xuICBnZXRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5jYWNoZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgdmFsaWRhdG9yXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWxpZGF0b3JLZXkgb25lIG9mIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXN9XG4gICAqIEByZXR1cm4ge1ZhbGlkYXRvciB8IHVuZGVmaW5lZH0gdGhlIHJlZ2lzdGVyZWQgVmFsaWRhdG9yIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBub25vIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBrZXlcbiAgICovXG4gIGdldDxUIGV4dGVuZHMgVmFsaWRhdG9yPih2YWxpZGF0b3JLZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIGlmICghKHZhbGlkYXRvcktleSBpbiB0aGlzLmNhY2hlKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNsYXNzT3JJbnN0YW5jZSA9IHRoaXMuY2FjaGVbdmFsaWRhdG9yS2V5XTtcbiAgICBpZiAoVmFsaWRhdG9yLmlzVmFsaWRhdG9yKGNsYXNzT3JJbnN0YW5jZSkpIHJldHVybiBjbGFzc09ySW5zdGFuY2UgYXMgVDtcbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9IGNsYXNzT3JJbnN0YW5jZS5kZWZhdWx0IHx8IGNsYXNzT3JJbnN0YW5jZTtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb25zdHJ1Y3RvcigpO1xuICAgIHRoaXMuY2FjaGVbdmFsaWRhdG9yS2V5XSA9IGluc3RhbmNlO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgdGhlIHByb3ZpZGVkIHZhbGlkYXRvcnMgb250byB0aGUgcmVnaXN0cnlcbiAgICpcbiAgICogQHBhcmFtIHtUW10gfCBWYWxpZGF0b3JEZWZpbml0aW9uW119IHZhbGlkYXRvclxuICAgKi9cbiAgcmVnaXN0ZXI8VCBleHRlbmRzIFZhbGlkYXRvcj4oXG4gICAgLi4udmFsaWRhdG9yOiAoVmFsaWRhdG9yRGVmaW5pdGlvbiB8IFQpW11cbiAgKTogdm9pZCB7XG4gICAgdmFsaWRhdG9yLmZvckVhY2goKHYpID0+IHtcbiAgICAgIGlmIChWYWxpZGF0b3IuaXNWYWxpZGF0b3IodikpIHtcbiAgICAgICAgLy8gY29uc3QgayA9XG5cbiAgICAgICAgaWYgKCh2IGFzIFZhbGlkYXRvckRlZmluaXRpb24pLnZhbGlkYXRpb25LZXkgaW4gdGhpcy5jYWNoZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmNhY2hlWyh2IGFzIFZhbGlkYXRvckRlZmluaXRpb24pLnZhbGlkYXRpb25LZXldID0gdjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgdmFsaWRhdGlvbktleSwgdmFsaWRhdG9yLCBzYXZlIH0gPSB2IGFzIFZhbGlkYXRvckRlZmluaXRpb247XG4gICAgICAgIGlmICh2YWxpZGF0aW9uS2V5IGluIHRoaXMuY2FjaGUpIHJldHVybjtcbiAgICAgICAgdGhpcy5jYWNoZVt2YWxpZGF0aW9uS2V5XSA9IHZhbGlkYXRvcjtcbiAgICAgICAgaWYgKCFzYXZlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBvYmpbdmFsaWRhdGlvbktleS50b1VwcGVyQ2FzZSgpXSA9IHZhbGlkYXRpb25LZXk7XG5cbiAgICAgICAgdGhpcy5jdXN0b21LZXlDYWNoZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY3VzdG9tS2V5Q2FjaGUsIG9iaik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvcnMvVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBJVmFsaWRhdG9yUmVnaXN0cnksIFZhbGlkYXRvckRlZmluaXRpb24gfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgVmFsaWRhdG9yUmVnaXN0cnkgfSBmcm9tIFwiLi9WYWxpZGF0b3JzL1ZhbGlkYXRvclJlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL1ZhbGlkYXRvcnMvY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgU3RhdGljIGNsYXNzIGFjdGluZyBhcyBhIG5hbWVzcGFjZSBmb3IgdGhlIFZhbGlkYXRpb25cbiAqXG4gKiBAY2xhc3MgVmFsaWRhdGlvblxuICogQHN0YXRpY1xuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uIHtcbiAgcHJpdmF0ZSBzdGF0aWMgYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnk/OiBJVmFsaWRhdG9yUmVnaXN0cnk8VmFsaWRhdG9yPiA9XG4gICAgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgc3RhdGljIGxvYWRlZERlY29yYXRvcnM6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5RGVjb3JhdG9yPiA9IHt9O1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgYWN0aW5nIFZhbGlkYXRvclJlZ2lzdHJ5XG4gICAqXG4gICAqIEBwYXJhbSB7SVZhbGlkYXRvclJlZ2lzdHJ5fSB2YWxpZGF0b3JSZWdpc3RyeSB0aGUgbmV3IGltcGxlbWVudGF0aW9uIG9mIHRoZSB2YWxpZGF0b3IgUmVnaXN0cnlcbiAgICogQHBhcmFtIHtmdW5jdGlvbihWYWxpZGF0b3IpOiBWYWxpZGF0b3J9IFttaWdyYXRpb25IYW5kbGVyXSB0aGUgbWV0aG9kIHRvIG1hcCB0aGUgdmFsaWRhdG9yIGlmIHJlcXVpcmVkO1xuICAgKi9cbiAgc3RhdGljIHNldFJlZ2lzdHJ5KFxuICAgIHZhbGlkYXRvclJlZ2lzdHJ5OiBJVmFsaWRhdG9yUmVnaXN0cnk8VmFsaWRhdG9yPixcbiAgICBtaWdyYXRpb25IYW5kbGVyPzogKHZhbGlkYXRvcjogVmFsaWRhdG9yKSA9PiBWYWxpZGF0b3JcbiAgKSB7XG4gICAgaWYgKG1pZ3JhdGlvbkhhbmRsZXIgJiYgVmFsaWRhdGlvbi5hY3RpbmdWYWxpZGF0b3JSZWdpc3RyeSlcbiAgICAgIFZhbGlkYXRpb24uYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnkuZ2V0S2V5cygpLmZvckVhY2goKGs6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB2YWxpZGF0b3JSZWdpc3RyeS5nZXQoayk7XG4gICAgICAgIGlmICh2YWxpZGF0b3IpIHZhbGlkYXRvclJlZ2lzdHJ5LnJlZ2lzdGVyKG1pZ3JhdGlvbkhhbmRsZXIodmFsaWRhdG9yKSk7XG4gICAgICB9KTtcbiAgICBWYWxpZGF0aW9uLmFjdGluZ1ZhbGlkYXRvclJlZ2lzdHJ5ID0gdmFsaWRhdG9yUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY3VycmVudCBWYWxpZGF0b3JSZWdpc3RyeVxuICAgKlxuICAgKiBAcmV0dXJuIElWYWxpZGF0b3JSZWdpc3RyeSwgZGVmYXVsdHMgdG8ge0BsaW5rIFZhbGlkYXRvclJlZ2lzdHJ5fVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVnaXN0cnkoKSB7XG4gICAgaWYgKCFWYWxpZGF0aW9uLmFjdGluZ1ZhbGlkYXRvclJlZ2lzdHJ5KVxuICAgICAgVmFsaWRhdGlvbi5hY3RpbmdWYWxpZGF0b3JSZWdpc3RyeSA9IG5ldyBWYWxpZGF0b3JSZWdpc3RyeSgpO1xuICAgIHJldHVybiBWYWxpZGF0aW9uLmFjdGluZ1ZhbGlkYXRvclJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHZhbGlkYXRvclxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsaWRhdG9yS2V5IG9uZSBvZiB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzfVxuICAgKiBAcmV0dXJuIHtWYWxpZGF0b3IgfCB1bmRlZmluZWR9IHRoZSByZWdpc3RlcmVkIFZhbGlkYXRvciBvciB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm9ubyBtYXRjaGluZyB0aGUgcHJvdmlkZWQga2V5XG4gICAqL1xuICBzdGF0aWMgZ2V0PFQgZXh0ZW5kcyBWYWxpZGF0b3I+KHZhbGlkYXRvcktleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIFZhbGlkYXRpb24uZ2V0UmVnaXN0cnkoKS5nZXQodmFsaWRhdG9yS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgdGhlIHByb3ZpZGVkIHZhbGlkYXRvcnMgb250byB0aGUgcmVnaXN0cnlcbiAgICpcbiAgICogQHBhcmFtIHtUW10gfCBWYWxpZGF0b3JEZWZpbml0aW9uW119IHZhbGlkYXRvclxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBWYWxpZGF0b3I+KFxuICAgIC4uLnZhbGlkYXRvcjogKFZhbGlkYXRvckRlZmluaXRpb24gfCBUKVtdXG4gICk6IHZvaWQge1xuICAgIHJldHVybiBWYWxpZGF0aW9uLmdldFJlZ2lzdHJ5KCkucmVnaXN0ZXIoLi4udmFsaWRhdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBCdWlsZHMgdGhlIGtleSB0byBzdG9yZSBhcyBNZXRhZGF0YSB1bmRlciBSZWZsZWN0aW9uc1xuICAgKiBAZGVzY3JpcHRpb24gY29uY2F0ZW5hdGVzIHtAbGluayBWYWxpZGF0aW9uS2V5cyNSRUZMRUNUfSB3aXRoIHRoZSBwcm92aWRlZCBrZXlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKi9cbiAgc3RhdGljIGtleShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUICsga2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYWxsIHJlZ2lzdGVyZWQgdmFsaWRhdGlvbiBrZXlzXG4gICAqL1xuICBzdGF0aWMga2V5cygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZWdpc3RyeSgpLmdldEtleXMoKTtcbiAgfVxuXG4gIHN0YXRpYyByZWdpc3RlckRlY29yYXRvcihrZXk6IHN0cmluZywgZGVjb3JhdG9yOiBQcm9wZXJ0eURlY29yYXRvcikge1xuICAgIGlmIChrZXkgaW4gdGhpcy5sb2FkZWREZWNvcmF0b3JzKSByZXR1cm47XG4gICAgdGhpcy5sb2FkZWREZWNvcmF0b3JzW2tleV0gPSBkZWNvcmF0b3I7XG4gIH1cblxuICBzdGF0aWMgZGVjb3JhdG9yRnJvbUtleShrZXk6IHN0cmluZykge1xuICAgIGlmICghKGtleSBpbiB0aGlzLmxvYWRlZERlY29yYXRvcnMpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBkZWNvcmF0b3IgcmVnaXN0ZXJlZCB1bmRlciAke2tleX1gKTtcbiAgICByZXR1cm4gdGhpcy5sb2FkZWREZWNvcmF0b3JzW2tleV07XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbmRpdGlvbmFsQXN5bmMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsS2V5KHN0cjogc3RyaW5nKSB7XG4gIHJldHVybiBNb2RlbEtleXMuUkVGTEVDVCArIHN0cjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgIGdldE1vZGVsS2V5KE1vZGVsS2V5cy5NT0RFTCksXG4gICAgbW9kZWwuY29uc3RydWN0b3JcbiAgKTtcbiAgaWYgKCFtZXRhZGF0YSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImNvdWxkIG5vdCBmaW5kIG1ldGFkYXRhIGZvciBwcm92aWRlZCBcIiArIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWVcbiAgICApO1xuICByZXR1cm4gbWV0YWRhdGE7XG59XG5cbi8qKlxuICogV3JhcHMgYSB2YWx1ZSBpbiBhIFByb21pc2UgaWYgdGhlIGBhc3luY2AgZmxhZyBpcyB0cnVlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGJlaW5nIHdyYXBwZWQuXG4gKiBAdGVtcGxhdGUgQXN5bmMgLSBBIGJvb2xlYW4gdHlwZSB0aGF0IGRldGVybWluZXMgaWYgdGhlIHJlc3VsdCBzaG91bGQgYmUgd3JhcHBlZCBpbiBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHJldHVybiBkaXJlY3RseSBvciB3cmFwIGluIGEgUHJvbWlzZS5cbiAqIEBwYXJhbSBhc3luYyAtIElmIHRydWUsIHRoZSB2YWx1ZSBpcyB3cmFwcGVkIGluIGEgcmVzb2x2ZWQgUHJvbWlzZS4gSWYgZmFsc2Ugb3IgdW5kZWZpbmVkLCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgYXMtaXMuXG4gKlxuICogQHJldHVybnMgVGhlIG9yaWdpbmFsIHZhbHVlIG9yIGEgUHJvbWlzZSByZXNvbHZpbmcgdG8gaXQsIGRlcGVuZGluZyBvbiB0aGUgYGFzeW5jYCBmbGFnLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Db25kaXRpb25hbFByb21pc2U8VCwgQXN5bmMgZXh0ZW5kcyBib29sZWFuPihcbiAgdmFsdWU6IFQsXG4gIGFzeW5jPzogQXN5bmNcbik6IENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIFQ+IHtcbiAgcmV0dXJuIChhc3luYyA/IFByb21pc2UucmVzb2x2ZSh2YWx1ZSkgOiB2YWx1ZSkgYXMgQ29uZGl0aW9uYWxBc3luYzxBc3luYywgVD47XG59XG4iLCJpbXBvcnQgeyBNb2RlbEVycm9yRGVmaW5pdGlvbiB9IGZyb20gXCIuL01vZGVsRXJyb3JEZWZpbml0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuL01vZGVsXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi4vdmFsaWRhdGlvbi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgTW9kZWxFcnJvcnMsXG4gIFR5cGVWYWxpZGF0b3JPcHRpb25zLFxuICBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uLFxuICBWYWxpZGF0b3JPcHRpb25zLFxufSBmcm9tIFwiLi4vdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGF0aFByb3h5RW5naW5lIH0gZnJvbSBcIi4uL3V0aWxzL1BhdGhQcm94eVwiO1xuaW1wb3J0IHsgQVNZTkNfTUVUQV9LRVksIFZBTElEQVRJT05fUEFSRU5UX0tFWSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbmRpdGlvbmFsQXN5bmMsIERlY29yYXRvck1ldGFkYXRhQXN5bmMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IHRvQ29uZGl0aW9uYWxQcm9taXNlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHZhbGlkYXRpb24gbWV0YWRhdGEgZGVjb3JhdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBwcm9wZXJ0eSBvZiBhIG1vZGVsLFxuICogdXNpbmcgdGhlIHJlZmxlY3RpdmUgbWV0YWRhdGEga2V5LlxuICpcbiAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjbGFzcyBjb250YWluaW5nIHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcCAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aG9zZSBkZWNvcmF0b3JzIHNob3VsZCBiZSByZXRyaWV2ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVmbGVjdEtleSAtIFRoZSBtZXRhZGF0YSBrZXkgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGVjb3JhdG9ycy5cbiAqICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gYFZhbGlkYXRpb25LZXlzLlJFRkxFQ1RgLlxuICpcbiAqIEByZXR1cm5zIFRoZSB2YWxpZGF0aW9uIGRlY29yYXRvcnMgYXBwbGllZCB0byB0aGUgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbGlkYXRpb25EZWNvcmF0b3JzKFxuICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcHJvcDogc3RyaW5nLFxuICByZWZsZWN0S2V5OiBzdHJpbmcgPSBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUXG4pOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uIHtcbiAgcmV0dXJuIFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgIHJlZmxlY3RLZXksXG4gICAgbW9kZWwsXG4gICAgcHJvcFxuICApIGFzIHVua25vd24gYXMgVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHJpZXZlcyBhbGwgdmFsaWRhdGFibGUgcHJvcGVydHkgZGVjb3JhdG9ycyBmcm9tIGEgZ2l2ZW4gbW9kZWwsIGV4Y2x1ZGluZyBzcGVjaWZpZWQgcHJvcGVydGllcy5cbiAqXG4gKiBAc3VtbWFyeVxuICogSXRlcmF0ZXMgdGhyb3VnaCB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBhIG1vZGVsIGluc3RhbmNlLCBmaWx0ZXJpbmcgb3V0IGFueSBwcm9wZXJ0aWVzXG4gKiBsaXN0ZWQgaW4gdGhlIGBwcm9wc1RvSWdub3JlYCBhcnJheS4gRm9yIGVhY2ggcmVtYWluaW5nIHByb3BlcnR5LCBpdCBjaGVja3Mgd2hldGhlciB2YWxpZGF0aW9uXG4gKiBkZWNvcmF0b3JzIGFyZSBwcmVzZW50IHVzaW5nIGBnZXRWYWxpZGF0aW9uRGVjb3JhdG9yc2AsIGFuZCBpZiBzbywgY29sbGVjdHMgdGhlbSBpbiB0aGUgcmVzdWx0IGFycmF5LlxuICpcbiAqIEB0ZW1wbGF0ZSBNIC0gQSBnZW5lcmljIHBhcmFtZXRlciBleHRlbmRpbmcgdGhlIGBNb2RlbGAgY2xhc3MsIHJlcHJlc2VudGluZyB0aGUgbW9kZWwgdHlwZSBiZWluZyBpbnNwZWN0ZWQuXG4gKlxuICogQHBhcmFtIHtNfSBtb2RlbCAtIEFuIGluc3RhbmNlIG9mIGEgY2xhc3MgZXh0ZW5kaW5nIGBNb2RlbGAgZnJvbSB3aGljaCB2YWxpZGF0YWJsZSBwcm9wZXJ0aWVzIHdpbGwgYmUgZXh0cmFjdGVkLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHNUb0lnbm9yZSAtIEFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdmFsaWRhdGlvbiBpbnNwZWN0aW9uLlxuICpcbiAqIEByZXR1cm4ge1ZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb25bXX0gQW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBkZWNvcmF0b3IgZGVmaW5pdGlvbnNcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZWwncyBwcm9wZXJ0aWVzLCBleGNsdWRpbmcgdGhvc2UgbGlzdGVkIGluIGBwcm9wc1RvSWdub3JlYC5cbiAqXG4gKiBAZnVuY3Rpb24gZ2V0VmFsaWRhdGFibGVQcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10ge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHByb3AgaW4gbW9kZWwpIHtcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIHByb3ApICYmXG4gICAgICAhcHJvcHNUb0lnbm9yZS5pbmNsdWRlcyhwcm9wKVxuICAgICkge1xuICAgICAgY29uc3QgZGVjID0gZ2V0VmFsaWRhdGlvbkRlY29yYXRvcnMobW9kZWwsIHByb3ApO1xuICAgICAgaWYgKGRlYykgZGVjb3JhdGVkUHJvcGVydGllcy5wdXNoKGRlYyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlY29yYXRlZFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogU2FmZWx5IHNldHMgdGVtcG9yYXJ5IG1ldGFkYXRhIG9uIGFuIG9iamVjdFxuICovXG5mdW5jdGlvbiBzZXRUZW1wb3JhcnlDb250ZXh0KFxuICB0YXJnZXQ6IGFueSxcbiAga2V5OiBzeW1ib2wgfCBzdHJpbmcsXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2b2lkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkpIHRhcmdldFtrZXldID0gdmFsdWU7XG59XG5cbi8qKlxuICogU2FmZWx5IHJlbW92ZXMgdGVtcG9yYXJ5IG1ldGFkYXRhIGZyb20gYW4gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBUZW1wb3JhcnlDb250ZXh0KHRhcmdldDogYW55LCBrZXk6IHN5bWJvbCB8IHN0cmluZyk6IHZvaWQge1xuICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpKSBkZWxldGUgdGFyZ2V0W2tleV07XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdmFsaWRhdGlvbiB3aXRoIHRlbXBvcmFyeSBjb250ZXh0IGFuZCByZXR1cm5zIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICpcbiAqIEBwYXJhbSBuZXN0ZWRNb2RlbCAtIFRoZSBpbnN0YW5jZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIHBhcmVudE1vZGVsIC0gUmVmZXJlbmNlIHRvIGEgcGFyZW50IG9iamVjdCBmb3IgbmVzdGVkIHZhbGlkYXRpb25cbiAqIEBwYXJhbSBpc0FzeW5jIC0gV2hldGhlciB0byBwZXJmb3JtIGFzeW5jIHZhbGlkYXRpb25cbiAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IGZyb20gaGFzRXJyb3JzKClcbiAqL1xuZnVuY3Rpb24gZ2V0TmVzdGVkVmFsaWRhdGlvbkVycm9yczxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG5lc3RlZE1vZGVsOiBNLFxuICBwYXJlbnRNb2RlbD86IE0sXG4gIGlzQXN5bmM/OiBBc3luYyxcbiAgLi4ucHJvcHNUb0lnbm9yZTogc3RyaW5nW11cbik6IENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPiB7XG4gIC8vIFNldCB0ZW1wb3JhcnkgY29udGV4dCBmb3IgbmVzdGVkIG1vZGVsc1xuICBpZiAocGFyZW50TW9kZWwpIHtcbiAgICBzZXRUZW1wb3JhcnlDb250ZXh0KG5lc3RlZE1vZGVsLCBWQUxJREFUSU9OX1BBUkVOVF9LRVksIHBhcmVudE1vZGVsKTtcbiAgfVxuICBzZXRUZW1wb3JhcnlDb250ZXh0KG5lc3RlZE1vZGVsLCBBU1lOQ19NRVRBX0tFWSwgISFpc0FzeW5jKTtcblxuICBjb25zdCBlcnJzID0gbmVzdGVkTW9kZWwuaGFzRXJyb3JzKC4uLnByb3BzVG9JZ25vcmUpIGFzIGFueTtcbiAgY2xlYW51cFRlbXBvcmFyeUNvbnRleHQobmVzdGVkTW9kZWwsIFZBTElEQVRJT05fUEFSRU5UX0tFWSk7XG4gIGNsZWFudXBUZW1wb3JhcnlDb250ZXh0KG5lc3RlZE1vZGVsLCBBU1lOQ19NRVRBX0tFWSk7XG4gIHJldHVybiBlcnJzIGFzIGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRWYWx1ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBwcm9wOiBzdHJpbmcsXG4gIGNoaWxkVmFsdWU6IGFueSxcbiAgcGFyZW50TW9kZWw6IE0sXG4gIGFsbG93ZWRUeXBlczogc3RyaW5nW10sXG4gIGFzeW5jOiBib29sZWFuLFxuICAuLi5wcm9wc1RvSWdub3JlOiBzdHJpbmdbXVxuKTpcbiAgfCBzdHJpbmdcbiAgfCB1bmRlZmluZWRcbiAgfCBNb2RlbEVycm9yRGVmaW5pdGlvblxuICB8IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkIHwgTW9kZWxFcnJvckRlZmluaXRpb24+IHtcbiAgbGV0IGVycjpcbiAgICB8IE1vZGVsRXJyb3JEZWZpbml0aW9uXG4gICAgfCBzdHJpbmdcbiAgICB8IHVuZGVmaW5lZFxuICAgIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQgfCBNb2RlbEVycm9yRGVmaW5pdGlvbj4gPSB1bmRlZmluZWQ7XG4gIGxldCBhdExlYXN0T25lTWF0Y2hlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGFsbG93ZWRUeXBlIG9mIGFsbG93ZWRUeXBlcykge1xuICAgIGNvbnN0IENvbnN0ciA9IE1vZGVsLmdldChhbGxvd2VkVHlwZSkgYXMgYW55O1xuICAgIGlmICghQ29uc3RyKSB7XG4gICAgICBlcnIgPSBuZXcgTW9kZWxFcnJvckRlZmluaXRpb24oe1xuICAgICAgICBbcHJvcF06IHtcbiAgICAgICAgICBbVmFsaWRhdGlvbktleXMuVFlQRV06IGBVbmFibGUgdG8gdmVyaWZ5IHR5cGUgY29uc2lzdGVuY3ksIG1pc3NpbmcgbW9kZWwgcmVnaXN0cnkgZm9yICR7YWxsb3dlZFR5cGV9YCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjaGlsZFZhbHVlIGluc3RhbmNlb2YgQ29uc3RyKSB7XG4gICAgICBhdExlYXN0T25lTWF0Y2hlZCA9IHRydWU7XG4gICAgICBlcnIgPSBnZXROZXN0ZWRWYWxpZGF0aW9uRXJyb3JzKFxuICAgICAgICBjaGlsZFZhbHVlLFxuICAgICAgICBwYXJlbnRNb2RlbCxcbiAgICAgICAgYXN5bmMsXG4gICAgICAgIC4uLnByb3BzVG9JZ25vcmVcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoYXRMZWFzdE9uZU1hdGNoZWQpIHJldHVybiBlcnI7XG5cbiAgcmV0dXJuIChcbiAgICBlcnIgfHxcbiAgICBuZXcgTW9kZWxFcnJvckRlZmluaXRpb24oe1xuICAgICAgW3Byb3BdOiB7XG4gICAgICAgIFtWYWxpZGF0aW9uS2V5cy5UWVBFXTogYFZhbHVlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2Ygb25lIG9mIHRoZSBleHBlY3RlZCB0eXBlczogJHthbGxvd2VkVHlwZXMuam9pbihcIiwgXCIpfWAsXG4gICAgICB9LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZURlY29yYXRvcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG1vZGVsOiBNLFxuICB2YWx1ZTogYW55LFxuICBkZWNvcmF0b3I6IERlY29yYXRvck1ldGFkYXRhQXN5bmMsXG4gIGFzeW5jPzogQXN5bmNcbik6IENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB2YWxpZGF0b3IgPSBWYWxpZGF0aW9uLmdldChkZWNvcmF0b3Iua2V5KTtcbiAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdmFsaWRhdG9yIGZvciAke2RlY29yYXRvci5rZXl9YCk7XG4gIH1cblxuICAvLyBza2lwIGFzeW5jIGRlY29yYXRvcnMgaWYgdmFsaWRhdGVEZWNvcmF0b3JzIGlzIGNhbGxlZCBzeW5jaHJvbm91c2x5IChhc3luYyA9IGZhbHNlKVxuICBpZiAoIWFzeW5jICYmIGRlY29yYXRvci5wcm9wcy5hc3luYykgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG5cbiAgY29uc3QgZGVjb3JhdG9yUHJvcHMgPVxuICAgIGRlY29yYXRvci5rZXkgPT09IE1vZGVsS2V5cy5UWVBFXG4gICAgICA/IFtkZWNvcmF0b3IucHJvcHNdXG4gICAgICA6IGRlY29yYXRvci5wcm9wcyB8fCB7fTtcblxuICBjb25zdCBjb250ZXh0ID0gUGF0aFByb3h5RW5naW5lLmNyZWF0ZShtb2RlbCwge1xuICAgIGlnbm9yZVVuZGVmaW5lZDogdHJ1ZSxcbiAgICBpZ25vcmVOdWxsOiB0cnVlLFxuICB9KTtcblxuICBjb25zdCB2YWxpZGF0b3JPcHRpb25zOiBWYWxpZGF0b3JPcHRpb25zIHwgVHlwZVZhbGlkYXRvck9wdGlvbnMgPVxuICAgIGRlY29yYXRvci5rZXkgPT09IE1vZGVsS2V5cy5UWVBFXG4gICAgICA/IHsgdHlwZTogKGRlY29yYXRvclByb3BzIGFzIGFueSlbMF0ubmFtZSB9XG4gICAgICA6IChkZWNvcmF0b3JQcm9wcyBhcyBWYWxpZGF0b3JPcHRpb25zKTtcblxuICBjb25zdCBtYXliZUFzeW5jRXJyb3JzID0gdmFsaWRhdG9yLmhhc0Vycm9ycyhcbiAgICB2YWx1ZSxcbiAgICB2YWxpZGF0b3JPcHRpb25zLFxuICAgIGNvbnRleHRcbiAgKTtcblxuICByZXR1cm4gdG9Db25kaXRpb25hbFByb21pc2UobWF5YmVBc3luY0Vycm9ycywgYXN5bmMpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRXhlY3V0ZXMgdmFsaWRhdGlvbiBsb2dpYyBmb3IgYSBzZXQgb2YgZGVjb3JhdG9ycyBhcHBsaWVkIHRvIGEgbW9kZWwncyBwcm9wZXJ0eSwgaGFuZGxpbmcgYm90aFxuICogc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9ucywgaW5jbHVkaW5nIHN1cHBvcnQgZm9yIG5lc3RlZCB2YWxpZGF0aW9ucyBhbmQgbGlzdHMuXG4gKlxuICogQHN1bW1hcnlcbiAqIEl0ZXJhdGVzIG92ZXIgYW4gYXJyYXkgb2YgZGVjb3JhdG9yIG1ldGFkYXRhIG9iamVjdHMgYW5kIGFwcGxpZXMgZWFjaCB2YWxpZGF0aW9uIHJ1bGUgdG8gdGhlXG4gKiBwcm92aWRlZCB2YWx1ZS4gRm9yIGxpc3QgZGVjb3JhdG9ycyAoYFZhbGlkYXRpb25LZXlzLkxJU1RgKSwgaXQgcGVyZm9ybXMgZWxlbWVudC13aXNlIHZhbGlkYXRpb24sXG4gKiBzdXBwb3J0aW5nIG5lc3RlZCBtb2RlbCB2YWxpZGF0aW9uIGFuZCB0eXBlIGNoZWNrcy4gSWYgdGhlIGBhc3luY2AgZmxhZyBpcyBzZXQsIGFzeW5jaHJvbm91c1xuICogdmFsaWRhdGlvbiBpcyBzdXBwb3J0ZWQgdXNpbmcgYFByb21pc2UuYWxsYC4gVGhlIHJlc3VsdCBpcyBhIHJlY29yZCBtYXBwaW5nIHZhbGlkYXRpb24ga2V5cyB0b1xuICogZXJyb3IgbWVzc2FnZXMsIG9yIGB1bmRlZmluZWRgIGlmIG5vIGVycm9ycyBhcmUgZm91bmQuXG4gKlxuICogQHRlbXBsYXRlIE0gLSBBIHR5cGUgcGFyYW1ldGVyIGV4dGVuZGluZyBgTW9kZWxgLCByZXByZXNlbnRpbmcgdGhlIG1vZGVsIHR5cGUgYmVpbmcgdmFsaWRhdGVkLlxuICogQHRlbXBsYXRlIEFzeW5jIC0gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB2YWxpZGF0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0aGF0IHRoZSB2YWxpZGF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIC0gVGhlIG1vZGVsIGZpZWxkIG5hbWVcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgcHJvdmlkZWQgZGVjb3JhdG9ycy5cbiAqIEBwYXJhbSB7RGVjb3JhdG9yTWV0YWRhdGFBc3luY1tdfSBkZWNvcmF0b3JzIC0gQW4gYXJyYXkgb2YgbWV0YWRhdGEgb2JqZWN0cyByZXByZXNlbnRpbmcgdmFsaWRhdGlvbiBkZWNvcmF0b3JzLlxuICogQHBhcmFtIHtBc3luY30gW2FzeW5jXSAtIE9wdGlvbmFsIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAcmV0dXJuIHtDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB8IHVuZGVmaW5lZH1cbiAqIFJldHVybnMgZWl0aGVyIGEgcmVjb3JkIG9mIHZhbGlkYXRpb24gZXJyb3JzIChrZXllZCBieSB0aGUgZGVjb3JhdG9yIGtleSkgb3IgYHVuZGVmaW5lZGAgaWYgbm8gZXJyb3JzIGFyZSBmb3VuZC5cbiAqIElmIGBhc3luY2AgaXMgdHJ1ZSwgdGhlIHJldHVybiB2YWx1ZSBpcyBhIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBzYW1lIHN0cnVjdHVyZS5cbiAqXG4gKiBAZnVuY3Rpb24gdmFsaWRhdGVEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZURlY29yYXRvcnM8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgQXN5bmMgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+KFxuICBtb2RlbDogTSxcbiAgcHJvcDogc3RyaW5nLFxuICB2YWx1ZTogYW55LFxuICBkZWNvcmF0b3JzOiBEZWNvcmF0b3JNZXRhZGF0YUFzeW5jW10sXG4gIGFzeW5jPzogQXN5bmMsXG4gIC4uLnByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+PiA9IHt9O1xuXG4gIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbiAgICAvLyBza2lwIGFzeW5jIGRlY29yYXRvcnMgaWYgdmFsaWRhdGVEZWNvcmF0b3JzIGlzIGNhbGxlZCBzeW5jaHJvbm91c2x5IChhc3luYyA9IGZhbHNlKVxuICAgIGlmICghYXN5bmMgJiYgZGVjb3JhdG9yLnByb3BzLmFzeW5jKSBjb250aW51ZTtcblxuICAgIGxldCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGVEZWNvcmF0b3IobW9kZWwsIHZhbHVlLCBkZWNvcmF0b3IsIGFzeW5jKTtcblxuICAgIC8qXG4gICAgSWYgdGhlIGRlY29yYXRvciBpcyBhIGxpc3QsIGVhY2ggZWxlbWVudCBtdXN0IGJlIGNoZWNrZWQuXG4gICAgV2hlbiAnYXN5bmMnIGlzIHRydWUsIHRoZSAnZXJyJyB3aWxsIGFsd2F5cyBiZSBhIHBlbmRpbmcgcHJvbWlzZSBpbml0aWFsbHksXG4gICAgc28gdGhlICchZXJyJyBjaGVjayB3aWxsIGV2YWx1YXRlIHRvIGZhbHNlIChldmVuIGlmIHRoZSBwcm9taXNlIGxhdGVyIHJlc29sdmVzIHdpdGggbm8gZXJyb3JzKVxuICAgICovXG4gICAgaWYgKGRlY29yYXRvci5rZXkgPT09IFZhbGlkYXRpb25LZXlzLkxJU1QgJiYgKCF2YWxpZGF0aW9uRXJyb3JzIHx8IGFzeW5jKSkge1xuICAgICAgY29uc3QgdmFsdWVzID0gdmFsdWUgaW5zdGFuY2VvZiBTZXQgPyBbLi4udmFsdWVdIDogdmFsdWU7XG4gICAgICBpZiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCB0eXBlczogc3RyaW5nW10gPSAoZGVjb3JhdG9yLnByb3BzLmNsYXNzIHx8XG4gICAgICAgICAgZGVjb3JhdG9yLnByb3BzLmNsYXp6IHx8XG4gICAgICAgICAgZGVjb3JhdG9yLnByb3BzLmN1c3RvbVR5cGVzKSBhcyBzdHJpbmdbXTtcbiAgICAgICAgdHlwZXMgPSAoQXJyYXkuaXNBcnJheSh0eXBlcykgPyB0eXBlcyA6IFt0eXBlc10pLm1hcCgoZTogYW55KSA9PiB7XG4gICAgICAgICAgZSA9IHR5cGVvZiBlID09PSBcImZ1bmN0aW9uXCIgJiYgIWUubmFtZSA/IGUoKSA6IGU7XG4gICAgICAgICAgcmV0dXJuIChlIGFzIGFueSkubmFtZSA/IChlIGFzIGFueSkubmFtZSA6IGU7XG4gICAgICAgIH0pIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSBbdHlwZXNdLmZsYXQoKS5tYXAoKHQpID0+IFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgLy8gY29uc3QgcmVzZXJ2ZWQgPSBPYmplY3QudmFsdWVzKFJlc2VydmVkTW9kZWxzKS5tYXAoKHYpID0+IHYudG9Mb3dlckNhc2UoKSkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgY29uc3QgZXJycyA9IHZhbHVlcy5tYXAoKGNoaWxkVmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIGlmIChNb2RlbC5pc01vZGVsKHYpICYmICFyZXNlcnZlZC5pbmNsdWRlcyh2KSB7XG4gICAgICAgICAgaWYgKE1vZGVsLmlzTW9kZWwoY2hpbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZUNoaWxkVmFsdWUoXG4gICAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgICAgIGNoaWxkVmFsdWUsXG4gICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICB0eXBlcy5mbGF0KCksXG4gICAgICAgICAgICAgICEhYXN5bmMsXG4gICAgICAgICAgICAgIC4uLnByb3BzVG9JZ25vcmVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyByZXR1cm4gZ2V0TmVzdGVkVmFsaWRhdGlvbkVycm9ycyhjaGlsZFZhbHVlLCBtb2RlbCwgYXN5bmMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBhbGxvd2VkVHlwZXMuaW5jbHVkZXModHlwZW9mIGNoaWxkVmFsdWUpXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBcIlZhbHVlIGhhcyBubyB2YWxpZGF0YWJsZSB0eXBlXCI7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMgPSBQcm9taXNlLmFsbChlcnJzKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFsbEVtcHR5ID0gcmVzdWx0LmV2ZXJ5KChyKSA9PiAhcik7XG4gICAgICAgICAgICByZXR1cm4gYWxsRW1wdHkgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gICAgICAgICAgfSkgYXMgYW55O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGFsbEVtcHR5ID0gZXJycy5ldmVyeSgocjogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiAhcik7XG4gICAgICAgICAgdmFsaWRhdGlvbkVycm9ycyA9IGVycnMubGVuZ3RoID4gMCAmJiAhYWxsRW1wdHkgPyBlcnJzIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZSA9XG4gICAgICBkZWNvcmF0b3Iua2V5ID09PSBNb2RlbEtleXMuVFlQRSA/IFZhbGlkYXRpb25LZXlzLlRZUEUgOiBkZWNvcmF0b3Iua2V5O1xuICAgIGlmICh2YWxpZGF0aW9uRXJyb3JzKSAocmVzdWx0IGFzIGFueSlbbmFtZV0gPSB2YWxpZGF0aW9uRXJyb3JzO1xuICB9XG5cbiAgaWYgKCFhc3luYylcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPiAwXG4gICAgICA/IChyZXN1bHQgYXMgYW55KVxuICAgICAgOiAodW5kZWZpbmVkIGFzIGFueSk7XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJlc3VsdCk7XG4gIGNvbnN0IHByb21pc2VzID0gT2JqZWN0LnZhbHVlcyhyZXN1bHQpIGFzIFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPltdO1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKHJlc29sdmVkVmFsdWVzKSA9PiB7XG4gICAgY29uc3QgcmVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvbHZlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsID0gcmVzb2x2ZWRWYWx1ZXNbaV07XG4gICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzW2tleXNbaV1dID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzKS5sZW5ndGggPiAwID8gcmVzIDogdW5kZWZpbmVkO1xuICB9KSBhcyBhbnk7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uIHZhbGlkYXRlXG4gKiBAdGVtcGxhdGUgTVxuICogQHRlbXBsYXRlIEFzeW5jXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFZhbGlkYXRlcyB0aGUgcHJvcGVydGllcyBvZiBhIHtAbGluayBNb2RlbH0gaW5zdGFuY2UgdXNpbmcgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzLlxuICogU3VwcG9ydHMgYm90aCBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gZmxvd3MsIGRlcGVuZGluZyBvbiB0aGUgYGFzeW5jYCBmbGFnLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGlzIGZ1bmN0aW9uIGluc3BlY3RzIGEgZ2l2ZW4gbW9kZWwgb2JqZWN0LCBpZGVudGlmaWVzIGRlY29yYXRlZCBwcm9wZXJ0aWVzIHRoYXQgcmVxdWlyZSB2YWxpZGF0aW9uLFxuICogYW5kIGFwcGxpZXMgdGhlIGNvcnJlc3BvbmRpbmcgdmFsaWRhdGlvbiBydWxlcy4gSXQgYWxzbyBzdXBwb3J0cyBuZXN0ZWQgbW9kZWwgdmFsaWRhdGlvbiBhbmQgZ3JhY2VmdWxseVxuICogbWVyZ2VzIGFueSB2YWxpZGF0aW9uIGVycm9ycy4gRm9yIGNvbGxlY3Rpb25zIChBcnJheS9TZXQpLCBpdCBlbmZvcmNlcyB0aGUgcHJlc2VuY2Ugb2YgdGhlIGBAbGlzdGAgZGVjb3JhdG9yXG4gKiBhbmQgY2hlY2tzIHRoZSB0eXBlIG9mIGVsZW1lbnRzLiBJZiBhIHByb3BlcnR5IGlzIGEgbmVzdGVkIG1vZGVsLCBpdCB3aWxsIGNhbGwgYGhhc0Vycm9yc2Agb24gaXQgYW5kIGZsYXR0ZW5cbiAqIHRoZSBuZXN0ZWQgZXJyb3Iga2V5cyB1c2luZyBkb3Qgbm90YXRpb24uXG4gKlxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBiZSB2YWxpZGF0ZWQuIE11c3QgZXh0ZW5kIGZyb20ge0BsaW5rIE1vZGVsfS5cbiAqIEBwYXJhbSB7QXN5bmN9IFthc3luY10gLSBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIGJlIGFzeW5jaHJvbm91cy5cbiAqIEBwYXJhbSB7Li4uc3RyaW5nfSBwcm9wc1RvSWdub3JlIC0gQSB2YXJpYWRpYyBsaXN0IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgZHVyaW5nIHZhbGlkYXRpb24uXG4gKlxuICogQHJldHVybnMge0NvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPn1cbiAqIFJldHVybnMgZWl0aGVyIGEge0BsaW5rIE1vZGVsRXJyb3JEZWZpbml0aW9ufSBjb250YWluaW5nIHZhbGlkYXRpb24gZXJyb3JzLFxuICogb3IgYHVuZGVmaW5lZGAgaWYgbm8gZXJyb3JzIGFyZSBmb3VuZC4gV2hlbiBgYXN5bmNgIGlzIGB0cnVlYCwgcmV0dXJucyBhIFByb21pc2UuXG4gKlxuICogQHNlZSB7QGxpbmsgTW9kZWx9XG4gKiBAc2VlIHtAbGluayBNb2RlbEVycm9yRGVmaW5pdGlvbn1cbiAqIEBzZWUge0BsaW5rIHZhbGlkYXRlRGVjb3JhdG9yc31cbiAqIEBzZWUge0BsaW5rIGdldFZhbGlkYXRhYmxlUHJvcGVydGllc31cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgICAgcGFydGljaXBhbnQgdmFsaWRhdGVcbiAqICAgICBwYXJ0aWNpcGFudCBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXNcbiAqICAgICBwYXJ0aWNpcGFudCB2YWxpZGF0ZURlY29yYXRvcnNcbiAqICAgICBwYXJ0aWNpcGFudCBNb2RlbEluc3RhbmNlXG4gKiAgICAgQ2FsbGVyLT4+dmFsaWRhdGU6IGNhbGwgd2l0aCBvYmosIGFzeW5jLCBwcm9wc1RvSWdub3JlXG4gKiAgICAgdmFsaWRhdGUtPj5nZXRWYWxpZGF0YWJsZVByb3BlcnRpZXM6IHJldHJpZXZlIGRlY29yYXRlZCBwcm9wc1xuICogICAgIGxvb3AgZm9yIGVhY2ggcHJvcGVydHlcbiAqICAgICAgICAgdmFsaWRhdGUtPj52YWxpZGF0ZURlY29yYXRvcnM6IHZhbGlkYXRlIHVzaW5nIGRlY29yYXRvcnNcbiAqICAgICAgICAgYWx0IGlzIG5lc3RlZCBtb2RlbFxuICogICAgICAgICAgICAgdmFsaWRhdGUtPj5Nb2RlbEluc3RhbmNlOiBjYWxsIGhhc0Vycm9ycygpXG4gKiAgICAgICAgIGVuZFxuICogICAgIGVuZFxuICogICAgIGFsdCBhc3luY1xuICogICAgICAgICB2YWxpZGF0ZS0+PnZhbGlkYXRlOiBQcm9taXNlLmFsbFNldHRsZWQgZm9yIGVycm9yc1xuICogICAgIGVuZFxuICogICAgIHZhbGlkYXRlLS0+PkNhbGxlcjogcmV0dXJuIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG1vZGVsOiBNLFxuICBhc3luYzogQXN5bmMsXG4gIC4uLnByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPVxuICAgIGdldFZhbGlkYXRhYmxlUHJvcGVydGllcyhtb2RlbCwgcHJvcHNUb0lnbm9yZSk7XG5cbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IG5lc3RlZEVycm9yczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGZvciAoY29uc3QgeyBwcm9wLCBkZWNvcmF0b3JzIH0gb2YgZGVjb3JhdGVkUHJvcGVydGllcykge1xuICAgIGNvbnN0IHByb3BLZXkgPSBTdHJpbmcocHJvcCk7XG4gICAgbGV0IHByb3BWYWx1ZSA9IChtb2RlbCBhcyBhbnkpW3Byb3BdO1xuXG4gICAgaWYgKCFkZWNvcmF0b3JzPy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgLy8gR2V0IHRoZSBkZWZhdWx0IHR5cGUgdmFsaWRhdG9yXG4gICAgY29uc3QgcHJpb3JpdHkgPSBbVmFsaWRhdGlvbktleXMuVFlQRSwgTW9kZWxLZXlzLlRZUEVdO1xuICAgIGNvbnN0IGRlc2lnblR5cGVEZWMgPSBwcmlvcml0eVxuICAgICAgLm1hcCgoa2V5KSA9PiBkZWNvcmF0b3JzLmZpbmQoKGQpID0+IGQua2V5ID09PSBrZXkpKVxuICAgICAgLmZpbmQoQm9vbGVhbik7XG5cbiAgICAvLyBFbnN1cmVzIHRoYXQgb25seSBvbmUgdHlwZSBkZWNvcmF0b3IgcmVtYWlucy5cbiAgICBpZiAoZGVzaWduVHlwZURlYz8ua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5UWVBFKSB7XG4gICAgICBkZWNvcmF0b3JzLnNwbGljZShcbiAgICAgICAgMCxcbiAgICAgICAgZGVjb3JhdG9ycy5sZW5ndGgsXG4gICAgICAgIC4uLmRlY29yYXRvcnMuZmlsdGVyKChkKSA9PiBkLmtleSAhPT0gTW9kZWxLZXlzLlRZUEUpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghZGVzaWduVHlwZURlYykgY29udGludWU7XG5cbiAgICBjb25zdCBkZXNpZ25UeXBlID1cbiAgICAgIGRlc2lnblR5cGVEZWMucHJvcHMuY2xhc3MgfHxcbiAgICAgIGRlc2lnblR5cGVEZWMucHJvcHMuY2xhenogfHxcbiAgICAgIGRlc2lnblR5cGVEZWMucHJvcHMuY3VzdG9tVHlwZXMgfHxcbiAgICAgIGRlc2lnblR5cGVEZWMucHJvcHMubmFtZTtcblxuICAgIC8vIFRTIGVtaXRzIFwiT2JqZWN0XCIgYXMgZGVzaWduOnR5cGUgZm9yIHVuaW9ucyAoc3RyaW5nIHwgbnVtYmVyKSBhbmQgaW50ZXJzZWN0aW9ucyAoQSAmIEIpLlxuICAgIC8vIFNpbmNlIHRoaXMgbWV0YWRhdGEgaXMgYW1iaWd1b3VzIGZvciB2YWxpZGF0aW9uLCBza2lwIGRlc2lnbjp0eXBlIGNoZWNrcyBpbiB0aGVzZSBjYXNlcy5cbiAgICAvLyBUbyBlbmZvcmNlIGRlc2lnbjp0eXBlIHZhbGlkYXRpb24gZXhwbGljaXRseSwgdGhlIEB0eXBlIHZhbGlkYXRvciBjYW4gYmUgdXNlZC5cbiAgICBpZiAoZGVzaWduVHlwZURlYy5rZXkgPT09IE1vZGVsS2V5cy5UWVBFICYmIGRlc2lnblR5cGUgPT09IFwiT2JqZWN0XCIpXG4gICAgICBkZWNvcmF0b3JzLnNoaWZ0KCk7XG5cbiAgICBjb25zdCBkZXNpZ25UeXBlcyA9IChcbiAgICAgIEFycmF5LmlzQXJyYXkoZGVzaWduVHlwZSkgPyBkZXNpZ25UeXBlIDogW2Rlc2lnblR5cGVdXG4gICAgKS5tYXAoKGU6IGFueSkgPT4ge1xuICAgICAgZSA9IHR5cGVvZiBlID09PSBcImZ1bmN0aW9uXCIgJiYgIWUubmFtZSA/IGUoKSA6IGU7XG4gICAgICByZXR1cm4gKGUgYXMgYW55KS5uYW1lID8gKGUgYXMgYW55KS5uYW1lIDogZTtcbiAgICB9KSBhcyBzdHJpbmdbXTtcblxuICAgIC8vIEhhbmRsZSBhcnJheSBvciBTZXQgdHlwZXMgYW5kIGVuZm9yY2UgdGhlIHByZXNlbmNlIG9mIEBsaXN0IGRlY29yYXRvclxuICAgIC8vIGlmIChbQXJyYXkubmFtZSwgU2V0Lm5hbWVdLmluY2x1ZGVzKGRlc2lnblR5cGUpKSB7fVxuICAgIGlmIChkZXNpZ25UeXBlcy5zb21lKCh0KSA9PiBbQXJyYXkubmFtZSwgU2V0Lm5hbWVdLmluY2x1ZGVzKHQpKSkge1xuICAgICAgaWYgKCFkZWNvcmF0b3JzLnNvbWUoKGQpID0+IGQua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUKSkge1xuICAgICAgICByZXN1bHRbcHJvcEtleV0gPSB7XG4gICAgICAgICAgW1ZhbGlkYXRpb25LZXlzLlRZUEVdOiBgQXJyYXkgb3IgU2V0IHByb3BlcnR5ICcke3Byb3BLZXl9JyByZXF1aXJlcyBhIEBsaXN0IGRlY29yYXRvcmAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHByb3BWYWx1ZSAmJlxuICAgICAgICAhKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSB8fCBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTZXQpXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0W3Byb3BLZXldID0ge1xuICAgICAgICAgIFtWYWxpZGF0aW9uS2V5cy5UWVBFXTogYFByb3BlcnR5ICcke1N0cmluZyhwcm9wKX0nIG11c3QgYmUgZWl0aGVyIGFuIEFycmF5IG9yIGEgU2V0YCxcbiAgICAgICAgfTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBkZXNpZ246dHlwZSBkZWNvcmF0b3IsIHNpbmNlIEBsaXN0IGRlY29yYXRvciBhbHJlYWR5IGVuc3VyZXMgdHlwZVxuICAgICAgZm9yIChsZXQgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKGRlY29yYXRvcnNbaV0ua2V5ID09PSBNb2RlbEtleXMuVFlQRSkge1xuICAgICAgICAgIGRlY29yYXRvcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcm9wVmFsdWUgPSBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTZXQgPyBbLi4ucHJvcFZhbHVlXSA6IHByb3BWYWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIHZhbGlkYXRlRGVjb3JhdG9ycyhcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIHByb3BLZXksXG4gICAgICAgIHByb3BWYWx1ZSxcbiAgICAgICAgZGVjb3JhdG9ycyxcbiAgICAgICAgYXN5bmMsXG4gICAgICAgIC4uLnByb3BzVG9JZ25vcmVcbiAgICAgICkgfHwge307XG5cbiAgICAvLyBDaGVjayBmb3IgbmVzdGVkIHByb3BlcnRpZXMuXG4gICAgLy8gVG8gcHJldmVudCB1bm5lY2Vzc2FyeSBwcm9jZXNzaW5nLCBcInByb3BWYWx1ZVwiIG11c3QgYmUgZGVmaW5lZCBhbmQgdmFsaWRhdGFibGVcbiAgICAvLyBsZXQgbmVzdGVkRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgaXNDb25zdHIgPSBNb2RlbC5pc1Byb3BlcnR5TW9kZWwobW9kZWwsIHByb3BLZXkpO1xuICAgIGNvbnN0IGhhc1Byb3BWYWx1ZSA9IHByb3BWYWx1ZSAhPT0gbnVsbCAmJiBwcm9wVmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNDb25zdHIgJiYgaGFzUHJvcFZhbHVlKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IHByb3BWYWx1ZSBhcyBNb2RlbDtcbiAgICAgIGNvbnN0IGlzSW52YWxpZE1vZGVsID1cbiAgICAgICAgdHlwZW9mIGluc3RhbmNlICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgIHR5cGVvZiBpbnN0YW5jZS5oYXNFcnJvcnMgIT09IFwiZnVuY3Rpb25cIjtcblxuICAgICAgaWYgKGlzSW52YWxpZE1vZGVsKSB7XG4gICAgICAgIC8vIHByb3BFcnJvcnNbVmFsaWRhdGlvbktleXMuVFlQRV0gPSBcIk1vZGVsIHNob3VsZCBiZSB2YWxpZGF0YWJsZSBidXQgaXQncyBub3QuXCI7XG4gICAgICAgIGNvbnNvbGUud2FybihcIk1vZGVsIHNob3VsZCBiZSB2YWxpZGF0YWJsZSBidXQgaXQncyBub3QuXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgQ29uc3RyID0gKEFycmF5LmlzQXJyYXkoZGVzaWduVHlwZSkgPyBkZXNpZ25UeXBlIDogW2Rlc2lnblR5cGVdKVxuICAgICAgICAgIC5tYXAoKGQpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZCA9PT0gXCJmdW5jdGlvblwiICYmICFkLm5hbWUpIGQgPSBkKCk7XG4gICAgICAgICAgICByZXR1cm4gTW9kZWwuZ2V0KGQubmFtZSB8fCBkKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maW5kKChkKSA9PiAhIWQpIGFzIGFueTtcblxuICAgICAgICAvLyBFbnN1cmUgaW5zdGFuY2UgaXMgb2YgdGhlIGV4cGVjdGVkIG1vZGVsIGNsYXNzLlxuICAgICAgICBpZiAoIUNvbnN0ciB8fCAhKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RyKSkge1xuICAgICAgICAgIHByb3BFcnJvcnNbVmFsaWRhdGlvbktleXMuVFlQRV0gPSAhQ29uc3RyXG4gICAgICAgICAgICA/IGBVbmFibGUgdG8gdmVyaWZ5IHR5cGUgY29uc2lzdGVuY3ksIG1pc3NpbmcgbW9kZWwgcmVnaXN0cnkgZm9yICR7ZGVzaWduVHlwZXMudG9TdHJpbmcoKX0gb24gcHJvcCAke3Byb3BLZXl9YFxuICAgICAgICAgICAgOiBgVmFsdWUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiAke0NvbnN0ci5uYW1lfWA7XG4gICAgICAgICAgZGVsZXRlIHByb3BFcnJvcnNbTW9kZWxLZXlzLlRZUEVdOyAvLyByZW1vdmUgZHVwbGljYXRlIHR5cGUgZXJyb3JcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXN0ZWRFcnJvcnNbcHJvcEtleV0gPSBnZXROZXN0ZWRWYWxpZGF0aW9uRXJyb3JzKFxuICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgIGFzeW5jLFxuICAgICAgICAgICAgLi4ucHJvcHNUb0lnbm9yZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgdG8gdGhlIHJlc3VsdCBpZiB3ZSBoYXZlIGFueSBlcnJvcnNcbiAgICAvLyBBc3luYyBtb2RlIHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdW5kZWZpbmVkIHdoZW4gbm8gZXJyb3JzIGV4aXN0XG4gICAgaWYgKE9iamVjdC5rZXlzKHByb3BFcnJvcnMpLmxlbmd0aCA+IDAgfHwgYXN5bmMpXG4gICAgICByZXN1bHRbcHJvcEtleV0gPSBwcm9wRXJyb3JzO1xuXG4gICAgLy8gVGhlbiBtZXJnZSBhbnkgbmVzdGVkIGVycm9yc1xuICAgIGlmICghYXN5bmMpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKG5lc3RlZEVycm9yc1twcm9wS2V5XSB8fCB7fSkuZm9yRWFjaCgoW2tleSwgZXJyb3JdKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0W2Ake3Byb3BLZXl9LiR7a2V5fWBdID0gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN5bmNocm9ub3VzIHJldHVyblxuICBpZiAoIWFzeW5jKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID4gMFxuICAgICAgICA/IG5ldyBNb2RlbEVycm9yRGVmaW5pdGlvbihyZXN1bHQpXG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgKSBhcyBhbnk7XG4gIH1cblxuICBjb25zdCBtZXJnZWQ6IGFueSA9IHJlc3VsdDsgLy8gVE9ETzogYXBwbHkgZmlsdGVyaW5nXG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG1lcmdlZCk7XG4gIGNvbnN0IHByb21pc2VzID0gT2JqZWN0LnZhbHVlcyhtZXJnZWQpO1xuICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKS50aGVuKGFzeW5jIChyZXN1bHRzKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0OiBNb2RlbEVycm9ycyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBbcGFyZW50UHJvcCwgbmVzdGVkRXJyUHJvbWlzZV0gb2YgT2JqZWN0LmVudHJpZXMobmVzdGVkRXJyb3JzKSkge1xuICAgICAgY29uc3QgbmVzdGVkUHJvcERlY0Vycm9ycyA9IChhd2FpdCBuZXN0ZWRFcnJQcm9taXNlKSBhcyBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgYW55XG4gICAgICA+O1xuXG4gICAgICBpZiAobmVzdGVkUHJvcERlY0Vycm9ycylcbiAgICAgICAgT2JqZWN0LmVudHJpZXMobmVzdGVkUHJvcERlY0Vycm9ycykuZm9yRWFjaChcbiAgICAgICAgICAoW25lc3RlZFByb3AsIG5lc3RlZFByb3BEZWNFcnJvcl0pID0+IHtcbiAgICAgICAgICAgIGlmIChuZXN0ZWRQcm9wRGVjRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRLZXkgPSBbcGFyZW50UHJvcCwgbmVzdGVkUHJvcF0uam9pbihcIi5cIik7XG4gICAgICAgICAgICAgIHJlc3VsdFtuZXN0ZWRLZXldID0gbmVzdGVkUHJvcERlY0Vycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBjb25zdCByZXMgPSByZXN1bHRzW2ldO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIiAmJiByZXMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAocmVzdWx0IGFzIGFueSlba2V5XSA9IHJlcy52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAocmVzLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIChyZXN1bHQgYXMgYW55KVtrZXldID1cbiAgICAgICAgICByZXMucmVhc29uIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgID8gcmVzLnJlYXNvbi5tZXNzYWdlXG4gICAgICAgICAgICA6IFN0cmluZyhyZXMucmVhc29uIHx8IFwiVmFsaWRhdGlvbiBmYWlsZWRcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID4gMFxuICAgICAgPyBuZXcgTW9kZWxFcnJvckRlZmluaXRpb24ocmVzdWx0KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH0pIGFzIGFueTtcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW1lcmF0aW9uIG9mIEphdmFTY3JpcHQgcHJpbWl0aXZlIHR5cGUgaWRlbnRpZmllcnMgdXNlZCBieSB0aGUgbW9kZWwgc3lzdGVtLlxuICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgcmVsZXZhbnQgSlMgcHJpbWl0aXZlcyBhbmQgc3RhbmRhcmRpemVzIHRoZWlyIHN0cmluZyByZXByZXNlbnRhdGlvbnMgYWNyb3NzIHRoZSBsaWJyYXJ5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNUUklORyByZWZlcmVuY2VzIHRoZSBzdHJpbmcgcHJpbWl0aXZlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVNQkVSIHJlZmVyZW5jZXMgdGhlIG51bWJlciBwcmltaXRpdmVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCT09MRUFOIHJlZmVyZW5jZXMgdGhlIGJvb2xlYW4gcHJpbWl0aXZlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHSU5UIHJlZmVyZW5jZXMgdGhlIGJpZ2ludCBwcmltaXRpdmVcbiAqIEBlbnVtIFByaW1pdGl2ZXNcbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZW51bSBQcmltaXRpdmVzIHtcbiAgLyoqIHJlZmVyZW5jZXMgdGhlIHN0cmluZyBwcmltaXRpdmUgKi9cbiAgU1RSSU5HID0gXCJzdHJpbmdcIixcbiAgLyoqIHJlZmVyZW5jZXMgdGhlIG51bWJlciBwcmltaXRpdmUgKi9cbiAgTlVNQkVSID0gXCJudW1iZXJcIixcbiAgLyoqIHJlZmVyZW5jZXMgdGhlIGJvb2xlYW4gcHJpbWl0aXZlICovXG4gIEJPT0xFQU4gPSBcImJvb2xlYW5cIixcbiAgLyoqIHJlZmVyZW5jZXMgdGhlIGJpZ2ludCBwcmltaXRpdmUgKi9cbiAgQklHSU5UID0gXCJiaWdpbnRcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVzZXJ2ZWQgbW9kZWwgbmFtZXMgd2hpY2ggYXJlIGV4Y2x1ZGVkIGZyb20gbW9kZWwgcmVidWlsZGluZy5cbiAqIEBzdW1tYXJ5IFJlZmVyZW5jZXMgdGhlIFJlc2VydmVkIG1vZGVsIG5hbWVzIHRvIGlnbm9yZSBkdXJpbmcgTW9kZWwgcmVidWlsZGluZyB0byBhdm9pZCBpbnRlcmZlcmluZyB3aXRoIG5hdGl2ZSB0eXBlcyBhbmQgc3BlY2lhbCBjYXNlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVFJJTkdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBPQkpFQ1RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOVU1CRVJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCT09MRUFOXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHSU5UXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURVxuICogQGVudW0gUmVzZXJ2ZWRNb2RlbHNcbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZW51bSBSZXNlcnZlZE1vZGVscyB7XG4gIC8qKiByZXNlcnZlZCBuYW1lIGZvciBzdHJpbmcgKi9cbiAgU1RSSU5HID0gXCJzdHJpbmdcIixcbiAgLyoqIHJlc2VydmVkIG5hbWUgZm9yIG9iamVjdCAqL1xuICBPQkpFQ1QgPSBcIm9iamVjdFwiLFxuICAvKiogcmVzZXJ2ZWQgbmFtZSBmb3IgbnVtYmVyICovXG4gIE5VTUJFUiA9IFwibnVtYmVyXCIsXG4gIC8qKiByZXNlcnZlZCBuYW1lIGZvciBib29sZWFuICovXG4gIEJPT0xFQU4gPSBcImJvb2xlYW5cIixcbiAgLyoqIHJlc2VydmVkIG5hbWUgZm9yIGJpZ2ludCAqL1xuICBCSUdJTlQgPSBcImJpZ2ludFwiLFxuICAvKiogcmVzZXJ2ZWQgbmFtZSBmb3IgRGF0ZSAqL1xuICBEQVRFID0gXCJkYXRlXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2ljIHN1cHBvcnRlZCBKYXZhU2NyaXB0IHR5cGVzIHVzZWQgYnkgdGhlIHZhbGlkYXRpb24gc3lzdGVtLlxuICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgYmFzaWMgc3VwcG9ydGVkIEpTIHR5cGVzIGFzIHN0cmluZ3MgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdHlwZSBjaGVja2luZyBhbmQgbWV0YWRhdGEuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBKc1R5cGVzXG4gKiBAcHJvcGVydHkge1wic3RyaW5nXCJ9IHN0cmluZyBTdHJpbmcgcHJpbWl0aXZlIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7XCJhcnJheVwifSBhcnJheSBBcnJheSB0eXBlIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7XCJudW1iZXJcIn0gbnVtYmVyIE51bWJlciBwcmltaXRpdmUgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHtcImJvb2xlYW5cIn0gYm9vbGVhbiBCb29sZWFuIHByaW1pdGl2ZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge1wic3ltYm9sXCJ9IHN5bWJvbCBTeW1ib2wgcHJpbWl0aXZlIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7XCJmdW5jdGlvblwifSBmdW5jdGlvbiBGdW5jdGlvbiB0eXBlIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7XCJvYmplY3RcIn0gb2JqZWN0IE9iamVjdCB0eXBlIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7XCJ1bmRlZmluZWRcIn0gdW5kZWZpbmVkIFVuZGVmaW5lZCB0eXBlIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7XCJudWxsXCJ9IG51bGwgTnVsbCB2YWx1ZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge1wiYmlnaW50XCJ9IEJJR0lOVCBCaWdJbnQgcHJpbWl0aXZlIGlkZW50aWZpZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGpzVHlwZXMgPSBbXG4gIFwic3RyaW5nXCIsXG4gIFwiYXJyYXlcIixcbiAgXCJudW1iZXJcIixcbiAgXCJib29sZWFuXCIsXG4gIFwic3ltYm9sXCIsXG4gIFwiZnVuY3Rpb25cIixcbiAgXCJvYmplY3RcIixcbiAgXCJ1bmRlZmluZWRcIixcbiAgXCJudWxsXCIsXG4gIFwiYmlnaW50XCIsXG5dO1xuIiwiaW1wb3J0IHsgU2VyaWFsaXphdGlvbiB9IGZyb20gXCIuLi91dGlscy9zZXJpYWxpemF0aW9uXCI7XG5pbXBvcnQgeyBCdWlsZGVyUmVnaXN0cnkgfSBmcm9tIFwiLi4vdXRpbHMvcmVnaXN0cnlcIjtcbmltcG9ydCB7IE1vZGVsRXJyb3JEZWZpbml0aW9uIH0gZnJvbSBcIi4vTW9kZWxFcnJvckRlZmluaXRpb25cIjtcbmltcG9ydCB7XG4gIENvbXBhcmFibGUsXG4gIENvbnN0cnVjdG9yLFxuICBIYXNoYWJsZSxcbiAgTW9kZWxBcmcsXG4gIE1vZGVsQnVpbGRlckZ1bmN0aW9uLFxuICBNb2RlbENvbnN0cnVjdG9yLFxuICBTZXJpYWxpemFibGUsXG4gIFZhbGlkYXRhYmxlLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjb3JhdG9yTWV0YWRhdGEsIGlzRXF1YWwsIFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IHZhbGlkYXRlIH0gZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSGFzaGluZyB9IGZyb20gXCIuLi91dGlscy9oYXNoaW5nXCI7XG5pbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBqc1R5cGVzLCBSZXNlcnZlZE1vZGVscyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0TWV0YWRhdGEsIGdldE1vZGVsS2V5IH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IENvbmRpdGlvbmFsQXN5bmMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEFTWU5DX01FVEFfS0VZIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5sZXQgbW9kZWxCdWlsZGVyRnVuY3Rpb246IE1vZGVsQnVpbGRlckZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xubGV0IGFjdGluZ01vZGVsUmVnaXN0cnk6IEJ1aWxkZXJSZWdpc3RyeTxhbnk+O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RyeSB0eXBlIGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIG1vZGVsIGNvbnN0cnVjdG9yc1xuICogQHN1bW1hcnkgVGhlIE1vZGVsUmVnaXN0cnkgdHlwZSBkZWZpbmVzIGEgcmVnaXN0cnkgZm9yIG1vZGVsIGNvbnN0cnVjdG9ycyB0aGF0IGV4dGVuZHNcbiAqIHRoZSBCdWlsZGVyUmVnaXN0cnkgaW50ZXJmYWNlLiBJdCBwcm92aWRlcyBhIHN0YW5kYXJkaXplZCB3YXkgdG8gcmVnaXN0ZXIsIHJldHJpZXZlLFxuICogYW5kIGJ1aWxkIG1vZGVsIGluc3RhbmNlcywgZW5hYmxpbmcgdGhlIG1vZGVsIHN5c3RlbSB0byB3b3JrIHdpdGggZGlmZmVyZW50IHR5cGVzIG9mIG1vZGVscy5cbiAqXG4gKiBAaW50ZXJmYWNlIE1vZGVsUmVnaXN0cnlcbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgbW9kZWwgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCwgbXVzdCBleHRlbmQgTW9kZWxcbiAqIEBleHRlbmRzIEJ1aWxkZXJSZWdpc3RyeTxUPlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUmVnaXN0cnk8VCBleHRlbmRzIE1vZGVsPiA9IEJ1aWxkZXJSZWdpc3RyeTxUPjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVnaXN0cnkgbWFuYWdlciBmb3IgbW9kZWwgY29uc3RydWN0b3JzIHRoYXQgZW5hYmxlcyBzZXJpYWxpemF0aW9uIGFuZCByZWJ1aWxkaW5nXG4gKiBAc3VtbWFyeSBUaGUgTW9kZWxSZWdpc3RyeU1hbmFnZXIgaW1wbGVtZW50cyB0aGUgTW9kZWxSZWdpc3RyeSBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzXG4gKiBmdW5jdGlvbmFsaXR5IGZvciByZWdpc3RlcmluZywgcmV0cmlldmluZywgYW5kIGJ1aWxkaW5nIG1vZGVsIGluc3RhbmNlcy4gSXQgbWFpbnRhaW5zXG4gKiBhIGNhY2hlIG9mIG1vZGVsIGNvbnN0cnVjdG9ycyBpbmRleGVkIGJ5IG5hbWUsIGFsbG93aW5nIGZvciBlZmZpY2llbnQgbG9va3VwIGFuZCBpbnN0YW50aWF0aW9uLlxuICogVGhpcyBjbGFzcyBpcyBlc3NlbnRpYWwgZm9yIHRoZSBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24gb2YgbW9kZWwgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFufSBbdGVzdEZ1bmN0aW9uXSAtIEZ1bmN0aW9uIHRvIHRlc3QgaWYgYW4gb2JqZWN0IGlzIGEgbW9kZWwsIGRlZmF1bHRzIHRvIHtAbGluayBNb2RlbCNpc01vZGVsfVxuICpcbiAqIEBjbGFzcyBNb2RlbFJlZ2lzdHJ5TWFuYWdlclxuICogQHRlbXBsYXRlIE0gVHlwZSBvZiBtb2RlbCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkLCBtdXN0IGV4dGVuZCBNb2RlbFxuICogQGltcGxlbWVudHMgTW9kZWxSZWdpc3RyeTxNPlxuICogQGNhdGVnb3J5IE1vZGVsXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG1vZGVsIHJlZ2lzdHJ5XG4gKiBjb25zdCByZWdpc3RyeSA9IG5ldyBNb2RlbFJlZ2lzdHJ5TWFuYWdlcigpO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGEgbW9kZWwgY2xhc3NcbiAqIHJlZ2lzdHJ5LnJlZ2lzdGVyKFVzZXIpO1xuICpcbiAqIC8vIFJldHJpZXZlIGEgbW9kZWwgY29uc3RydWN0b3IgYnkgbmFtZVxuICogY29uc3QgVXNlckNsYXNzID0gcmVnaXN0cnkuZ2V0KFwiVXNlclwiKTtcbiAqXG4gKiAvLyBCdWlsZCBhIG1vZGVsIGluc3RhbmNlIGZyb20gYSBwbGFpbiBvYmplY3RcbiAqIGNvbnN0IHVzZXJEYXRhID0geyBuYW1lOiBcIkpvaG5cIiwgYWdlOiAzMCB9O1xuICogY29uc3QgdXNlciA9IHJlZ2lzdHJ5LmJ1aWxkKHVzZXJEYXRhLCBcIlVzZXJcIik7XG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgTW9kZWxSZWdpc3RyeU1hbmFnZXJcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbCBDbGFzc1xuICpcbiAqICAgQy0+PlI6IG5ldyBNb2RlbFJlZ2lzdHJ5TWFuYWdlcih0ZXN0RnVuY3Rpb24pXG4gKiAgIEMtPj5SOiByZWdpc3RlcihNb2RlbENsYXNzKVxuICogICBSLT4+UjogU3RvcmUgaW4gY2FjaGVcbiAqICAgQy0+PlI6IGdldChcIk1vZGVsTmFtZVwiKVxuICogICBSLS0+PkM6IE1vZGVsQ2xhc3MgY29uc3RydWN0b3JcbiAqICAgQy0+PlI6IGJ1aWxkKGRhdGEsIFwiTW9kZWxOYW1lXCIpXG4gKiAgIFItPj5SOiBHZXQgY29uc3RydWN0b3IgZnJvbSBjYWNoZVxuICogICBSLT4+TTogbmV3IE1vZGVsQ2xhc3MoZGF0YSlcbiAqICAgTS0tPj5SOiBNb2RlbCBpbnN0YW5jZVxuICogICBSLS0+PkM6IE1vZGVsIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbFJlZ2lzdHJ5TWFuYWdlcjxNIGV4dGVuZHMgTW9kZWw8dHJ1ZSB8IGZhbHNlPj5cbiAgaW1wbGVtZW50cyBNb2RlbFJlZ2lzdHJ5PE0+XG57XG4gIHByaXZhdGUgY2FjaGU6IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29uc3RydWN0b3I8TT4+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVzdEZ1bmN0aW9uOiAob2JqOiBvYmplY3QpID0+IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdGVzdEZ1bmN0aW9uOiAob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBib29sZWFuID0gTW9kZWwuaXNNb2RlbFxuICApIHtcbiAgICB0aGlzLnRlc3RGdW5jdGlvbiA9IHRlc3RGdW5jdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgbW9kZWwgY29uc3RydWN0b3Igd2l0aCB0aGUgcmVnaXN0cnlcbiAgICogQHN1bW1hcnkgQWRkcyBhIG1vZGVsIGNvbnN0cnVjdG9yIHRvIHRoZSByZWdpc3RyeSBjYWNoZSwgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3JcbiAgICogbGF0ZXIgcmV0cmlldmFsIGFuZCBpbnN0YW50aWF0aW9uLiBJZiBubyBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0b3IncyBuYW1lXG4gICAqIHByb3BlcnR5IGlzIHVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmVnaXN0cnkuXG4gICAqXG4gICAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3RvcjxNPn0gY29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSAtIE9wdGlvbmFsIG5hbWUgdG8gcmVnaXN0ZXIgdGhlIGNvbnN0cnVjdG9yIHVuZGVyLCBkZWZhdWx0cyB0byBjb25zdHJ1Y3Rvci5uYW1lXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY29uc3RydWN0b3IgaXMgbm90IGEgZnVuY3Rpb25cbiAgICovXG4gIHJlZ2lzdGVyKGNvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPE0+LCBuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk1vZGVsIHJlZ2lzdGVyaW5nIGZhaWxlZC4gTWlzc2luZyBDbGFzcyBuYW1lIG9yIGNvbnN0cnVjdG9yXCJcbiAgICAgICk7XG4gICAgbmFtZSA9IG5hbWUgfHwgY29uc3RydWN0b3IubmFtZTtcbiAgICB0aGlzLmNhY2hlW25hbWVdID0gY29uc3RydWN0b3I7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgR2V0cyBhIHJlZ2lzdGVyZWQgTW9kZWwge0BsaW5rIE1vZGVsQ29uc3RydWN0b3J9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBnZXQobmFtZTogc3RyaW5nKTogTW9kZWxDb25zdHJ1Y3RvcjxNPiB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlW25hbWVdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtjbGF6el0gd2hlbiBwcm92aWRlZCwgaXQgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGNvbnN0cnVjdG9yXG4gICAqXG4gICAqIEB0aHJvd3MgRXJyb3IgSWYgY2xhenogaXMgbm90IGZvdW5kLCBvciBvYmogaXMgbm90IGEge0BsaW5rIE1vZGVsfSBtZWFuaW5nIGl0IGhhcyBubyB7QGxpbmsgTW9kZWxLZXlzLkFOQ0hPUn0gcHJvcGVydHlcbiAgICovXG4gIGJ1aWxkKG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LCBjbGF6ej86IHN0cmluZyk6IE0ge1xuICAgIGlmICghY2xhenogJiYgIXRoaXMudGVzdEZ1bmN0aW9uKG9iaikpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlZCBvYmogaXMgbm90IGEgTW9kZWwgb2JqZWN0XCIpO1xuICAgIGNvbnN0IG5hbWUgPSBjbGF6eiB8fCBNb2RlbC5nZXRNZXRhZGF0YShvYmogYXMgYW55KTtcbiAgICBpZiAoIShuYW1lIGluIHRoaXMuY2FjaGUpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUHJvdmlkZWQgY2xhc3MgJHtuYW1lfSBpcyBub3QgYSByZWdpc3RlcmVkIE1vZGVsIG9iamVjdGBcbiAgICAgICk7XG4gICAgcmV0dXJuIG5ldyB0aGlzLmNhY2hlW25hbWVdKG9iaik7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBCdWxrIFJlZ2lzdGVycyBNb2RlbHNcbiAqIEBkZXNjcmlwdGlvbiBVc2VmdWwgd2hlbiB1c2luZyBidW5kbGVycyB0aGF0IG1pZ2h0IG5vdCBldmFsdWF0ZSBhbGwgdGhlIGNvZGUgYXQgb25jZVxuICpcbiAqIEB0ZW1wbGF0ZSBNIGV4dGVuZHMgTW9kZWxcbiAqIEBwYXJhbSB7QXJyYXk8Q29uc3RydWN0b3I8TT4+IHwgQXJyYXk8e25hbWU6IHN0cmluZywgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPE0+fT59IFttb2RlbHNdXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWxrTW9kZWxSZWdpc3RlcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAuLi5tb2RlbHM6IChDb25zdHJ1Y3RvcjxNPiB8IHsgbmFtZTogc3RyaW5nOyBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8TT4gfSlbXVxuKSB7XG4gIG1vZGVscy5mb3JFYWNoKFxuICAgIChtOiBDb25zdHJ1Y3RvcjxNPiB8IHsgbmFtZTogc3RyaW5nOyBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8TT4gfSkgPT4ge1xuICAgICAgY29uc3QgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPE0+ID0gKFxuICAgICAgICBtLmNvbnN0cnVjdG9yID8gbS5jb25zdHJ1Y3RvciA6IG1cbiAgICAgICkgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgICBNb2RlbC5yZWdpc3Rlcihjb25zdHJ1Y3RvciwgKG0gYXMgQ29uc3RydWN0b3I8TT4pLm5hbWUpO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBBYnN0cmFjdCBjbGFzcyByZXByZXNlbnRpbmcgYSBWYWxpZGF0YWJsZSBNb2RlbCBvYmplY3RcbiAqIEBkZXNjcmlwdGlvbiBNZWFudCB0byBiZSB1c2VkIGFzIGEgYmFzZSBjbGFzcyBmb3IgYWxsIE1vZGVsIGNsYXNzZXNcbiAqXG4gKiBNb2RlbCBvYmplY3RzIG11c3Q6XG4gKiAgLSBIYXZlIGFsbCB0aGVpciByZXF1aXJlZCBwcm9wZXJ0aWVzIG1hcmtlZCB3aXRoICchJztcbiAqICAtIEhhdmUgYWxsIHRoZWlyIG9wdGlvbmFsIHByb3BlcnRpZXMgbWFya2VkIGFzICc/JzpcbiAqXG4gKiBAcGFyYW0ge01vZGVsQXJnPE1vZGVsPn0gbW9kZWwgYmFzZSBvYmplY3QgZnJvbSB3aGljaCB0byBwb3B1bGF0ZSBwcm9wZXJ0aWVzIGZyb21cbiAqXG4gKiBAY2xhc3MgTW9kZWxcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICogQGFic3RyYWN0XG4gKiBAaW1wbGVtZW50cyBWYWxpZGF0YWJsZVxuICogQGltcGxlbWVudHMgU2VyaWFsaXphYmxlXG4gKlxuICogQGV4YW1wbGVcbiAqICAgICAgY2xhc3MgQ2xhc3NOYW1lIHtcbiAqICAgICAgICAgIEByZXF1aXJlZCgpXG4gKiAgICAgICAgICByZXF1aXJlZFByb3BlcnR5TmFtZSE6IFByb3BlcnR5VHlwZTtcbiAqXG4gKiAgICAgICAgICBvcHRpb25hbFByb3BlcnR5TmFtZT86IFByb3BlcnR5VHlwZTtcbiAqICAgICAgfVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTW9kZWw8QXN5bmMgZXh0ZW5kcyBib29sZWFuID0gZmFsc2U+XG4gIGltcGxlbWVudHNcbiAgICBWYWxpZGF0YWJsZTxBc3luYz4sXG4gICAgU2VyaWFsaXphYmxlLFxuICAgIEhhc2hhYmxlLFxuICAgIENvbXBhcmFibGU8TW9kZWw8QXN5bmM+Plxue1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihhcmc6IE1vZGVsQXJnPE1vZGVsPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCkge31cblxuICBwdWJsaWMgaXNBc3luYygpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcyBhcyBhbnk7XG4gICAgcmV0dXJuICEhKHNlbGZbQVNZTkNfTUVUQV9LRVldID8/IHNlbGY/LmNvbnN0cnVjdG9yW0FTWU5DX01FVEFfS0VZXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyB0aGUgbW9kZWwgb2JqZWN0IGFnYWluc3QgaXRzIGRlZmluZWQgdmFsaWRhdGlvbiBydWxlc1xuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhlIG9iamVjdCBhY2NvcmRpbmcgdG8gaXRzIGRlY29yYXRlZCBwcm9wZXJ0aWVzLCByZXR1cm5pbmcgYW55IHZhbGlkYXRpb24gZXJyb3JzXG4gICAqXG4gICAqIEBwYXJhbSB7YW55W119IFtleGNlcHRpb25zXSAtIFByb3BlcnRpZXMgaW4gdGhlIG9iamVjdCB0byBiZSBpZ25vcmVkIGZvciB0aGUgdmFsaWRhdGlvbi4gTWFya2VkIGFzICdhbnknIHRvIGFsbG93IGZvciBleHRlbnNpb24gYnV0IGV4cGVjdHMgc3RyaW5nc1xuICAgKiBAcmV0dXJuIHtNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZH0gLSBSZXR1cm5zIGEgTW9kZWxFcnJvckRlZmluaXRpb24gb2JqZWN0IGlmIHZhbGlkYXRpb24gZXJyb3JzIGV4aXN0LCBvdGhlcndpc2UgdW5kZWZpbmVkXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIC4uLmV4Y2VwdGlvbnM6IGFueVtdXG4gICk6IENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHZhbGlkYXRlPGFueSwgQXN5bmM+KFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuaXNBc3luYygpIGFzIGFueSxcbiAgICAgIC4uLmV4Y2VwdGlvbnNcbiAgICApIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiB0aGlzIG1vZGVsIGlzIGVxdWFsIHRvIGFub3RoZXIgb2JqZWN0XG4gICAqIEBzdW1tYXJ5IENvbXBhcmUgb2JqZWN0IGVxdWFsaXR5IHJlY3Vyc2l2ZWx5LCBjaGVja2luZyBhbGwgcHJvcGVydGllcyB1bmxlc3MgZXhjbHVkZWRcbiAgICpcbiAgICogQHBhcmFtIHthbnl9IG9iaiAtIE9iamVjdCB0byBjb21wYXJlIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtleGNlcHRpb25zXSAtIFByb3BlcnR5IG5hbWVzIHRvIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGNvbXBhcmlzb25cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gLSBUcnVlIGlmIG9iamVjdHMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHB1YmxpYyBlcXVhbHMob2JqOiBhbnksIC4uLmV4Y2VwdGlvbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzRXF1YWwodGhpcywgb2JqLCAuLi5leGNlcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgdGhlIG1vZGVsIHRvIGEgc2VyaWFsaXplZCBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgc2VyaWFsaXplZCBtb2RlbCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnRseSBkZWZpbmVkIHtAbGluayBTZXJpYWxpemVyfVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gVGhlIHNlcmlhbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbFxuICAgKi9cbiAgc2VyaWFsaXplKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE1vZGVsLnNlcmlhbGl6ZSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IganMncyAndG9TdHJpbmcoKScgdG8gcHJvdmlkZSBhIG1vcmUgdXNlZnVsIHJlcHJlc2VudGF0aW9uXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gLSBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgaW5jbHVkaW5nIGl0cyBjbGFzcyBuYW1lIGFuZCBKU09OIHJlcHJlc2VudGF0aW9uXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZSArIFwiOiBcIiArIEpTT04uc3RyaW5naWZ5KHRoaXMsIHVuZGVmaW5lZCwgMik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIGhhc2ggc3RyaW5nIGZvciB0aGUgbW9kZWwgb2JqZWN0XG4gICAqIEBzdW1tYXJ5IERlZmluZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBvYmplY3QgaGFzaCwgcmVseWluZyBvbiBhIGJhc2ljIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIEphdmEncyBzdHJpbmcgaGFzaFxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gQSBoYXNoIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG1vZGVsXG4gICAqL1xuICBwdWJsaWMgaGFzaCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBNb2RlbC5oYXNoKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHNlcmlhbGl6ZWQgc3RyaW5nIGJhY2sgaW50byBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IERlc2VyaWFsaXplcyBhIE1vZGVsIGZyb20gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHNlcmlhbGl6ZWQgc3RyaW5nIHRvIGNvbnZlcnQgYmFjayB0byBhIG1vZGVsXG4gICAqIEByZXR1cm4ge2FueX0gLSBUaGUgZGVzZXJpYWxpemVkIG1vZGVsIGluc3RhbmNlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlscyB0byBwYXJzZSB0aGUgc3RyaW5nLCBvciBpZiBpdCBmYWlscyB0byBidWlsZCB0aGUgbW9kZWxcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIE1vZGVsLmtleShNb2RlbEtleXMuU0VSSUFMSVpBVElPTiksXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXG4gICAgKTtcblxuICAgIGlmIChtZXRhZGF0YSAmJiBtZXRhZGF0YS5zZXJpYWxpemVyKVxuICAgICAgcmV0dXJuIFNlcmlhbGl6YXRpb24uZGVzZXJpYWxpemUoXG4gICAgICAgIHN0cixcbiAgICAgICAgbWV0YWRhdGEuc2VyaWFsaXplcixcbiAgICAgICAgLi4uKG1ldGFkYXRhLmFyZ3MgfHwgW10pXG4gICAgICApO1xuICAgIHJldHVybiBTZXJpYWxpemF0aW9uLmRlc2VyaWFsaXplKHN0cik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvcGllcyBwcm9wZXJ0aWVzIGZyb20gYSBzb3VyY2Ugb2JqZWN0IHRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgUmVwb3B1bGF0ZXMgdGhlIE9iamVjdCBwcm9wZXJ0aWVzIHdpdGggdGhlIG9uZXMgZnJvbSB0aGUgbmV3IG9iamVjdFxuICAgKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1R9IHNlbGYgLSBUaGUgdGFyZ2V0IG1vZGVsIGluc3RhbmNlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge1QgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbb2JqXSAtIFRoZSBzb3VyY2Ugb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyB0byBjb3B5XG4gICAqIEByZXR1cm4ge1R9IC0gVGhlIHVwZGF0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBmcm9tT2JqZWN0PFQgZXh0ZW5kcyBNb2RlbDxhbnk+PihcbiAgICBzZWxmOiBULFxuICAgIG9iaj86IFQgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFQge1xuICAgIGlmICghb2JqKSBvYmogPSB7fTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgTW9kZWwuZ2V0QXR0cmlidXRlcyhzZWxmKSkge1xuICAgICAgKHNlbGYgYXMgYW55KVtwcm9wXSA9XG4gICAgICAgIChvYmogYXMgYW55KVtwcm9wXSA/PyAoc2VsZiBhcyBhbnkpW3Byb3BdID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvcGllcyBhbmQgcmVidWlsZHMgcHJvcGVydGllcyBmcm9tIGEgc291cmNlIG9iamVjdCB0byBhIG1vZGVsIGluc3RhbmNlLCBoYW5kbGluZyBuZXN0ZWQgbW9kZWxzXG4gICAqIEBzdW1tYXJ5IFJlcG9wdWxhdGVzIHRoZSBpbnN0YW5jZSB3aXRoIHByb3BlcnRpZXMgZnJvbSB0aGUgbmV3IE1vZGVsIE9iamVjdCwgcmVjdXJzaXZlbHkgcmVidWlsZGluZyBuZXN0ZWQgbW9kZWxzXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VH0gc2VsZiAtIFRoZSB0YXJnZXQgbW9kZWwgaW5zdGFuY2UgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7VCB8IFJlY29yZDxzdHJpbmcsIGFueT59IFtvYmpdIC0gVGhlIHNvdXJjZSBvYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRvIGNvcHlcbiAgICogQHJldHVybiB7VH0gLSBUaGUgdXBkYXRlZCBtb2RlbCBpbnN0YW5jZSB3aXRoIHJlYnVpbHQgbmVzdGVkIG1vZGVsc1xuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWwuZnJvbU1vZGVsXG4gICAqICAgcGFydGljaXBhbnQgQiBhcyBNb2RlbC5idWlsZFxuICAgKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVmbGVjdGlvblxuICAgKlxuICAgKiAgIEMtPj5NOiBmcm9tTW9kZWwoc2VsZiwgb2JqKVxuICAgKiAgIE0tPj5NOiBHZXQgYXR0cmlidXRlcyBmcm9tIHNlbGZcbiAgICogICBsb29wIEZvciBlYWNoIHByb3BlcnR5XG4gICAqICAgICBNLT4+TTogQ29weSBwcm9wZXJ0eSBmcm9tIG9iaiB0byBzZWxmXG4gICAqICAgICBhbHQgUHJvcGVydHkgaXMgYSBtb2RlbFxuICAgKiAgICAgICBNLT4+TTogQ2hlY2sgaWYgcHJvcGVydHkgaXMgYSBtb2RlbFxuICAgKiAgICAgICBNLT4+QjogYnVpbGQocHJvcGVydHksIG1vZGVsVHlwZSlcbiAgICogICAgICAgQi0tPj5NOiBSZXR1cm4gYnVpbHQgbW9kZWxcbiAgICogICAgIGVsc2UgUHJvcGVydHkgaXMgYSBjb21wbGV4IHR5cGVcbiAgICogICAgICAgTS0+PlI6IEdldCBwcm9wZXJ0eSBkZWNvcmF0b3JzXG4gICAqICAgICAgIFItLT4+TTogUmV0dXJuIGRlY29yYXRvcnNcbiAgICogICAgICAgTS0+Pk06IEZpbHRlciB0eXBlIGRlY29yYXRvcnNcbiAgICogICAgICAgYWx0IFByb3BlcnR5IGlzIEFycmF5L1NldCB3aXRoIGxpc3QgZGVjb3JhdG9yXG4gICAqICAgICAgICAgTS0+Pk06IFByb2Nlc3MgZWFjaCBpdGVtIGluIGNvbGxlY3Rpb25cbiAgICogICAgICAgICBsb29wIEZvciBlYWNoIGl0ZW1cbiAgICogICAgICAgICAgIE0tPj5COiBidWlsZChpdGVtLCBpdGVtTW9kZWxUeXBlKVxuICAgKiAgICAgICAgICAgQi0tPj5NOiBSZXR1cm4gYnVpbHQgbW9kZWxcbiAgICogICAgICAgICBlbmRcbiAgICogICAgICAgZWxzZSBQcm9wZXJ0eSBpcyBhbm90aGVyIG1vZGVsIHR5cGVcbiAgICogICAgICAgICBNLT4+QjogYnVpbGQocHJvcGVydHksIHByb3BlcnR5VHlwZSlcbiAgICogICAgICAgICBCLS0+Pk06IFJldHVybiBidWlsdCBtb2RlbFxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIE0tLT4+QzogUmV0dXJuIHVwZGF0ZWQgc2VsZlxuICAgKi9cbiAgc3RhdGljIGZyb21Nb2RlbDxUIGV4dGVuZHMgTW9kZWw+KHNlbGY6IFQsIG9iaj86IFQgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogVCB7XG4gICAgaWYgKCFvYmopIG9iaiA9IHt9O1xuXG4gICAgbGV0IGRlY29yYXRvcnM6IERlY29yYXRvck1ldGFkYXRhW10sIGRlYzogRGVjb3JhdG9yTWV0YWRhdGE7XG5cbiAgICBjb25zdCBwcm9wcyA9IE1vZGVsLmdldEF0dHJpYnV0ZXMoc2VsZik7XG5cbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihzZWxmKTtcbiAgICBsZXQgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0gPVxuICAgICAgICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0gPz9cbiAgICAgICAgICAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSA/P1xuICAgICAgICAgIHVuZGVmaW5lZDtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHByb3ApO1xuICAgICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgZGVzY3JpcHRvci53cml0YWJsZSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byB3cml0ZSBwcm9wZXJ0eSAke3Byb3B9IHRvIG1vZGVsOiAke2V9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgKHNlbGYgYXMgYW55KVtwcm9wXSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHByb3BNID0gTW9kZWwuaXNQcm9wZXJ0eU1vZGVsKHNlbGYsIHByb3ApO1xuICAgICAgaWYgKHByb3BNKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0gPSBNb2RlbC5idWlsZChcbiAgICAgICAgICAgIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdLFxuICAgICAgICAgICAgdHlwZW9mIHByb3BNID09PSBcInN0cmluZ1wiID8gcHJvcE0gOiB1bmRlZmluZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWxsRGVjb3JhdG9yczogRGVjb3JhdG9yTWV0YWRhdGFbXSA9XG4gICAgICAgIFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICAgIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1QsXG4gICAgICAgICAgc2VsZixcbiAgICAgICAgICBwcm9wXG4gICAgICAgICkuZGVjb3JhdG9ycztcbiAgICAgIGRlY29yYXRvcnMgPSBhbGxEZWNvcmF0b3JzLmZpbHRlcihcbiAgICAgICAgKGQ6IERlY29yYXRvck1ldGFkYXRhKSA9PlxuICAgICAgICAgIFtNb2RlbEtleXMuVFlQRSwgVmFsaWRhdGlvbktleXMuVFlQRSBhcyBzdHJpbmddLmluZGV4T2YoZC5rZXkpICE9PSAtMVxuICAgICAgKTtcbiAgICAgIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZmFpbGVkIHRvIGZpbmQgZGVjb3JhdG9ycyBmb3IgcHJvcGVydHkgJHtwcm9wfWApO1xuICAgICAgZGVjID0gZGVjb3JhdG9ycy5wb3AoKSBhcyBEZWNvcmF0b3JNZXRhZGF0YTtcbiAgICAgIGNvbnN0IGNsYXp6ID0gZGVjLnByb3BzLm5hbWVcbiAgICAgICAgPyBbZGVjLnByb3BzLm5hbWVdXG4gICAgICAgIDogKEFycmF5LmlzQXJyYXkoZGVjLnByb3BzLmN1c3RvbVR5cGVzKVxuICAgICAgICAgICAgPyBkZWMucHJvcHMuY3VzdG9tVHlwZXNcbiAgICAgICAgICAgIDogW2RlYy5wcm9wcy5jdXN0b21UeXBlc11cbiAgICAgICAgICApLm1hcCgodCkgPT4gKHR5cGVvZiB0ID09PSBcImZ1bmN0aW9uXCIgPyB0KCkgOiB0KSk7XG4gICAgICBjb25zdCByZXNlcnZlZCA9IE9iamVjdC52YWx1ZXMoUmVzZXJ2ZWRNb2RlbHMpLm1hcCgodikgPT5cbiAgICAgICAgdi50b0xvd2VyQ2FzZSgpXG4gICAgICApIGFzIHN0cmluZ1tdO1xuXG4gICAgICBjbGF6ei5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgYyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgaWYgKGMubmFtZSkgYyA9IGMubmFtZTtcbiAgICAgICAgICBlbHNlIGMgPSBjKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc2VydmVkLmluZGV4T2YoYy50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgICBjYXNlIFwiQXJyYXlcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIlNldFwiOlxuICAgICAgICAgICAgICAgIGlmIChhbGxEZWNvcmF0b3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdERlYyA9IGFsbERlY29yYXRvcnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKGQpID0+IGQua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKGxpc3REZWMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsYXp6TmFtZSA9IChsaXN0RGVjLnByb3BzLmNsYXp6IGFzIHN0cmluZ1tdKS5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICh0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0eXBlb2YgdCA9PT0gXCJmdW5jdGlvblwiID8gKHQgYXMgYW55KSgpIDogdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAodCBhcyBhbnkpLm5hbWUgPyAodCBhcyBhbnkpLm5hbWUgOiB0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFqc1R5cGVzLmluY2x1ZGVzKHQpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY2xhenpOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2xhenpOYW1lID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNsYXp6TmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoY2xhenpOYW1lIGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgICAgY2xhenpOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2xhenpOYW1lID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNsYXp6TmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoY2xhenpOYW1lIGFzIGFueSkubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09IFwiQXJyYXlcIilcbiAgICAgICAgICAgICAgICAgICAgICAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICAgICAgICAgICAgICAgIClbcHJvcF0ubWFwKChlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1wib2JqZWN0XCIsIFwiZnVuY3Rpb25cIl0uaW5jbHVkZXModHlwZW9mIGVsKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6ek5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBNb2RlbC5idWlsZChlbCwgY2xhenpOYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVsO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gXCJTZXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm9iamVjdFwiLCBcImZ1bmN0aW9uXCJdLmluY2x1ZGVzKHR5cGVvZiB2KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6ek5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkZChNb2RlbC5idWlsZCh2LCBjbGF6ek5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRkKHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSA9IHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgdHlwZW9mIHNlbGZbcHJvcCBhcyBrZXlvZiB0eXBlb2Ygc2VsZl0gIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICAgIE1vZGVsLmdldChjKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID0gTW9kZWwuYnVpbGQoXG4gICAgICAgICAgICAgICAgICAgIChzZWxmIGFzIGFueSlbcHJvcF0sXG4gICAgICAgICAgICAgICAgICAgIGNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuIHdlIGhhdmUgbm8gcmVnaXN0cnkgb2YgdGhpcyBjbGFzc1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJlcyB0aGUgZ2xvYmFsIG1vZGVsIGJ1aWxkZXIgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgU2V0cyB0aGUgR2xvYmFsIHtAbGluayBNb2RlbEJ1aWxkZXJGdW5jdGlvbn0gdXNlZCBmb3IgYnVpbGRpbmcgbW9kZWwgaW5zdGFuY2VzXG4gICAqXG4gICAqIEBwYXJhbSB7TW9kZWxCdWlsZGVyRnVuY3Rpb259IFtidWlsZGVyXSAtIFRoZSBidWlsZGVyIGZ1bmN0aW9uIHRvIHNldCBhcyB0aGUgZ2xvYmFsIGJ1aWxkZXJcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZXRCdWlsZGVyKGJ1aWxkZXI/OiBNb2RlbEJ1aWxkZXJGdW5jdGlvbikge1xuICAgIG1vZGVsQnVpbGRlckZ1bmN0aW9uID0gYnVpbGRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBnbG9iYWwgbW9kZWwgYnVpbGRlciBmdW5jdGlvblxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjdXJyZW50IGdsb2JhbCB7QGxpbmsgTW9kZWxCdWlsZGVyRnVuY3Rpb259IHVzZWQgZm9yIGJ1aWxkaW5nIG1vZGVsIGluc3RhbmNlc1xuICAgKlxuICAgKiBAcmV0dXJuIHtNb2RlbEJ1aWxkZXJGdW5jdGlvbiB8IHVuZGVmaW5lZH0gLSBUaGUgY3VycmVudCBnbG9iYWwgYnVpbGRlciBmdW5jdGlvbiBvciB1bmRlZmluZWQgaWYgbm90IHNldFxuICAgKi9cbiAgc3RhdGljIGdldEJ1aWxkZXIoKTogTW9kZWxCdWlsZGVyRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBtb2RlbEJ1aWxkZXJGdW5jdGlvbiB8fCBNb2RlbC5mcm9tTW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY3VycmVudCBtb2RlbCByZWdpc3RyeVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjdXJyZW50IHtAbGluayBNb2RlbFJlZ2lzdHJ5TWFuYWdlcn0gaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAqXG4gICAqIEByZXR1cm4ge01vZGVsUmVnaXN0cnk8YW55Pn0gLSBUaGUgY3VycmVudCBtb2RlbCByZWdpc3RyeSwgZGVmYXVsdHMgdG8gYSBuZXcge0BsaW5rIE1vZGVsUmVnaXN0cnlNYW5hZ2VyfSBpZiBub3Qgc2V0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRSZWdpc3RyeSgpIHtcbiAgICBpZiAoIWFjdGluZ01vZGVsUmVnaXN0cnkpIGFjdGluZ01vZGVsUmVnaXN0cnkgPSBuZXcgTW9kZWxSZWdpc3RyeU1hbmFnZXIoKTtcbiAgICByZXR1cm4gYWN0aW5nTW9kZWxSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJlcyB0aGUgbW9kZWwgcmVnaXN0cnkgdG8gYmUgdXNlZCBieSB0aGUgTW9kZWwgc3lzdGVtXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIGN1cnJlbnQgbW9kZWwgcmVnaXN0cnkgdG8gYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtCdWlsZGVyUmVnaXN0cnk8YW55Pn0gbW9kZWxSZWdpc3RyeSAtIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgUmVnaXN0cnkgdG8gdXNlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0UmVnaXN0cnkobW9kZWxSZWdpc3RyeTogQnVpbGRlclJlZ2lzdHJ5PGFueT4pIHtcbiAgICBhY3RpbmdNb2RlbFJlZ2lzdHJ5ID0gbW9kZWxSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgbW9kZWwgY29uc3RydWN0b3Igd2l0aCB0aGUgbW9kZWwgcmVnaXN0cnlcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIG5ldyBtb2RlbCBjbGFzc2VzIHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgZm9yIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvblxuICAgKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3I8VD59IGNvbnN0cnVjdG9yIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBPcHRpb25hbCBuYW1lIHRvIHJlZ2lzdGVyIHRoZSBjb25zdHJ1Y3RvciB1bmRlciwgZGVmYXVsdHMgdG8gY29uc3RydWN0b3IubmFtZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKlxuICAgKiBAc2VlIE1vZGVsUmVnaXN0cnlcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcjxUIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPFQ+LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgcmV0dXJuIE1vZGVsLmdldFJlZ2lzdHJ5KCkucmVnaXN0ZXIoY29uc3RydWN0b3IsIG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZWdpc3RlcmVkIG1vZGVsIGNvbnN0cnVjdG9yIGJ5IG5hbWVcbiAgICogQHN1bW1hcnkgR2V0cyBhIHJlZ2lzdGVyZWQgTW9kZWwge0BsaW5rIE1vZGVsQ29uc3RydWN0b3J9IGZyb20gdGhlIG1vZGVsIHJlZ2lzdHJ5XG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG1vZGVsIGNvbnN0cnVjdG9yIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4ge01vZGVsQ29uc3RydWN0b3I8VD4gfCB1bmRlZmluZWR9IC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIGlmIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBzZWUgTW9kZWxSZWdpc3RyeVxuICAgKi9cbiAgc3RhdGljIGdldDxUIGV4dGVuZHMgTW9kZWw+KG5hbWU6IHN0cmluZyk6IE1vZGVsQ29uc3RydWN0b3I8VD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBNb2RlbC5nZXRSZWdpc3RyeSgpLmdldChuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gYSBwbGFpbiBvYmplY3RcbiAgICogQHN1bW1hcnkgQnVpbGRzIGEgbW9kZWwgaW5zdGFuY2UgdXNpbmcgdGhlIG1vZGVsIHJlZ2lzdHJ5LCBvcHRpb25hbGx5IHNwZWNpZnlpbmcgdGhlIG1vZGVsIGNsYXNzXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqIC0gVGhlIHNvdXJjZSBvYmplY3QgdG8gYnVpbGQgdGhlIG1vZGVsIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtjbGF6el0gLSBXaGVuIHByb3ZpZGVkLCBpdCB3aWxsIGF0dGVtcHQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgY29uc3RydWN0b3IgYnkgbmFtZVxuICAgKiBAcmV0dXJuIHtUfSAtIFRoZSBidWlsdCBtb2RlbCBpbnN0YW5jZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgY2xhenogaXMgbm90IGZvdW5kLCBvciBvYmogaXMgbm90IGEge0BsaW5rIE1vZGVsfSBtZWFuaW5nIGl0IGhhcyBubyB7QGxpbmsgTW9kZWxLZXlzLkFOQ0hPUn0gcHJvcGVydHlcbiAgICpcbiAgICogQHNlZSBNb2RlbFJlZ2lzdHJ5XG4gICAqL1xuICBzdGF0aWMgYnVpbGQ8VCBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgICBjbGF6ej86IHN0cmluZ1xuICApOiBUIHtcbiAgICByZXR1cm4gTW9kZWwuZ2V0UmVnaXN0cnkoKS5idWlsZChvYmosIGNsYXp6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBtb2RlbCBtZXRhZGF0YSBmcm9tIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgbW9kZWwgaW5zdGFuY2UsIHR5cGljYWxseSB0aGUgbW9kZWwgY2xhc3MgbmFtZVxuICAgKlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGdldCBtZXRhZGF0YSBmcm9tXG4gICAqIEByZXR1cm4ge3N0cmluZ30gLSBUaGUgbW9kZWwgbWV0YWRhdGEgKHR5cGljYWxseSB0aGUgY2xhc3MgbmFtZSlcbiAgICovXG4gIHN0YXRpYyBnZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgcmV0dXJuIGdldE1ldGFkYXRhPE0+KG1vZGVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFsbCBhdHRyaWJ1dGUgbmFtZXMgZnJvbSBhIG1vZGVsIGNsYXNzIG9yIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEdldHMgYWxsIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiBhIG1vZGVsLCB0cmF2ZXJzaW5nIHRoZSBwcm90b3R5cGUgY2hhaW4gdG8gaW5jbHVkZSBpbmhlcml0ZWQgYXR0cmlidXRlc1xuICAgKlxuICAgKiBAdGVtcGxhdGUgVlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPFY+IHwgVn0gbW9kZWwgLSBUaGUgbW9kZWwgY2xhc3Mgb3IgaW5zdGFuY2UgdG8gZ2V0IGF0dHJpYnV0ZXMgZnJvbVxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gLSBBcnJheSBvZiBhdHRyaWJ1dGUgbmFtZXMgZGVmaW5lZCBpbiB0aGUgbW9kZWxcbiAgICovXG4gIHN0YXRpYyBnZXRBdHRyaWJ1dGVzPFYgZXh0ZW5kcyBNb2RlbD4obW9kZWw6IENvbnN0cnVjdG9yPFY+IHwgVikge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcHJvdG90eXBlID1cbiAgICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWxcbiAgICAgICAgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWwpXG4gICAgICAgIDogKG1vZGVsIGFzIGFueSkucHJvdG90eXBlO1xuICAgIHdoaWxlIChwcm90b3R5cGUgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcHJvcHM6IHN0cmluZ1tdID0gcHJvdG90eXBlW01vZGVsS2V5cy5BVFRSSUJVVEVdO1xuICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnByb3BzKTtcbiAgICAgIH1cbiAgICAgIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb21wYXJlcyB0d28gbW9kZWwgaW5zdGFuY2VzIGZvciBlcXVhbGl0eVxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIHR3byBtb2RlbCBpbnN0YW5jZXMgYXJlIGVxdWFsIGJ5IGNvbXBhcmluZyB0aGVpciBwcm9wZXJ0aWVzXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7TX0gb2JqMSAtIEZpcnN0IG1vZGVsIGluc3RhbmNlIHRvIGNvbXBhcmVcbiAgICogQHBhcmFtIHtNfSBvYmoyIC0gU2Vjb25kIG1vZGVsIGluc3RhbmNlIHRvIGNvbXBhcmVcbiAgICogQHBhcmFtIHthbnlbXX0gW2V4Y2VwdGlvbnNdIC0gUHJvcGVydHkgbmFtZXMgdG8gZXhjbHVkZSBmcm9tIGNvbXBhcmlzb25cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gLSBUcnVlIGlmIHRoZSBtb2RlbHMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHN0YXRpYyBlcXVhbHM8TSBleHRlbmRzIE1vZGVsPihvYmoxOiBNLCBvYmoyOiBNLCAuLi5leGNlcHRpb25zOiBhbnlbXSkge1xuICAgIHJldHVybiBpc0VxdWFsKG9iajEsIG9iajIsIC4uLmV4Y2VwdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgYSBtb2RlbCBpbnN0YW5jZSBhZ2FpbnN0IGl0cyB2YWxpZGF0aW9uIHJ1bGVzXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBpZiBhIG1vZGVsIGhhcyB2YWxpZGF0aW9uIGVycm9ycywgb3B0aW9uYWxseSBpZ25vcmluZyBzcGVjaWZpZWQgcHJvcGVydGllc1xuICAgKlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXN5bmMgLSBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIGJlIGFzeW5jaHJvbm91cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW3Byb3BzVG9JZ25vcmVdIC0gUHJvcGVydGllcyB0byBleGNsdWRlIGZyb20gdmFsaWRhdGlvblxuICAgKiBAcmV0dXJuIHtNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZH0gLSBSZXR1cm5zIHZhbGlkYXRpb24gZXJyb3JzIGlmIGFueSwgb3RoZXJ3aXNlIHVuZGVmaW5lZFxuICAgKi9cbiAgc3RhdGljIGhhc0Vycm9yczxNIGV4dGVuZHMgTW9kZWwsIEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlPihcbiAgICBtb2RlbDogTSxcbiAgICBhc3luYzogQXN5bmMsXG4gICAgLi4ucHJvcHNUb0lnbm9yZTogc3RyaW5nW11cbiAgKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdmFsaWRhdGU8YW55LCBBc3luYz4obW9kZWwsIGFzeW5jLCAuLi5wcm9wc1RvSWdub3JlKSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgdG8gYSBzZXJpYWxpemVkIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBTZXJpYWxpemVzIGEgbW9kZWwgaW5zdGFuY2UgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgc2VyaWFsaXplciBvciB0aGUgZGVmYXVsdCBvbmVcbiAgICpcbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybiB7c3RyaW5nfSAtIFRoZSBzZXJpYWxpemVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWxcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemU8TSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+Pihtb2RlbDogTSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIE1vZGVsLmtleShNb2RlbEtleXMuU0VSSUFMSVpBVElPTiksXG4gICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICk7XG5cbiAgICBpZiAobWV0YWRhdGEgJiYgbWV0YWRhdGEuc2VyaWFsaXplcilcbiAgICAgIHJldHVybiBTZXJpYWxpemF0aW9uLnNlcmlhbGl6ZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgbWV0YWRhdGEuc2VyaWFsaXplcixcbiAgICAgICAgLi4uKG1ldGFkYXRhLmFyZ3MgfHwgW10pXG4gICAgICApO1xuICAgIHJldHVybiBTZXJpYWxpemF0aW9uLnNlcmlhbGl6ZShtb2RlbCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIGhhc2ggc3RyaW5nIGZvciBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBoYXNoIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9kZWwgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgYWxnb3JpdGhtIG9yIHRoZSBkZWZhdWx0IG9uZVxuICAgKlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGhhc2hcbiAgICogQHJldHVybiB7c3RyaW5nfSAtIFRoZSBoYXNoIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG1vZGVsXG4gICAqL1xuICBzdGF0aWMgaGFzaDxNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgTW9kZWwua2V5KE1vZGVsS2V5cy5IQVNISU5HKSxcbiAgICAgIG1vZGVsLmNvbnN0cnVjdG9yXG4gICAgKTtcblxuICAgIGlmIChtZXRhZGF0YSAmJiBtZXRhZGF0YS5hbGdvcml0aG0pXG4gICAgICByZXR1cm4gSGFzaGluZy5oYXNoKG1vZGVsLCBtZXRhZGF0YS5hbGdvcml0aG0sIC4uLihtZXRhZGF0YS5hcmdzIHx8IFtdKSk7XG4gICAgcmV0dXJuIEhhc2hpbmcuaGFzaChtb2RlbCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBtZXRhZGF0YSBrZXkgZm9yIHVzZSB3aXRoIHRoZSBSZWZsZWN0aW9uIEFQSVxuICAgKiBAc3VtbWFyeSBCdWlsZHMgdGhlIGtleSB0byBzdG9yZSBhcyBNZXRhZGF0YSB1bmRlciBSZWZsZWN0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIGJhc2Uga2V5IHRvIGNvbmNhdGVuYXRlIHdpdGggdGhlIG1vZGVsIHJlZmxlY3Rpb24gcHJlZml4XG4gICAqIEByZXR1cm4ge3N0cmluZ30gLSBUaGUgY29tcGxldGUgbWV0YWRhdGEga2V5XG4gICAqL1xuICBzdGF0aWMga2V5KHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGdldE1vZGVsS2V5KHN0cik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgYW4gb2JqZWN0IGlzIGEgbW9kZWwgaW5zdGFuY2Ugb3IgaGFzIG1vZGVsIG1ldGFkYXRhXG4gICAqIEBzdW1tYXJ5IENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gb2JqZWN0IGlzIGVpdGhlciBhbiBpbnN0YW5jZSBvZiB0aGUgTW9kZWwgY2xhc3Mgb3JcbiAgICogaGFzIG1vZGVsIG1ldGFkYXRhIGF0dGFjaGVkIHRvIGl0LiBUaGlzIGZ1bmN0aW9uIGlzIGVzc2VudGlhbCBmb3Igc2VyaWFsaXphdGlvbiBhbmRcbiAgICogZGVzZXJpYWxpemF0aW9uIHByb2Nlc3NlcywgYXMgaXQgaGVscHMgaWRlbnRpZnkgbW9kZWwgb2JqZWN0cyB0aGF0IG5lZWQgc3BlY2lhbCBoYW5kbGluZy5cbiAgICogSXQgc2FmZWx5IGhhbmRsZXMgcG90ZW50aWFsIGVycm9ycyBkdXJpbmcgbWV0YWRhdGEgcmV0cmlldmFsLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRhcmdldCAtIFRoZSBvYmplY3QgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgbW9kZWwgaW5zdGFuY2Ugb3IgaGFzIG1vZGVsIG1ldGFkYXRhLCBmYWxzZSBvdGhlcndpc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBtb2RlbFxuICAgKiBjb25zdCB1c2VyID0gbmV3IFVzZXIoeyBuYW1lOiBcIkpvaG5cIiB9KTtcbiAgICogY29uc3QgaXNVc2VyTW9kZWwgPSBpc01vZGVsKHVzZXIpOyAvLyB0cnVlXG4gICAqXG4gICAqIC8vIENoZWNrIGEgcGxhaW4gb2JqZWN0XG4gICAqIGNvbnN0IHBsYWluT2JqZWN0ID0geyBuYW1lOiBcIkpvaG5cIiB9O1xuICAgKiBjb25zdCBpc1BsYWluT2JqZWN0TW9kZWwgPSBpc01vZGVsKHBsYWluT2JqZWN0KTsgLy8gZmFsc2VcbiAgICogYGBgXG4gICAqL1xuICBzdGF0aWMgaXNNb2RlbCh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIE1vZGVsIHx8ICEhTW9kZWwuZ2V0TWV0YWRhdGEodGFyZ2V0IGFzIGFueSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSBwcm9wZXJ0eSBvZiBhIG1vZGVsIGlzIGl0c2VsZiBhIG1vZGVsIG9yIGhhcyBhIG1vZGVsIHR5cGVcbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3BlY2lmaWMgcHJvcGVydHkgb2YgYSBtb2RlbCBpbnN0YW5jZSBpcyBlaXRoZXIgYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBvciBoYXMgYSB0eXBlIHRoYXQgaXMgcmVnaXN0ZXJlZCBhcyBhIG1vZGVsXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7TX0gdGFyZ2V0IC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNoZWNrXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgLSBUaGUgcHJvcGVydHkgbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJuIHtib29sZWFuIHwgc3RyaW5nIHwgdW5kZWZpbmVkfSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgYSBtb2RlbCBpbnN0YW5jZSxcbiAgICogdGhlIG1vZGVsIG5hbWUgaWYgdGhlIHByb3BlcnR5IGhhcyBhIG1vZGVsIHR5cGUsIG9yIHVuZGVmaW5lZCBpZiBub3QgYSBtb2RlbFxuICAgKi9cbiAgc3RhdGljIGlzUHJvcGVydHlNb2RlbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBhdHRyaWJ1dGU6IHN0cmluZ1xuICApOiBib29sZWFuIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoTW9kZWwuaXNNb2RlbCgodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2F0dHJpYnV0ZV0pKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoTW9kZWxLZXlzLlRZUEUsIHRhcmdldCwgYXR0cmlidXRlKTtcbiAgICByZXR1cm4gTW9kZWwuZ2V0KG1ldGFkYXRhLm5hbWUpID8gbWV0YWRhdGEubmFtZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHN0YXRpYyBkZXNjcmliZTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sIGtleT86IGtleW9mIE0pIHtcbiAgICBjb25zdCBkZXNjS2V5ID0gTW9kZWwua2V5KE1vZGVsS2V5cy5ERVNDUklQVElPTik7XG4gICAgaWYgKGtleSkge1xuICAgICAgbW9kZWwgPSBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwgOiBuZXcgbW9kZWwoKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKG1vZGVsLmNvbnN0cnVjdG9yLCBrZXkudG9TdHJpbmcoKSlcbiAgICAgICAgICAuZmluZCgoaykgPT4gayA9PT0gZGVzY0tleSlcbiAgICAgICAgICA/LnRvU3RyaW5nKCkgfHwgbW9kZWwudG9TdHJpbmcoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgTW9kZWwua2V5KE1vZGVsS2V5cy5ERVNDUklQVElPTiksXG4gICAgICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IG1vZGVsXG4gICAgICApIHx8IG1vZGVsLnRvU3RyaW5nKClcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9tb2RlbC90eXBlc1wiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRNZXRhZGF0YSB9IGZyb20gXCIuLi9tb2RlbC91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgRGVmYXVsdFNlcmlhbGl6YXRpb25NZXRob2QgPSBcImpzb25cIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHtAbGluayBTZXJpYWxpemVyfSBpbiBKU09OIGZvcm1hdFxuICogQGRlc2NyaXB0aW9uIEpTJ3MgbmF0aXZlIEpTT04uc3RyaW5naWZ5ICh1c2VkIGhlcmUpIGlzIG5vdCBkZXRlcm1pbmlzdGljXG4gKiBhbmQgdGhlcmVmb3JlIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgaGFzaGluZyBwdXJwb3Nlc1xuICpcbiAqIFRvIGtlZXAgZGVwZW5kZW5jaWVzIGxvdywgd2Ugd2lsbCBub3QgaW1wbGVtZW50IHRoaXMsIGJ1dCB3ZSByZWNvbW1lbmRcbiAqIGltcGxlbWVudGluZyBhIHNpbWlsYXIge0BsaW5rIEpTT05TZXJpYWxpemVyfSB1c2luZyAnZGV0ZXJtaW5pc3RpYy1qc29uJyBsaWJyYXJpZXNcbiAqXG4gKiBAY2xhc3MgSlNPTlNlcmlhbGl6ZXJcbiAqIEBpbXBsZW1lbnRzIFNlcmlhbGl6ZXJcbiAqXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEpTT05TZXJpYWxpemVyPFQgZXh0ZW5kcyBNb2RlbD4gaW1wbGVtZW50cyBTZXJpYWxpemVyPFQ+IHtcbiAgY29uc3RydWN0b3IoKSB7fVxuICAvKipcbiAgICogQHN1bW1hcnkgcHJlcGFyZXMgdGhlIG1vZGVsIGZvciBzZXJpYWxpemF0aW9uXG4gICAqIEBkZXNjcmlwdGlvbiByZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBvYmplY3QsIGNvbnRhaW5pbmcgYW4gZW51bWVyYWJsZSB7QGxpbmsgTW9kZWxLZXlzI0FOQ0hPUn0gcHJvcGVydHlcbiAgICogc28gdGhlIG9iamVjdCBjYW4gYmUgcmVjb2duaXplZCB1cG9uIGRlc2VyaWFsaXphdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge1R9IG1vZGVsXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBwcmVTZXJpYWxpemUobW9kZWw6IFQpIHtcbiAgICAvLyBUT0RPOiBuZXN0ZWQgcHJlc2VyaWFsaXphdGlvbiAoc28gaW5jcmVhc2UgcGVyZm9ybWFuY2Ugd2hlbiBkZXNlcmlhbGl6aW5nKVxuICAgIGNvbnN0IHRvU2VyaWFsaXplOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZWwpO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0TWV0YWRhdGEobW9kZWwpO1xuICAgIHRvU2VyaWFsaXplW01vZGVsS2V5cy5BTkNIT1JdID0gbWV0YWRhdGEgfHwgbW9kZWwuY29uc3RydWN0b3IubmFtZTtcbiAgICByZXR1cm4gdG9TZXJpYWxpemU7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVidWlsZHMgYSBtb2RlbCBmcm9tIGEgc2VyaWFsaXphdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlscyB0byBwYXJzZSB0aGUgc3RyaW5nLCBvciB0byBidWlsZCB0aGUgbW9kZWxcbiAgICovXG4gIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKTogVCB7XG4gICAgY29uc3QgZGVzZXJpYWxpemF0aW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRlc2VyaWFsaXphdGlvbltNb2RlbEtleXMuQU5DSE9SXTtcbiAgICBpZiAoIWNsYXNzTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGNsYXNzIHJlZmVyZW5jZSBpbiBzZXJpYWxpemVkIG1vZGVsXCIpO1xuICAgIGNvbnN0IG1vZGVsOiBUID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgVDtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgU2VyaWFsaXplcyBhIG1vZGVsXG4gICAqIEBwYXJhbSB7VH0gbW9kZWxcbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIGZhaWxzIHRvIHNlcmlhbGl6ZVxuICAgKi9cbiAgc2VyaWFsaXplKG1vZGVsOiBUKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5wcmVTZXJpYWxpemUobW9kZWwpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2VyaWFsaXphdGlvbiB7XG4gIHByaXZhdGUgc3RhdGljIGN1cnJlbnQ6IHN0cmluZyA9IERlZmF1bHRTZXJpYWxpemF0aW9uTWV0aG9kO1xuXG4gIHByaXZhdGUgc3RhdGljIGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBTZXJpYWxpemVyPGFueT4+ID0ge1xuICAgIGpzb246IG5ldyBKU09OU2VyaWFsaXplcigpLFxuICB9O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHByaXZhdGUgc3RhdGljIGdldChrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKGtleSBpbiB0aGlzLmNhY2hlKSByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gc2VyaWFsaXphdGlvbiBtZXRob2QgcmVnaXN0ZXJlZCB1bmRlciAke2tleX1gKTtcbiAgfVxuXG4gIHN0YXRpYyByZWdpc3RlcihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmdW5jOiBDb25zdHJ1Y3RvcjxTZXJpYWxpemVyPGFueT4+LFxuICAgIHNldERlZmF1bHQgPSBmYWxzZVxuICApOiB2b2lkIHtcbiAgICBpZiAoa2V5IGluIHRoaXMuY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlcmlhbGl6YXRpb24gbWV0aG9kICR7a2V5fSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICB0aGlzLmNhY2hlW2tleV0gPSBuZXcgZnVuYygpO1xuICAgIGlmIChzZXREZWZhdWx0KSB0aGlzLmN1cnJlbnQgPSBrZXk7XG4gIH1cblxuICBzdGF0aWMgc2VyaWFsaXplKG9iajogYW55LCBtZXRob2Q/OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgaWYgKCFtZXRob2QpIHJldHVybiB0aGlzLmdldCh0aGlzLmN1cnJlbnQpLnNlcmlhbGl6ZShvYmosIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmdldChtZXRob2QpLnNlcmlhbGl6ZShvYmosIC4uLmFyZ3MpO1xuICB9XG5cbiAgc3RhdGljIGRlc2VyaWFsaXplKG9iajogc3RyaW5nLCBtZXRob2Q/OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgaWYgKCFtZXRob2QpIHJldHVybiB0aGlzLmdldCh0aGlzLmN1cnJlbnQpLmRlc2VyaWFsaXplKG9iaiwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KG1ldGhvZCkuZGVzZXJpYWxpemUob2JqLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHN0YXRpYyBzZXREZWZhdWx0KG1ldGhvZDogc3RyaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5nZXQobWV0aG9kKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhQcm94eSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IHsgQmFzZVZhbGlkYXRvciB9IGZyb20gXCIuL0Jhc2VWYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFic3RyYWN0IGNsYXNzIGZvciBkZWZpbmluZyBhc3luY2hyb25vdXMgdmFsaWRhdG9ycy5cbiAqXG4gKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIGJhc2UgYFZhbGlkYXRvcmAgYW5kIGVuZm9yY2VzIHRoYXQgYW55IGltcGxlbWVudGF0aW9uXG4gKiBvZiBgaGFzRXJyb3JzYCBtdXN0IGJlIGFzeW5jaHJvbm91cywgYWx3YXlzIHJldHVybmluZyBhIFByb21pc2UuXG4gKlxuICogVXNlIHRoaXMgd2hlbiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIGludm9sdmVzIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLFxuICogc3VjaCBhcyBBUEkgY2FsbHMsIGRhdGFiYXNlIGxvb2t1cHMsIG9yIHRpbWUtYmFzZWQgY2hlY2tzIChlLmcuLCB0aW1lb3V0cykuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgb2YgYW4gYXN5bmNocm9ub3VzIHZhbGlkYXRvciB0aGF0IGNvbXBhcmVzIHZhbHVlIGFnYWluc3QgYSB0aW1lb3V0XG4gKiBjbGFzcyBUaW1lb3V0VmFsaWRhdG9yIGV4dGVuZHMgQXN5bmNWYWxpZGF0b3I8eyB0aW1lb3V0PzogbnVtYmVyIH0+IHtcbiAqICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gXCJWYWxpZGF0aW9uIGZhaWxlZCBkdWUgdG8gdGltZW91dFwiKSB7XG4gKiAgICAgc3VwZXIobWVzc2FnZSk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGhhc0Vycm9ycyh2YWx1ZTogbnVtYmVyLCBvcHRpb25zPzogeyB0aW1lb3V0PzogbnVtYmVyIH0pIHtcbiAqICAgICBjb25zdCBkZWxheSA9IG9wdGlvbnM/LnRpbWVvdXQgPz8gMTAwO1xuICpcbiAqICAgICAvLyBhc3luYyBjYWxsXG4gKiAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzID0+IHNldFRpbWVvdXQocmVzLCBkZWxheSkpO1xuICpcbiAqICAgICBpZiAodmFsdWUgPiBkZWxheSkge1xuICogICAgICAgLy8gUmVqZWN0cyB0aGUgdmFsaWRhdGlvbiBhZnRlciB3YWl0aW5nIHRoZSBkZWxheSBpZiB2YWx1ZSBpcyBncmVhdGVyXG4gKiAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZ2V0TWVzc2FnZSgpKTtcbiAqICAgICB9XG4gKlxuICogICAgIC8vIFBhc3NlcyB0aGUgdmFsaWRhdGlvbiBhZnRlciB3YWl0aW5nIHRoZSBkZWxheVxuICogICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIEV4YW1wbGUgdXNhZ2U6XG4gKiBjb25zdCB2YWxpZGF0b3IgPSBuZXcgVGltZW91dFZhbGlkYXRvcigpO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIHJ1blZhbGlkYXRpb24oKSB7XG4gKiAgY29uc3QgZXJyb3IgPSBhd2FpdCB2YWxpZGF0b3IuaGFzRXJyb3JzKDUwLCB7IHRpbWVvdXQ6IDEwMCB9KTtcbiAqICBpZiAoZXJyb3IpIHtcbiAqICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdWYWxpZGF0aW9uIGVycm9yOicsIGVycm9yKTtcbiAqICB9XG4gKiAgY29uc29sZS5sb2coJ1ZhbHVlIGlzIHZhbGlkJyk7XG4gKiB9XG4gKlxuICogYXdhaXQgcnVuVmFsaWRhdGlvbigpO1xuICogYGBgXG4gKlxuICogLSBJZiBgdmFsdWUgPiB0aW1lb3V0YCwgdGhlIHZhbGlkYXRvciB3YWl0cyBmb3IgdGhlIGRlbGF5IGFuZCB0aGVuIHJlamVjdHMgd2l0aCBhbiBlcnJvci5cbiAqIC0gSWYgYHZhbHVlIDw9IHRpbWVvdXRgLCB0aGUgdmFsaWRhdG9yIHdhaXRzIGZvciB0aGUgZGVsYXkgYW5kIHJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzZWUge0BsaW5rIFZhbGlkYXRvcn0gRm9yIHRoZSBiYXNlIHN5bmNocm9ub3VzIHZhbGlkYXRvci5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFzeW5jVmFsaWRhdG9yPFxuICBWIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyxcbj4gZXh0ZW5kcyBCYXNlVmFsaWRhdG9yPFYsIHRydWU+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREVGQVVMVCxcbiAgICAuLi5hY2NlcHRlZFR5cGVzOiBzdHJpbmdbXVxuICApIHtcbiAgICBzdXBlcih0cnVlLCBtZXNzYWdlLCAuLi5hY2NlcHRlZFR5cGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQXN5bmNocm9ub3VzbHkgdmFsaWRhdGVzIGEgdmFsdWUuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBvZiB0aGUgb3B0aW9uIG9iamVjdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIHZhbGlkYXRvclxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtWfSBbb3B0aW9uc10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGN1c3RvbWl6aW5nIHZhbGlkYXRpb24gYmVoYXZpb3JcbiAgICogQHBhcmFtIHtQYXRoUHJveHk8YW55Pn0gcHJveHkgLVxuICAgKiBAcmV0dXJuIFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAc2VlIHtAbGluayBWYWxpZGF0b3J9XG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3Qgb3ZlcnJpZGUgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9ucz86IFYsXG4gICAgcHJveHk/OiBQYXRoUHJveHk8YW55PlxuICApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tIFwiLi4vVmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vLi4vbW9kZWwvdHlwZXNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRvckRlZmluaXRpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNYXJrcyB0aGUgY2xhc3MgYXMgYSB2YWxpZGF0b3IgZm9yIGEgY2VydGFpbiBrZXkuXG4gKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIHRoZSBjbGFzcyBpbiB0aGUge0BsaW5rIFZhbGlkYXRpb259IHdpdGggdGhlIHByb3ZpZGVkIGtleVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlzIHRoZSB2YWxpZGF0aW9uIGtleVxuICpcbiAqIEBmdW5jdGlvbiB2YWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdG9yPFQgZXh0ZW5kcyBWYWxpZGF0b3I+KC4uLmtleXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBhcHBseShcbiAgICAoKG9yaWdpbmFsOiBDb25zdHJ1Y3RvcjxUPikgPT4ge1xuICAgICAga2V5cy5mb3JFYWNoKChrOiBzdHJpbmcpID0+IHtcbiAgICAgICAgVmFsaWRhdGlvbi5yZWdpc3Rlcih7XG4gICAgICAgICAgdmFsaWRhdG9yOiBvcmlnaW5hbCxcbiAgICAgICAgICB2YWxpZGF0aW9uS2V5OiBrLFxuICAgICAgICAgIHNhdmU6IHRydWUsXG4gICAgICAgIH0gYXMgVmFsaWRhdG9yRGVmaW5pdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvcmlnaW5hbDtcbiAgICB9KSBhcyBDbGFzc0RlY29yYXRvcixcbiAgICBtZXRhZGF0YShWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5WQUxJREFUT1IpLCBrZXlzKVxuICApO1xufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRGF0ZVZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZVxuICogQHN1bW1hcnkgVGhlIERhdGVWYWxpZGF0b3IgY2hlY2tzIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBkYXRlIG9iamVjdCBvciBhIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSB2YWxpZCBkYXRlLlxuICogSXQgdmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIHJlcHJlc2VudHMgYSByZWFsIGRhdGUgYW5kIG5vdCBhbiBpbnZhbGlkIGRhdGUgbGlrZSBcIjIwMjMtMDItMzFcIi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjREFURX1cbiAqIEBjbGFzcyBEYXRlVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIGRhdGUgdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBkYXRlVmFsaWRhdG9yID0gbmV3IERhdGVWYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBkYXRlIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21EYXRlVmFsaWRhdG9yID0gbmV3IERhdGVWYWxpZGF0b3IoXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlXCIpO1xuICpcbiAqIC8vIFZhbGlkYXRlIGEgZGF0ZVxuICogY29uc3QgcmVzdWx0ID0gZGF0ZVZhbGlkYXRvci5oYXNFcnJvcnMobmV3IERhdGUoKSk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBjb25zdCBpbnZhbGlkUmVzdWx0ID0gZGF0ZVZhbGlkYXRvci5oYXNFcnJvcnMoXCJub3QgYSBkYXRlXCIpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBEYXRlVmFsaWRhdG9yXG4gKlxuICogICBDLT4+VjogbmV3IERhdGVWYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgQy0+PlY6IGhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucylcbiAqICAgYWx0IHZhbHVlIGlzIHVuZGVmaW5lZFxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZWxzZSB2YWx1ZSBpcyBzdHJpbmdcbiAqICAgICBWLT4+VjogQ29udmVydCB0byBEYXRlXG4gKiAgIGVuZFxuICogICBhbHQgRGF0ZSBpcyBpbnZhbGlkIChOYU4pXG4gKiAgICAgVi0tPj5DOiBFcnJvciBtZXNzYWdlXG4gKiAgIGVsc2UgRGF0ZSBpcyB2YWxpZFxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZW5kXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuREFURSlcbmV4cG9ydCBjbGFzcyBEYXRlVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPERhdGVWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREFURSkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIE51bWJlci5uYW1lLCBEYXRlLm5hbWUsIFN0cmluZy5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCB2YWx1ZSBpcyBhIHZhbGlkIGRhdGVcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZS4gSWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLFxuICAgKiBpdCBhdHRlbXB0cyB0byBjb252ZXJ0IGl0IHRvIGEgRGF0ZSBvYmplY3QuIFJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSBpZiB0aGUgZGF0ZSBpcyBpbnZhbGlkLFxuICAgKiBvciB1bmRlZmluZWQgaWYgdGhlIGRhdGUgaXMgdmFsaWQgb3IgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtEYXRlIHwgc3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZSwgY2FuIGJlIGEgRGF0ZSBvYmplY3Qgb3IgYSBzdHJpbmdcbiAgICogQHBhcmFtIHtEYXRlVmFsaWRhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgdmFsaWRhdG9yXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogRGF0ZSB8IHN0cmluZyxcbiAgICBvcHRpb25zOiBEYXRlVmFsaWRhdG9yT3B0aW9ucyA9IHt9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuXG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZS5nZXREYXRlKCkpKSB7XG4gICAgICBjb25zdCB7IG1lc3NhZ2UgPSBcIlwiIH0gPSBvcHRpb25zO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShtZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBEaWZmVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBQYXRoUHJveHkgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBEaWZmIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjRGlmZlZhbGlkYXRvcn1cbiAqXG4gKiBAY2xhc3MgRGlmZlZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5ESUZGKVxuZXhwb3J0IGNsYXNzIERpZmZWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8RGlmZlZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5ESUZGKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7RGlmZlZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtQYXRoUHJveHk8YW55Pn0gYWNjZXNzb3IgLSBQcm94eS1saWtlIG9iamVjdCB1c2VkIHRvIHJlc29sdmUgdmFsdWVzIGZyb20gbmVzdGVkIHN0cnVjdHVyZXMgdmlhIHBhdGggc3RyaW5ncy5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9uczogRGlmZlZhbGlkYXRvck9wdGlvbnMsXG4gICAgYWNjZXNzb3I6IFBhdGhQcm94eTxhbnk+XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlID0gYWNjZXNzb3IuZ2V0VmFsdWVGcm9tUGF0aChcbiAgICAgICAgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5ESUZGXVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoZS5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRXF1YWwodmFsdWUsIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlKVxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgICAgb3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgICAgICBvcHRpb25zLmxhYmVsIHx8IG9wdGlvbnNbVmFsaWRhdGlvbktleXMuRElGRl1cbiAgICAgICAgKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgcGFyc2luZyBzdHJpbmcgcGF0dGVybnMgd2l0aCBmbGFnc1xuICogQHN1bW1hcnkgVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaXMgdXNlZCB0byBwYXJzZSBzdHJpbmcgcGF0dGVybnMgaW4gdGhlIGZvcm1hdCBcIi9wYXR0ZXJuL2ZsYWdzXCIuXG4gKiBJdCBjYXB0dXJlcyB0aGUgcGF0dGVybiBhbmQgZmxhZ3Mgc2VwYXJhdGVseSwgYWxsb3dpbmcgdGhlIGNyZWF0aW9uIG9mIGEgUmVnRXhwIG9iamVjdFxuICogd2l0aCB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MuXG4gKlxuICogQGNvbnN0IHtSZWdFeHB9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgcmVnZXhwUGFyc2VyOiBSZWdFeHAgPSBuZXcgUmVnRXhwKFwiXi8oLispLyhbZ2ltdXNdKikkXCIpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3IgZm9yIGNoZWNraW5nIGlmIGEgc3RyaW5nIG1hdGNoZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVyblxuICogQHN1bW1hcnkgVGhlIFBhdHRlcm5WYWxpZGF0b3IgY2hlY2tzIGlmIGEgc3RyaW5nIHZhbHVlIG1hdGNoZXMgYSBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uXG4gKiBJdCBzdXBwb3J0cyBib3RoIFJlZ0V4cCBvYmplY3RzIGFuZCBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHBhdHRlcm5zLCBpbmNsdWRpbmcgdGhvc2Ugd2l0aCBmbGFncy5cbiAqIFRoaXMgdmFsaWRhdG9yIGlzIHRoZSBmb3VuZGF0aW9uIGZvciBzcGVjaWFsaXplZCB2YWxpZGF0b3JzIGxpa2UgRW1haWxWYWxpZGF0b3IgYW5kIFVSTFZhbGlkYXRvcixcbiAqIGFuZCBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIHRoZSBAcGF0dGVybiBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLCBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNQQVRURVJOfVxuICpcbiAqIEBjbGFzcyBQYXR0ZXJuVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgcGF0dGVybiB2YWxpZGF0b3Igd2l0aCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IHBhdHRlcm5WYWxpZGF0b3IgPSBuZXcgUGF0dGVyblZhbGlkYXRvcigpO1xuICpcbiAqIC8vIENyZWF0ZSBhIHBhdHRlcm4gdmFsaWRhdG9yIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IGN1c3RvbVBhdHRlcm5WYWxpZGF0b3IgPSBuZXcgUGF0dGVyblZhbGlkYXRvcihcIlZhbHVlIG11c3QgbWF0Y2ggdGhlIHJlcXVpcmVkIGZvcm1hdFwiKTtcbiAqXG4gKiAvLyBWYWxpZGF0ZSB1c2luZyBhIFJlZ0V4cCBvYmplY3RcbiAqIGNvbnN0IHJlZ2V4T3B0aW9ucyA9IHsgcGF0dGVybjogL15bQS1aXVthLXpdKyQvIH07XG4gKiBwYXR0ZXJuVmFsaWRhdG9yLmhhc0Vycm9ycyhcIkhlbGxvXCIsIHJlZ2V4T3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBwYXR0ZXJuVmFsaWRhdG9yLmhhc0Vycm9ycyhcImhlbGxvXCIsIHJlZ2V4T3B0aW9ucyk7IC8vIFJldHVybnMgZXJyb3IgbWVzc2FnZSAoaW52YWxpZClcbiAqXG4gKiAvLyBWYWxpZGF0ZSB1c2luZyBhIHN0cmluZyBwYXR0ZXJuXG4gKiBjb25zdCBzdHJpbmdPcHRpb25zID0geyBwYXR0ZXJuOiBcIl5cXFxcZHszfS1cXFxcZHsyfS1cXFxcZHs0fSRcIiB9O1xuICogcGF0dGVyblZhbGlkYXRvci5oYXNFcnJvcnMoXCIxMjMtNDUtNjc4OVwiLCBzdHJpbmdPcHRpb25zKTsgLy8gdW5kZWZpbmVkICh2YWxpZClcbiAqXG4gKiAvLyBWYWxpZGF0ZSB1c2luZyBhIHN0cmluZyBwYXR0ZXJuIHdpdGggZmxhZ3NcbiAqIGNvbnN0IGZsYWdPcHRpb25zID0geyBwYXR0ZXJuOiBcIi9eaGVsbG8kL2lcIiB9O1xuICogcGF0dGVyblZhbGlkYXRvci5oYXNFcnJvcnMoXCJIZWxsb1wiLCBmbGFnT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFYgYXMgUGF0dGVyblZhbGlkYXRvclxuICpcbiAqICAgQy0+PlY6IG5ldyBQYXR0ZXJuVmFsaWRhdG9yKG1lc3NhZ2UpXG4gKiAgIEMtPj5WOiBoYXNFcnJvcnModmFsdWUsIG9wdGlvbnMpXG4gKiAgIGFsdCB2YWx1ZSBpcyBlbXB0eVxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZWxzZSBwYXR0ZXJuIGlzIG1pc3NpbmdcbiAqICAgICBWLS0+PkM6IEVycm9yOiBNaXNzaW5nIFBhdHRlcm5cbiAqICAgZWxzZSBwYXR0ZXJuIGlzIHN0cmluZ1xuICogICAgIFYtPj5WOiBnZXRQYXR0ZXJuKHBhdHRlcm4pXG4gKiAgIGVuZFxuICogICBWLT4+VjogUmVzZXQgcGF0dGVybi5sYXN0SW5kZXhcbiAqICAgVi0+PlY6IFRlc3QgdmFsdWUgYWdhaW5zdCBwYXR0ZXJuXG4gKiAgIGFsdCBwYXR0ZXJuIHRlc3QgcGFzc2VzXG4gKiAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICBlbHNlIHBhdHRlcm4gdGVzdCBmYWlsc1xuICogICAgIFYtLT4+QzogRXJyb3IgbWVzc2FnZVxuICogICBlbmRcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLlBBVFRFUk4pXG5leHBvcnQgY2xhc3MgUGF0dGVyblZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlBBVFRFUk4pIHtcbiAgICBzdXBlcihtZXNzYWdlLCBcInN0cmluZ1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdHJpbmcgcGF0dGVybiB0byBhIFJlZ0V4cCBvYmplY3RcbiAgICogQHN1bW1hcnkgUGFyc2VzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBjb252ZXJ0cyBpdCB0byBhIFJlZ0V4cCBvYmplY3QuXG4gICAqIEl0IGhhbmRsZXMgYm90aCBzaW1wbGUgc3RyaW5nIHBhdHRlcm5zIGFuZCBwYXR0ZXJucyB3aXRoIGZsYWdzIGluIHRoZSBmb3JtYXQgXCIvcGF0dGVybi9mbGFnc1wiLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiAtIFRoZSBzdHJpbmcgcGF0dGVybiB0byBjb252ZXJ0XG4gICAqIEByZXR1cm4ge1JlZ0V4cH0gQSBSZWdFeHAgb2JqZWN0IGNyZWF0ZWQgZnJvbSB0aGUgc3RyaW5nIHBhdHRlcm5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0UGF0dGVybihwYXR0ZXJuOiBzdHJpbmcpOiBSZWdFeHAge1xuICAgIGlmICghcmVnZXhwUGFyc2VyLnRlc3QocGF0dGVybikpIHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4pO1xuICAgIGNvbnN0IG1hdGNoOiBhbnkgPSBwYXR0ZXJuLm1hdGNoKHJlZ2V4cFBhcnNlcik7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgc3RyaW5nIG1hdGNoZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVyblxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhhdCB0aGUgcHJvdmlkZWQgc3RyaW5nIG1hdGNoZXMgdGhlIHBhdHRlcm4gc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zLlxuICAgKiBJZiB0aGUgcGF0dGVybiBpcyBwcm92aWRlZCBhcyBhIHN0cmluZywgaXQncyBjb252ZXJ0ZWQgdG8gYSBSZWdFeHAgb2JqZWN0IHVzaW5nIHRoZSBnZXRQYXR0ZXJuIG1ldGhvZC5cbiAgICogVGhlIG1ldGhvZCByZXNldHMgdGhlIHBhdHRlcm4ncyBsYXN0SW5kZXggcHJvcGVydHkgdG8gZW5zdXJlIGNvbnNpc3RlbnQgdmFsaWRhdGlvbiByZXN1bHRzXG4gICAqIGZvciBwYXR0ZXJucyB3aXRoIHRoZSBnbG9iYWwgZmxhZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVGhlIHN0cmluZyB0byB2YWxpZGF0ZSBhZ2FpbnN0IHRoZSBwYXR0ZXJuXG4gICAqIEBwYXJhbSB7UGF0dGVyblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgY29udGFpbmluZyB0aGUgcGF0dGVyblxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBubyBwYXR0ZXJuIGlzIHByb3ZpZGVkIGluIHRoZSBvcHRpb25zXG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdmFsdWUpIHJldHVybjtcblxuICAgIGxldCB7IHBhdHRlcm4gfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFwYXR0ZXJuKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIFBhdHRlcm5cIik7XG4gICAgcGF0dGVybiA9IHR5cGVvZiBwYXR0ZXJuID09PSBcInN0cmluZ1wiID8gdGhpcy5nZXRQYXR0ZXJuKHBhdHRlcm4pIDogcGF0dGVybjtcbiAgICBwYXR0ZXJuLmxhc3RJbmRleCA9IDA7IC8vIHJlc2V0cyBwYXR0ZXJuIHBvc2l0aW9uIGZvciByZXBlYXQgdmFsaWRhdGlvbiByZXF1ZXN0c1xuICAgIHJldHVybiAhcGF0dGVybi50ZXN0KHZhbHVlKVxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBERUZBVUxUX1BBVFRFUk5TLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBQYXR0ZXJuVmFsaWRhdG9yIH0gZnJvbSBcIi4vUGF0dGVyblZhbGlkYXRvclwiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcbiAqIEBzdW1tYXJ5IFRoZSBFbWFpbFZhbGlkYXRvciBjaGVja3MgaWYgYSBzdHJpbmcgbWF0Y2hlcyBhIHN0YW5kYXJkIGVtYWlsIGFkZHJlc3MgcGF0dGVybi5cbiAqIEl0IGV4dGVuZHMgdGhlIFBhdHRlcm5WYWxpZGF0b3IgYW5kIHVzZXMgYSBwcmVkZWZpbmVkIGVtYWlsIHJlZ2V4IHBhdHRlcm4gdG8gdmFsaWRhdGUgZW1haWwgYWRkcmVzc2VzLlxuICogVGhpcyB2YWxpZGF0b3IgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0aGUgQGVtYWlsIGRlY29yYXRvci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMsIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0VNQUlMfVxuICpcbiAqIEBjbGFzcyBFbWFpbFZhbGlkYXRvclxuICogQGV4dGVuZHMgUGF0dGVyblZhbGlkYXRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYW4gZW1haWwgdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBlbWFpbFZhbGlkYXRvciA9IG5ldyBFbWFpbFZhbGlkYXRvcigpO1xuICpcbiAqIC8vIENyZWF0ZSBhbiBlbWFpbCB2YWxpZGF0b3Igd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogY29uc3QgY3VzdG9tRW1haWxWYWxpZGF0b3IgPSBuZXcgRW1haWxWYWxpZGF0b3IoXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXCIpO1xuICpcbiAqIC8vIFZhbGlkYXRlIGFuIGVtYWlsXG4gKiBjb25zdCByZXN1bHQgPSBlbWFpbFZhbGlkYXRvci5oYXNFcnJvcnMoXCJ1c2VyQGV4YW1wbGUuY29tXCIpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogY29uc3QgaW52YWxpZFJlc3VsdCA9IGVtYWlsVmFsaWRhdG9yLmhhc0Vycm9ycyhcImludmFsaWQtZW1haWxcIik7IC8vIFJldHVybnMgZXJyb3IgbWVzc2FnZSAoaW52YWxpZClcbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRSBhcyBFbWFpbFZhbGlkYXRvclxuICogICBwYXJ0aWNpcGFudCBQIGFzIFBhdHRlcm5WYWxpZGF0b3JcbiAqXG4gKiAgIEMtPj5FOiBuZXcgRW1haWxWYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgRS0+PlA6IHN1cGVyKG1lc3NhZ2UpXG4gKiAgIEMtPj5FOiBoYXNFcnJvcnModmFsdWUsIG9wdGlvbnMpXG4gKiAgIEUtPj5QOiBzdXBlci5oYXNFcnJvcnModmFsdWUsIG9wdGlvbnMgd2l0aCBFTUFJTCBwYXR0ZXJuKVxuICogICBQLS0+PkU6IHZhbGlkYXRpb24gcmVzdWx0XG4gKiAgIEUtLT4+QzogdmFsaWRhdGlvbiByZXN1bHRcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLkVNQUlMKVxuZXhwb3J0IGNsYXNzIEVtYWlsVmFsaWRhdG9yIGV4dGVuZHMgUGF0dGVyblZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRU1BSUwpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgZW1haWwgYWRkcmVzc1xuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhhdCB0aGUgcHJvdmlkZWQgc3RyaW5nIG1hdGNoZXMgdGhlIGVtYWlsIHBhdHRlcm4uXG4gICAqIFRoaXMgbWV0aG9kIGV4dGVuZHMgdGhlIFBhdHRlcm5WYWxpZGF0b3IncyBoYXNFcnJvcnMgbWV0aG9kIGJ5IGVuc3VyaW5nXG4gICAqIHRoZSBlbWFpbCBwYXR0ZXJuIGlzIHVzZWQsIGV2ZW4gaWYgbm90IGV4cGxpY2l0bHkgcHJvdmlkZWQgaW4gdGhlIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBzdHJpbmcgdG8gdmFsaWRhdGUgYXMgYW4gZW1haWwgYWRkcmVzc1xuICAgKiBAcGFyYW0ge1BhdHRlcm5WYWxpZGF0b3JPcHRpb25zfSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBQYXR0ZXJuVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zID0ge31cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKHZhbHVlLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgIHBhdHRlcm46IG9wdGlvbnM/LnBhdHRlcm4gfHwgREVGQVVMVF9QQVRURVJOUy5FTUFJTCxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRXF1YWxzVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBQYXRoUHJveHkgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBFcXVhbHMgVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNFUVVBTFN9XG4gKlxuICogQGNsYXNzIEVxdWFsc1ZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5FUVVBTFMpXG5leHBvcnQgY2xhc3MgRXF1YWxzVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPEVxdWFsc1ZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5FUVVBTFMpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtFcXVhbHNWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqIEBwYXJhbSB7UGF0aFByb3h5PGFueT59IGFjY2Vzc29yIC0gUHJveHktbGlrZSBvYmplY3QgdXNlZCB0byByZXNvbHZlIHZhbHVlcyBmcm9tIG5lc3RlZCBzdHJ1Y3R1cmVzIHZpYSBwYXRoIHN0cmluZ3MuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IEVxdWFsc1ZhbGlkYXRvck9wdGlvbnMsXG4gICAgYWNjZXNzb3I6IFBhdGhQcm94eTxhbnk+XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlID0gYWNjZXNzb3IuZ2V0VmFsdWVGcm9tUGF0aChcbiAgICAgICAgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5FUVVBTFNdXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShlLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNFcXVhbCh2YWx1ZSwgY29tcGFyaXNvblByb3BlcnR5VmFsdWUpXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgICAgb3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgICAgICBvcHRpb25zLmxhYmVsIHx8IG9wdGlvbnNbVmFsaWRhdGlvbktleXMuRVFVQUxTXVxuICAgICAgICApO1xuICB9XG59XG5cbi8vIFZhbGlkYXRpb24ucmVnaXN0ZXIoe1xuLy8gICB2YWxpZGF0b3I6IEVxdWFsc1ZhbGlkYXRvcixcbi8vICAgdmFsaWRhdGlvbktleTogVmFsaWRhdGlvbktleXMuRVFVQUxTLFxuLy8gICBzYXZlOiBmYWxzZSxcbi8vIH0gYXMgVmFsaWRhdG9yRGVmaW5pdGlvbik7XG4iLCJpbXBvcnQgeyBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcblxuLy8gLyoqXG4vLyAgKiBTYWZlbHkgcmV0cmlldmVzIGEgbmVzdGVkIHByb3BlcnR5IHZhbHVlIGZyb20gYW4gb2JqZWN0IHVzaW5nIGEgZG90LW5vdGF0ZWQgcGF0aCBzdHJpbmcuXG4vLyAgKlxuLy8gICogQHRlbXBsYXRlIFQgLSBUaGUgZXhwZWN0ZWQgcmV0dXJuIHR5cGUgb2YgdGhlIHByb3BlcnR5IHZhbHVlLlxuLy8gICpcbi8vICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqIC0gVGhlIHNvdXJjZSBvYmplY3QgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZyb20uXG4vLyAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEEgZG90LXNlcGFyYXRlZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSBkZXNpcmVkIHByb3BlcnR5IChlLmcuLCBcInVzZXIuYWRkcmVzcy5zdHJlZXRcIikuXG4vLyAgKlxuLy8gICogQHJldHVybnMge1R9IC0gVGhlIHZhbHVlIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgcGF0aFxuLy8gICpcbi8vICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcGF0aCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGlmIGFueSBwYXJ0IG9mIHRoZSBwYXRoIGRvZXMgbm90IGV4aXN0IGluIHRoZSBvYmplY3QuXG4vLyAgKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4vLyAgKi9cbi8vIGV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUJ5UGF0aDxUPihvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIHBhdGg6IHN0cmluZyk6IFQge1xuLy8gICBpZiAodHlwZW9mIHBhdGggIT09IFwic3RyaW5nXCIgfHwgIXBhdGgudHJpbSgpKSB7XG4vLyAgICAgdGhyb3cgbmV3IEVycm9yKHNmKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuSU5WQUxJRF9QQVRILCBwYXRoKSk7XG4vLyAgIH1cbi8vXG4vLyAgIC8vIFByb2Nlc3MgcGFyZW50IGRpcmVjdG9yeSBhY2Nlc3MgKC4uLylcbi8vICAgY29uc3QgcGFyZW50QWNjZXNzb3JzID0gcGF0aC5tYXRjaCgvXFwuXFwuXFwvL2cpIHx8IFtdO1xuLy8gICBjb25zdCBwYXJlbnRMZXZlbCA9IHBhcmVudEFjY2Vzc29ycy5sZW5ndGg7XG4vLyAgIGNvbnN0IGNsZWFuUGF0aCA9IHBhdGgucmVwbGFjZSgvXFwuXFwuXFwvL2csIFwiXCIpO1xuLy9cbi8vICAgLy8gTmF2aWdhdGUgdXAgdGhlIHBhcmVudCBjaGFpblxuLy8gICBsZXQgY3VycmVudENvbnRleHQ6IGFueSA9IG9iajtcbi8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnRMZXZlbDsgaSsrKSB7XG4vLyAgICAgaWYgKCFjdXJyZW50Q29udGV4dCB8fCB0eXBlb2YgY3VycmVudENvbnRleHQgIT09IFwib2JqZWN0XCIpIHtcbi8vICAgICAgIHRocm93IG5ldyBFcnJvcihcbi8vICAgICAgICAgc2YoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5DT05URVhUX05PVF9PQkpFQ1RfQ09NUEFSSVNPTiwgaSArIDEsIHBhdGgpXG4vLyAgICAgICApO1xuLy8gICAgIH1cbi8vXG4vLyAgICAgaWYgKCFjdXJyZW50Q29udGV4dFtWQUxJREFUSU9OX1BBUkVOVF9LRVldKSB7XG4vLyAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4vLyAgICAgICAgIHNmKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuTk9fUEFSRU5UX0NPTVBBUklTT04sIGkgKyAxLCBwYXRoKVxuLy8gICAgICAgKTtcbi8vICAgICB9XG4vL1xuLy8gICAgIGN1cnJlbnRDb250ZXh0ID0gY3VycmVudENvbnRleHRbVkFMSURBVElPTl9QQVJFTlRfS0VZXTtcbi8vICAgfVxuLy9cbi8vICAgLy8gUHJvY2VzcyBkb3Qgbm90YXRpb24gcGF0aFxuLy8gICBjb25zdCBwYXJ0cyA9IGNsZWFuUGF0aC5zcGxpdChcIi5cIik7XG4vLyAgIGxldCBjdXJyZW50VmFsdWU6IGFueSA9IGN1cnJlbnRDb250ZXh0O1xuLy9cbi8vICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4vLyAgICAgaWYgKFxuLy8gICAgICAgY3VycmVudFZhbHVlICE9PSBudWxsICYmXG4vLyAgICAgICB0eXBlb2YgY3VycmVudFZhbHVlID09PSBcIm9iamVjdFwiICYmXG4vLyAgICAgICBwYXJ0IGluIGN1cnJlbnRWYWx1ZVxuLy8gICAgICkge1xuLy8gICAgICAgY3VycmVudFZhbHVlID0gKGN1cnJlbnRWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwYXJ0XTtcbi8vICAgICB9IGVsc2Uge1xuLy8gICAgICAgY29uc3QgZXJyb3JNc2dUZW1wbGF0ZSA9XG4vLyAgICAgICAgIHBhcmVudExldmVsID09PSAwXG4vLyAgICAgICAgICAgPyBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlBST1BFUlRZX05PVF9GT1VORFxuLy8gICAgICAgICAgIDogcGFyZW50TGV2ZWwgPT09IDFcbi8vICAgICAgICAgICAgID8gQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5QUk9QRVJUWV9OT1RfRk9VTkRfT05fUEFSRU5UXG4vLyAgICAgICAgICAgICA6IENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuUFJPUEVSVFlfTk9UX0ZPVU5EX0FGVEVSX1BBUkVOVDtcbi8vXG4vLyAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2YoZXJyb3JNc2dUZW1wbGF0ZSwgcGF0aCwgcGFydCwgcGFyZW50TGV2ZWwpKTtcbi8vICAgICB9XG4vLyAgIH1cbi8vXG4vLyAgIHJldHVybiBjdXJyZW50VmFsdWUgYXMgVDtcbi8vIH1cblxuY29uc3QgZ2V0VHlwZU5hbWUgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBcIm51bGxcIjtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIFwiRGF0ZVwiO1xuICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkgcmV0dXJuIFwiTmFOXCI7XG4gIGlmICh2YWx1ZSA9PT0gSW5maW5pdHkpIHJldHVybiBcIkluZmluaXR5XCI7XG4gIGlmICh2YWx1ZSA9PT0gLUluZmluaXR5KSByZXR1cm4gXCItSW5maW5pdHlcIjtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gXCJhcnJheVwiO1xuICByZXR1cm4gdHlwZW9mIHZhbHVlO1xufTtcblxuY29uc3QgaXNTdXBwb3J0ZWQgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyB1bmRlZmluZWQgfCBudW1iZXIgfCBiaWdpbnQgfCBEYXRlID0+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBOdW1iZXJzIG11c3QgYmUgZmluaXRlIChleGNsdWRlcyBOYU4sIEluZmluaXR5LCAtSW5maW5pdHkpXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpO1xuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIHdoZXRoZXIgdHdvIHZhbHVlcyBhcmUgZWxpZ2libGUgZm9yIGNvbXBhcmlzb24gdXNpbmcgPj0gb3IgPD0gb3BlcmF0b3JzLlxuICpcbiAqIFN1cHBvcnRlZCB0eXBlczogYHVuZGVmaW5lZGAsIGBudW1iZXJgLCBgYmlnaW50YCwgYW5kIGBEYXRlYC5cbiAqXG4gKiBAcGFyYW0gYSAtIFRoZSBmaXJzdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIGIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYm90aCB2YWx1ZXMgYXJlIG9mIHN1cHBvcnRlZCB0eXBlcy5cbiAqXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIGVpdGhlciB2YWx1ZSBpcyBvZiBhbiB1bnN1cHBvcnRlZCB0eXBlLlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEZvckd0ZU9yTHRlQ29tcGFyaXNvbihhOiBhbnksIGI6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoaXNTdXBwb3J0ZWQoYSkgJiYgaXNTdXBwb3J0ZWQoYikpIHJldHVybiB0cnVlO1xuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgc2YoXG4gICAgICBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlVOU1VQUE9SVEVEX1RZUEVTX0NPTVBBUklTT04sXG4gICAgICBnZXRUeXBlTmFtZShhKSxcbiAgICAgIGdldFR5cGVOYW1lKGIpXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IENvbXBhcmVzIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaXJzdCBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZC5cbiAqIEBkZXNjcmlwdGlvbiBTdXBwb3J0cyBudW1iZXJzIGFuZCBkYXRlcy4gVGhyb3dzIGFuIGVycm9yIGZvciB1bnN1cHBvcnRlZCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gYSAtIFRoZSBmaXJzdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHthbnl9IGIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgYWAgaXMgbGVzcyB0aGFuIGBiYCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBlaXRoZXIgYGFgIG9yIGBiYCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHZhbHVlcyBhcmUgb2YgbWlzbWF0Y2hlZCBvciB1bnN1cHBvcnRlZCB0eXBlcy5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGVzc1RoYW4oYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKFtudWxsLCB1bmRlZmluZWRdLmluY2x1ZGVzKGEpIHx8IFtudWxsLCB1bmRlZmluZWRdLmluY2x1ZGVzKGIpKVxuICAgIHRocm93IG5ldyBFcnJvcihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLk5VTExfT1JfVU5ERUZJTkVEX0NPTVBBUklTT04pO1xuXG4gIC8vIFZhbGlkYXRlIHR5cGUgY29tcGF0aWJpbGl0eVxuICBjb25zdCBhVHlwZSA9IHR5cGVvZiBhO1xuICBjb25zdCBiVHlwZSA9IHR5cGVvZiBiO1xuXG4gIGlmIChhVHlwZSAhPT0gYlR5cGUpIHtcbiAgICAvLyBBbGxvdyBudW1iZXIgWCBiaWdpbnRcbiAgICBpZiAoYVR5cGUgPT09IFwiYmlnaW50XCIgJiYgYlR5cGUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gTnVtYmVyKGEpIDwgKGIgYXMgbnVtYmVyKTtcbiAgICBpZiAoYVR5cGUgPT09IFwibnVtYmVyXCIgJiYgYlR5cGUgPT09IFwiYmlnaW50XCIpXG4gICAgICByZXR1cm4gKGEgYXMgbnVtYmVyKSA8IE51bWJlcihiKTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgc2YoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5UWVBFX01JU01BVENIX0NPTVBBUklTT04sIGFUeXBlLCBiVHlwZSlcbiAgICApO1xuICB9XG5cbiAgaWYgKFxuICAgIChhVHlwZSA9PT0gXCJudW1iZXJcIiAmJiBiVHlwZSA9PT0gXCJudW1iZXJcIikgfHxcbiAgICAoYVR5cGUgPT09IFwiYmlnaW50XCIgJiYgYlR5cGUgPT09IFwiYmlnaW50XCIpXG4gICkge1xuICAgIGlmIChOdW1iZXIuaXNOYU4oYSkgfHwgTnVtYmVyLmlzTmFOKGIpKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLk5BTl9DT01QQVJJU09OKTtcbiAgICByZXR1cm4gYSA8IGI7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBpZiAoaXNOYU4oYS5nZXRUaW1lKCkpIHx8IGlzTmFOKGIuZ2V0VGltZSgpKSlcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5JTlZBTElEX0RBVEVfQ09NUEFSSVNPTik7XG4gICAgcmV0dXJuIGEuZ2V0VGltZSgpIDwgYi5nZXRUaW1lKCk7XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIHNmKFxuICAgICAgQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5VTlNVUFBPUlRFRF9UWVBFU19DT01QQVJJU09OLFxuICAgICAgZ2V0VHlwZU5hbWUoYSksXG4gICAgICBnZXRUeXBlTmFtZShiKVxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYGFgIGlzIGdyZWF0ZXIgdGhhbiBgYmAuXG4gKiBTdXBwb3J0cyBjb21wYXJpc29uIGZvciBudW1iZXJzIGFuZCBEYXRlIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHthbnl9IGEgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGUuXG4gKiBAcGFyYW0ge2FueX0gYiAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYGFgIGlzIGdyZWF0ZXIgdGhhbiBgYmAsIG90aGVyd2lzZSBmYWxzZS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgZWl0aGVyIGBhYCBvciBgYmAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiB2YWx1ZXMgYXJlIG9mIG1pc21hdGNoZWQgb3IgdW5zdXBwb3J0ZWQgdHlwZXMuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dyZWF0ZXJUaGFuKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gIGlmIChbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyhhKSB8fCBbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyhiKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5OVUxMX09SX1VOREVGSU5FRF9DT01QQVJJU09OKTtcblxuICBjb25zdCBhVHlwZSA9IHR5cGVvZiBhO1xuICBjb25zdCBiVHlwZSA9IHR5cGVvZiBiO1xuXG4gIGlmIChhVHlwZSAhPT0gYlR5cGUpIHtcbiAgICAvLyBBbGxvdyBudW1iZXIgWCBiaWdpbnRcbiAgICBpZiAoYVR5cGUgPT09IFwiYmlnaW50XCIgJiYgYlR5cGUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gTnVtYmVyKGEpID4gKGIgYXMgbnVtYmVyKTtcbiAgICBpZiAoYVR5cGUgPT09IFwibnVtYmVyXCIgJiYgYlR5cGUgPT09IFwiYmlnaW50XCIpXG4gICAgICByZXR1cm4gKGEgYXMgbnVtYmVyKSA+IE51bWJlcihiKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlRZUEVfTUlTTUFUQ0hfQ09NUEFSSVNPTiwgYVR5cGUsIGJUeXBlKVxuICAgICk7XG4gIH1cblxuICBpZiAoXG4gICAgKGFUeXBlID09PSBcIm51bWJlclwiICYmIGJUeXBlID09PSBcIm51bWJlclwiKSB8fFxuICAgIChhVHlwZSA9PT0gXCJiaWdpbnRcIiAmJiBiVHlwZSA9PT0gXCJiaWdpbnRcIilcbiAgKSB7XG4gICAgaWYgKE51bWJlci5pc05hTihhKSB8fCBOdW1iZXIuaXNOYU4oYikpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuTkFOX0NPTVBBUklTT04pO1xuICAgIHJldHVybiBhID4gYjtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIGlmIChpc05hTihhLmdldFRpbWUoKSkgfHwgaXNOYU4oYi5nZXRUaW1lKCkpKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLklOVkFMSURfREFURV9DT01QQVJJU09OKTtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPiBiLmdldFRpbWUoKTtcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgc2YoXG4gICAgICBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlVOU1VQUE9SVEVEX1RZUEVTX0NPTVBBUklTT04sXG4gICAgICBnZXRUeXBlTmFtZShhKSxcbiAgICAgIGdldFR5cGVOYW1lKGIpXG4gICAgKVxuICApO1xufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgR3JlYXRlclRoYW5WYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBpc0dyZWF0ZXJUaGFuIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgUGF0aFByb3h5IH0gZnJvbSBcIi4uLy4uL3V0aWxzL1BhdGhQcm94eVwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEdyZWF0ZXIgVGhhbiBWYWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0dSRUFURVJfVEhBTn1cbiAqXG4gKiBAY2xhc3MgR3JlYXRlclRoYW5WYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOKVxuZXhwb3J0IGNsYXNzIEdyZWF0ZXJUaGFuVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPEdyZWF0ZXJUaGFuVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkdSRUFURVJfVEhBTikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0dyZWF0ZXJUaGFuVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1BhdGhQcm94eTxhbnk+fSBhY2Nlc3NvciAtIFByb3h5LWxpa2Ugb2JqZWN0IHVzZWQgdG8gcmVzb2x2ZSB2YWx1ZXMgZnJvbSBuZXN0ZWQgc3RydWN0dXJlcyB2aWEgcGF0aCBzdHJpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zOiBHcmVhdGVyVGhhblZhbGlkYXRvck9wdGlvbnMsXG4gICAgYWNjZXNzb3I6IFBhdGhQcm94eTxhbnk+XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlID0gYWNjZXNzb3IuZ2V0VmFsdWVGcm9tUGF0aChcbiAgICAgICAgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5dXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShlLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFpc0dyZWF0ZXJUaGFuKHZhbHVlLCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgIGUubWVzc2FnZSxcbiAgICAgICAgb3B0aW9ucy5sYWJlbCB8fCBvcHRpb25zW1ZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNHcmVhdGVyVGhhbiwgaXNWYWxpZEZvckd0ZU9yTHRlQ29tcGFyaXNvbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhQcm94eSB9IGZyb20gXCIuLi8uLi91dGlscy9QYXRoUHJveHlcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBHcmVhdGVyIFRoYW4gb3IgRXF1YWwgVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNHUkVBVEVSX1RIQU5fT1JfRVFVQUx9XG4gKlxuICogQGNsYXNzIEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUwpXG5leHBvcnQgY2xhc3MgR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5fT1JfRVFVQUwpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqIEBwYXJhbSB7UGF0aFByb3h5PGFueT59IGFjY2Vzc29yIC0gUHJveHktbGlrZSBvYmplY3QgdXNlZCB0byByZXNvbHZlIHZhbHVlcyBmcm9tIG5lc3RlZCBzdHJ1Y3R1cmVzIHZpYSBwYXRoIHN0cmluZ3MuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMsXG4gICAgYWNjZXNzb3I6IFBhdGhQcm94eTxhbnk+XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlID0gYWNjZXNzb3IuZ2V0VmFsdWVGcm9tUGF0aChcbiAgICAgICAgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxdXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShlLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKFxuICAgICAgICAoaXNWYWxpZEZvckd0ZU9yTHRlQ29tcGFyaXNvbih2YWx1ZSwgY29tcGFyaXNvblByb3BlcnR5VmFsdWUpICYmXG4gICAgICAgICAgaXNFcXVhbCh2YWx1ZSwgY29tcGFyaXNvblByb3BlcnR5VmFsdWUpKSB8fFxuICAgICAgICBpc0dyZWF0ZXJUaGFuKHZhbHVlLCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShcbiAgICAgICAgZS5tZXNzYWdlLFxuICAgICAgICBvcHRpb25zLmxhYmVsIHx8IG9wdGlvbnNbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMXVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IExlc3NUaGFuVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNMZXNzVGhhbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhQcm94eSB9IGZyb20gXCIuLi8uLi91dGlscy9QYXRoUHJveHlcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBMZXNzIFRoYW4gVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNMRVNTX1RIQU59XG4gKlxuICogQGNsYXNzIExlc3NUaGFuVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTilcbmV4cG9ydCBjbGFzcyBMZXNzVGhhblZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxMZXNzVGhhblZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU4pIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtMZXNzVGhhblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtQYXRoUHJveHk8YW55Pn0gYWNjZXNzb3IgLSBQcm94eS1saWtlIG9iamVjdCB1c2VkIHRvIHJlc29sdmUgdmFsdWVzIGZyb20gbmVzdGVkIHN0cnVjdHVyZXMgdmlhIHBhdGggc3RyaW5ncy5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9uczogTGVzc1RoYW5WYWxpZGF0b3JPcHRpb25zLFxuICAgIGFjY2Vzc29yOiBQYXRoUHJveHk8YW55PlxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZTogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSA9IGFjY2Vzc29yLmdldFZhbHVlRnJvbVBhdGgoXG4gICAgICAgIG9wdGlvbnNbVmFsaWRhdGlvbktleXMuTEVTU19USEFOXVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoZS5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghaXNMZXNzVGhhbih2YWx1ZSwgY29tcGFyaXNvblByb3BlcnR5VmFsdWUpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3Iob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICBlLm1lc3NhZ2UsXG4gICAgICAgIG9wdGlvbnMubGFiZWwgfHwgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5dXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB0eXBlIHsgTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNMZXNzVGhhbiwgaXNWYWxpZEZvckd0ZU9yTHRlQ29tcGFyaXNvbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhQcm94eSB9IGZyb20gXCIuLi8uLi91dGlscy9QYXRoUHJveHlcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBMZXNzIFRoYW4gb3IgRXF1YWwgVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNMRVNTX1RIQU5fT1JfRVFVQUx9XG4gKlxuICogQGNsYXNzIExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUwpXG5leHBvcnQgY2xhc3MgTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5fT1JfRVFVQUwpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqIEBwYXJhbSB7UGF0aFByb3h5PGFueT59IGFjY2Vzc29yIC0gUHJveHktbGlrZSBvYmplY3QgdXNlZCB0byByZXNvbHZlIHZhbHVlcyBmcm9tIG5lc3RlZCBzdHJ1Y3R1cmVzIHZpYSBwYXRoIHN0cmluZ3MuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMsXG4gICAgYWNjZXNzb3I6IFBhdGhQcm94eTxhbnk+XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbXBhcmlzb25Qcm9wZXJ0eVZhbHVlID0gYWNjZXNzb3IuZ2V0VmFsdWVGcm9tUGF0aChcbiAgICAgICAgb3B0aW9uc1tWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUxdXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShlLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKFxuICAgICAgICAoaXNWYWxpZEZvckd0ZU9yTHRlQ29tcGFyaXNvbih2YWx1ZSwgY29tcGFyaXNvblByb3BlcnR5VmFsdWUpICYmXG4gICAgICAgICAgaXNFcXVhbCh2YWx1ZSwgY29tcGFyaXNvblByb3BlcnR5VmFsdWUpKSB8fFxuICAgICAgICBpc0xlc3NUaGFuKHZhbHVlLCBjb21wYXJpc29uUHJvcGVydHlWYWx1ZSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShcbiAgICAgICAgZS5tZXNzYWdlLFxuICAgICAgICBvcHRpb25zLmxhYmVsIHx8IG9wdGlvbnNbVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMXVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IExpc3RWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi8uLi9tb2RlbFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3IgZm9yIGNoZWNraW5nIGlmIGVsZW1lbnRzIGluIGEgbGlzdCBvciBzZXQgbWF0Y2ggZXhwZWN0ZWQgdHlwZXNcbiAqIEBzdW1tYXJ5IFRoZSBMaXN0VmFsaWRhdG9yIHZhbGlkYXRlcyB0aGF0IGFsbCBlbGVtZW50cyBpbiBhbiBhcnJheSBvciBTZXQgbWF0Y2ggdGhlIGV4cGVjdGVkIHR5cGVzLlxuICogSXQgY2hlY2tzIGVhY2ggZWxlbWVudCBhZ2FpbnN0IGEgbGlzdCBvZiBhbGxvd2VkIGNsYXNzIHR5cGVzIGFuZCBlbnN1cmVzIHR5cGUgY29uc2lzdGVuY3kuXG4gKiBUaGlzIHZhbGlkYXRvciBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIHRoZSBAbGlzdCBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLCBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNMSVNUfVxuICpcbiAqIEBjbGFzcyBMaXN0VmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbGlzdCB2YWxpZGF0b3Igd2l0aCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IGxpc3RWYWxpZGF0b3IgPSBuZXcgTGlzdFZhbGlkYXRvcigpO1xuICpcbiAqIC8vIENyZWF0ZSBhIGxpc3QgdmFsaWRhdG9yIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IGN1c3RvbUxpc3RWYWxpZGF0b3IgPSBuZXcgTGlzdFZhbGlkYXRvcihcIkFsbCBpdGVtcyBtdXN0IGJlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZVwiKTtcbiAqXG4gKiAvLyBWYWxpZGF0ZSBhIGxpc3RcbiAqIGNvbnN0IG9wdGlvbnMgPSB7IGNsYXp6OiBbXCJTdHJpbmdcIiwgXCJOdW1iZXJcIl0gfTtcbiAqIGNvbnN0IHJlc3VsdCA9IGxpc3RWYWxpZGF0b3IuaGFzRXJyb3JzKFtcInRlc3RcIiwgMTIzXSwgb3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBjb25zdCBpbnZhbGlkUmVzdWx0ID0gbGlzdFZhbGlkYXRvci5oYXNFcnJvcnMoW25ldyBEYXRlKCldLCBvcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIExpc3RWYWxpZGF0b3JcbiAqXG4gKiAgIEMtPj5WOiBuZXcgTGlzdFZhbGlkYXRvcihtZXNzYWdlKVxuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdmFsdWUgaXMgZW1wdHlcbiAqICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgIGVsc2UgdmFsdWUgaGFzIGVsZW1lbnRzXG4gKiAgICAgVi0+PlY6IENoZWNrIGVhY2ggZWxlbWVudCdzIHR5cGVcbiAqICAgICBhbHQgQWxsIGVsZW1lbnRzIG1hdGNoIGFsbG93ZWQgdHlwZXNcbiAqICAgICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgICBlbHNlIFNvbWUgZWxlbWVudHMgZG9uJ3QgbWF0Y2hcbiAqICAgICAgIFYtLT4+QzogRXJyb3IgbWVzc2FnZVxuICogICAgIGVuZFxuICogICBlbmRcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLkxJU1QpXG5leHBvcnQgY2xhc3MgTGlzdFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxMaXN0VmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxJU1QpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBBcnJheS5uYW1lLCBTZXQubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbGwgZWxlbWVudHMgaW4gYSBsaXN0IG9yIHNldCBtYXRjaCB0aGUgZXhwZWN0ZWQgdHlwZXNcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgZWFjaCBlbGVtZW50IGluIHRoZSBwcm92aWRlZCBhcnJheSBvciBTZXQgbWF0Y2hlcyBvbmUgb2YgdGhlXG4gICAqIGNsYXNzIHR5cGVzIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy4gRm9yIG9iamVjdCB0eXBlcywgaXQgY2hlY2tzIHRoZSBjb25zdHJ1Y3RvciBuYW1lLFxuICAgKiBhbmQgZm9yIHByaW1pdGl2ZSB0eXBlcywgaXQgY29tcGFyZXMgYWdhaW5zdCB0aGUgbG93ZXJjYXNlIHR5cGUgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHthbnlbXSB8IFNldDxhbnk+fSB2YWx1ZSAtIFRoZSBhcnJheSBvciBTZXQgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtMaXN0VmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBjb250YWluaW5nIHRoZSBhbGxvd2VkIGNsYXNzIHR5cGVzXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnlbXSB8IFNldDxhbnk+LFxuICAgIG9wdGlvbnM6IExpc3RWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAhdmFsdWUubGVuZ3RoIDogIXZhbHVlLnNpemUpKSByZXR1cm47XG5cbiAgICBjb25zdCBjbGF6eiA9IChcbiAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9ucy5jbGF6eikgPyBvcHRpb25zLmNsYXp6IDogW29wdGlvbnMuY2xhenpdXG4gICAgKS5tYXAoKGMpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgYyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGM7XG4gICAgICBpZiAoIWMubmFtZSkgcmV0dXJuIChjIGFzICgpID0+IENvbnN0cnVjdG9yPGFueT4pKCkubmFtZTtcbiAgICAgIHJldHVybiBjLm5hbWU7XG4gICAgfSk7XG4gICAgbGV0IHZhbDogYW55LFxuICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgZm9yIChcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGkgPCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5sZW5ndGggOiB2YWx1ZS5zaXplKTtcbiAgICAgIGkrK1xuICAgICkge1xuICAgICAgdmFsID0gKHZhbHVlIGFzIGFueSlbaV07XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBpc1ZhbGlkID0gY2xhenouaW5jbHVkZXMoKCh2YWwgPz8ge30pIGFzIG9iamVjdCkuY29uc3RydWN0b3I/Lm5hbWUpOyAvLyBudWxsIGlzIGFuIG9iamVjdFxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlzVmFsaWQgPSBjbGF6ei5zb21lKChjOiBzdHJpbmcpID0+IHR5cGVvZiB2YWwgPT09IGMudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzVmFsaWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLCBjbGF6eik7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMsIERFRkFVTFRfRVJST1JfTUVTU0FHRVMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNYXhpbXVtIExlbmd0aCBWYWxpZGF0b3JcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgc3RyaW5ncyBhbmQgQXJyYXlzIG9uIHRoZWlyIG1heGltdW0gbGVuZ3RoXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNQVhfTEVOR1RIfVxuICpcbiAqIEBjbGFzcyBNaW5MZW5ndGhWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSClcbmV4cG9ydCBjbGFzcyBNYXhMZW5ndGhWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8TWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1BWF9MRU5HVEgpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBTdHJpbmcubmFtZSwgQXJyYXkubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7TWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IHN0cmluZyB8IGFueVtdLFxuICAgIG9wdGlvbnM6IE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IG9wdGlvbnMubWF4bGVuZ3RoXG4gICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLCBvcHRpb25zLm1heGxlbmd0aClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNYXhWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvciBmb3IgY2hlY2tpbmcgaWYgYSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYSBtYXhpbXVtXG4gKiBAc3VtbWFyeSBUaGUgTWF4VmFsaWRhdG9yIGNoZWNrcyBpZiBhIG51bWVyaWMgdmFsdWUsIGRhdGUsIG9yIHN0cmluZyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAqIGEgc3BlY2lmaWVkIG1heGltdW0gdmFsdWUuIEl0IHN1cHBvcnRzIGNvbXBhcmluZyBudW1iZXJzIGRpcmVjdGx5LCBkYXRlcyBjaHJvbm9sb2dpY2FsbHksXG4gKiBhbmQgc3RyaW5ncyBsZXhpY29ncmFwaGljYWxseS4gVGhpcyB2YWxpZGF0b3IgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0aGUgQG1heCBkZWNvcmF0b3IuXG4gKiBcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUFYfVxuICogXG4gKiBAY2xhc3MgTWF4VmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG1heCB2YWxpZGF0b3Igd2l0aCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IG1heFZhbGlkYXRvciA9IG5ldyBNYXhWYWxpZGF0b3IoKTtcbiAqIFxuICogLy8gQ3JlYXRlIGEgbWF4IHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21NYXhWYWxpZGF0b3IgPSBuZXcgTWF4VmFsaWRhdG9yKFwiVmFsdWUgbXVzdCBub3QgZXhjZWVkIHswfVwiKTtcbiAqIFxuICogLy8gVmFsaWRhdGUgYSBudW1iZXJcbiAqIGNvbnN0IG51bU9wdGlvbnMgPSB7IG1heDogMTAwLCBtZXNzYWdlOiBcIk51bWJlciB0b28gbGFyZ2VcIiB9O1xuICogY29uc3QgbnVtUmVzdWx0ID0gbWF4VmFsaWRhdG9yLmhhc0Vycm9ycyg1MCwgbnVtT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBjb25zdCBpbnZhbGlkTnVtUmVzdWx0ID0gbWF4VmFsaWRhdG9yLmhhc0Vycm9ycygxNTAsIG51bU9wdGlvbnMpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKiBcbiAqIC8vIFZhbGlkYXRlIGEgZGF0ZVxuICogY29uc3QgZGF0ZU9wdGlvbnMgPSB7IG1heDogbmV3IERhdGUoMjAyMywgMTEsIDMxKSB9O1xuICogY29uc3QgZGF0ZVJlc3VsdCA9IG1heFZhbGlkYXRvci5oYXNFcnJvcnMobmV3IERhdGUoMjAyMywgNSwgMTUpLCBkYXRlT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBgYGBcbiAqIFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIE1heFZhbGlkYXRvclxuICogICBcbiAqICAgQy0+PlY6IG5ldyBNYXhWYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgQy0+PlY6IGhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucylcbiAqICAgYWx0IHZhbHVlIGlzIHVuZGVmaW5lZFxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZWxzZSB2YWx1ZSBpcyBEYXRlIGFuZCBtYXggaXMgbm90IERhdGVcbiAqICAgICBWLT4+VjogQ29udmVydCBtYXggdG8gRGF0ZVxuICogICAgIGFsdCBjb252ZXJzaW9uIGZhaWxzXG4gKiAgICAgICBWLS0+PkM6IEVycm9yOiBJbnZhbGlkIE1heCBwYXJhbVxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgYWx0IHZhbHVlID4gbWF4XG4gKiAgICAgVi0tPj5DOiBFcnJvciBtZXNzYWdlXG4gKiAgIGVsc2UgdmFsdWUgPD0gbWF4XG4gKiAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICBlbmRcbiAqIFxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5NQVgpXG5leHBvcnQgY2xhc3MgTWF4VmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPE1heFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NQVgpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBcIm51bWJlclwiLCBcIkRhdGVcIiwgXCJzdHJpbmdcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBhIG1heGltdW1cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIHZhbHVlIGRvZXMgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSB2YWx1ZVxuICAgKiBzcGVjaWZpZWQgaW4gdGhlIG9wdGlvbnMuIEZvciBkYXRlcywgaXQgcGVyZm9ybXMgY2hyb25vbG9naWNhbCBjb21wYXJpc29uLFxuICAgKiBjb252ZXJ0aW5nIHN0cmluZyByZXByZXNlbnRhdGlvbnMgdG8gRGF0ZSBvYmplY3RzIGlmIG5lY2Vzc2FyeS4gRm9yIG51bWJlcnNcbiAgICogYW5kIHN0cmluZ3MsIGl0IHBlcmZvcm1zIGRpcmVjdCBjb21wYXJpc29uLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlciB8IERhdGUgfCBzdHJpbmd9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7TWF4VmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBjb250YWluaW5nIHRoZSBtYXhpbXVtIHZhbHVlXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogbnVtYmVyIHwgRGF0ZSB8IHN0cmluZyxcbiAgICBvcHRpb25zOiBNYXhWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuXG4gICAgbGV0IHsgbWF4IH0gPSBvcHRpb25zO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIShtYXggaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgbWF4ID0gbmV3IERhdGUobWF4KTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4obWF4LmdldERhdGUoKSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTWF4IHBhcmFtIGRlZmluZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlID4gbWF4XG4gICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLCBtYXgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IE1pbmltdW0gTGVuZ3RoIFZhbGlkYXRvclxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBzdHJpbmdzIGFuZCBBcnJheXMgb24gdGhlaXIgbWluaW11bSBsZW5ndGhcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTl9MRU5HVEh9XG4gKlxuICogQGNsYXNzIE1pbkxlbmd0aFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIKVxuZXhwb3J0IGNsYXNzIE1pbkxlbmd0aFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUlOX0xFTkdUSCkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFN0cmluZy5uYW1lLCBBcnJheS5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5fSB2YWx1ZVxuICAgKiBAcGFyYW0ge01pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IHN0cmluZyB8IGFueVtdLFxuICAgIG9wdGlvbnM6IE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8IG9wdGlvbnMubWlubGVuZ3RoXG4gICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLCBvcHRpb25zLm1pbmxlbmd0aClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNaW5WYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvciBmb3IgY2hlY2tpbmcgaWYgYSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYSBtaW5pbXVtXG4gKiBAc3VtbWFyeSBUaGUgTWluVmFsaWRhdG9yIGNoZWNrcyBpZiBhIG51bWVyaWMgdmFsdWUsIGRhdGUsIG9yIHN0cmluZyBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cbiAqIGEgc3BlY2lmaWVkIG1pbmltdW0gdmFsdWUuIEl0IHN1cHBvcnRzIGNvbXBhcmluZyBudW1iZXJzIGRpcmVjdGx5LCBkYXRlcyBjaHJvbm9sb2dpY2FsbHksXG4gKiBhbmQgc3RyaW5ncyBsZXhpY29ncmFwaGljYWxseS4gVGhpcyB2YWxpZGF0b3IgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0aGUgQG1pbiBkZWNvcmF0b3IuXG4gKiBcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUlOfVxuICogXG4gKiBAY2xhc3MgTWluVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG1pbiB2YWxpZGF0b3Igd2l0aCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IG1pblZhbGlkYXRvciA9IG5ldyBNaW5WYWxpZGF0b3IoKTtcbiAqIFxuICogLy8gQ3JlYXRlIGEgbWluIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21NaW5WYWxpZGF0b3IgPSBuZXcgTWluVmFsaWRhdG9yKFwiVmFsdWUgbXVzdCBiZSBhdCBsZWFzdCB7MH1cIik7XG4gKiBcbiAqIC8vIFZhbGlkYXRlIGEgbnVtYmVyXG4gKiBjb25zdCBudW1PcHRpb25zID0geyBtaW46IDEwLCBtZXNzYWdlOiBcIk51bWJlciB0b28gc21hbGxcIiB9O1xuICogY29uc3QgbnVtUmVzdWx0ID0gbWluVmFsaWRhdG9yLmhhc0Vycm9ycyg1MCwgbnVtT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBjb25zdCBpbnZhbGlkTnVtUmVzdWx0ID0gbWluVmFsaWRhdG9yLmhhc0Vycm9ycyg1LCBudW1PcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogXG4gKiAvLyBWYWxpZGF0ZSBhIGRhdGVcbiAqIGNvbnN0IGRhdGVPcHRpb25zID0geyBtaW46IG5ldyBEYXRlKDIwMjMsIDAsIDEpIH07XG4gKiBjb25zdCBkYXRlUmVzdWx0ID0gbWluVmFsaWRhdG9yLmhhc0Vycm9ycyhuZXcgRGF0ZSgyMDIzLCA1LCAxNSksIGRhdGVPcHRpb25zKTsgLy8gdW5kZWZpbmVkICh2YWxpZClcbiAqIGBgYFxuICogXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFYgYXMgTWluVmFsaWRhdG9yXG4gKiAgIFxuICogICBDLT4+VjogbmV3IE1pblZhbGlkYXRvcihtZXNzYWdlKVxuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKiAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICBlbHNlIHZhbHVlIGlzIERhdGUgYW5kIG1pbiBpcyBub3QgRGF0ZVxuICogICAgIFYtPj5WOiBDb252ZXJ0IG1pbiB0byBEYXRlXG4gKiAgICAgYWx0IGNvbnZlcnNpb24gZmFpbHNcbiAqICAgICAgIFYtLT4+QzogRXJyb3I6IEludmFsaWQgTWluIHBhcmFtXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICogICBhbHQgdmFsdWUgPCBtaW5cbiAqICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgZWxzZSB2YWx1ZSA+PSBtaW5cbiAqICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgIGVuZFxuICogXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLk1JTilcbmV4cG9ydCBjbGFzcyBNaW5WYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8TWluVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1JTikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFwibnVtYmVyXCIsIFwiRGF0ZVwiLCBcInN0cmluZ1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGEgbWluaW11bVxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhhdCB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgbm90IGxlc3MgdGhhbiB0aGUgbWluaW11bSB2YWx1ZVxuICAgKiBzcGVjaWZpZWQgaW4gdGhlIG9wdGlvbnMuIEZvciBkYXRlcywgaXQgcGVyZm9ybXMgY2hyb25vbG9naWNhbCBjb21wYXJpc29uLFxuICAgKiBjb252ZXJ0aW5nIHN0cmluZyByZXByZXNlbnRhdGlvbnMgdG8gRGF0ZSBvYmplY3RzIGlmIG5lY2Vzc2FyeS4gRm9yIG51bWJlcnNcbiAgICogYW5kIHN0cmluZ3MsIGl0IHBlcmZvcm1zIGRpcmVjdCBjb21wYXJpc29uLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlciB8IERhdGUgfCBzdHJpbmd9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7TWluVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBjb250YWluaW5nIHRoZSBtaW5pbXVtIHZhbHVlXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogbnVtYmVyIHwgRGF0ZSB8IHN0cmluZyxcbiAgICBvcHRpb25zOiBNaW5WYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuXG4gICAgbGV0IHsgbWluIH0gPSBvcHRpb25zO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIShtaW4gaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgbWluID0gbmV3IERhdGUobWluKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4obWluLmdldERhdGUoKSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTWluIHBhcmFtIGRlZmluZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZSA8IG1pblxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgbWluKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFBhdHRlcm5WYWxpZGF0b3IgfSBmcm9tIFwiLi9QYXR0ZXJuVmFsaWRhdG9yXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBERUZBVUxUX1BBVFRFUk5TLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEhhbmRsZXMgUGFzc3dvcmQgVmFsaWRhdGlvblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZXJyb3JNZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNQQVNTV09SRH1cbiAqXG4gKiBAY2xhc3MgUGFzc3dvcmRWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLlBBU1NXT1JEKVxuZXhwb3J0IGNsYXNzIFBhc3N3b3JkVmFsaWRhdG9yIGV4dGVuZHMgUGF0dGVyblZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlBBU1NXT1JEKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7UGF0dGVyblZhbGlkYXRvck9wdGlvbnN9IFtvcHRpb25zPXt9XVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFBhdHRlcm5WYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgPSB7fVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBzdXBlci5oYXNFcnJvcnModmFsdWUsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBtZXNzYWdlOiBvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLFxuICAgICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOlxuICAgICAgICBvcHRpb25zPy5wYXR0ZXJuIHx8IERFRkFVTFRfUEFUVEVSTlMuUEFTU1dPUkQuQ0hBUjhfT05FX09GX0VBQ0gsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHZhbHVlIGlzIHByZXNlbnQgYW5kIG5vdCBlbXB0eVxuICogQHN1bW1hcnkgVGhlIFJlcXVpcmVkVmFsaWRhdG9yIGVuc3VyZXMgdGhhdCBhIHZhbHVlIGlzIHByb3ZpZGVkIGFuZCBub3QgZW1wdHkuXG4gKiBJdCBoYW5kbGVzIGRpZmZlcmVudCB0eXBlcyBvZiB2YWx1ZXMgYXBwcm9wcmlhdGVseTogZm9yIGJvb2xlYW5zIGFuZCBudW1iZXJzLFxuICogaXQgY2hlY2tzIGlmIHRoZXkncmUgdW5kZWZpbmVkOyBmb3Igb3RoZXIgdHlwZXMgKHN0cmluZ3MsIGFycmF5cywgb2JqZWN0cyksXG4gKiBpdCBjaGVja3MgaWYgdGhleSdyZSBmYWxzeS4gVGhpcyB2YWxpZGF0b3IgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0aGUgQHJlcXVpcmVkIGRlY29yYXRvclxuICogYW5kIGlzIG9mdGVuIHRoZSBmaXJzdCB2YWxpZGF0aW9uIGFwcGxpZWQgdG8gaW1wb3J0YW50IGZpZWxkcy5cbiAqIFxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLCBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNSRVFVSVJFRH1cbiAqIFxuICogQGNsYXNzIFJlcXVpcmVkVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHJlcXVpcmVkIHZhbGlkYXRvciB3aXRoIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogY29uc3QgcmVxdWlyZWRWYWxpZGF0b3IgPSBuZXcgUmVxdWlyZWRWYWxpZGF0b3IoKTtcbiAqIFxuICogLy8gQ3JlYXRlIGEgcmVxdWlyZWQgdmFsaWRhdG9yIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IGN1c3RvbVJlcXVpcmVkVmFsaWRhdG9yID0gbmV3IFJlcXVpcmVkVmFsaWRhdG9yKFwiVGhpcyBmaWVsZCBpcyBtYW5kYXRvcnlcIik7XG4gKiBcbiAqIC8vIFZhbGlkYXRlIGRpZmZlcmVudCB0eXBlcyBvZiB2YWx1ZXNcbiAqIHJlcXVpcmVkVmFsaWRhdG9yLmhhc0Vycm9ycyhcIkhlbGxvXCIpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogcmVxdWlyZWRWYWxpZGF0b3IuaGFzRXJyb3JzKFwiXCIpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKiByZXF1aXJlZFZhbGlkYXRvci5oYXNFcnJvcnMoMCk7IC8vIHVuZGVmaW5lZCAodmFsaWQgLSAwIGlzIGEgdmFsaWQgbnVtYmVyKVxuICogcmVxdWlyZWRWYWxpZGF0b3IuaGFzRXJyb3JzKG51bGwpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKiByZXF1aXJlZFZhbGlkYXRvci5oYXNFcnJvcnMoW10pOyAvLyB1bmRlZmluZWQgKHZhbGlkIC0gZW1wdHkgYXJyYXkgaXMgc3RpbGwgYW4gYXJyYXkpXG4gKiBgYGBcbiAqIFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIFJlcXVpcmVkVmFsaWRhdG9yXG4gKiAgIFxuICogICBDLT4+VjogbmV3IFJlcXVpcmVkVmFsaWRhdG9yKG1lc3NhZ2UpXG4gKiAgIEMtPj5WOiBoYXNFcnJvcnModmFsdWUsIG9wdGlvbnMpXG4gKiAgIGFsdCB0eXBlb2YgdmFsdWUgaXMgYm9vbGVhbiBvciBudW1iZXJcbiAqICAgICBhbHQgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKiAgICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgICBlbHNlIHZhbHVlIGlzIGRlZmluZWRcbiAqICAgICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgICBlbmRcbiAqICAgZWxzZSBvdGhlciB0eXBlc1xuICogICAgIGFsdCB2YWx1ZSBpcyBmYWxzeSAobnVsbCwgdW5kZWZpbmVkLCBlbXB0eSBzdHJpbmcpXG4gKiAgICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgICBlbHNlIHZhbHVlIGlzIHRydXRoeVxuICogICAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICAgIGVuZFxuICogICBlbmRcbiAqIFxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRClcbmV4cG9ydCBjbGFzcyBSZXF1aXJlZFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVRVUlSRUQpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgdmFsdWUgaXMgcHJlc2VudCBhbmQgbm90IGVtcHR5XG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGF0IHRoZSBwcm92aWRlZCB2YWx1ZSBleGlzdHMgYW5kIGlzIG5vdCBlbXB0eS5cbiAgICogVGhlIHZhbGlkYXRpb24gbG9naWMgdmFyaWVzIGJ5IHR5cGU6XG4gICAqIC0gRm9yIGJvb2xlYW5zIGFuZCBudW1iZXJzOiBjaGVja3MgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgKiAtIEZvciBvdGhlciB0eXBlcyAoc3RyaW5ncywgYXJyYXlzLCBvYmplY3RzKTogY2hlY2tzIGlmIHRoZSB2YWx1ZSBpcyBmYWxzeVxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtWYWxpZGF0b3JPcHRpb25zfSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9uczogVmFsaWRhdG9yT3B0aW9ucyA9IHt9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICF2YWx1ZVxuICAgICAgICAgID8gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTdGVwVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFN0ZXAgVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNTVEVQfVxuICpcbiAqIEBjbGFzcyBTdGVwVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLlNURVApXG5leHBvcnQgY2xhc3MgU3RlcFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxTdGVwVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlNURVApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBcIm51bWJlclwiLCBcInN0cmluZ1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXBcbiAgICogQHBhcmFtIHtTdGVwVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IG51bWJlciB8IHN0cmluZyxcbiAgICBvcHRpb25zOiBTdGVwVmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKSAlIE51bWJlcihvcHRpb25zLnN0ZXApICE9PSAwXG4gICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLCBvcHRpb25zLnN0ZXApXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuLi9WYWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBUeXBlVmFsaWRhdG9yT3B0aW9ucyxcbiAgVmFsaWRhdG9yRGVmaW5pdGlvbixcbiAgVmFsaWRhdG9yT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvciBmb3IgY2hlY2tpbmcgaWYgYSB2YWx1ZSBpcyBvZiB0aGUgZXhwZWN0ZWQgdHlwZShzKVxuICogQHN1bW1hcnkgVGhlIFR5cGVWYWxpZGF0b3IgZW5zdXJlcyB0aGF0IGEgdmFsdWUgbWF0Y2hlcyBvbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlcy5cbiAqIEl0IGNhbiB2YWxpZGF0ZSBhZ2FpbnN0IGEgc2luZ2xlIHR5cGUsIG11bHRpcGxlIHR5cGVzLCBvciBhIHR5cGUgd2l0aCBhIHNwZWNpZmljIG5hbWUuXG4gKiBUaGlzIHZhbGlkYXRvciBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIHRoZSBAdHlwZSBkZWNvcmF0b3IgYW5kIGlzIGZ1bmRhbWVudGFsIGZvclxuICogZW5zdXJpbmcgdHlwZSBzYWZldHkgaW4gdmFsaWRhdGVkIG1vZGVscy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMsIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1RZUEV9XG4gKlxuICogQGNsYXNzIFR5cGVWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSB0eXBlIHZhbGlkYXRvciB3aXRoIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogY29uc3QgdHlwZVZhbGlkYXRvciA9IG5ldyBUeXBlVmFsaWRhdG9yKCk7XG4gKlxuICogLy8gQ3JlYXRlIGEgdHlwZSB2YWxpZGF0b3Igd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogY29uc3QgY3VzdG9tVHlwZVZhbGlkYXRvciA9IG5ldyBUeXBlVmFsaWRhdG9yKFwiVmFsdWUgbXVzdCBiZSBvZiB0eXBlIHswfSwgYnV0IGdvdCB7MX1cIik7XG4gKlxuICogLy8gVmFsaWRhdGUgYWdhaW5zdCBhIHNpbmdsZSB0eXBlXG4gKiBjb25zdCBzdHJpbmdPcHRpb25zID0geyB0eXBlczogXCJzdHJpbmdcIiB9O1xuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnMoXCJoZWxsb1wiLCBzdHJpbmdPcHRpb25zKTsgLy8gdW5kZWZpbmVkICh2YWxpZClcbiAqIHR5cGVWYWxpZGF0b3IuaGFzRXJyb3JzKDEyMywgc3RyaW5nT3B0aW9ucyk7IC8vIFJldHVybnMgZXJyb3IgbWVzc2FnZSAoaW52YWxpZClcbiAqXG4gKiAvLyBWYWxpZGF0ZSBhZ2FpbnN0IG11bHRpcGxlIHR5cGVzXG4gKiBjb25zdCBtdWx0aU9wdGlvbnMgPSB7IHR5cGVzOiBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIl0gfTtcbiAqIHR5cGVWYWxpZGF0b3IuaGFzRXJyb3JzKFwiaGVsbG9cIiwgbXVsdGlPcHRpb25zKTsgLy8gdW5kZWZpbmVkICh2YWxpZClcbiAqIHR5cGVWYWxpZGF0b3IuaGFzRXJyb3JzKDEyMywgbXVsdGlPcHRpb25zKTsgLy8gdW5kZWZpbmVkICh2YWxpZClcbiAqIHR5cGVWYWxpZGF0b3IuaGFzRXJyb3JzKHRydWUsIG11bHRpT3B0aW9ucyk7IC8vIFJldHVybnMgZXJyb3IgbWVzc2FnZSAoaW52YWxpZClcbiAqXG4gKiAvLyBWYWxpZGF0ZSBhZ2FpbnN0IGEgY2xhc3MgdHlwZVxuICogY29uc3QgY2xhc3NPcHRpb25zID0geyB0eXBlczogeyBuYW1lOiBcIkRhdGVcIiB9IH07XG4gKiB0eXBlVmFsaWRhdG9yLmhhc0Vycm9ycyhuZXcgRGF0ZSgpLCBjbGFzc09wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIFR5cGVWYWxpZGF0b3JcbiAqICAgcGFydGljaXBhbnQgUiBhcyBSZWZsZWN0aW9uXG4gKlxuICogICBDLT4+VjogbmV3IFR5cGVWYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgQy0+PlY6IGhhc0Vycm9ycyh2YWx1ZSwgb3B0aW9ucylcbiAqICAgYWx0IHZhbHVlIGlzIHVuZGVmaW5lZFxuICogICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgZWxzZSB2YWx1ZSBpcyBkZWZpbmVkXG4gKiAgICAgVi0+PlI6IGV2YWx1YXRlRGVzaWduVHlwZXModmFsdWUsIHR5cGVzKVxuICogICAgIGFsdCB0eXBlIGV2YWx1YXRpb24gcGFzc2VzXG4gKiAgICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgICAgZWxzZSB0eXBlIGV2YWx1YXRpb24gZmFpbHNcbiAqICAgICAgIFYtPj5WOiBGb3JtYXQgZXJyb3IgbWVzc2FnZSB3aXRoIHR5cGUgaW5mb1xuICogICAgICAgVi0tPj5DOiBFcnJvciBtZXNzYWdlXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuVFlQRSlcbmV4cG9ydCBjbGFzcyBUeXBlVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPFR5cGVWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVFlQRSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBvZiB0aGUgZXhwZWN0ZWQgdHlwZShzKVxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhhdCB0aGUgcHJvdmlkZWQgdmFsdWUgbWF0Y2hlcyBvbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlcy5cbiAgICogSXQgdXNlcyB0aGUgUmVmbGVjdGlvbiB1dGlsaXR5IHRvIGV2YWx1YXRlIGlmIHRoZSB2YWx1ZSdzIHR5cGUgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgdHlwZXMuXG4gICAqIFRoZSBtZXRob2Qgc2tpcHMgdmFsaWRhdGlvbiBmb3IgdW5kZWZpbmVkIHZhbHVlcyB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgUmVxdWlyZWRWYWxpZGF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge1R5cGVWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGNvbnRhaW5pbmcgdGhlIGV4cGVjdGVkIHR5cGVzXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM6IFR5cGVWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjsgLy8gRG9uJ3QgdHJ5IGFuZCBlbmZvcmNlIHR5cGUgaWYgdW5kZWZpbmVkXG5cbiAgICBjb25zdCB7IHR5cGUsIG1lc3NhZ2UsIGN1c3RvbVR5cGVzIH0gPSBvcHRpb25zO1xuXG4gICAgbGV0IHRzID0gY3VzdG9tVHlwZXMgfHwgdHlwZTtcbiAgICB0cyA9IChBcnJheS5pc0FycmF5KHRzKSA/IHRzIDogW3RzXSkubWFwKCh0KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHQgPT09IFwic3RyaW5nXCIpIHJldHVybiB0O1xuICAgICAgaWYgKHR5cGVvZiB0ID09PSBcImZ1bmN0aW9uXCIgJiYgIXQubmFtZSkgdCA9ICh0IGFzICgpID0+IHN0cmluZykoKTtcbiAgICAgIHJldHVybiAodCBhcyBhbnkpLm5hbWUgfHwgdDtcbiAgICB9KTtcblxuICAgIGlmICghUmVmbGVjdGlvbi5ldmFsdWF0ZURlc2lnblR5cGVzKHZhbHVlLCB0cyBhcyBhbnkpKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShcbiAgICAgICAgbWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsXG4gICAgICAgIHR5cGVvZiB0cyA9PT0gXCJzdHJpbmdcIiA/IHRzIDogQXJyYXkuaXNBcnJheSh0cykgPyB0cy5qb2luKFwiLCBcIikgOiB0cyxcbiAgICAgICAgdHlwZW9mIHZhbHVlXG4gICAgICApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIHRoZSBUeXBlVmFsaWRhdG9yIHdpdGggdGhlIFZhbGlkYXRpb24gcmVnaXN0cnlcbiAqIEBzdW1tYXJ5IFRoaXMgcmVnaXN0cmF0aW9uIGFzc29jaWF0ZXMgdGhlIFR5cGVWYWxpZGF0b3Igd2l0aCB0aGUgTW9kZWxLZXlzLlRZUEUga2V5LFxuICogYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCBmb3IgdmFsaWRhdGluZyBkZXNpZ24gdHlwZXMuIFRoZSBzYXZlIGZsYWcgaXMgc2V0IHRvIGZhbHNlXG4gKiB0byBwcmV2ZW50IHRoZSB2YWxpZGF0b3IgZnJvbSBiZWluZyBzYXZlZCBpbiB0aGUgc3RhbmRhcmQgdmFsaWRhdG9yIHJlZ2lzdHJ5LlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuVmFsaWRhdGlvbi5yZWdpc3Rlcih7XG4gIHZhbGlkYXRvcjogVHlwZVZhbGlkYXRvciBhcyBWYWxpZGF0b3JPcHRpb25zLFxuICB2YWxpZGF0aW9uS2V5OiBNb2RlbEtleXMuVFlQRSxcbiAgc2F2ZTogZmFsc2UsXG59IGFzIFZhbGlkYXRvckRlZmluaXRpb24pO1xuIiwiaW1wb3J0IHtcbiAgVmFsaWRhdGlvbktleXMsXG4gIERFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIERFRkFVTFRfUEFUVEVSTlMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvciB9IGZyb20gXCIuL1BhdHRlcm5WYWxpZGF0b3JcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvciBmb3IgY2hlY2tpbmcgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBVUkxcbiAqIEBzdW1tYXJ5IFRoZSBVUkxWYWxpZGF0b3IgY2hlY2tzIGlmIGEgc3RyaW5nIG1hdGNoZXMgYSBzdGFuZGFyZCBVUkwgcGF0dGVybi5cbiAqIEl0IGV4dGVuZHMgdGhlIFBhdHRlcm5WYWxpZGF0b3IgYW5kIHVzZXMgYSByb2J1c3QgVVJMIHJlZ2V4IHBhdHRlcm4gdG8gdmFsaWRhdGUgd2ViIGFkZHJlc3Nlcy5cbiAqIFRoZSBwYXR0ZXJuIGlzIHNvdXJjZWQgZnJvbSB7QGxpbmsgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZHBlcmluaS83MjkyOTR9IGFuZCBpcyB3aWRlbHlcbiAqIHJlY29nbml6ZWQgZm9yIGl0cyBhY2N1cmFjeSBpbiB2YWxpZGF0aW5nIFVSTHMuIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEB1cmwgZGVjb3JhdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVVJMfVxuICpcbiAqIEBjbGFzcyBVUkxWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgVVJMIHZhbGlkYXRvciB3aXRoIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogY29uc3QgdXJsVmFsaWRhdG9yID0gbmV3IFVSTFZhbGlkYXRvcigpO1xuICpcbiAqIC8vIENyZWF0ZSBhIFVSTCB2YWxpZGF0b3Igd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogY29uc3QgY3VzdG9tVXJsVmFsaWRhdG9yID0gbmV3IFVSTFZhbGlkYXRvcihcIlBsZWFzZSBlbnRlciBhIHZhbGlkIHdlYiBhZGRyZXNzXCIpO1xuICpcbiAqIC8vIFZhbGlkYXRlIGEgVVJMXG4gKiBjb25zdCByZXN1bHQgPSB1cmxWYWxpZGF0b3IuaGFzRXJyb3JzKFwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiKTsgLy8gdW5kZWZpbmVkICh2YWxpZClcbiAqIGNvbnN0IGludmFsaWRSZXN1bHQgPSB1cmxWYWxpZGF0b3IuaGFzRXJyb3JzKFwibm90LWEtdXJsXCIpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgVVJMVmFsaWRhdG9yXG4gKiAgIHBhcnRpY2lwYW50IFAgYXMgUGF0dGVyblZhbGlkYXRvclxuICpcbiAqICAgQy0+PlU6IG5ldyBVUkxWYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgVS0+PlA6IHN1cGVyKG1lc3NhZ2UpXG4gKiAgIEMtPj5VOiBoYXNFcnJvcnModmFsdWUsIG9wdGlvbnMpXG4gKiAgIFUtPj5QOiBzdXBlci5oYXNFcnJvcnModmFsdWUsIG9wdGlvbnMgd2l0aCBVUkwgcGF0dGVybilcbiAqICAgUC0tPj5VOiB2YWxpZGF0aW9uIHJlc3VsdFxuICogICBVLS0+PkM6IHZhbGlkYXRpb24gcmVzdWx0XG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5VUkwpXG5leHBvcnQgY2xhc3MgVVJMVmFsaWRhdG9yIGV4dGVuZHMgUGF0dGVyblZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVVJMKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIFVSTFxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhhdCB0aGUgcHJvdmlkZWQgc3RyaW5nIG1hdGNoZXMgdGhlIFVSTCBwYXR0ZXJuLlxuICAgKiBUaGlzIG1ldGhvZCBleHRlbmRzIHRoZSBQYXR0ZXJuVmFsaWRhdG9yJ3MgaGFzRXJyb3JzIG1ldGhvZCBieSBlbnN1cmluZ1xuICAgKiB0aGUgVVJMIHBhdHRlcm4gaXMgdXNlZCwgZXZlbiBpZiBub3QgZXhwbGljaXRseSBwcm92aWRlZCBpbiB0aGUgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVGhlIHN0cmluZyB0byB2YWxpZGF0ZSBhcyBhIFVSTFxuICAgKiBAcGFyYW0ge1BhdHRlcm5WYWxpZGF0b3JPcHRpb25zfSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBQYXR0ZXJuVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zID0ge31cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKHZhbHVlLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgIHBhdHRlcm46IG9wdGlvbnMucGF0dGVybiB8fCBERUZBVUxUX1BBVFRFUk5TLlVSTCxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHtcbiAgQ29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnMsXG4gIERhdGVWYWxpZGF0b3JPcHRpb25zLFxuICBEaWZmVmFsaWRhdG9yT3B0aW9ucyxcbiAgRXF1YWxzVmFsaWRhdG9yT3B0aW9ucyxcbiAgR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyxcbiAgR3JlYXRlclRoYW5WYWxpZGF0b3JPcHRpb25zLFxuICBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zLFxuICBMZXNzVGhhblZhbGlkYXRvck9wdGlvbnMsXG4gIExpc3RWYWxpZGF0b3JPcHRpb25zLFxuICBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNYXhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5WYWxpZGF0b3JPcHRpb25zLFxuICBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyxcbiAgU3RlcFZhbGlkYXRvck9wdGlvbnMsXG4gIFZhbGlkYXRpb25NZXRhZGF0YSxcbiAgVmFsaWRhdG9yT3B0aW9ucyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIERFRkFVTFRfUEFUVEVSTlMsXG4gIFZhbGlkYXRpb25LZXlzLFxufSBmcm9tIFwiLi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi4vdXRpbHMvc3RyaW5nc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vbW9kZWwvdHlwZXNcIjtcbmltcG9ydCB7IHBhcnNlRGF0ZSB9IGZyb20gXCIuLi91dGlscy9kYXRlc1wiO1xuaW1wb3J0IHsgcHJvcE1ldGFkYXRhIH0gZnJvbSBcIi4uL3V0aWxzL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tIFwiLi9WYWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uIH0gZnJvbSBcIi4uL3V0aWxzL0RlY29yYXRpb25cIjtcbmltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBBU1lOQ19NRVRBX0tFWSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tYmluZWQgcHJvcGVydHkgZGVjb3JhdG9yIGZhY3RvcnkgZm9yIG1ldGFkYXRhIGFuZCBhdHRyaWJ1dGUgbWFya2luZ1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IGJvdGggbWFya3MgYSBwcm9wZXJ0eSBhcyBhIG1vZGVsIGF0dHJpYnV0ZSBhbmQgYXNzaWducyBtZXRhZGF0YSB0byBpdFxuICpcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1Byb3BlcnR5RGVjb3JhdG9yfSBkZWNvcmF0b3IgLSBUaGUgbWV0YWRhdGEga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIG1ldGFkYXRhIGtleVxuICogQHBhcmFtIHtWfSB2YWx1ZSAtIFRoZSBtZXRhZGF0YSB2YWx1ZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcHJvcGVydHlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSAtIENvbWJpbmVkIGRlY29yYXRvciBmdW5jdGlvblxuICogQGZ1bmN0aW9uIHZhbGlkYXRpb25NZXRhZGF0YVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRpb25NZXRhZGF0YTxWPihkZWNvcmF0b3I6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBWKSB7XG4gIFZhbGlkYXRpb24ucmVnaXN0ZXJEZWNvcmF0b3Ioa2V5LCBkZWNvcmF0b3IpO1xuICByZXR1cm4gYXBwbHkocHJvcE1ldGFkYXRhPFY+KGtleSwgdmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzeW5jKCkge1xuICByZXR1cm4gKG1vZGVsOiBvYmplY3QpOiB2b2lkID0+IHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbCwgQVNZTkNfTUVUQV9LRVkpKVxuICAgICAgKG1vZGVsIGFzIGFueSlbQVNZTkNfTUVUQV9LRVldID0gdHJ1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgbWFya3MgYSBmaWVsZCBhcyByZXF1aXJlZFxuICogQHN1bW1hcnkgTWFya3MgdGhlIHByb3BlcnR5IGFzIHJlcXVpcmVkLCBjYXVzaW5nIHZhbGlkYXRpb24gdG8gZmFpbCBpZiB0aGUgcHJvcGVydHkgaXMgdW5kZWZpbmVkLCBudWxsLCBvciBlbXB0eS5cbiAqIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNSRVFVSVJFRH0uXG4gKiBUaGlzIGRlY29yYXRvciBpcyBjb21tb25seSB1c2VkIGFzIHRoZSBmaXJzdCB2YWxpZGF0aW9uIHN0ZXAgZm9yIGltcG9ydGFudCBmaWVsZHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNSRVFVSVJFRH1cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqXG4gKiBAZnVuY3Rpb24gcmVxdWlyZWRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIge1xuICogICBAcmVxdWlyZWQoKVxuICogICB1c2VybmFtZTogc3RyaW5nO1xuICpcbiAqICAgQHJlcXVpcmVkKFwiRW1haWwgYWRkcmVzcyBpcyBtYW5kYXRvcnlcIilcbiAqICAgZW1haWw6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWQobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5SRVFVSVJFRCkge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRCk7XG4gIGNvbnN0IG1ldGE6IFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIGF0dHJpYnV0ZSBhcyByZXF1aXJlZGAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdG9yT3B0aW9ucz4sXG4gICAgICBhcmdzOiBbcmVxdWlyZWQsIGtleSwgbWV0YV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgZW5mb3JjZXMgYSBtaW5pbXVtIHZhbHVlIGNvbnN0cmFpbnRcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBtaW5pbXVtIHZhbHVlIGZvciB0aGUgcHJvcGVydHksIGNhdXNpbmcgdmFsaWRhdGlvbiB0byBmYWlsIGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCBtaW5pbXVtLlxuICogVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI01JTn0uXG4gKiBUaGlzIGRlY29yYXRvciB3b3JrcyB3aXRoIG51bWVyaWMgdmFsdWVzIGFuZCBkYXRlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlciB8IERhdGUgfCBzdHJpbmd9IHZhbHVlIC0gVGhlIG1pbmltdW0gdmFsdWUgYWxsb3dlZC4gRm9yIGRhdGVzLCBjYW4gYmUgYSBEYXRlIG9iamVjdCBvciBhIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTn1cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqXG4gKiBAZnVuY3Rpb24gbWluXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBQcm9kdWN0IHtcbiAqICAgQG1pbigwKVxuICogICBwcmljZTogbnVtYmVyO1xuICpcbiAqICAgQG1pbihuZXcgRGF0ZSgyMDIzLCAwLCAxKSwgXCJEYXRlIG11c3QgYmUgYWZ0ZXIgSmFudWFyeSAxLCAyMDIzXCIpXG4gKiAgIHJlbGVhc2VEYXRlOiBEYXRlO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaW4oXG4gIHZhbHVlOiBudW1iZXIgfCBEYXRlIHwgc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1JTlxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLk1JTik7XG4gIGNvbnN0IG1ldGE6IE1pblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLk1JTl06IHZhbHVlLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtOdW1iZXIubmFtZSwgRGF0ZS5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIG1heCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGFzICR7dmFsdWV9IChhcHBsaWVzIHRvIG51bWJlcnMgb3IgRGF0ZXMpYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YTxNaW5WYWxpZGF0b3JPcHRpb25zPixcbiAgICAgIGFyZ3M6IFttaW4sIGtleSwgbWV0YV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgbWF4aW11bSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI01BWH1cbiAqXG4gKiBAcGFyYW0ge251bWJlciB8IERhdGV9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNQVh9XG4gKlxuICogQGZ1bmN0aW9uIG1heFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heChcbiAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUFYXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUFYKTtcbiAgY29uc3QgbWV0YTogTWF4VmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuTUFYXTogdmFsdWUsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW051bWJlci5uYW1lLCBEYXRlLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgbWF4IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgYXMgJHt2YWx1ZX0gKGFwcGxpZXMgdG8gbnVtYmVycyBvciBEYXRlcylgLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPE1heFZhbGlkYXRvck9wdGlvbnM+LFxuICAgICAgYXJnczogW21heCwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBzdGVwIHZhbHVlIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjU1RFUH1cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1NURVB9XG4gKlxuICogQGZ1bmN0aW9uIHN0ZXBcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlNURVBcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5TVEVQKTtcbiAgY29uc3QgbWV0YTogU3RlcFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLlNURVBdOiB2YWx1ZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbTnVtYmVyLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgc3RlcCBvZiB0aGUgYXR0cmlidXRlIGFzICR7dmFsdWV9YCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YTxTdGVwVmFsaWRhdG9yT3B0aW9ucz4sXG4gICAgICBhcmdzOiBbc3RlcCwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBtaW5pbXVtIGxlbmd0aCBmb3IgdGhlIHByb3BlcnR5XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI01JTl9MRU5HVEh9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNSU5fTEVOR1RIfVxuICpcbiAqIEBmdW5jdGlvbiBtaW5sZW5ndGhcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaW5sZW5ndGgoXG4gIHZhbHVlOiBudW1iZXIsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUlOX0xFTkdUSFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEgpO1xuICBjb25zdCBtZXRhOiBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIXTogdmFsdWUsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW1N0cmluZy5uYW1lLCBBcnJheS5uYW1lLCBTZXQubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBtaW4gbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUgYXMgJHt2YWx1ZX0gKGFwcGxpZXMgdG8gc3RyaW5ncyBvciBsaXN0cylgLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnM+LFxuICAgICAgYXJnczogW21pbmxlbmd0aCwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBtYXhpbXVtIGxlbmd0aCBmb3IgdGhlIHByb3BlcnR5XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI01BWF9MRU5HVEh9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNQVhfTEVOR1RIfVxuICpcbiAqIEBmdW5jdGlvbiBtYXhsZW5ndGhcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXhsZW5ndGgoXG4gIHZhbHVlOiBudW1iZXIsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUFYX0xFTkdUSFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgpO1xuICBjb25zdCBtZXRhOiBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXTogdmFsdWUsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW1N0cmluZy5uYW1lLCBBcnJheS5uYW1lLCBTZXQubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBtYXggbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUgYXMgJHt2YWx1ZX0gKGFwcGxpZXMgdG8gc3RyaW5ncyBvciBsaXN0cylgLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnM+LFxuICAgICAgYXJnczogW21heGxlbmd0aCwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBSZWdFeHAgcGF0dGVybiB0aGUgcHJvcGVydHkgbXVzdCByZXNwZWN0XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1BBVFRFUk59XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNQQVRURVJOfVxuICpcbiAqIEBmdW5jdGlvbiBwYXR0ZXJuXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0dGVybihcbiAgdmFsdWU6IFJlZ0V4cCB8IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVRURVJOXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuUEFUVEVSTik7XG4gIGNvbnN0IG1ldGE6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXTpcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgYXNzaWducyB0aGUgJHt2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKX0gcGF0dGVybiB0byB0aGUgYXR0cmlidXRlYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YTxQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucz4sXG4gICAgICBhcmdzOiBbcGF0dGVybiwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHByb3BlcnR5IGFzIGFuIGVtYWlsXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI0VNQUlMfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0VNQUlMfVxuICpcbiAqIEBmdW5jdGlvbiBlbWFpbFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtYWlsKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRU1BSUwpIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuRU1BSUwpO1xuICBjb25zdCBtZXRhOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuUEFUVEVSTl06IERFRkFVTFRfUEFUVEVSTlMuRU1BSUwudG9TdHJpbmcoKSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBcIm1hcmtzIHRoZSBhdHRyaWJ1dGUgYXMgYW4gZW1haWxcIixcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YTxQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucz4sXG4gICAgICBhcmdzOiBbZW1haWwsIGtleSwgbWV0YV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBwcm9wZXJ0eSBhcyBhbiBVUkxcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjVVJMfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1VSTH1cbiAqXG4gKiBAZnVuY3Rpb24gdXJsXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVVJMKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlVSTCk7XG4gIGNvbnN0IG1ldGE6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXTogREVGQVVMVF9QQVRURVJOUy5VUkwudG9TdHJpbmcoKSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBcIm1hcmtzIHRoZSBhdHRyaWJ1dGUgYXMgYW4gdXJsXCIsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGE8UGF0dGVyblZhbGlkYXRvck9wdGlvbnM+LFxuICAgICAgYXJnczogW3VybCwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVNZXRhZGF0YSBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMge1xuICBjdXN0b21UeXBlczogKHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpKVtdIHwgc3RyaW5nIHwgKCgpID0+IHN0cmluZyk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRW5mb3JjZXMgdHlwZSB2ZXJpZmljYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjVFlQRX1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgc3RyaW5nfSB0eXBlcyBhY2NlcHRlZCB0eXBlc1xuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVFlQRX1cbiAqXG4gKiBAZnVuY3Rpb24gdHlwZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGUoXG4gIHR5cGVzOiAoc3RyaW5nIHwgKCgpID0+IHN0cmluZykpW10gfCBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuVFlQRSk7XG4gIGNvbnN0IG1ldGE6IFR5cGVNZXRhZGF0YSA9IHtcbiAgICBjdXN0b21UeXBlczogdHlwZXMsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBkZXNjcmlwdGlvbjogXCJkZWZpbmVzIHRoZSBhY2NlcHRlZCB0eXBlcyBmb3IgdGhlIGF0dHJpYnV0ZVwiLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPFR5cGVNZXRhZGF0YT4sXG4gICAgICBhcmdzOiBbdHlwZSwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVNZXRhZGF0YSBleHRlbmRzIERhdGVWYWxpZGF0b3JPcHRpb25zIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERhdGUgSGFuZGxlciBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjREFURX1cbiAqXG4gKiBXaWxsIGVuZm9yY2Ugc2VyaWFsaXphdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGZvcm1hdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgYWNjZXB0ZWQgZm9ybWF0IGFjY29yZGluZyB0byB7QGxpbmsgZm9ybWF0RGF0ZX1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0RBVEV9XG4gKlxuICogQGZ1bmN0aW9uIGRhdGVcbiAqXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0ZShcbiAgZm9ybWF0OiBzdHJpbmcgPSBcImRkL01NL3l5eXlcIixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5EQVRFXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuREFURSk7XG4gIGZ1bmN0aW9uIGRhdGVEZWMoZm9ybWF0OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZykge1xuICAgIGNvbnN0IG1ldGE6IERhdGVNZXRhZGF0YSA9IHtcbiAgICAgIFtWYWxpZGF0aW9uS2V5cy5GT1JNQVRdOiBmb3JtYXQsXG4gICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgdHlwZXM6IFtEYXRlLm5hbWVdLFxuICAgICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBhdHRyaWJ1dGUgYXMgYSBkYXRlIHdpdGggdGhlIGZvcm1hdCAke2Zvcm1hdH1gLFxuICAgICAgYXN5bmM6IGZhbHNlLFxuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGRhdGVEZWMoXG4gICAgICB0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICBwcm9wZXJ0eUtleT86IGFueVxuICAgICk6IGFueSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgc2V0KHRoaXM6IGFueSwgbmV3VmFsdWU6IHN0cmluZyB8IERhdGUpIHtcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKVxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5S2V5LCB7XG4gICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIGdldDogKCkgPT4gdmFsdWVzLmdldCh0aGlzKSxcbiAgICAgICAgICAgICAgc2V0OiAobmV3VmFsdWU6IHN0cmluZyB8IERhdGUgfCBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsOiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICB2YWwgPSBwYXJzZURhdGUoZm9ybWF0LCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICB2YWx1ZXMuc2V0KHRoaXMsIHZhbCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBzZihcIkZhaWxlZCB0byBwYXJzZSBkYXRlOiB7MH1cIiwgZS5tZXNzYWdlIHx8IGUpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXNbcHJvcGVydHlLZXldID0gbmV3VmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVzLmdldCh0aGlzKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YShkYXRlLCBrZXksIG1ldGEpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogZGF0ZURlYyxcbiAgICAgIGFyZ3M6IFtmb3JtYXQsIG1lc3NhZ2VdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUGFzc3dvcmQgSGFuZGxlciBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjUEFTU1dPUkR9XG4gKlxuICogQHBhcmFtIHtSZWdFeHB9IFtwYXR0ZXJuXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9QQVRURVJOUyNDSEFSOF9PTkVfT0ZfRUFDSH1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1BBU1NXT1JEfVxuICpcbiAqIEBmdW5jdGlvbiBwYXNzd29yZFxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXNzd29yZChcbiAgcGF0dGVybjogUmVnRXhwID0gREVGQVVMVF9QQVRURVJOUy5QQVNTV09SRC5DSEFSOF9PTkVfT0ZfRUFDSCxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVNTV09SRFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlBBU1NXT1JEKTtcbiAgY29uc3QgbWV0YTogUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOiBwYXR0ZXJuLnRvU3RyaW5nKCksXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGF0dHJpYnV0ZSBhcyBhIHBhc3N3b3JkYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YSxcbiAgICAgIGFyZ3M6IFtwYXNzd29yZCwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RNZXRhZGF0YSBleHRlbmRzIExpc3RWYWxpZGF0b3JPcHRpb25zIHtcbiAgdHlwZTogXCJBcnJheVwiIHwgXCJTZXRcIjtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBMaXN0IERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIEFsc28gc2V0cyB0aGUge0BsaW5rIHR5cGV9IHRvIHRoZSBwcm92aWRlZCBjb2xsZWN0aW9uXG4gKlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yfSBjbGF6elxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2xsZWN0aW9uXSBUaGUgY29sbGVjdGlvbiBiZWluZyB1c2VkLiBkZWZhdWx0cyB0byBBcnJheVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNMSVNUfVxuICpcbiAqIEBmdW5jdGlvbiBsaXN0XG4gKlxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3QoXG4gIGNsYXp6OlxuICAgIHwgQ29uc3RydWN0b3I8YW55PlxuICAgIHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pXG4gICAgfCAoQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSlbXSxcbiAgY29sbGVjdGlvbjogXCJBcnJheVwiIHwgXCJTZXRcIiA9IFwiQXJyYXlcIixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MSVNUXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTElTVCk7XG4gIGNvbnN0IG1ldGE6IExpc3RNZXRhZGF0YSA9IHtcbiAgICBjbGF6ejogKEFycmF5LmlzQXJyYXkoY2xhenopXG4gICAgICA/IGNsYXp6Lm1hcCgoYykgPT4gKGMubmFtZSA/IGMubmFtZSA6IGMpKVxuICAgICAgOiBbY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiBjbGF6el0pIGFzIChcbiAgICAgIHwgc3RyaW5nXG4gICAgICB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KVxuICAgIClbXSxcbiAgICB0eXBlOiBjb2xsZWN0aW9uLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgYXN5bmM6IGZhbHNlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgYXR0cmlidXRlIGFzIGEgJHtjb2xsZWN0aW9ufSBvZiAkeyhjbGF6eiBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT4pLm5hbWV9YCxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhLFxuICAgICAgYXJnczogW2xpc3QsIGtleSwgbWV0YV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBTZXQgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gV3JhcHBlciBmb3Ige0BsaW5rIGxpc3R9IHdpdGggdGhlICdTZXQnIENvbGxlY3Rpb25cbiAqXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3J9IGNsYXp6XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0xJU1R9XG4gKlxuICogQGZ1bmN0aW9uIHNldFxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQoXG4gIGNsYXp6OiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTElTVFxuKSB7XG4gIHJldHVybiBsaXN0KGNsYXp6LCBcIlNldFwiLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCB0byBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuRVFVQUxTfSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoZSBkZWNvcmF0ZWQgdmFsdWUgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGVxdWFsaXR5IGFnYWluc3QuXG4gKiBAcGFyYW0ge0NvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIHZhbGlkYXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbF0gLSBUaGUgbGFiZWwgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubWVzc2FnZT1ERUZBVUxUX0VSUk9SX01FU1NBR0VTLkVRVUFMU10gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBiZSByZXR1cm5lZCBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgZXF1YWxpdHkgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZXFcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcShcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnMsIFwiYXN5bmNcIiB8IFwiZGVzY3JpcHRpb25cIj5cbiAgLy8gbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5FUVVBTFNcbikge1xuICBjb25zdCBlcXVhbHNPcHRpb25zOiBFcXVhbHNWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIGxhYmVsOiBvcHRpb25zPy5sYWJlbCB8fCBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBtZXNzYWdlOiBvcHRpb25zPy5tZXNzYWdlIHx8IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRVFVQUxTLFxuICAgIFtWYWxpZGF0aW9uS2V5cy5FUVVBTFNdOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgYXR0cmlidXRlIGFzIGVxdWFsIHRvICR7cHJvcGVydHlUb0NvbXBhcmV9YCxcbiAgfTtcblxuICByZXR1cm4gdmFsaWRhdGlvbk1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgZXEsXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuRVFVQUxTKSxcbiAgICB7IC4uLmVxdWFsc09wdGlvbnMsIGFzeW5jOiBmYWxzZSB9IGFzIFZhbGlkYXRpb25NZXRhZGF0YVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlY2xhcmVzIHRoYXQgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIGFub3RoZXIgc3BlY2lmaWVkIHByb3BlcnR5LlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5cy5ESUZGfSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoZSBkZWNvcmF0ZWQgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlUb0NvbXBhcmUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29tcGFyZSBkaWZmZXJlbmNlIGFnYWluc3QuXG4gKiBAcGFyYW0ge0NvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIHZhbGlkYXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbF0gLSBUaGUgbGFiZWwgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubWVzc2FnZT1ERUZBVUxUX0VSUk9SX01FU1NBR0VTLkRJRkZdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gYmUgcmV0dXJuZWQgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGRpZmZlcmVuY2UgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZGlmZlxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmYoXG4gIHByb3BlcnR5VG9Db21wYXJlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBPbWl0PENvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zLCBcImFzeW5jXCIgfCBcImRlc2NyaXB0aW9uXCI+XG4pIHtcbiAgY29uc3QgZGlmZk9wdGlvbnM6IERpZmZWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIGxhYmVsOiBvcHRpb25zPy5sYWJlbCB8fCBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBtZXNzYWdlOiBvcHRpb25zPy5tZXNzYWdlIHx8IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRElGRixcbiAgICBbVmFsaWRhdGlvbktleXMuRElGRl06IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyBhdHRyaWJ1dGUgYXMgZGlmZmVyZW50IHRvICR7cHJvcGVydHlUb0NvbXBhcmV9YCxcbiAgfTtcblxuICByZXR1cm4gdmFsaWRhdGlvbk1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgZGlmZixcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5ESUZGKSxcbiAgICB7XG4gICAgICAuLi5kaWZmT3B0aW9ucyxcbiAgICAgIGFzeW5jOiBmYWxzZSxcbiAgICB9IGFzIFZhbGlkYXRpb25NZXRhZGF0YVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlY2xhcmVzIHRoYXQgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IGJlIGxlc3MgdGhhbiBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuTEVTU19USEFOfSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoZSBkZWNvcmF0ZWQgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5VG9Db21wYXJlIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqIEBwYXJhbSB7Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgdmFsaWRhdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhYmVsXSAtIFRoZSBsYWJlbCB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5tZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuTEVTU19USEFOXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGJlIHJldHVybmVkIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBsZXNzIHRoYW4gdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gbHRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsdChcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnMsIFwiYXN5bmNcIiB8IFwiZGVzY3JpcHRpb25cIj5cbikge1xuICBjb25zdCBsdE9wdGlvbnM6IExlc3NUaGFuVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBsYWJlbDogb3B0aW9ucz8ubGFiZWwgfHwgcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgbWVzc2FnZTogb3B0aW9ucz8ubWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTixcbiAgICBbVmFsaWRhdGlvbktleXMuTEVTU19USEFOXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBsZXNzIHRoYW4gdG8gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBsdCxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU4pLFxuICAgIHsgLi4ubHRPcHRpb25zLCBhc3luYzogZmFsc2UgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTH0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGVxdWFsIG9yIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge0NvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIHZhbGlkYXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbF0gLSBUaGUgbGFiZWwgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubWVzc2FnZT1ERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTl9PUl9FUVVBTF0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBiZSByZXR1cm5lZCBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgbGVzcyB0aGFuIG9yIGVxdWFsIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gKlxuICogQGZ1bmN0aW9uIGx0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGx0ZShcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnMsIFwiYXN5bmNcIiB8IFwiZGVzY3JpcHRpb25cIj5cbikge1xuICBjb25zdCBsdGVPcHRpb25zOiBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIGxhYmVsOiBvcHRpb25zPy5sYWJlbCB8fCBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBtZXNzYWdlOiBvcHRpb25zPy5tZXNzYWdlIHx8IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTEVTU19USEFOX09SX0VRVUFMLFxuICAgIFtWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUxdOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgYXR0cmlidXRlIGFzIGxlc3Mgb3IgZXF1YWwgdG8gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBsdGUsXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMKSxcbiAgICB7IC4uLmx0ZU9wdGlvbnMsIGFzeW5jOiBmYWxzZSB9IGFzIFZhbGlkYXRpb25NZXRhZGF0YVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlY2xhcmVzIHRoYXQgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOfSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoZSBkZWNvcmF0ZWQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5VG9Db21wYXJlIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqIEBwYXJhbSB7Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgdmFsaWRhdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhYmVsXSAtIFRoZSBsYWJlbCB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5tZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuR1JFQVRFUl9USEFOXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGJlIHJldHVybmVkIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBncmVhdGVyIHRoYW4gdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZ3RcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBndChcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnMsIFwiYXN5bmNcIiB8IFwiZGVzY3JpcHRpb25cIj5cbikge1xuICBjb25zdCBndE9wdGlvbnM6IEdyZWF0ZXJUaGFuVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBsYWJlbDogb3B0aW9ucz8ubGFiZWwgfHwgcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgbWVzc2FnZTogb3B0aW9ucz8ubWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkdSRUFURVJfVEhBTixcbiAgICBbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBncmVhdGVyIHRoYW4gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBndCxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU4pLFxuICAgIHsgLi4uZ3RPcHRpb25zLCBhc3luYzogZmFsc2UgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTH0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge0NvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIHZhbGlkYXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbF0gLSBUaGUgbGFiZWwgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubWVzc2FnZT1ERUZBVUxUX0VSUk9SX01FU1NBR0VTLkdSRUFURVJfVEhBTl9PUl9FUVVBTF0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBiZSByZXR1cm5lZCBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gKlxuICogQGZ1bmN0aW9uIGd0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGd0ZShcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnMsIFwiYXN5bmNcIiB8IFwiZGVzY3JpcHRpb25cIj5cbikge1xuICBjb25zdCBndGVPcHRpb25zOiBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIGxhYmVsOiBvcHRpb25zPy5sYWJlbCB8fCBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBtZXNzYWdlOiBvcHRpb25zPy5tZXNzYWdlIHx8IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuR1JFQVRFUl9USEFOX09SX0VRVUFMLFxuICAgIFtWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxdOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgYXR0cmlidXRlIGFzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBndGUsXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMKSxcbiAgICB7IC4uLmd0ZU9wdGlvbnMsIGFzeW5jOiBmYWxzZSB9IGFzIFZhbGlkYXRpb25NZXRhZGF0YVxuICApO1xufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi9Nb2RlbFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIGluc3RhbmNlIGJ5IGludm9raW5nIGEgY29uc3RydWN0b3Igd2l0aCBkeW5hbWljIGFyZ3VtZW50cy5cbiAqIEBzdW1tYXJ5IE92ZXJyaWRlcyBzdGFuZGFyZCBjb25zdHJ1Y3Rpb24gcGF0dGVybnMgYnkgd3JhcHBpbmcgdGhlIGdpdmVuIGNvbnN0cnVjdG9yIHRvIGFsbG93IHNwcmVhZCBhcmd1bWVudCBpbnZvY2F0aW9uIHdoaWxlIHByZXNlcnZpbmcgdGhlIHByb3RvdHlwZSBjaGFpbi5cbiAqIEB0ZW1wbGF0ZSBNIHRoZSBtb2RlbCBpbnN0YW5jZSB0eXBlXG4gKiBAcGFyYW0ge2FueX0gY29uc3RydWN0b3IgVGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICogQHJldHVybiB7TX0gVGhlIG5ld2x5IGNvbnN0cnVjdGVkIGluc3RhbmNlLlxuICogQGZ1bmN0aW9uIGNvbnN0cnVjdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNvbnN0cnVjdG9yOiBhbnksXG4gIC4uLmFyZ3M6IGFueVtdXG4pOiBNIHtcbiAgY29uc3QgX2NvbnN0ciA9ICguLi5hcmd6OiBhbnlbXSkgPT4gbmV3IGNvbnN0cnVjdG9yKC4uLmFyZ3opO1xuICBfY29uc3RyLnByb3RvdHlwZSA9IGNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgcmV0dXJuIF9jb25zdHIoLi4uYXJncyk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlY3Vyc2l2ZWx5IGZpbmRzIHRoZSBsYXN0IHByb3RvdHlwZSBpbiB0aGUgY2hhaW4gYmVmb3JlIHJlYWNoaW5nIE9iamVjdC5wcm90b3R5cGUuXG4gKiBAc3VtbWFyeSBXYWxrcyB1cCB0aGUgcHJvdG90eXBlIGNoYWluIHRvIGxvY2F0ZSB0aGUgbW9zdCBkZXJpdmVkIHByb3RvdHlwZSB0aGF0IHN0aWxsIHByZWNlZGVzIHRoZSBiYXNlIE9iamVjdCBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqIFRoZSBvYmplY3Qgd2hvc2UgcHJvdG90eXBlIGNoYWluIHdpbGwgYmUgaW5zcGVjdGVkLlxuICogQHJldHVybiB7b2JqZWN0fSBUaGUgbGFzdCBwcm90b3R5cGUgYmVmb3JlIE9iamVjdC5wcm90b3R5cGUsIG9yIHRoZSBpbnB1dCBvYmplY3QgaWYgaXRzIHByb3RvdHlwZSBpcyBPYmplY3QucHJvdG90eXBlLlxuICogQGZ1bmN0aW9uIGZpbmRMYXN0UHJvdG9CZWZvcmVPYmplY3RcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0UHJvdG9CZWZvcmVPYmplY3Qob2JqOiBvYmplY3QpOiBvYmplY3Qge1xuICBsZXQgcHJvdG90eXBlOiBhbnkgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgaWYgKHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIG9iajtcbiAgd2hpbGUgKHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgIGlmIChwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBwcm90b3R5cGU7XG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBPYmplY3QucHJvdG90eXBlKSByZXR1cm4gcHJvdG90eXBlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHByb3BlciBwcm90b3R5cGVcIik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJpbmRzIHRoZSBNb2RlbCBjbGFzcyBhcyB0aGUgcm9vdCBwcm90b3R5cGUgb2YgdGhlIHByb3ZpZGVkIGluc3RhbmNlIHdoZW4gbm90IGFscmVhZHkgYSBNb2RlbC5cbiAqIEBzdW1tYXJ5IEVuc3VyZXMgb2JqZWN0cyBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIE1vZGVsIGluaGVyaXRhbmNlIGNoYWluIGdhaW4gTW9kZWwgYXMgdGhlaXIgdWx0aW1hdGUgcHJvdG90eXBlIHRvIGFjY2VzcyBtb2RlbCB1dGlsaXRpZXMuXG4gKiBAcGFyYW0ge3Vua25vd259IG9iaiBUaGUgb2JqZWN0IHRvIGJpbmQgdG8gdGhlIE1vZGVsIHByb3RvdHlwZSBjaGFpbi5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAZnVuY3Rpb24gYmluZE1vZGVsUHJvdG90eXBlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBGbiBhcyBiaW5kTW9kZWxQcm90b3R5cGVcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbC5wcm90b3R5cGVcbiAqICAgQ2FsbGVyLT4+Rm46IG9ialxuICogICBhbHQgb2JqIGluc3RhbmNlb2YgTW9kZWxcbiAqICAgICBGbi0tPj5DYWxsZXI6IHJldHVyblxuICogICBlbHNlIG9iaiBjaGFpbiBlbmRzIGF0IE9iamVjdC5wcm90b3R5cGVcbiAqICAgICBGbi0+PkZuOiBzZXRQcm90b3R5cGVPZihvYmosIE0pXG4gKiAgICAgRm4tLT4+Q2FsbGVyOiByZXR1cm5cbiAqICAgZWxzZSBkZWVwIHByb3RvdHlwZSBjaGFpblxuICogICAgIEZuLT4+Rm46IHdhbGsgcHJvdG90eXBlc1xuICogICAgIEZuLT4+Rm46IHNldFByb3RvdHlwZU9mKGxhc3QsIE0pXG4gKiAgICAgRm4tLT4+Q2FsbGVyOiByZXR1cm5cbiAqICAgZW5kXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kTW9kZWxQcm90b3R5cGUob2JqOiB1bmtub3duKSB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBNb2RlbCkgcmV0dXJuO1xuXG4gIGZ1bmN0aW9uIGJpbmRQcm90b3R5cGUob2JqVG9PdmVycmlkZTogdW5rbm93biwgcHJvdG90eXBlOiBvYmplY3QpIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2Yob2JqVG9PdmVycmlkZSwgcHJvdG90eXBlKTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvdHlwZTogYW55ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gIGlmIChwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gYmluZFByb3RvdHlwZShvYmosIE1vZGVsLnByb3RvdHlwZSk7XG4gIH1cbiAgd2hpbGUgKHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIGNvbnN0IHByb3QgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICBpZiAoXG4gICAgICBwcm90ID09PSBPYmplY3QucHJvdG90eXBlIHx8XG4gICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdCkgPT09IE9iamVjdC5wcm90b3R5cGVcbiAgICApIHtcbiAgICAgIHJldHVybiBiaW5kUHJvdG90eXBlKHByb3RvdHlwZSwgTW9kZWwucHJvdG90eXBlKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgcHJvcGVyIHByb3RvdHlwZSB0byBiaW5kXCIpO1xufVxuIiwiaW1wb3J0IHsgYmluZE1vZGVsUHJvdG90eXBlLCBjb25zdHJ1Y3QgfSBmcm9tIFwiLi9jb25zdHJ1Y3Rpb25cIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcbmltcG9ydCB7IG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uS2V5cywgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsQmFzZURlY29yYXRvcihvcmlnaW5hbDogYW55KSB7XG4gIC8vIHRoZSBuZXcgY29uc3RydWN0b3IgYmVoYXZpb3VyXG4gIGNvbnN0IG5ld0NvbnN0cnVjdG9yOiBhbnkgPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBpbnN0YW5jZTogUmV0dXJuVHlwZTx0eXBlb2Ygb3JpZ2luYWw+ID0gY29uc3RydWN0KG9yaWdpbmFsLCAuLi5hcmdzKTtcbiAgICBiaW5kTW9kZWxQcm90b3R5cGUoaW5zdGFuY2UpO1xuXG4gICAgLy8gcnVuIGEgYnVpbGRlciBmdW5jdGlvbiBpZiBkZWZpbmVkIHdpdGggdGhlIGZpcnN0IGFyZ3VtZW50IChUaGUgTW9kZWxBcmcpXG4gICAgY29uc3QgYnVpbGRlciA9IE1vZGVsLmdldEJ1aWxkZXIoKTtcbiAgICBpZiAoYnVpbGRlcikgYnVpbGRlcihpbnN0YW5jZSwgYXJncy5sZW5ndGggPyBhcmdzWzBdIDogdW5kZWZpbmVkKTtcblxuICAgIG1ldGFkYXRhKE1vZGVsLmtleShNb2RlbEtleXMuTU9ERUwpLCBvcmlnaW5hbC5uYW1lKShpbnN0YW5jZS5jb25zdHJ1Y3Rvcik7XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG5cbiAgLy8gY29weSBwcm90b3R5cGUgc28gaW5zdGFuY2VvZiBvcGVyYXRvciBzdGlsbCB3b3Jrc1xuICBuZXdDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBvcmlnaW5hbC5wcm90b3R5cGU7XG5cbiAgbWV0YWRhdGEoTW9kZWwua2V5KE1vZGVsS2V5cy5NT0RFTCksIG9yaWdpbmFsLm5hbWUpKG9yaWdpbmFsKTtcblxuICBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhvcmlnaW5hbCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGtleSxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoa2V5LCBvcmlnaW5hbCksXG4gICAgICBuZXdDb25zdHJ1Y3RvclxuICAgICk7XG4gIH0pO1xuICAvLyBTZXRzIHRoZSBwcm9wZXIgY29uc3RydWN0b3IgbmFtZSBmb3IgdHlwZSB2ZXJpZmljYXRpb25cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld0NvbnN0cnVjdG9yLCBcIm5hbWVcIiwge1xuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IG9yaWdpbmFsLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICB9KTtcbiAgLy9cbiAgLy8gYW5jaG9ycyB0aGUgb3JpZ2luYWwgY29uc3RydWN0b3IgZm9yIGZ1dHVyZSByZWZlcmVuY2VcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld0NvbnN0cnVjdG9yLCBNb2RlbEtleXMuQU5DSE9SLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IG9yaWdpbmFsLFxuICB9KTtcblxuICBNZXRhZGF0YS5zZXQobmV3Q29uc3RydWN0b3IsIERlY29yYXRpb25LZXlzLkNPTlNUUlVDVE9SLCBvcmlnaW5hbCk7XG4gIC8vXG4gIC8vIC8vIGFuY2hvcnMgdGhlIG5ldyBjb25zdHJ1Y3RvciBmb3IgZnV0dXJlIHJlZmVyZW5jZVxuICAvLyBPYmplY3QuZGVmaW5lUHJvcGVydHkob3JpZ2luYWwsIE1vZGVsS2V5cy5BTkNIT1IsIHtcbiAgLy8gICB3cml0YWJsZTogZmFsc2UsXG4gIC8vICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgLy8gICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAvLyAgIHZhbHVlOiBuZXdDb25zdHJ1Y3RvcixcbiAgLy8gfSk7XG5cbiAgTW9kZWwucmVnaXN0ZXIobmV3Q29uc3RydWN0b3IsIG9yaWdpbmFsLm5hbWUpO1xuXG4gIC8vIHJldHVybiBuZXcgY29uc3RydWN0b3IgKHdpbGwgb3ZlcnJpZGUgb3JpZ2luYWwpXG4gIHJldHVybiBuZXdDb25zdHJ1Y3Rvcjtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYSBNb2RlbCBjbGFzc1xuICogQGRlc2NyaXB0aW9uXG4gKlxuICogLSBSZWdpc3RlcnMgdGhlIGNsYXNzIHVuZGVyIHRoZSBtb2RlbCByZWdpc3RyeSBzbyBpdCBjYW4gYmUgZWFzaWx5IHJlYnVpbHQ7XG4gKiAtIE92ZXJyaWRlcyB0aGUgY2xhc3MgY29uc3RydWN0b3I7XG4gKiAtIFJ1bnMgdGhlIGdsb2JhbCB7QGxpbmsgTW9kZWxCdWlsZGVyRnVuY3Rpb259IGlmIGRlZmluZWQ7XG4gKlxuICogQGZ1bmN0aW9uIG1vZGVsXG4gKlxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsKCkge1xuICBjb25zdCBrZXkgPSBNb2RlbC5rZXkoTW9kZWxLZXlzLk1PREVMKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSkuZGVmaW5lKG1vZGVsQmFzZURlY29yYXRvcikuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBoYXNoaW5nIGFsZ29yaXRobSB0byB1c2Ugb24gdGhlIG1vZGVsXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiAtIFJlZ2lzdGVycyB0aGUgY2xhc3MgdW5kZXIgdGhlIG1vZGVsIHJlZ2lzdHJ5IHNvIGl0IGNhbiBiZSBlYXNpbHkgcmVidWlsdDtcbiAqIC0gT3ZlcnJpZGVzIHRoZSBjbGFzcyBjb25zdHJ1Y3RvcjtcbiAqIC0gUnVucyB0aGUgZ2xvYmFsIHtAbGluayBNb2RlbEJ1aWxkZXJGdW5jdGlvbn0gaWYgZGVmaW5lZDtcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWxnb3JpdGhtIHRoZSBhbGdvcml0aG0gdG8gdXNlXG4gKlxuICogQGZ1bmN0aW9uIGhhc2hlZEJ5XG4gKlxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hlZEJ5KGFsZ29yaXRobTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICByZXR1cm4gbWV0YWRhdGEoTW9kZWwua2V5KE1vZGVsS2V5cy5IQVNISU5HKSwge1xuICAgIGFsZ29yaXRobTogYWxnb3JpdGhtLFxuICAgIGFyZ3M6IGFyZ3MsXG4gIH0pO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHNlcmlhbGl6YXRpb24gYWxnb3JpdGhtIHRvIHVzZSBvbiB0aGUgbW9kZWxcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VyaWFsaXplciB0aGUgYWxnb3JpdGhtIHRvIHVzZVxuICpcbiAqIEBmdW5jdGlvbiBzZXJpYWxpemVkQnlcbiAqXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplZEJ5KHNlcmlhbGl6ZXI6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgcmV0dXJuIG1ldGFkYXRhKE1vZGVsLmtleShNb2RlbEtleXMuU0VSSUFMSVpBVElPTiksIHtcbiAgICBzZXJpYWxpemVyOiBzZXJpYWxpemVyLFxuICAgIGFyZ3M6IGFyZ3MsXG4gIH0pO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEFwcGxpZXMgZGVzY3JpcHRpdmUgbWV0YWRhdGEgdG8gYSBjbGFzcywgcHJvcGVydHkgb3IgbWV0aG9kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIHRoZSBkZXNjcmlwdGlvbiB0byBhcHBseVxuICpcbiAqIEBmdW5jdGlvbiBkZXNjcmlwdGlvblxuICpcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKSB7XG4gIHJldHVybiBtZXRhZGF0YShNb2RlbC5rZXkoTW9kZWxLZXlzLkRFU0NSSVBUSU9OKSwgZGVzY3JpcHRpb24pO1xufVxuIiwiLyoqXG4gKiBAbW9kdWxlIGRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAZGVzY3JpcHRpb24gVHlwZVNjcmlwdCBkZWNvcmF0b3ItYmFzZWQgdmFsaWRhdGlvbiBsaWJyYXJ5XG4gKiBAc3VtbWFyeSBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgdXNpbmcgVHlwZVNjcmlwdCBkZWNvcmF0b3JzLlxuICogSXQgZXhwb3NlcyB1dGlsaXR5IGZ1bmN0aW9ucywgdmFsaWRhdGlvbiBkZWNvcmF0b3JzLCBhbmQgbW9kZWwtcmVsYXRlZCBmdW5jdGlvbmFsaXR5IGZvclxuICogaW1wbGVtZW50aW5nIHR5cGUtc2FmZSwgZGVjbGFyYXRpdmUgdmFsaWRhdGlvbiBpbiBUeXBlU2NyaXB0IGFwcGxpY2F0aW9ucy5cbiAqL1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZhbGlkYXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZGVsXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcmVmbGVjdGlvbiBwYWNrYWdlXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJNb2RlbEtleXMiLCJhcHBseSIsIm1ldGFkYXRhIiwiUmVmbGVjdGlvbiIsIlByaW1pdGl2ZXMiLCJSZXNlcnZlZE1vZGVscyIsImlzRXF1YWwiLCJEYXRlVmFsaWRhdG9yIiwiX19kZWNvcmF0ZSIsIkRpZmZWYWxpZGF0b3IiLCJQYXR0ZXJuVmFsaWRhdG9yIiwiRW1haWxWYWxpZGF0b3IiLCJFcXVhbHNWYWxpZGF0b3IiLCJHcmVhdGVyVGhhblZhbGlkYXRvciIsIkdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvciIsIkxlc3NUaGFuVmFsaWRhdG9yIiwiTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yIiwiTGlzdFZhbGlkYXRvciIsIk1heExlbmd0aFZhbGlkYXRvciIsIk1heFZhbGlkYXRvciIsIk1pbkxlbmd0aFZhbGlkYXRvciIsIk1pblZhbGlkYXRvciIsIlBhc3N3b3JkVmFsaWRhdG9yIiwiUmVxdWlyZWRWYWxpZGF0b3IiLCJTdGVwVmFsaWRhdG9yIiwiVHlwZVZhbGlkYXRvciIsIlVSTFZhbGlkYXRvciIsIk1ldGFkYXRhIiwiRGVjb3JhdGlvbktleXMiLCJEZWNvcmF0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBYSxVQUFBLHlCQUF5QixHQUFHO0lBQ3ZDLElBQUEsWUFBWSxFQUNWLHNFQUFzRTtJQUN4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
|