@decaf-ts/decorator-validation 1.7.18 → 1.7.19

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.
@@ -4973,7 +4973,7 @@
4973
4973
  * @const VERSION
4974
4974
  * @memberOf module:decorator-validation
4975
4975
  */
4976
- const VERSION = "1.7.18";
4976
+ const VERSION = "1.7.19";
4977
4977
 
4978
4978
  exports.ASYNC_META_KEY = ASYNC_META_KEY;
4979
4979
  exports.AsyncValidator = AsyncValidator;
@@ -4972,7 +4972,7 @@ function description(description) {
4972
4972
  * @const VERSION
4973
4973
  * @memberOf module:decorator-validation
4974
4974
  */
4975
- const VERSION = "1.7.18";
4975
+ const VERSION = "1.7.19";
4976
4976
 
4977
4977
  export { ASYNC_META_KEY, AsyncValidator, COMPARISON_ERROR_MESSAGES, ComparisonValidationKeys, DAYS_OF_WEEK_NAMES, DEFAULT_ERROR_MESSAGES, DEFAULT_PATTERNS, DateValidator, Decoration, DefaultFlavour, DefaultHashingMethod, DefaultSerializationMethod, DiffValidator, EmailValidator, EqualsValidator, GreaterThanOrEqualValidator, GreaterThanValidator, Hashing, JSONSerializer, LessThanOrEqualValidator, LessThanValidator, ListValidator, MONTH_NAMES, MaxLengthValidator, MaxValidator, MinLengthValidator, MinValidator, Model, ModelErrorDefinition, ModelKeys, ModelRegistryManager, PasswordValidator, PathProxyEngine, PatternValidator, Primitives, RequiredValidator, ReservedModels, Serialization, StepValidator, TypeValidator, URLValidator, VALIDATION_PARENT_KEY, VERSION, Validation, ValidationKeys, Validator, ValidatorRegistry, async, bindDateToString, bindModelPrototype, bulkModelRegister, construct, date, dateFromFormat, description, diff, email, eq, findLastProtoBeforeObject, formatDate, getMetadata, getModelKey, getValidatableProperties, getValidationDecorators, gt, gte, hashCode, hashObj, hashedBy, isGreaterThan, isLessThan, isValidDate, isValidForGteOrLteComparison, jsTypes, list, lt, lte, max, maxlength, min, minlength, model, modelBaseDecorator, parseDate, password, pattern, prop, propMetadata, regexpParser, required, serializedBy, set, sf, step, stringFormat, toConditionalPromise, twoDigitPad, type, url, validate, validateChildValue, validateDecorator, validateDecorators, validationMetadata, validator };
4978
4978
  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLXZhbGlkYXRpb24uZXNtLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy9lcnJvcnMudHMiLCIuLi9zcmMvY29uc3RhbnRzL3ZhbGlkYXRpb24udHMiLCIuLi9zcmMvdXRpbHMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHMudHMiLCIuLi9zcmMvdXRpbHMvc3RyaW5ncy50cyIsIi4uL3NyYy91dGlscy9kYXRlcy50cyIsIi4uL3NyYy91dGlscy9EZWNvcmF0aW9uLnRzIiwiLi4vc3JjL3V0aWxzL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvdXRpbHMvaGFzaGluZy50cyIsIi4uL3NyYy91dGlscy9QYXRoUHJveHkudHMiLCIuLi9zcmMvbW9kZWwvTW9kZWxFcnJvckRlZmluaXRpb24udHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0Jhc2VWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1ZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvVmFsaWRhdG9yUmVnaXN0cnkudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uLnRzIiwiLi4vc3JjL21vZGVsL3V0aWxzLnRzIiwiLi4vc3JjL21vZGVsL3ZhbGlkYXRpb24udHMiLCIuLi9zcmMvbW9kZWwvY29uc3RhbnRzLnRzIiwiLi4vc3JjL21vZGVsL01vZGVsLnRzIiwiLi4vc3JjL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0FzeW5jVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9EYXRlVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9EaWZmVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9QYXR0ZXJuVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9FbWFpbFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvRXF1YWxzVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy91dGlscy50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvR3JlYXRlclRoYW5WYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0dyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvTGVzc1RoYW5WYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0xlc3NUaGFuT3JFcXVhbFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvTGlzdFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvTWF4TGVuZ3RoVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9NYXhWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL01pbkxlbmd0aFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvTWluVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9QYXNzd29yZFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvUmVxdWlyZWRWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1N0ZXBWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1R5cGVWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1VSTFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvbW9kZWwvY29uc3RydWN0aW9uLnRzIiwiLi4vc3JjL21vZGVsL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMgPSB7XG4gIElOVkFMSURfUEFUSDpcbiAgICBcIkludmFsaWQgcGF0aCBhcmd1bWVudC4gRXhwZWN0ZWQgbm9uLWVtcHR5IHN0cmluZyBidXQgcmVjZWl2ZWQ6ICd7MH0nXCIsXG4gIENPTlRFWFRfTk9UX09CSkVDVF9DT01QQVJJU09OOlxuICAgIFwiVW5hYmxlIHRvIGFjY2VzcyBwYXJlbnQgYXQgbGV2ZWwgezB9IGZvciBwYXRoICd7MX0nOiBjdXJyZW50IGNvbnRleHQgaXMgbm90IGFuIG9iamVjdFwiLFxuICBQUk9QRVJUWV9JTlZBTElEOlxuICAgIFwiRmFpbGVkIHRvIHJlc29sdmUgcGF0aCB7MH06IHByb3BlcnR5ICd7MX0nIGlzIGludmFsaWQgb3IgZG9lcyBub3QgZXhpc3QuXCIsXG4gIFBST1BFUlRZX05PVF9FWElTVDogXCJGYWlsZWQgdG8gcmVzb2x2ZSBwYXRoOiBwcm9wZXJ0eSAnezB9JyBkb2VzIG5vdCBleGlzdC5cIixcbiAgVU5TVVBQT1JURURfVFlQRVNfQ09NUEFSSVNPTjpcbiAgICBcIlVuc3VwcG9ydGVkIHR5cGVzIGZvciBjb21wYXJpc29uOiAnezB9JyBhbmQgJ3sxfSdcIixcbiAgTlVMTF9PUl9VTkRFRklORURfQ09NUEFSSVNPTjpcbiAgICBcIkNvbXBhcmlzb24gZmFpbGVkIGR1ZSB0byBudWxsIG9yIHVuZGVmaW5lZCB2YWx1ZVwiLFxuICBJTlZBTElEX0RBVEVfQ09NUEFSSVNPTjogXCJJbnZhbGlkIERhdGUgb2JqZWN0cyBhcmUgbm90IGNvbXBhcmFibGVcIixcbiAgVFlQRV9NSVNNQVRDSF9DT01QQVJJU09OOlxuICAgIFwiQ2Fubm90IGNvbXBhcmUgdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlczogezB9IGFuZCB7MX0uXCIsXG4gIE5BTl9DT01QQVJJU09OOiBcIkNvbXBhcmlzb24gbm90IHN1cHBvcnRlZCBmb3IgTmFOIHZhbHVlc1wiLFxuICAvLyBOT19QQVJFTlRfQ09NUEFSSVNPTjogXCJVbmFibGUgdG8gYWNjZXNzIHBhcmVudCBhdCBsZXZlbCB7MH0gZm9yIHBhdGggJ3sxfSc6IG5vIHBhcmVudCBhdmFpbGFibGVcIixcbiAgLy8gUFJPUEVSVFlfTk9UX0ZPVU5EOiBcIkZhaWxlZCB0byByZXNvbHZlIHBhdGggezB9OiBwcm9wZXJ0eSAnezF9JyBkb2VzIG5vdCBleGlzdC5cIixcbiAgLy8gUFJPUEVSVFlfTk9UX0ZPVU5EX09OX1BBUkVOVDogXCJGYWlsZWQgdG8gcmVzb2x2ZSBwYXRoIHswfTogcHJvcGVydHkgJ3sxfScgZG9lcyBub3QgZXhpc3Qgb24gcGFyZW50LlwiLFxuICAvLyBQUk9QRVJUWV9OT1RfRk9VTkRfQUZURVJfUEFSRU5UOiBcIkZhaWxlZCB0byByZXNvbHZlIHBhdGggezB9OiBwcm9wZXJ0eSAnezF9JyBkb2VzIG5vdCBleGlzdCBhZnRlciB7Mn0gcGFyZW50IGxldmVsKHMpLlwiLFxufTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIFN5bWJvbCBrZXkgZm9yIHRyYWNraW5nIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIGluIHZhbGlkYXRpb25cbiAqIEBzdW1tYXJ5IFN5bWJvbCB1c2VkIHRvIGludGVybmFsbHkgdHJhY2sgdGhlIHBhcmVudCBvYmplY3QgZHVyaW5nIG5lc3RlZCB2YWxpZGF0aW9uXG4gKlxuICogQGNvbnN0IFZBTElEQVRJT05fUEFSRU5UX0tFWVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgVkFMSURBVElPTl9QQVJFTlRfS0VZID0gU3ltYm9sKFwiX3BhcmVudFwiKTtcbmV4cG9ydCBjb25zdCBBU1lOQ19NRVRBX0tFWSA9IFN5bWJvbChcImlzQXN5bmNcIik7XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGNvbnRhaW5pbmcgbWV0YWRhdGEga2V5cyB1c2VkIGZvciByZWZsZWN0aW9uIGluIHRoZSBtb2RlbCBzeXN0ZW1cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHZhcmlvdXMgTW9kZWwga2V5cyB1c2VkIGZvciByZWZsZWN0aW9uIGFuZCBtZXRhZGF0YSBzdG9yYWdlLlxuICogVGhlc2Uga2V5cyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5IHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBtb2RlbHMsXG4gKiB0aGVpciBwcm9wZXJ0aWVzLCBhbmQgdGhlaXIgYmVoYXZpb3IuXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFRkxFQ1QgLSBQcmVmaXggdG8gYWxsIG90aGVyIGtleXMsIHVzZWQgYXMgYSBuYW1lc3BhY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUWVBFIC0gS2V5IGZvciBzdG9yaW5nIGRlc2lnbiB0eXBlIGluZm9ybWF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFSQU1TIC0gS2V5IGZvciBzdG9yaW5nIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVRVUk4gLSBLZXkgZm9yIHN0b3JpbmcgbWV0aG9kIHJldHVybiB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTU9ERUwgLSBLZXkgZm9yIGlkZW50aWZ5aW5nIG1vZGVsIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQU5DSE9SIC0gQW5jaG9yIGtleSB0aGF0IHNlcnZlcyBhcyBhIGdob3N0IHByb3BlcnR5IGluIHRoZSBtb2RlbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IENPTlNUUlVDVElPTiAtIEtleSBmb3Igc3RvcmluZyBjb25zdHJ1Y3Rpb24gaW5mb3JtYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBBVFRSSUJVVEUgLSBLZXkgZm9yIHN0b3JpbmcgYXR0cmlidXRlIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSEFTSElORyAtIEtleSBmb3Igc3RvcmluZyBoYXNoaW5nIGNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTRVJJQUxJWkFUSU9OIC0gS2V5IGZvciBzdG9yaW5nIHNlcmlhbGl6YXRpb24gY29uZmlndXJhdGlvblxuICpcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZW51bSBNb2RlbEtleXMge1xuICBSRUZMRUNUID0gXCJkZWNhZi5tb2RlbC5cIixcbiAgREVTQ1JJUFRJT04gPSBcImRlY2FmLmRlc2NyaXB0aW9uLlwiLFxuICBUWVBFID0gXCJkZXNpZ246dHlwZVwiLFxuICBQQVJBTVMgPSBcImRlc2lnbjpwYXJhbXR5cGVzXCIsXG4gIFJFVFVSTiA9IFwiZGVzaWduOnJldHVybnR5cGVcIixcbiAgTU9ERUwgPSBcIm1vZGVsXCIsXG4gIEFOQ0hPUiA9IFwiX19tb2RlbFwiLFxuICBDT05TVFJVQ1RJT04gPSBcImNvbnN0cnVjdGVkLWJ5XCIsXG4gIEFUVFJJQlVURSA9IFwiX19hdHRyaWJ1dGVzXCIsXG4gIEhBU0hJTkcgPSBcImhhc2hpbmdcIixcbiAgU0VSSUFMSVpBVElPTiA9IFwic2VyaWFsaXphdGlvblwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGZsYXZvdXIgaWRlbnRpZmllciBmb3IgdGhlIGRlY29yYXRvciBzeXN0ZW1cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGRlZmF1bHQgZmxhdm91ciB1c2VkIGJ5IHRoZSBEZWNvcmF0aW9uIGNsYXNzIHdoZW4gbm8gc3BlY2lmaWMgZmxhdm91ciBpcyBwcm92aWRlZC5cbiAqIFRoaXMgY29uc3RhbnQgaXMgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5IGFzIHRoZSBmYWxsYmFjayBmbGF2b3VyIGZvciBkZWNvcmF0b3JzLlxuICpcbiAqIEBjb25zdCB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0Rmxhdm91ciA9IFwiZGVjYWZcIjtcbiIsImltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi8uLi91dGlscy9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT2JqZWN0LWxpa2Ugc2V0IG9mIGtleXMgdXNlZCBmb3IgY29tcGFyaXNvbi1iYXNlZCB2YWxpZGF0aW9ucy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGNhbm9uaWNhbCBuYW1lcyBmb3IgdmFsaWRhdG9ycyB0aGF0IGNvbXBhcmUgdHdvIHZhbHVlcyAoZXF1YWxpdHkgYW5kIG9yZGVyaW5nIGNoZWNrcykuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb21wYXJpc29uVmFsaWRhdGlvbktleXNEZWZcbiAqIEBwcm9wZXJ0eSB7XCJlcXVhbHNcIn0gRVFVQUxTIFZhbGlkYXRlcyBpZiB0d28gdmFsdWVzIGFyZSBlcXVhbC5cbiAqIEBwcm9wZXJ0eSB7XCJkaWZmZXJlbnRcIn0gRElGRiBWYWxpZGF0ZXMgaWYgdHdvIHZhbHVlcyBhcmUgZGlmZmVyZW50LlxuICogQHByb3BlcnR5IHtcImxlc3NUaGFuXCJ9IExFU1NfVEhBTiBWYWxpZGF0ZXMgaWYgYSB2YWx1ZSBpcyBsZXNzIHRoYW4gYW5vdGhlci5cbiAqIEBwcm9wZXJ0eSB7XCJsZXNzVGhhbk9yRXF1YWxcIn0gTEVTU19USEFOX09SX0VRVUFMIFZhbGlkYXRlcyBpZiBhIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBhbm90aGVyLlxuICogQHByb3BlcnR5IHtcImdyZWF0ZXJUaGFuXCJ9IEdSRUFURVJfVEhBTiBWYWxpZGF0ZXMgaWYgYSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gYW5vdGhlci5cbiAqIEBwcm9wZXJ0eSB7XCJncmVhdGVyVGhhbk9yRXF1YWxcIn0gR1JFQVRFUl9USEFOX09SX0VRVUFMIFZhbGlkYXRlcyBpZiBhIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBhbm90aGVyLlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5cyB1c2VkIGZvciBjb21wYXJpc29uLWJhc2VkIHZhbGlkYXRpb25zLlxuICogQHN1bW1hcnkgQ2Fub25pY2FsIGtleSBuYW1lcyBmb3IgY29tcGFyaXNvbiB2YWxpZGF0b3JzLlxuICogQGNvbnN0IENvbXBhcmlzb25WYWxpZGF0aW9uS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICogQHR5cGUge0NvbXBhcmlzb25WYWxpZGF0aW9uS2V5c0RlZn1cbiAqL1xuZXhwb3J0IGNvbnN0IENvbXBhcmlzb25WYWxpZGF0aW9uS2V5cyA9IHtcbiAgRVFVQUxTOiBcImVxdWFsc1wiLFxuICBESUZGOiBcImRpZmZlcmVudFwiLFxuICBMRVNTX1RIQU46IFwibGVzc1RoYW5cIixcbiAgTEVTU19USEFOX09SX0VRVUFMOiBcImxlc3NUaGFuT3JFcXVhbFwiLFxuICBHUkVBVEVSX1RIQU46IFwiZ3JlYXRlclRoYW5cIixcbiAgR1JFQVRFUl9USEFOX09SX0VRVUFMOiBcImdyZWF0ZXJUaGFuT3JFcXVhbFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT2JqZWN0LWxpa2Ugc2V0IG9mIGtleXMgdXNlZCBhY3Jvc3MgYWxsIHZhbGlkYXRvcnMgaW4gdGhlIHN5c3RlbS5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGNhbm9uaWNhbCBuYW1lc3BhY2VkIGtleSBwcmVmaXggYW5kIHRoZSBpbmRpdmlkdWFsIHZhbGlkYXRpb24gZmxhZ3MgZm9yIHJ1bGVzIHN1Y2ggYXMgcmVxdWlyZWQsIG1pbi9tYXgsIGxlbmd0aCwgcGF0dGVybnMsIHR5cGVzLCBsaXN0cyBhbmQgbW9yZS5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFZhbGlkYXRpb25LZXlzRGVmXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCBwcmVmaXhlcyBvdGhlcnMgKG5hbWVzcGFjZSBwcmVmaXgpXG4gKiBAcHJvcGVydHkge1wicmVxdWlyZWRcIn0gUkVRVUlSRUQgc2V0cyBhcyByZXF1aXJlZFxuICogQHByb3BlcnR5IHtcIm1pblwifSBNSU4gZGVmaW5lcyBtaW4gdmFsdWVcbiAqIEBwcm9wZXJ0eSB7XCJtYXhcIn0gTUFYIGRlZmluZXMgbWF4IHZhbHVlXG4gKiBAcHJvcGVydHkge1wic3RlcFwifSBTVEVQIGRlZmluZXMgc3RlcFxuICogQHByb3BlcnR5IHtcIm1pbmxlbmd0aFwifSBNSU5fTEVOR1RIIGRlZmluZXMgbWluIGxlbmd0aFxuICogQHByb3BlcnR5IHtcIm1heGxlbmd0aFwifSBNQVhfTEVOR1RIIGRlZmluZXMgbWF4IGxlbmd0aFxuICogQHByb3BlcnR5IHtcInBhdHRlcm5cIn0gUEFUVEVSTiBkZWZpbmVzIHBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7XCJlbWFpbFwifSBFTUFJTCBkZWZpbmVzIGVtYWlsXG4gKiBAcHJvcGVydHkge1widXJsXCJ9IFVSTCBkZWZpbmVzIHVybFxuICogQHByb3BlcnR5IHtcImRhdGVcIn0gREFURSBkZWZpbmVzIGRhdGVcbiAqIEBwcm9wZXJ0eSB7XCJ0eXBlXCJ9IFRZUEUgZGVmaW5lcyB0eXBlXG4gKiBAcHJvcGVydHkge1wicGFzc3dvcmRcIn0gUEFTU1dPUkQgZGVmaW5lcyBwYXNzd29yZFxuICogQHByb3BlcnR5IHtcImxpc3RcIn0gTElTVCBkZWZpbmVzIGxpc3RcbiAqIEBwcm9wZXJ0eSB7XCJ1bmlxdWVcIn0gVU5JUVVFIGZsYWdzIHVuaXF1ZW5lc3NcbiAqIEBwcm9wZXJ0eSB7XCJ2YWxpZGF0b3JcIn0gVkFMSURBVE9SIGN1c3RvbSB2YWxpZGF0b3IgaWRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRoZSBrZXlzIHVzZWQgZm9yIHZhbGlkYXRpb24uXG4gKiBAc3VtbWFyeSBBIG5hbWVzcGFjZWQgY29sbGVjdGlvbiBvZiB2YWxpZGF0aW9uIGtleSBzdHJpbmdzIHVzZWQgdGhyb3VnaG91dCB0aGUgbGlicmFyeS5cbiAqIEBjb25zdCBWYWxpZGF0aW9uS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICogQHR5cGUge1ZhbGlkYXRpb25LZXlzRGVmfVxuICovXG5leHBvcnQgY29uc3QgVmFsaWRhdGlvbktleXMgPSB7XG4gIFJFRkxFQ1Q6IGAke01vZGVsS2V5cy5SRUZMRUNUfXZhbGlkYXRpb24uYCxcbiAgREFURTogXCJkYXRlXCIsXG4gIEVNQUlMOiBcImVtYWlsXCIsXG4gIEZPUk1BVDogXCJmb3JtYXRcIixcbiAgTElTVDogXCJsaXN0XCIsXG4gIE1BWDogXCJtYXhcIixcbiAgTUFYX0xFTkdUSDogXCJtYXhsZW5ndGhcIixcbiAgTUlOOiBcIm1pblwiLFxuICBNSU5fTEVOR1RIOiBcIm1pbmxlbmd0aFwiLFxuICBQQVNTV09SRDogXCJwYXNzd29yZFwiLFxuICBQQVRURVJOOiBcInBhdHRlcm5cIixcbiAgUkVRVUlSRUQ6IFwicmVxdWlyZWRcIixcbiAgU1RFUDogXCJzdGVwXCIsXG4gIFRZUEU6IFwidHlwZVwiLFxuICBVTklRVUU6IFwidW5pcXVlXCIsXG4gIFVSTDogXCJ1cmxcIixcbiAgVkFMSURBVE9SOiBcInZhbGlkYXRvclwiLFxuICAuLi5Db21wYXJpc29uVmFsaWRhdGlvbktleXMsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBsaXN0IG9mIG1vbnRoIG5hbWVzXG4gKiBAc3VtbWFyeSBTdG9yZXMgbW9udGggbmFtZXMuIENhbiBiZSBjaGFuZ2VkIGZvciBsb2NhbGl6YXRpb24gcHVycG9zZXNcbiAqIEBjb25zdCBNT05USF9OQU1FU1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgTU9OVEhfTkFNRVMgPSBbXG4gIFwiSmFudWFyeVwiLFxuICBcIkZlYnJ1YXJ5XCIsXG4gIFwiTWFyY2hcIixcbiAgXCJBcHJpbFwiLFxuICBcIk1heVwiLFxuICBcIkp1bmVcIixcbiAgXCJKdWx5XCIsXG4gIFwiQXVndXN0XCIsXG4gIFwiU2VwdGVtYmVyXCIsXG4gIFwiT2N0b2JlclwiLFxuICBcIk5vdmVtYmVyXCIsXG4gIFwiRGVjZW1iZXJcIixcbl07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIGxpc3Qgb2YgbmFtZXMgb2YgZGF5cyBvZiB0aGUgd2Vla1xuICogQHN1bW1hcnkgU3RvcmVzIG5hbWVzIGZvciBkYXlzIG9mIHRoZSB3ZWVrLiBDYW4gYmUgY2hhbmdlZCBmb3IgbG9jYWxpemF0aW9uIHB1cnBvc2VzXG4gKiBAY29uc3QgREFZU19PRl9XRUVLX05BTUVTXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBEQVlTX09GX1dFRUtfTkFNRVMgPSBbXG4gIFwiU3VuZGF5XCIsXG4gIFwiTW9uZGF5XCIsXG4gIFwiVHVlc2RheVwiLFxuICBcIldlZG5lc2RheVwiLFxuICBcIlRodXJzZGF5XCIsXG4gIFwiRnJpZGF5XCIsXG4gIFwiU2F0dXJkYXlcIixcbl07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgZGVmaW5pdGlvbiBmb3IgZGVmYXVsdCBlcnJvciBtZXNzYWdlIHN0cmluZ3Mga2V5ZWQgYnkgdmFsaWRhdGlvbiB0eXBlLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB0aGUgc3VwcG9ydGVkIGVycm9yIG1lc3NhZ2Uga2V5cyB3aXRoIHRoZWlyIGludGVuZGVkIG1lYW5pbmc7IHVzZWQgdG8gbG9jYWxpemUgb3Igb3ZlcnJpZGUgZGVmYXVsdCBtZXNzYWdlcy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IERlZmF1bHRFcnJvck1lc3NhZ2VzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVRVUlSRUQgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUlOIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1BWCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNSU5fTEVOR1RIIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1BWF9MRU5HVEggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFUVEVSTiBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFTUFJTCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVUkwgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVFlQRSBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVEVQIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IERBVEUgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREVGQVVMVCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQQVNTV09SRCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBMSVNUIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJU1RfSU5TSURFIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1PREVMX05PVF9GT1VORCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIGRlZmF1bHQgZXJyb3IgbWVzc2FnZXNcbiAqIEBzdW1tYXJ5IE1hcHBpbmcgYmV0d2VlbiB2YWxpZGF0aW9uIGtleXMgYW5kIHRoZWlyIGRlZmF1bHQgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZXMuXG4gKiBAY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFU1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICogQHR5cGUge0RlZmF1bHRFcnJvck1lc3NhZ2VzfVxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgUkVRVUlSRUQ6IFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZFwiLFxuICBNSU46IFwiVGhlIG1pbmltdW0gdmFsdWUgaXMgezB9XCIsXG4gIE1BWDogXCJUaGUgbWF4aW11bSB2YWx1ZSBpcyB7MH1cIixcbiAgTUlOX0xFTkdUSDogXCJUaGUgbWluaW11bSBsZW5ndGggaXMgezB9XCIsXG4gIE1BWF9MRU5HVEg6IFwiVGhlIG1heGltdW0gbGVuZ3RoIGlzIHswfVwiLFxuICBQQVRURVJOOiBcIlRoZSB2YWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVyblwiLFxuICBFTUFJTDogXCJUaGUgdmFsdWUgaXMgbm90IGEgdmFsaWQgZW1haWxcIixcbiAgVVJMOiBcIlRoZSB2YWx1ZSBpcyBub3QgYSB2YWxpZCBVUkxcIixcbiAgVFlQRTogXCJJbnZhbGlkIHR5cGUuIEV4cGVjdGVkIHswfSwgcmVjZWl2ZWQgezF9XCIsXG4gIFNURVA6IFwiSW52YWxpZCB2YWx1ZS4gTm90IGEgc3RlcCBvZiB7MH1cIixcbiAgREFURTogXCJJbnZhbGlkIHZhbHVlLiBub3QgYSB2YWxpZCBEYXRlXCIsXG4gIERFRkFVTFQ6IFwiVGhlcmUgaXMgYW4gRXJyb3JcIixcbiAgUEFTU1dPUkQ6XG4gICAgXCJNdXN0IGJlIGF0IGxlYXN0IDggY2hhcmFjdGVycyBhbmQgY29udGFpbiBvbmUgb2YgbnVtYmVyLCBsb3dlciBhbmQgdXBwZXIgY2FzZSBsZXR0ZXJzLCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXIgKEAkISUqPyZfLS4sKVwiLFxuICBMSVNUOiBcIkludmFsaWQgbGlzdCBvZiB7MH1cIixcbiAgTU9ERUxfTk9UX0ZPVU5EOiBcIk5vIG1vZGVsIHJlZ2lzdGVyZWQgdW5kZXIgezB9XCIsXG4gIEVRVUFMUzogXCJUaGlzIGZpZWxkIG11c3QgYmUgZXF1YWwgdG8gZmllbGQgezB9XCIsXG4gIERJRkY6IFwiVGhpcyBmaWVsZCBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIGZpZWxkIHswfVwiLFxuICBMRVNTX1RIQU46IFwiVGhpcyBmaWVsZCBtdXN0IGJlIGxlc3MgdGhhbiBmaWVsZCB7MH1cIixcbiAgTEVTU19USEFOX09SX0VRVUFMOiBcIlRoaXMgZmllbGQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZmllbGQgezB9XCIsXG4gIEdSRUFURVJfVEhBTjogXCJUaGlzIGZpZWxkIG11c3QgYmUgZ3JlYXRlciB0aGFuIGZpZWxkIHswfVwiLFxuICBHUkVBVEVSX1RIQU5fT1JfRVFVQUw6XG4gICAgXCJUaGlzIGZpZWxkIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGZpZWxkIHswfVwiLFxuICBVTklRVUU6IFwiRHVwbGljYXRlIGZvdW5kLCB0aGlzIGZpZWxkIG11c3QgYmUgdW5pcXVlLlwiLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZSBkZWZpbml0aW9uIGZvciBkZWZhdWx0IHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJucyB1c2VkIGluIHZhbGlkYXRpb24uXG4gKiBAc3VtbWFyeSBDYXB0dXJlcyBjb21tb24gcmVnZXggcGF0dGVybnMgZm9yIGVtYWlsLCBVUkwsIGFuZCBwYXNzd29yZCBwb2xpY2llcywgaW5jbHVkaW5nIG5lc3RlZCBncm91cGluZyBmb3IgcGFzc3dvcmQtcmVsYXRlZCBydWxlcy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IERlZmF1bHRQYXR0ZXJuc1xuICogQHByb3BlcnR5IHtSZWdFeHB9IEVNQUlMIEVtYWlsIGFkZHJlc3MgdmFsaWRhdGlvbiBwYXR0ZXJuXG4gKiBAcHJvcGVydHkge1JlZ0V4cH0gVVJMIFVSTCB2YWxpZGF0aW9uIHBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBQQVNTV09SRCBQYXNzd29yZC1yZWxhdGVkIHJlZ2V4IHBhdHRlcm5zXG4gKiBAcHJvcGVydHkge1JlZ0V4cH0gUEFTU1dPUkQuQ0hBUjhfT05FX09GX0VBQ0ggQXQgbGVhc3QgOCBjaGFycyB3aXRoIGxvd2VyLCB1cHBlciwgbnVtYmVyLCBhbmQgc3BlY2lhbCBjaGFyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIHRoZSB2YXJpb3VzIGRlZmF1bHQgcmVnZXhwIHBhdHRlcm5zIHVzZWRcbiAqIEBzdW1tYXJ5IENvbGxlY3Rpb24gb2YgZnJlcXVlbnRseSB1c2VkIHZhbGlkYXRpb24gcGF0dGVybnMgZ3JvdXBlZCB1bmRlciBzZW1hbnRpYyBrZXlzLlxuICogQGNvbnN0IERFRkFVTFRfUEFUVEVSTlNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqIEB0eXBlIHtEZWZhdWx0UGF0dGVybnN9XG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BBVFRFUk5TID0ge1xuICBFTUFJTDpcbiAgICAvW2EtekEtWjAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXpBLVowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKkAoPzpbYS16QS1aMC05XSg/OlthLXowLTktXSpbYS16QS1aMC05XSk/XFwuKStbYS16QS1aMC05XSg/OlthLXpBLVowLTktXSpbYS16QS1aMC05XSk/LyxcbiAgVVJMOiAvXig/Oig/Oig/Omh0dHBzP3xmdHApOik/XFwvXFwvKSg/OlxcUysoPzo6XFxTKik/QCk/KD86KD8hKD86MTB8MTI3KSg/OlxcLlxcZHsxLDN9KXszfSkoPyEoPzoxNjlcXC4yNTR8MTkyXFwuMTY4KSg/OlxcLlxcZHsxLDN9KXsyfSkoPyExNzJcXC4oPzoxWzYtOV18MlxcZHwzWzAtMV0pKD86XFwuXFxkezEsM30pezJ9KSg/OlsxLTldXFxkP3wxXFxkXFxkfDJbMDFdXFxkfDIyWzAtM10pKD86XFwuKD86MT9cXGR7MSwyfXwyWzAtNF1cXGR8MjVbMC01XSkpezJ9KD86XFwuKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNF0pKXwoPzooPzpbYS16MC05XFx1MDBhMS1cXHVmZmZmXVthLXowLTlcXHUwMGExLVxcdWZmZmZfLV17MCw2Mn0pP1thLXowLTlcXHUwMGExLVxcdWZmZmZdXFwuKSsoPzpbYS16XFx1MDBhMS1cXHVmZmZmXXsyLH1cXC4/KSkoPzo6XFxkezIsNX0pPyg/OlsvPyNdXFxTKik/JC9pLFxuICBQQVNTV09SRDoge1xuICAgIENIQVI4X09ORV9PRl9FQUNIOlxuICAgICAgL14oPz0uKlthLXpdKSg/PS4qW0EtWl0pKD89LipcXGQpKD89LipbQCQhJSo/Jl9cXC0uLF0pW0EtWmEtelxcZEAkISUqPyZfXFwtLixdezgsfSQvZyxcbiAgfSxcbn07XG4iLCIvKipcbiAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gcHJvdmlkZSBzdHJpbmcgZm9ybWF0IGZ1bmN0aW9uYWxpdHkgc2ltaWxhciB0byBDIydzIHN0cmluZy5mb3JtYXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IG51bWJlcj59IFthcmdzXSByZXBsYWNlbWVudHMgbWFkZSBieSBvcmRlciBvZiBhcHBlYXJhbmNlIChyZXBsYWNlbWVudDAgd2lsIHJlcGxhY2UgezB9IGFuZCBzbyBvbilcbiAqIEByZXR1cm4ge3N0cmluZ30gZm9ybWF0dGVkIHN0cmluZ1xuICpcbiAqIEBmdW5jdGlvbiBzdHJpbmdGb3JtYXRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRm9ybWF0KHN0cmluZzogc3RyaW5nLCAuLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgveyhcXGQrKX0vZywgZnVuY3Rpb24gKG1hdGNoLCBudW1iZXIpIHtcbiAgICByZXR1cm4gdHlwZW9mIGFyZ3NbbnVtYmVyXSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgPyBhcmdzW251bWJlcl0udG9TdHJpbmcoKVxuICAgICAgOiBcInVuZGVmaW5lZFwiO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIHByb3ZpZGUgc3RyaW5nIGZvcm1hdCBmdW5jdGlvbmFsaXR5IHNpbWlsYXIgdG8gQyMncyBzdHJpbmcuZm9ybWF0XG4gKiBAZGVzY3JpcHRpb24gYWxpYXMgZm9yIHtAbGluayBzdHJpbmdGb3JtYXR9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MgcmVwbGFjZW1lbnRzIG1hZGUgYnkgb3JkZXIgb2YgYXBwZWFyYW5jZSAocmVwbGFjZW1lbnQwIHdpbCByZXBsYWNlIHswfSBhbmQgc28gb24pXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGZvcm1hdHRlZCBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc2ZcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgY29uc3Qgc2YgPSBzdHJpbmdGb3JtYXQ7XG4iLCJpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICBEQVlTX09GX1dFRUtfTkFNRVMsXG4gIE1PTlRIX05BTUVTLFxufSBmcm9tIFwiLi4vdmFsaWRhdGlvbi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi9zdHJpbmdzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgUmV2ZXJzZXMgdGhlIHByb2Nlc3MgZnJvbSB7QGxpbmsgZm9ybWF0RGF0ZX1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0ZSB0aGUgZGF0ZSBzdHJpbmcgdG8gYmUgY29udmVydGVkIGJhY2sgaW50byBkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IHRoZSBkYXRlIGZvcm1hdFxuICogQHJldHVybiB7RGF0ZX0gdGhlIGRhdGUgZnJvbSB0aGUgZm9ybWF0IG9yIHRoZSBzdGFuZGFyZCBuZXcgRGF0ZSh7QHByb3AgZGF0ZX0pIGlmIHRoZSBzdHJpbmcgY291bGRuJ3QgYmUgcGFyc2VkIChhcmUgeW91IHN1cmUgdGhlIGZvcm1hdCBtYXRjaGVzIHRoZSBzdHJpbmc/KVxuICpcbiAqIEBmdW5jdGlvbiBkYXRlRnJvbUZvcm1hdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRlRnJvbUZvcm1hdChkYXRlOiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nKSB7XG4gIGxldCBmb3JtYXRSZWdleHA6IHN0cmluZyA9IGZvcm1hdDtcblxuICAvLyBIb3VyXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL2hoLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJoaFwiLCBcIig/PGhvdXI+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL2gvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcImhcIiwgXCIoPzxob3VyPlxcXFxkezEsMn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL0hILykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJISFwiLCBcIig/PGhvdXI+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL0gvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIkhcIiwgXCIoPzxob3VyPlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIE1pbnV0ZXNcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvbW0vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIm1tXCIsIFwiKD88bWludXRlcz5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvbS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwibVwiLCBcIig/PG1pbnV0ZXM+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gU2Vjb25kc1xuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9zcy8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwic3NcIiwgXCIoPzxzZWNvbmRzPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9zLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJzXCIsIFwiKD88c2Vjb25kcz5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBEYXlcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvZGQvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcImRkXCIsIFwiKD88ZGF5PlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9kLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJkXCIsIFwiKD88ZGF5PlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIERheSBPZiBXZWVrXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL0VFRUUvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIkVFRUVcIiwgXCIoPzxkYXlvZndlZWs+XFxcXHcrKVwiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWR1cGUtZWxzZS1pZlxuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL0VFRUUvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIkVFRVwiLCBcIig/PGRheW9md2Vlaz5cXFxcdyspXCIpO1xuXG4gIC8vIFllYXJcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgveXl5eS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwieXl5eVwiLCBcIig/PHllYXI+XFxcXGR7NH0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL3l5LykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJ5eVwiLCBcIig/PHllYXI+XFxcXGR7Mn0pXCIpO1xuXG4gIC8vIE1vbnRoXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL01NTU0vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIk1NTU1cIiwgXCIoPzxtb250aG5hbWU+XFxcXHcrKVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9NTU0vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIk1NTVwiLCBcIig/PG1vbnRobmFtZXNtYWxsPlxcXFx3KylcIik7XG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL01NLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJNTVwiLCBcIig/PG1vbnRoPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9NLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJNXCIsIFwiKD88bW9udGg+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gTWlsaXMgYW5kIEFtIFBtXG4gIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cFxuICAgIC5yZXBsYWNlKFwiU1wiLCBcIig/PG1pbGlzPlxcXFxkezEsM30pXCIpXG4gICAgLnJlcGxhY2UoXCJhYWFcIiwgXCIoPzxhbXBtPlxcXFx3ezJ9KVwiKTtcblxuICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKGZvcm1hdFJlZ2V4cCwgXCJnXCIpO1xuXG4gIGNvbnN0IG1hdGNoOiB7XG4gICAgZ3JvdXBzOiB7XG4gICAgICB5ZWFyPzogc3RyaW5nO1xuICAgICAgZGF5Pzogc3RyaW5nO1xuICAgICAgYW1wbT86IHN0cmluZztcbiAgICAgIGhvdXI/OiBzdHJpbmc7XG4gICAgICBtaW51dGVzPzogc3RyaW5nO1xuICAgICAgc2Vjb25kcz86IHN0cmluZztcbiAgICAgIG1pbGlzPzogc3RyaW5nO1xuICAgICAgbW9udGhuYW1lPzogc3RyaW5nO1xuICAgICAgbW9udGhuYW1lc21hbGw/OiBzdHJpbmc7XG4gICAgICBtb250aD86IHN0cmluZztcbiAgICB9O1xuICB9ID0gcmVnZXhwLmV4ZWMoZGF0ZSkgYXMgYW55O1xuXG4gIGlmICghbWF0Y2ggfHwgIW1hdGNoLmdyb3VwcykgcmV0dXJuIG5ldyBEYXRlKGRhdGUpO1xuXG4gIGNvbnN0IHNhZmVQYXJzZUludCA9IGZ1bmN0aW9uIChuPzogc3RyaW5nKSB7XG4gICAgaWYgKCFuKSByZXR1cm4gMDtcbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZUludChuKTtcblxuICAgIHJldHVybiBpc05hTihyZXN1bHQpID8gMCA6IHJlc3VsdDtcbiAgfTtcblxuICBjb25zdCB5ZWFyID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy55ZWFyKTtcbiAgY29uc3QgZGF5ID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy5kYXkpO1xuXG4gIGNvbnN0IGFtUG0gPSBtYXRjaC5ncm91cHMuYW1wbTtcbiAgbGV0IGhvdXIgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLmhvdXIpO1xuXG4gIGlmIChhbVBtKSBob3VyID0gYW1QbSA9PT0gXCJQTVwiID8gaG91ciArIDEyIDogaG91cjtcblxuICBjb25zdCBtaW51dGVzID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy5taW51dGVzKTtcbiAgY29uc3Qgc2Vjb25kcyA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMuc2Vjb25kcyk7XG4gIGNvbnN0IG1zID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy5taWxpcyk7XG5cbiAgY29uc3QgbW9udGhOYW1lID0gbWF0Y2guZ3JvdXBzLm1vbnRobmFtZTtcbiAgY29uc3QgbW9udGhOYW1lU21hbGwgPSBtYXRjaC5ncm91cHMubW9udGhuYW1lc21hbGw7XG4gIGxldCBtb250aDogbnVtYmVyIHwgc3RyaW5nID0gbWF0Y2guZ3JvdXBzLm1vbnRoIGFzIHN0cmluZztcbiAgaWYgKG1vbnRoTmFtZSkgbW9udGggPSBNT05USF9OQU1FUy5pbmRleE9mKG1vbnRoTmFtZSk7XG4gIGVsc2UgaWYgKG1vbnRoTmFtZVNtYWxsKSB7XG4gICAgY29uc3QgbSA9IE1PTlRIX05BTUVTLmZpbmQoKG0pID0+XG4gICAgICBtLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtb250aE5hbWVTbWFsbC50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgaWYgKCFtKSByZXR1cm4gbmV3IERhdGUoZGF0ZSk7XG4gICAgbW9udGggPSBNT05USF9OQU1FUy5pbmRleE9mKG0pO1xuICB9IGVsc2UgbW9udGggPSBzYWZlUGFyc2VJbnQoYCR7bW9udGh9YCk7XG5cbiAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5LCBob3VyLCBtaW51dGVzLCBzZWNvbmRzLCBtcyk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJpbmRzIGEgc3BlY2lmaWMgZGF0ZSBmb3JtYXQgdG8gYSBEYXRlIG9iamVjdCdzIHRvU3RyaW5nIGFuZCB0b0lTT1N0cmluZyBtZXRob2RzXG4gKiBAc3VtbWFyeSBNb2RpZmllcyBhIERhdGUgb2JqZWN0IHRvIHJldHVybiBhIGZvcm1hdHRlZCBzdHJpbmcgd2hlbiB0b1N0cmluZyBvciB0b0lTT1N0cmluZyBpcyBjYWxsZWQuXG4gKiBUaGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCB0b1N0cmluZyBhbmQgdG9JU09TdHJpbmcgbWV0aG9kcyBvZiB0aGUgRGF0ZSBvYmplY3QgdG8gcmV0dXJuXG4gKiB0aGUgZGF0ZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cbiAqIEBwYXJhbSB7RGF0ZX0gW2RhdGVdIFRoZSBEYXRlIG9iamVjdCB0byBtb2RpZnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZm9ybWF0XSBUaGUgZm9ybWF0IHN0cmluZyB0byB1c2UgZm9yIGZvcm1hdHRpbmcgdGhlIGRhdGVcbiAqIEByZXR1cm4ge0RhdGV8dW5kZWZpbmVkfSBUaGUgbW9kaWZpZWQgRGF0ZSBvYmplY3Qgb3IgdW5kZWZpbmVkIGlmIG5vIGRhdGUgd2FzIHByb3ZpZGVkXG4gKiBAZnVuY3Rpb24gYmluZERhdGVUb1N0cmluZ1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kRGF0ZVRvU3RyaW5nKGRhdGU6IERhdGUgfCB1bmRlZmluZWQsIGZvcm1hdDogc3RyaW5nKSB7XG4gIGlmICghZGF0ZSkgcmV0dXJuO1xuICBjb25zdCBmdW5jID0gKCkgPT4gZm9ybWF0RGF0ZShkYXRlLCBmb3JtYXQpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0ZSwgXCJ0b0lTT1N0cmluZ1wiLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuYyxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCBcInRvU3RyaW5nXCIsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jLFxuICB9KTtcbiAgLy8gT2JqZWN0LnNldFByb3RvdHlwZU9mKGRhdGUsIERhdGUucHJvdG90eXBlKTtcbiAgcmV0dXJuIGRhdGU7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNhZmVseSBjaGVja3MgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIERhdGUgb2JqZWN0XG4gKiBAc3VtbWFyeSBBIHV0aWxpdHkgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBEYXRlIG9iamVjdC5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgbW9yZSByZWxpYWJsZSB0aGFuIHVzaW5nIGluc3RhbmNlb2YgRGF0ZSBhcyBpdCBhbHNvIGNoZWNrc1xuICogdGhhdCB0aGUgZGF0ZSBpcyBub3QgTmFOLCB3aGljaCBjYW4gaGFwcGVuIHdpdGggaW52YWxpZCBkYXRlIHN0cmluZ3MuXG4gKiBAcGFyYW0ge2FueX0gZGF0ZSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgRGF0ZSBvYmplY3QsIGZhbHNlIG90aGVyd2lzZVxuICogQGZ1bmN0aW9uIGlzVmFsaWREYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZERhdGUoZGF0ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgZGF0ZSAmJlxuICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRlKSA9PT0gXCJbb2JqZWN0IERhdGVdXCIgJiZcbiAgICAhTnVtYmVyLmlzTmFOKGRhdGUpXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBwYWQgbnVtYmVyc1xuICogQHBhcmFtIHtudW1iZXJ9IG51bVxuICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqXG4gKiBAZnVuY3Rpb24gdHdvRGlnaXRQYWRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHdvRGlnaXRQYWQobnVtOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gbnVtIDwgMTAgPyBcIjBcIiArIG51bSA6IG51bS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERhdGUgRm9ybWF0IEhhbmRsaW5nXG4gKiBAZGVzY3JpcHRpb24gQ29kZSBmcm9tIHtAbGluayBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTUyNDYxL2hvdy10by1mb3JtYXQtYS1qYXZhc2NyaXB0LWRhdGV9XG4gKlxuICogPHByZT5cbiAqICAgICAgVXNpbmcgc2ltaWxhciBmb3JtYXR0aW5nIGFzIE1vbWVudC5qcywgQ2xhc3MgRGF0ZVRpbWVGb3JtYXR0ZXIgKEphdmEpLCBhbmQgQ2xhc3MgU2ltcGxlRGF0ZUZvcm1hdCAoSmF2YSksXG4gKiAgICAgIEkgaW1wbGVtZW50ZWQgYSBjb21wcmVoZW5zaXZlIHNvbHV0aW9uIGZvcm1hdERhdGUoZGF0ZSwgcGF0dGVyblN0cikgd2hlcmUgdGhlIGNvZGUgaXMgZWFzeSB0byByZWFkIGFuZCBtb2RpZnkuXG4gKiAgICAgIFlvdSBjYW4gZGlzcGxheSBkYXRlLCB0aW1lLCBBTS9QTSwgZXRjLlxuICpcbiAqICAgICAgRGF0ZSBhbmQgVGltZSBQYXR0ZXJuc1xuICogICAgICB5eSA9IDItZGlnaXQgeWVhcjsgeXl5eSA9IGZ1bGwgeWVhclxuICogICAgICBNID0gZGlnaXQgbW9udGg7IE1NID0gMi1kaWdpdCBtb250aDsgTU1NID0gc2hvcnQgbW9udGggbmFtZTsgTU1NTSA9IGZ1bGwgbW9udGggbmFtZVxuICogICAgICBFRUVFID0gZnVsbCB3ZWVrZGF5IG5hbWU7IEVFRSA9IHNob3J0IHdlZWtkYXkgbmFtZVxuICogICAgICBkID0gZGlnaXQgZGF5OyBkZCA9IDItZGlnaXQgZGF5XG4gKiAgICAgIGggPSBob3VycyBhbS9wbTsgaGggPSAyLWRpZ2l0IGhvdXJzIGFtL3BtOyBIID0gaG91cnM7IEhIID0gMi1kaWdpdCBob3Vyc1xuICogICAgICBtID0gbWludXRlczsgbW0gPSAyLWRpZ2l0IG1pbnV0ZXM7IGFhYSA9IEFNL1BNXG4gKiAgICAgIHMgPSBzZWNvbmRzOyBzcyA9IDItZGlnaXQgc2Vjb25kc1xuICogICAgICBTID0gbWlsaXNlY29uZHNcbiAqIDwvcHJlPlxuICpcbiAqIEBwYXJhbSB7RGF0ZX0gZGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXR0ZXJuU3RyXSBkZWZhdWx0cyB0byAneXl5eS9NTS9kZCdcbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGZvcm1hdHRlZCBkYXRlXG4gKlxuICogQGZ1bmN0aW9uIGZvcm1hdERhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlOiBEYXRlLCBwYXR0ZXJuU3RyOiBzdHJpbmcgPSBcInl5eXkvTU0vZGRcIikge1xuICBjb25zdCBkYXk6IG51bWJlciA9IGRhdGUuZ2V0RGF0ZSgpLFxuICAgIG1vbnRoOiBudW1iZXIgPSBkYXRlLmdldE1vbnRoKCksXG4gICAgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgIGhvdXI6IG51bWJlciA9IGRhdGUuZ2V0SG91cnMoKSxcbiAgICBtaW51dGU6IG51bWJlciA9IGRhdGUuZ2V0TWludXRlcygpLFxuICAgIHNlY29uZDogbnVtYmVyID0gZGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgbWlsaXNlY29uZHM6IG51bWJlciA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCksXG4gICAgaDogbnVtYmVyID0gaG91ciAlIDEyLFxuICAgIGhoOiBzdHJpbmcgPSB0d29EaWdpdFBhZChoKSxcbiAgICBISDogc3RyaW5nID0gdHdvRGlnaXRQYWQoaG91ciksXG4gICAgbW06IHN0cmluZyA9IHR3b0RpZ2l0UGFkKG1pbnV0ZSksXG4gICAgc3M6IHN0cmluZyA9IHR3b0RpZ2l0UGFkKHNlY29uZCksXG4gICAgYWFhOiBzdHJpbmcgPSBob3VyIDwgMTIgPyBcIkFNXCIgOiBcIlBNXCIsXG4gICAgRUVFRTogc3RyaW5nID0gREFZU19PRl9XRUVLX05BTUVTW2RhdGUuZ2V0RGF5KCldLFxuICAgIEVFRTogc3RyaW5nID0gRUVFRS5zdWJzdHIoMCwgMyksXG4gICAgZGQ6IHN0cmluZyA9IHR3b0RpZ2l0UGFkKGRheSksXG4gICAgTTogbnVtYmVyID0gbW9udGggKyAxLFxuICAgIE1NOiBzdHJpbmcgPSB0d29EaWdpdFBhZChNKSxcbiAgICBNTU1NOiBzdHJpbmcgPSBNT05USF9OQU1FU1ttb250aF0sXG4gICAgTU1NOiBzdHJpbmcgPSBNTU1NLnN1YnN0cigwLCAzKSxcbiAgICB5eXl5OiBzdHJpbmcgPSB5ZWFyICsgXCJcIixcbiAgICB5eTogc3RyaW5nID0geXl5eS5zdWJzdHIoMiwgMik7XG4gIC8vIGNoZWNrcyB0byBzZWUgaWYgbW9udGggbmFtZSB3aWxsIGJlIHVzZWRcbiAgcGF0dGVyblN0ciA9IHBhdHRlcm5TdHJcbiAgICAucmVwbGFjZShcImhoXCIsIGhoKVxuICAgIC5yZXBsYWNlKFwiaFwiLCBoLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJISFwiLCBISClcbiAgICAucmVwbGFjZShcIkhcIiwgaG91ci50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwibW1cIiwgbW0pXG4gICAgLnJlcGxhY2UoXCJtXCIsIG1pbnV0ZS50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwic3NcIiwgc3MpXG4gICAgLnJlcGxhY2UoXCJzXCIsIHNlY29uZC50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwiU1wiLCBtaWxpc2Vjb25kcy50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwiZGRcIiwgZGQpXG4gICAgLnJlcGxhY2UoXCJkXCIsIGRheS50b1N0cmluZygpKVxuXG4gICAgLnJlcGxhY2UoXCJFRUVFXCIsIEVFRUUpXG4gICAgLnJlcGxhY2UoXCJFRUVcIiwgRUVFKVxuICAgIC5yZXBsYWNlKFwieXl5eVwiLCB5eXl5KVxuICAgIC5yZXBsYWNlKFwieXlcIiwgeXkpXG4gICAgLnJlcGxhY2UoXCJhYWFcIiwgYWFhKTtcbiAgaWYgKHBhdHRlcm5TdHIuaW5kZXhPZihcIk1NTVwiKSA+IC0xKSB7XG4gICAgcGF0dGVyblN0ciA9IHBhdHRlcm5TdHIucmVwbGFjZShcIk1NTU1cIiwgTU1NTSkucmVwbGFjZShcIk1NTVwiLCBNTU0pO1xuICB9IGVsc2Uge1xuICAgIHBhdHRlcm5TdHIgPSBwYXR0ZXJuU3RyLnJlcGxhY2UoXCJNTVwiLCBNTSkucmVwbGFjZShcIk1cIiwgTS50b1N0cmluZygpKTtcbiAgfVxuICByZXR1cm4gcGF0dGVyblN0cjtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBQYXJzZXMgYSBkYXRlIGZyb20gYSBzcGVjaWZpZWQgZm9ybWF0XG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0XG4gKiBAcGFyYW0ge3N0cmluZyB8IERhdGUgfCBudW1iZXJ9IFt2XVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGUoZm9ybWF0OiBzdHJpbmcsIHY/OiBzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKSB7XG4gIGxldCB2YWx1ZTogRGF0ZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBpZiAoIXYpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgaWYgKHYgaW5zdGFuY2VvZiBEYXRlKVxuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KGZvcm1hdERhdGUodiBhcyBEYXRlLCBmb3JtYXQpLCBmb3JtYXQpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBzZihcIkNvdWxkIG5vdCBjb252ZXJ0IGRhdGUgezB9IHRvIGZvcm1hdDogezF9XCIsIHYudG9TdHJpbmcoKSwgZm9ybWF0KVxuICAgICAgKTtcbiAgICB9XG4gIGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgdmFsdWUgPSBkYXRlRnJvbUZvcm1hdCh2LCBmb3JtYXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKHYpO1xuICAgIHZhbHVlID0gZGF0ZUZyb21Gb3JtYXQoZm9ybWF0RGF0ZShkLCBmb3JtYXQpLCBmb3JtYXQpO1xuICB9IGVsc2UgaWYgKGlzVmFsaWREYXRlKHYpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2KTtcbiAgICAgIHZhbHVlID0gZGF0ZUZyb21Gb3JtYXQoZm9ybWF0RGF0ZShkLCBmb3JtYXQpLCBmb3JtYXQpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgc2YoXCJDb3VsZCBub3QgY29udmVydCBkYXRlIHswfSB0byBmb3JtYXQ6IHsxfVwiLCB2LCBmb3JtYXQpXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWUgcHJvdmlkZWQgJHt2fWApO1xuICB9XG4gIHJldHVybiBiaW5kRGF0ZVRvU3RyaW5nKHZhbHVlLCBmb3JtYXQpO1xufVxuIiwiaW1wb3J0IHtcbiAgRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJFbmQsXG4gIERlY29yYXRpb25CdWlsZGVyTWlkLFxuICBEZWNvcmF0aW9uQnVpbGRlclN0YXJ0LFxuICBGbGF2b3VyUmVzb2x2ZXIsXG4gIElEZWNvcmF0aW9uQnVpbGRlcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlZmF1bHRGbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmZ1bmN0aW9uIGRlZmF1bHRGbGF2b3VyUmVzb2x2ZXIodGFyZ2V0OiBvYmplY3QpIHtcbiAgcmV0dXJuIERlZmF1bHRGbGF2b3VyO1xufVxuXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JUeXBlcyA9XG4gIHwgQ2xhc3NEZWNvcmF0b3JcbiAgfCBQcm9wZXJ0eURlY29yYXRvclxuICB8IE1ldGhvZERlY29yYXRvcjtcblxuZXhwb3J0IHR5cGUgRGVjb3JhdG9yRmFjdG9yeSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gRGVjb3JhdG9yVHlwZXM7XG5cbmV4cG9ydCB0eXBlIERlY29yYXRvckZhY3RvcnlBcmdzID0ge1xuICBkZWNvcmF0b3I6IERlY29yYXRvckZhY3Rvcnk7XG4gIGFyZ3M/OiBhbnlbXTtcbiAgdHJhbnNmb3JtPzogKGFyZ3M6IGFueVtdKSA9PiBhbnlbXTtcbn07XG5cbmV4cG9ydCB0eXBlIERlY29yYXRvckRhdGEgPSBEZWNvcmF0b3JUeXBlcyB8IERlY29yYXRvckZhY3RvcnlBcmdzO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBkZWNvcmF0b3IgbWFuYWdlbWVudCBjbGFzcyB0aGF0IGhhbmRsZXMgZmxhdm91cmVkIGRlY29yYXRvcnNcbiAqIEBzdW1tYXJ5IFRoZSBEZWNvcmF0aW9uIGNsYXNzIHByb3ZpZGVzIGEgYnVpbGRlciBwYXR0ZXJuIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgZGVjb3JhdG9ycyB3aXRoIGRpZmZlcmVudCBmbGF2b3Vycy5cbiAqIEl0IHN1cHBvcnRzIHJlZ2lzdGVyaW5nLCBleHRlbmRpbmcsIGFuZCBhcHBseWluZyBkZWNvcmF0b3JzIHdpdGggY29udGV4dC1hd2FyZSBmbGF2b3VyIHJlc29sdXRpb24uXG4gKiBUaGUgY2xhc3MgaW1wbGVtZW50cyBhIGZsdWVudCBpbnRlcmZhY2UgZm9yIGRlZmluaW5nLCBleHRlbmRpbmcsIGFuZCBhcHBseWluZyBkZWNvcmF0b3JzIHdpdGggZGlmZmVyZW50IGZsYXZvdXJzLFxuICogYWxsb3dpbmcgZm9yIGZyYW1ld29yay1zcGVjaWZpYyBkZWNvcmF0b3IgaW1wbGVtZW50YXRpb25zIHdoaWxlIG1haW50YWluaW5nIGEgY29uc2lzdGVudCBBUEkuXG4gKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBkZWNvcmF0b3IgKENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IpXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXJdIE9wdGlvbmFsIGZsYXZvdXIgcGFyYW1ldGVyIGZvciB0aGUgZGVjb3JhdG9yIGNvbnRleHRcbiAqIEBjbGFzc1xuICogQGNhdGVnb3J5IE1vZGVsXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IGRlY29yYXRpb24gZm9yICdjb21wb25lbnQnIHdpdGggZGVmYXVsdCBmbGF2b3VyXG4gKiBjb25zdCBjb21wb25lbnREZWNvcmF0b3IgPSBuZXcgRGVjb3JhdGlvbigpXG4gKiAgIC5mb3IoJ2NvbXBvbmVudCcpXG4gKiAgIC5kZWZpbmUoY3VzdG9tQ29tcG9uZW50RGVjb3JhdG9yKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBmbGF2b3VyZWQgZGVjb3JhdGlvblxuICogY29uc3QgdnVlQ29tcG9uZW50ID0gbmV3IERlY29yYXRpb24oJ3Z1ZScpXG4gKiAgIC5mb3IoJ2NvbXBvbmVudCcpXG4gKiAgIC5kZWZpbmUodnVlQ29tcG9uZW50RGVjb3JhdG9yKTtcbiAqXG4gKiAvLyBBcHBseSB0aGUgZGVjb3JhdGlvblxuICogQGNvbXBvbmVudERlY29yYXRvclxuICogY2xhc3MgTXlDb21wb25lbnQge31cbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEIGFzIERlY29yYXRpb25cbiAqICAgcGFydGljaXBhbnQgUiBhcyBGbGF2b3VyUmVzb2x2ZXJcbiAqICAgcGFydGljaXBhbnQgRiBhcyBEZWNvcmF0b3JGYWN0b3J5XG4gKlxuICogICBDLT4+RDogbmV3IERlY29yYXRpb24oZmxhdm91cilcbiAqICAgQy0+PkQ6IGZvcihrZXkpXG4gKiAgIEMtPj5EOiBkZWZpbmUoZGVjb3JhdG9ycylcbiAqICAgRC0+PkQ6IHJlZ2lzdGVyKGtleSwgZmxhdm91ciwgZGVjb3JhdG9ycylcbiAqICAgRC0+PkY6IGRlY29yYXRvckZhY3Rvcnkoa2V5LCBmbGF2b3VyKVxuICogICBGLT4+UjogcmVzb2x2ZSh0YXJnZXQpXG4gKiAgIFItLT4+RjogcmVzb2x2ZWQgZmxhdm91clxuICogICBGLT4+RjogYXBwbHkgZGVjb3JhdG9yc1xuICogICBGLS0+PkM6IGRlY29yYXRlZCB0YXJnZXRcbiAqL1xuZXhwb3J0IGNsYXNzIERlY29yYXRpb24gaW1wbGVtZW50cyBJRGVjb3JhdGlvbkJ1aWxkZXIge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBtYXAgb2YgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyBhbGwgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzIG9yZ2FuaXplZCBieSBrZXkgYW5kIGZsYXZvdXJcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRlY29yYXRvcnM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAge1xuICAgICAgICBkZWNvcmF0b3JzPzogU2V0PERlY29yYXRvckRhdGE+O1xuICAgICAgICBleHRyYXM/OiBTZXQ8RGVjb3JhdG9yRGF0YT47XG4gICAgICB9XG4gICAgPlxuICA+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byByZXNvbHZlIGZsYXZvdXIgZnJvbSBhIHRhcmdldFxuICAgKiBAc3VtbWFyeSBSZXNvbHZlciBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgdGhlIGFwcHJvcHJpYXRlIGZsYXZvdXIgZm9yIGEgZ2l2ZW4gdGFyZ2V0XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmbGF2b3VyUmVzb2x2ZXI6IEZsYXZvdXJSZXNvbHZlciA9IGRlZmF1bHRGbGF2b3VyUmVzb2x2ZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXQgb2YgZGVjb3JhdG9ycyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dFxuICAgKi9cbiAgcHJpdmF0ZSBkZWNvcmF0b3JzPzogU2V0PERlY29yYXRvckRhdGE+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0IG9mIGFkZGl0aW9uYWwgZGVjb3JhdG9yc1xuICAgKi9cbiAgcHJpdmF0ZSBleHRyYXM/OiBTZXQ8RGVjb3JhdG9yRGF0YT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IGRlY29yYXRvciBrZXlcbiAgICovXG4gIHByaXZhdGUga2V5Pzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmxhdm91cjogc3RyaW5nID0gRGVmYXVsdEZsYXZvdXIpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBrZXkgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgZGVjb3JhdGlvbiBjaGFpbiB3aXRoIHRoZSBzcGVjaWZpZWQga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBkZWNvcmF0b3JcbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJNaWR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgKi9cbiAgZm9yKGtleTogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJNaWQge1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGRlY29yYXRvcnMgdG8gdGhlIGN1cnJlbnQgY29udGV4dFxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gYWRkIGRlY29yYXRvcnMgd2l0aCBhZGRvbiBzdXBwb3J0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZG9uPWZhbHNlXSBXaGV0aGVyIHRoZSBkZWNvcmF0b3JzIGFyZSBhZGRvbnNcbiAgICogQHBhcmFtIGRlY29yYXRvcnMgQXJyYXkgb2YgZGVjb3JhdG9yc1xuICAgKiBAcmV0dXJuIHt0aGlzfSBDdXJyZW50IGluc3RhbmNlIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBkZWNvcmF0ZShcbiAgICBhZGRvbjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIC4uLmRlY29yYXRvcnM6IERlY29yYXRvckRhdGFbXVxuICApOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMua2V5KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwia2V5IG11c3QgYmUgcHJvdmlkZWQgYmVmb3JlIGRlY29yYXRvcnMgY2FuIGJlIGFkZGVkXCIpO1xuICAgIGlmIChcbiAgICAgICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpICYmXG4gICAgICAhYWRkb24gJiZcbiAgICAgIHRoaXMuZmxhdm91ciAhPT0gRGVmYXVsdEZsYXZvdXJcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTXVzdCBwcm92aWRlIG92ZXJyaWRlcyBvciBhZGRvbnMgdG8gb3ZlcnJpZGUgb3IgZXh0ZW5kIGRlY2FmJ3MgZGVjb3JhdG9yc1wiXG4gICAgICApO1xuICAgIGlmICh0aGlzLmZsYXZvdXIgPT09IERlZmF1bHRGbGF2b3VyICYmIGFkZG9uKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVmYXVsdCBmbGF2b3VyIGNhbm5vdCBiZSBleHRlbmRlZFwiKTtcblxuICAgIHRoaXNbYWRkb24gPyBcImV4dHJhc1wiIDogXCJkZWNvcmF0b3JzXCJdID0gbmV3IFNldChbXG4gICAgICAuLi4odGhpc1thZGRvbiA/IFwiZXh0cmFzXCIgOiBcImRlY29yYXRvcnNcIl0gfHwgbmV3IFNldCgpKS52YWx1ZXMoKSxcbiAgICAgIC4uLmRlY29yYXRvcnMsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB0aGUgYmFzZSBkZWNvcmF0b3JzXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIHByaW1hcnkgZGVjb3JhdG9ycyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dFxuICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBEZWNvcmF0b3JzIHRvIGRlZmluZVxuICAgKiBAcmV0dXJuIEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGZpbmlzaGluZyB0aGUgY2hhaW5cbiAgICovXG4gIGRlZmluZShcbiAgICAuLi5kZWNvcmF0b3JzOiBEZWNvcmF0b3JEYXRhW11cbiAgKTogRGVjb3JhdGlvbkJ1aWxkZXJFbmQgJiBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkIHtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZShmYWxzZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4dGVuZHMgZXhpc3RpbmcgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBBZGRzIGFkZGl0aW9uYWwgZGVjb3JhdG9ycyB0byB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqIEBwYXJhbSBkZWNvcmF0b3JzIEFkZGl0aW9uYWwgZGVjb3JhdG9yc1xuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlckJ1aWxkfSBCdWlsZGVyIGluc3RhbmNlIGZvciBidWlsZGluZyB0aGUgZGVjb3JhdG9yXG4gICAqL1xuICBleHRlbmQoLi4uZGVjb3JhdG9yczogRGVjb3JhdG9yRGF0YVtdKTogRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCB7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdGUodHJ1ZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVjb3JhdG9yRmFjdG9yeShrZXk6IHN0cmluZywgZjogc3RyaW5nID0gRGVmYXVsdEZsYXZvdXIpIHtcbiAgICBjb25zdCBjb250ZXh0RGVjb3JhdG9yID0gZnVuY3Rpb24gY29udGV4dERlY29yYXRvcihcbiAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICAgICkge1xuICAgICAgY29uc3QgZmxhdm91ciA9IERlY29yYXRpb24uZmxhdm91clJlc29sdmVyKHRhcmdldCk7XG4gICAgICBjb25zdCBjYWNoZSA9IERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldO1xuICAgICAgbGV0IGRlY29yYXRvcnM7XG4gICAgICBjb25zdCBleHRyYXMgPSBjYWNoZVtmbGF2b3VyXVxuICAgICAgICA/IGNhY2hlW2ZsYXZvdXJdLmV4dHJhc1xuICAgICAgICA6IGNhY2hlW0RlZmF1bHRGbGF2b3VyXS5leHRyYXM7XG4gICAgICBjb25zdCBleHRyYUFyZ3MgPSBbXG4gICAgICAgIC4uLigoY2FjaGVbRGVmYXVsdEZsYXZvdXJdIGFzIGFueSkuZXh0cmFzXG4gICAgICAgICAgPyAoY2FjaGVbRGVmYXVsdEZsYXZvdXJdIGFzIGFueSkuZXh0cmFzLnZhbHVlcygpXG4gICAgICAgICAgOiBbXSksXG4gICAgICBdLnJlZHVjZSgoYWNjdW06IFJlY29yZDxudW1iZXIsIGFueT4sIGUsIGkpID0+IHtcbiAgICAgICAgaWYgKGUuYXJncykgYWNjdW1baV0gPSBlLmFyZ3M7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgaWYgKFxuICAgICAgICBjYWNoZSAmJlxuICAgICAgICBjYWNoZVtmbGF2b3VyXSAmJlxuICAgICAgICBjYWNoZVtmbGF2b3VyXS5kZWNvcmF0b3JzICYmXG4gICAgICAgIGNhY2hlW2ZsYXZvdXJdLmRlY29yYXRvcnMuc2l6ZVxuICAgICAgKSB7XG4gICAgICAgIGRlY29yYXRvcnMgPSBjYWNoZVtmbGF2b3VyXS5kZWNvcmF0b3JzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb3JhdG9ycyA9IGNhY2hlW0RlZmF1bHRGbGF2b3VyXS5kZWNvcmF0b3JzO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWNvcmF0b3JBcmdzID0gW1xuICAgICAgICAuLi4oY2FjaGVbRGVmYXVsdEZsYXZvdXJdIGFzIGFueSkuZGVjb3JhdG9ycy52YWx1ZXMoKSxcbiAgICAgIF0ucmVkdWNlKChhY2N1bTogUmVjb3JkPG51bWJlciwgYW55PiwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZS5hcmdzKSBhY2N1bVtpXSA9IGUuYXJncztcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwge30pO1xuXG4gICAgICBjb25zdCB0b0FwcGx5ID0gW1xuICAgICAgICAuLi4oZGVjb3JhdG9ycyA/IGRlY29yYXRvcnMudmFsdWVzKCkgOiBbXSksXG4gICAgICAgIC4uLihleHRyYXMgPyBleHRyYXMudmFsdWVzKCkgOiBbXSksXG4gICAgICBdO1xuXG4gICAgICByZXR1cm4gdG9BcHBseS5yZWR1Y2UoXG4gICAgICAgIChfLCBkLCBpKSA9PiB7XG4gICAgICAgICAgc3dpdGNoICh0eXBlb2YgZCkge1xuICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgZGVjb3JhdG9yLCBhcmdzLCB0cmFuc2Zvcm0gfSA9IGQgYXMgRGVjb3JhdG9yRmFjdG9yeUFyZ3M7XG4gICAgICAgICAgICAgIGNvbnN0IGFyZ3ogPVxuICAgICAgICAgICAgICAgIGFyZ3MgfHwgaSA8IChkZWNvcmF0b3JzID8gZGVjb3JhdG9ycy5zaXplIDogMClcbiAgICAgICAgICAgICAgICAgID8gZGVjb3JhdG9yQXJnc1tpXVxuICAgICAgICAgICAgICAgICAgOiBleHRyYUFyZ3NbaSAtIChkZWNvcmF0b3JzID8gZGVjb3JhdG9ycy5zaXplIDogMCldIHx8XG4gICAgICAgICAgICAgICAgICAgIChkZWNvcmF0b3JzID8gZGVjb3JhdG9yQXJnc1tpIC0gZGVjb3JhdG9ycy5zaXplXSA6IFtdKTtcblxuICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IHRyYW5zZm9ybVxuICAgICAgICAgICAgICAgID8gdHJhbnNmb3JtKGFyZ3ogfHwgW10pXG4gICAgICAgICAgICAgICAgOiBhcmd6IHx8IFtdO1xuICAgICAgICAgICAgICByZXR1cm4gKGRlY29yYXRvciguLi50cmFuc2Zvcm1lZCkgYXMgYW55KShcbiAgICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgICAgIHJldHVybiAoZCBhcyBhbnkpKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGRlY29yYXRvciB0eXBlOiAke3R5cGVvZiBkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgeyB0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yIH1cbiAgICAgICk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGV4dERlY29yYXRvciwgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBbZiwga2V5XS5qb2luKFwiX2RlY29yYXRvcl9mb3JfXCIpLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiBjb250ZXh0RGVjb3JhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHRoZSBmaW5hbCBkZWNvcmF0b3IgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgQnVpbGRzIGFuZCByZXR1cm5zIHRoZSBkZWNvcmF0b3IgZmFjdG9yeSBmdW5jdGlvblxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueT8sIFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPyk6IGFueX0gVGhlIGdlbmVyYXRlZCBkZWNvcmF0b3IgZnVuY3Rpb25cbiAgICovXG4gIGFwcGx5KCk6IChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApID0+IGFueSB7XG4gICAgaWYgKCF0aGlzLmtleSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBEZWNvcmF0aW9uLnJlZ2lzdGVyKFxuICAgICAgdGhpcy5rZXksXG4gICAgICB0aGlzLmZsYXZvdXIsXG4gICAgICB0aGlzLmRlY29yYXRvcnMgfHwgbmV3IFNldCgpLFxuICAgICAgdGhpcy5leHRyYXNcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRvckZhY3RvcnkodGhpcy5rZXksIHRoaXMuZmxhdm91cik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBkZWNvcmF0b3JzIGZvciBhIHNwZWNpZmljIGtleSBhbmQgZmxhdm91clxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gc3RvcmUgZGVjb3JhdG9ycyBpbiB0aGUgc3RhdGljIHJlZ2lzdHJ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgRGVjb3JhdG9yIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciBEZWNvcmF0b3IgZmxhdm91clxuICAgKiBAcGFyYW0gW2RlY29yYXRvcnNdIFByaW1hcnkgZGVjb3JhdG9yc1xuICAgKiBAcGFyYW0gW2V4dHJhc10gQWRkaXRpb25hbCBkZWNvcmF0b3JzXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWdpc3RlcihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmbGF2b3VyOiBzdHJpbmcsXG4gICAgZGVjb3JhdG9ycz86IFNldDxEZWNvcmF0b3JEYXRhPixcbiAgICBleHRyYXM/OiBTZXQ8RGVjb3JhdG9yRGF0YT5cbiAgKSB7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICB9XG4gICAgaWYgKCFkZWNvcmF0b3JzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gZGVjb3JhdG9ycyBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBpZiAoIWZsYXZvdXIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBmbGF2b3VyIHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuXG4gICAgaWYgKCFEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XSkgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV0gPSB7fTtcbiAgICBpZiAoIURlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdKVxuICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0gPSB7fTtcbiAgICBpZiAoZGVjb3JhdG9ycykgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZGVjb3JhdG9ycyA9IGRlY29yYXRvcnM7XG4gICAgaWYgKGV4dHJhcykgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZXh0cmFzID0gZXh0cmFzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBnbG9iYWwgZmxhdm91ciByZXNvbHZlclxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBkZWNvcmF0b3IgZmxhdm91cnNcbiAgICogQHBhcmFtIHtGbGF2b3VyUmVzb2x2ZXJ9IHJlc29sdmVyIEZ1bmN0aW9uIHRvIHJlc29sdmUgZmxhdm91cnNcbiAgICovXG4gIHN0YXRpYyBzZXRGbGF2b3VyUmVzb2x2ZXIocmVzb2x2ZXI6IEZsYXZvdXJSZXNvbHZlcikge1xuICAgIERlY29yYXRpb24uZmxhdm91clJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICBzdGF0aWMgZm9yKGtleTogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJNaWQge1xuICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbigpLmZvcihrZXkpO1xuICB9XG5cbiAgc3RhdGljIGZsYXZvdXJlZEFzKGZsYXZvdXI6IHN0cmluZyk6IERlY29yYXRpb25CdWlsZGVyU3RhcnQge1xuICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihmbGF2b3VyKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERlY29yYXRpb24gfSBmcm9tIFwiLi9EZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgZmFjdG9yeSBmb3IgbW9kZWwgYXR0cmlidXRlc1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IG1hcmtzIGNsYXNzIHByb3BlcnRpZXMgYXMgbW9kZWwgYXR0cmlidXRlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5PU1vZGVsS2V5cy5BVFRSSUJVVEVdIC0gVGhlIG1ldGFkYXRhIGtleSB1bmRlciB3aGljaCB0byBzdG9yZSB0aGUgcHJvcGVydHkgbmFtZVxuICogQHJldHVybiB7ZnVuY3Rpb24ob2JqZWN0LCBhbnk/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+IHN0cmluZykpW10gfCBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuVFlQRSk7XG4gIGNvbnN0IG1ldGE6IFR5cGVNZXRhZGF0YSA9IHtcbiAgICBjdXN0b21UeXBlczogdHlwZXMsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBkZXNjcmlwdGlvbjogXCJkZWZpbmVzIHRoZSBhY2NlcHRlZCB0eXBlcyBmb3IgdGhlIGF0dHJpYnV0ZVwiLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPFR5cGVNZXRhZGF0YT4sXG4gICAgICBhcmdzOiBbdHlwZSwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVNZXRhZGF0YSBleHRlbmRzIERhdGVWYWxpZGF0b3JPcHRpb25zIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERhdGUgSGFuZGxlciBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjREFURX1cbiAqXG4gKiBXaWxsIGVuZm9yY2Ugc2VyaWFsaXphdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGZvcm1hdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgYWNjZXB0ZWQgZm9ybWF0IGFjY29yZGluZyB0byB7QGxpbmsgZm9ybWF0RGF0ZX1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0RBVEV9XG4gKlxuICogQGZ1bmN0aW9uIGRhdGVcbiAqXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0ZShcbiAgZm9ybWF0OiBzdHJpbmcgPSBcImRkL01NL3l5eXlcIixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5EQVRFXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuREFURSk7XG4gIGNvbnN0IG1ldGE6IERhdGVNZXRhZGF0YSA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuRk9STUFUXTogZm9ybWF0LFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtEYXRlLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgYXR0cmlidXRlIGFzIGEgZGF0ZSB3aXRoIHRoZSBmb3JtYXQgJHtmb3JtYXR9YCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIGZ1bmN0aW9uIGRhdGVEZWModGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwcm9wZXJ0eUtleT86IGFueSk6IGFueSB7XG4gICAgY29uc3QgdmFsdWVzID0gbmV3IFdlYWtNYXAoKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHNldCh0aGlzOiBhbnksIG5ld1ZhbHVlOiBzdHJpbmcgfCBEYXRlKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKVxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6ICgpID0+IHZhbHVlcy5nZXQodGhpcyksXG4gICAgICAgICAgICBzZXQ6IChuZXdWYWx1ZTogc3RyaW5nIHwgRGF0ZSB8IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICBsZXQgdmFsOiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhbCA9IHBhcnNlRGF0ZShmb3JtYXQsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMuc2V0KHRoaXMsIHZhbCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Ioc2YoXCJGYWlsZWQgdG8gcGFyc2UgZGF0ZTogezB9XCIsIGUubWVzc2FnZSB8fCBlKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIHRoaXNbcHJvcGVydHlLZXldID0gbmV3VmFsdWU7XG4gICAgICB9LFxuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdmFsdWVzLmdldCh0aGlzKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YShkYXRlLCBrZXksIG1ldGEpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICB9XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpLmRlZmluZShkYXRlRGVjKS5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFBhc3N3b3JkIEhhbmRsZXIgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1BBU1NXT1JEfVxuICpcbiAqIEBwYXJhbSB7UmVnRXhwfSBbcGF0dGVybl0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfUEFUVEVSTlMjQ0hBUjhfT05FX09GX0VBQ0h9XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNQQVNTV09SRH1cbiAqXG4gKiBAZnVuY3Rpb24gcGFzc3dvcmRcbiAqXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFzc3dvcmQoXG4gIHBhdHRlcm46IFJlZ0V4cCA9IERFRkFVTFRfUEFUVEVSTlMuUEFTU1dPUkQuQ0hBUjhfT05FX09GX0VBQ0gsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUEFTU1dPUkRcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5QQVNTV09SRCk7XG4gIGNvbnN0IG1ldGE6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXTogcGF0dGVybi50b1N0cmluZygpLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtTdHJpbmcubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBhdHRyaWJ1dGUgYXMgYSBwYXNzd29yZGAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGEsXG4gICAgICBhcmdzOiBbcGFzc3dvcmQsIGtleSwgbWV0YV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0TWV0YWRhdGEgZXh0ZW5kcyBMaXN0VmFsaWRhdG9yT3B0aW9ucyB7XG4gIHR5cGU6IFwiQXJyYXlcIiB8IFwiU2V0XCI7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgTGlzdCBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBBbHNvIHNldHMgdGhlIHtAbGluayB0eXBlfSB0byB0aGUgcHJvdmlkZWQgY29sbGVjdGlvblxuICpcbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcn0gY2xhenpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29sbGVjdGlvbl0gVGhlIGNvbGxlY3Rpb24gYmVpbmcgdXNlZC4gZGVmYXVsdHMgdG8gQXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTElTVH1cbiAqXG4gKiBAZnVuY3Rpb24gbGlzdFxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0KFxuICBjbGF6ejpcbiAgICB8IENvbnN0cnVjdG9yPGFueT5cbiAgICB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KVxuICAgIHwgKENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PikpW10sXG4gIGNvbGxlY3Rpb246IFwiQXJyYXlcIiB8IFwiU2V0XCIgPSBcIkFycmF5XCIsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTElTVFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxJU1QpO1xuICBjb25zdCBtZXRhOiBMaXN0TWV0YWRhdGEgPSB7XG4gICAgY2xheno6IChBcnJheS5pc0FycmF5KGNsYXp6KVxuICAgICAgPyBjbGF6ei5tYXAoKGMpID0+IChjLm5hbWUgPyBjLm5hbWUgOiBjKSlcbiAgICAgIDogW2NsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogY2xhenpdKSBhcyAoXG4gICAgICB8IHN0cmluZ1xuICAgICAgfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PilcbiAgICApW10sXG4gICAgdHlwZTogY29sbGVjdGlvbixcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIGF0dHJpYnV0ZSBhcyBhICR7Y29sbGVjdGlvbn0gb2YgJHsoY2xhenogYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+KS5uYW1lfWAsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YSxcbiAgICAgIGFyZ3M6IFtsaXN0LCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgU2V0IERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIFdyYXBwZXIgZm9yIHtAbGluayBsaXN0fSB3aXRoIHRoZSAnU2V0JyBDb2xsZWN0aW9uXG4gKlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yfSBjbGF6elxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNMSVNUfVxuICpcbiAqIEBmdW5jdGlvbiBzZXRcbiAqXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0KFxuICBjbGF6ejogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxJU1Rcbikge1xuICByZXR1cm4gbGlzdChjbGF6eiwgXCJTZXRcIiwgbWVzc2FnZSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgZXF1YWwgdG8gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkVRVUFMU30gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIG1hdGNoZXMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlUb0NvbXBhcmUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29tcGFyZSBlcXVhbGl0eSBhZ2FpbnN0LlxuICogQHBhcmFtIHtDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSB2YWxpZGF0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWxdIC0gVGhlIGxhYmVsIHRleHQgZGlzcGxheWVkIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5FUVVBTFNdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gYmUgcmV0dXJuZWQgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGVxdWFsaXR5IHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gKlxuICogQGZ1bmN0aW9uIGVxXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXEoXG4gIHByb3BlcnR5VG9Db21wYXJlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBPbWl0PENvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zLCBcImFzeW5jXCIgfCBcImRlc2NyaXB0aW9uXCI+XG4gIC8vIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRVFVQUxTXG4pIHtcbiAgY29uc3QgZXF1YWxzT3B0aW9uczogRXF1YWxzVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBsYWJlbDogb3B0aW9ucz8ubGFiZWwgfHwgcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgbWVzc2FnZTogb3B0aW9ucz8ubWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkVRVUFMUyxcbiAgICBbVmFsaWRhdGlvbktleXMuRVFVQUxTXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBlcXVhbCB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGVxLFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkVRVUFMUyksXG4gICAgeyAuLi5lcXVhbHNPcHRpb25zLCBhc3luYzogZmFsc2UgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuRElGRn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5VG9Db21wYXJlIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbXBhcmUgZGlmZmVyZW5jZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSB2YWxpZGF0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWxdIC0gVGhlIGxhYmVsIHRleHQgZGlzcGxheWVkIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5ESUZGXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGJlIHJldHVybmVkIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBkaWZmZXJlbmNlIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gKlxuICogQGZ1bmN0aW9uIGRpZmZcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBvcHRpb25zPzogT21pdDxDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9ucywgXCJhc3luY1wiIHwgXCJkZXNjcmlwdGlvblwiPlxuKSB7XG4gIGNvbnN0IGRpZmZPcHRpb25zOiBEaWZmVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBsYWJlbDogb3B0aW9ucz8ubGFiZWwgfHwgcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgbWVzc2FnZTogb3B0aW9ucz8ubWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkRJRkYsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkRJRkZdOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgYXR0cmlidXRlIGFzIGRpZmZlcmVudCB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGRpZmYsXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuRElGRiksXG4gICAge1xuICAgICAgLi4uZGlmZk9wdGlvbnMsXG4gICAgICBhc3luYzogZmFsc2UsXG4gICAgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBsZXNzIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge0NvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIHZhbGlkYXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbF0gLSBUaGUgbGFiZWwgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubWVzc2FnZT1ERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTl0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBiZSByZXR1cm5lZCBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgbGVzcyB0aGFuIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gKlxuICogQGZ1bmN0aW9uIGx0XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbHQoXG4gIHByb3BlcnR5VG9Db21wYXJlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBPbWl0PENvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zLCBcImFzeW5jXCIgfCBcImRlc2NyaXB0aW9uXCI+XG4pIHtcbiAgY29uc3QgbHRPcHRpb25zOiBMZXNzVGhhblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbGFiZWw6IG9wdGlvbnM/LmxhYmVsIHx8IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIG1lc3NhZ2U6IG9wdGlvbnM/Lm1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU4sXG4gICAgW1ZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl06IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyBhdHRyaWJ1dGUgYXMgbGVzcyB0aGFuIHRvICR7cHJvcGVydHlUb0NvbXBhcmV9YCxcbiAgfTtcblxuICByZXR1cm4gdmFsaWRhdGlvbk1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgbHQsXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTEVTU19USEFOKSxcbiAgICB7IC4uLmx0T3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgZXF1YWwgb3IgbGVzcyB0aGFuIGFub3RoZXIgc3BlY2lmaWVkIHByb3BlcnR5LlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUx9IHZhbGlkYXRvciB0byBlbnN1cmUgdGhlIGRlY29yYXRlZCB2YWx1ZSBpcyBlcXVhbCBvciBsZXNzIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlUb0NvbXBhcmUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSB2YWxpZGF0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWxdIC0gVGhlIGxhYmVsIHRleHQgZGlzcGxheWVkIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5fT1JfRVFVQUxdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gYmUgcmV0dXJuZWQgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGxlc3MgdGhhbiBvciBlcXVhbCB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBsdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsdGUoXG4gIHByb3BlcnR5VG9Db21wYXJlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBPbWl0PENvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zLCBcImFzeW5jXCIgfCBcImRlc2NyaXB0aW9uXCI+XG4pIHtcbiAgY29uc3QgbHRlT3B0aW9uczogTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBsYWJlbDogb3B0aW9ucz8ubGFiZWwgfHwgcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgbWVzc2FnZTogb3B0aW9ucz8ubWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTl9PUl9FUVVBTCxcbiAgICBbVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBsZXNzIG9yIGVxdWFsIHRvICR7cHJvcGVydHlUb0NvbXBhcmV9YCxcbiAgfTtcblxuICByZXR1cm4gdmFsaWRhdGlvbk1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgbHRlLFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTCksXG4gICAgeyAuLi5sdGVPcHRpb25zLCBhc3luYzogZmFsc2UgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge0NvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIHZhbGlkYXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbF0gLSBUaGUgbGFiZWwgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubWVzc2FnZT1ERUZBVUxUX0VSUk9SX01FU1NBR0VTLkdSRUFURVJfVEhBTl0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBiZSByZXR1cm5lZCBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgZ3JlYXRlciB0aGFuIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gKlxuICogQGZ1bmN0aW9uIGd0XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ3QoXG4gIHByb3BlcnR5VG9Db21wYXJlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBPbWl0PENvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zLCBcImFzeW5jXCIgfCBcImRlc2NyaXB0aW9uXCI+XG4pIHtcbiAgY29uc3QgZ3RPcHRpb25zOiBHcmVhdGVyVGhhblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbGFiZWw6IG9wdGlvbnM/LmxhYmVsIHx8IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIG1lc3NhZ2U6IG9wdGlvbnM/Lm1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU4sXG4gICAgW1ZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl06IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyBhdHRyaWJ1dGUgYXMgZ3JlYXRlciB0aGFuICR7cHJvcGVydHlUb0NvbXBhcmV9YCxcbiAgfTtcblxuICByZXR1cm4gdmFsaWRhdGlvbk1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgZ3QsXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOKSxcbiAgICB7IC4uLmd0T3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGFub3RoZXIgc3BlY2lmaWVkIHByb3BlcnR5LlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUx9IHZhbGlkYXRvciB0byBlbnN1cmUgdGhlIGRlY29yYXRlZCB2YWx1ZSBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlUb0NvbXBhcmUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSB2YWxpZGF0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWxdIC0gVGhlIGxhYmVsIHRleHQgZGlzcGxheWVkIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gYmUgcmV0dXJuZWQgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBndGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBndGUoXG4gIHByb3BlcnR5VG9Db21wYXJlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBPbWl0PENvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zLCBcImFzeW5jXCIgfCBcImRlc2NyaXB0aW9uXCI+XG4pIHtcbiAgY29uc3QgZ3RlT3B0aW9uczogR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBsYWJlbDogb3B0aW9ucz8ubGFiZWwgfHwgcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgbWVzc2FnZTogb3B0aW9ucz8ubWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkdSRUFURVJfVEhBTl9PUl9FUVVBTCxcbiAgICBbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBncmVhdGVyIG9yIGVxdWFsIHRvICR7cHJvcGVydHlUb0NvbXBhcmV9YCxcbiAgfTtcblxuICByZXR1cm4gdmFsaWRhdGlvbk1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgZ3RlLFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTCksXG4gICAgeyAuLi5ndGVPcHRpb25zLCBhc3luYzogZmFsc2UgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBieSBpbnZva2luZyBhIGNvbnN0cnVjdG9yIHdpdGggZHluYW1pYyBhcmd1bWVudHMuXG4gKiBAc3VtbWFyeSBPdmVycmlkZXMgc3RhbmRhcmQgY29uc3RydWN0aW9uIHBhdHRlcm5zIGJ5IHdyYXBwaW5nIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciB0byBhbGxvdyBzcHJlYWQgYXJndW1lbnQgaW52b2NhdGlvbiB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBwcm90b3R5cGUgY2hhaW4uXG4gKiBAdGVtcGxhdGUgTSB0aGUgbW9kZWwgaW5zdGFuY2UgdHlwZVxuICogQHBhcmFtIHthbnl9IGNvbnN0cnVjdG9yIFRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAqIEByZXR1cm4ge019IFRoZSBuZXdseSBjb25zdHJ1Y3RlZCBpbnN0YW5jZS5cbiAqIEBmdW5jdGlvbiBjb25zdHJ1Y3RcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdDxNIGV4dGVuZHMgTW9kZWw+KFxuICBjb25zdHJ1Y3RvcjogYW55LFxuICAuLi5hcmdzOiBhbnlbXVxuKTogTSB7XG4gIGNvbnN0IF9jb25zdHIgPSAoLi4uYXJnejogYW55W10pID0+IG5ldyBjb25zdHJ1Y3RvciguLi5hcmd6KTtcbiAgX2NvbnN0ci5wcm90b3R5cGUgPSBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIHJldHVybiBfY29uc3RyKC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBmaW5kcyB0aGUgbGFzdCBwcm90b3R5cGUgaW4gdGhlIGNoYWluIGJlZm9yZSByZWFjaGluZyBPYmplY3QucHJvdG90eXBlLlxuICogQHN1bW1hcnkgV2Fsa3MgdXAgdGhlIHByb3RvdHlwZSBjaGFpbiB0byBsb2NhdGUgdGhlIG1vc3QgZGVyaXZlZCBwcm90b3R5cGUgdGhhdCBzdGlsbCBwcmVjZWRlcyB0aGUgYmFzZSBPYmplY3QgcHJvdG90eXBlLlxuICogQHBhcmFtIHtvYmplY3R9IG9iaiBUaGUgb2JqZWN0IHdob3NlIHByb3RvdHlwZSBjaGFpbiB3aWxsIGJlIGluc3BlY3RlZC5cbiAqIEByZXR1cm4ge29iamVjdH0gVGhlIGxhc3QgcHJvdG90eXBlIGJlZm9yZSBPYmplY3QucHJvdG90eXBlLCBvciB0aGUgaW5wdXQgb2JqZWN0IGlmIGl0cyBwcm90b3R5cGUgaXMgT2JqZWN0LnByb3RvdHlwZS5cbiAqIEBmdW5jdGlvbiBmaW5kTGFzdFByb3RvQmVmb3JlT2JqZWN0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdFByb3RvQmVmb3JlT2JqZWN0KG9iajogb2JqZWN0KTogb2JqZWN0IHtcbiAgbGV0IHByb3RvdHlwZTogYW55ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gIGlmIChwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBvYmo7XG4gIHdoaWxlIChwcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICBpZiAocHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlKSByZXR1cm4gcHJvdG90eXBlO1xuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIHByb3RvdHlwZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBwcm9wZXIgcHJvdG90eXBlXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCaW5kcyB0aGUgTW9kZWwgY2xhc3MgYXMgdGhlIHJvb3QgcHJvdG90eXBlIG9mIHRoZSBwcm92aWRlZCBpbnN0YW5jZSB3aGVuIG5vdCBhbHJlYWR5IGEgTW9kZWwuXG4gKiBAc3VtbWFyeSBFbnN1cmVzIG9iamVjdHMgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBNb2RlbCBpbmhlcml0YW5jZSBjaGFpbiBnYWluIE1vZGVsIGFzIHRoZWlyIHVsdGltYXRlIHByb3RvdHlwZSB0byBhY2Nlc3MgbW9kZWwgdXRpbGl0aWVzLlxuICogQHBhcmFtIHt1bmtub3dufSBvYmogVGhlIG9iamVjdCB0byBiaW5kIHRvIHRoZSBNb2RlbCBwcm90b3R5cGUgY2hhaW4uXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGZ1bmN0aW9uIGJpbmRNb2RlbFByb3RvdHlwZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgRm4gYXMgYmluZE1vZGVsUHJvdG90eXBlXG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWwucHJvdG90eXBlXG4gKiAgIENhbGxlci0+PkZuOiBvYmpcbiAqICAgYWx0IG9iaiBpbnN0YW5jZW9mIE1vZGVsXG4gKiAgICAgRm4tLT4+Q2FsbGVyOiByZXR1cm5cbiAqICAgZWxzZSBvYmogY2hhaW4gZW5kcyBhdCBPYmplY3QucHJvdG90eXBlXG4gKiAgICAgRm4tPj5Gbjogc2V0UHJvdG90eXBlT2Yob2JqLCBNKVxuICogICAgIEZuLS0+PkNhbGxlcjogcmV0dXJuXG4gKiAgIGVsc2UgZGVlcCBwcm90b3R5cGUgY2hhaW5cbiAqICAgICBGbi0+PkZuOiB3YWxrIHByb3RvdHlwZXNcbiAqICAgICBGbi0+PkZuOiBzZXRQcm90b3R5cGVPZihsYXN0LCBNKVxuICogICAgIEZuLS0+PkNhbGxlcjogcmV0dXJuXG4gKiAgIGVuZFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZE1vZGVsUHJvdG90eXBlKG9iajogdW5rbm93bikge1xuICBpZiAob2JqIGluc3RhbmNlb2YgTW9kZWwpIHJldHVybjtcblxuICBmdW5jdGlvbiBiaW5kUHJvdG90eXBlKG9ialRvT3ZlcnJpZGU6IHVua25vd24sIHByb3RvdHlwZTogb2JqZWN0KSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKG9ialRvT3ZlcnJpZGUsIHByb3RvdHlwZSk7XG4gIH1cblxuICBjb25zdCBwcm90b3R5cGU6IGFueSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICBpZiAocHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuIGJpbmRQcm90b3R5cGUob2JqLCBNb2RlbC5wcm90b3R5cGUpO1xuICB9XG4gIHdoaWxlIChwcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBjb25zdCBwcm90ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSk7XG4gICAgaWYgKFxuICAgICAgcHJvdCA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fFxuICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3QpID09PSBPYmplY3QucHJvdG90eXBlXG4gICAgKSB7XG4gICAgICByZXR1cm4gYmluZFByb3RvdHlwZShwcm90b3R5cGUsIE1vZGVsLnByb3RvdHlwZSk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHByb3BlciBwcm90b3R5cGUgdG8gYmluZFwiKTtcbn1cbiIsImltcG9ydCB7IGJpbmRNb2RlbFByb3RvdHlwZSwgY29uc3RydWN0IH0gZnJvbSBcIi4vY29uc3RydWN0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuL01vZGVsXCI7XG5pbXBvcnQgeyBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgRGVjb3JhdGlvbiwgRGVjb3JhdGlvbktleXMsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbEJhc2VEZWNvcmF0b3Iob3JpZ2luYWw6IGFueSkge1xuICAvLyB0aGUgbmV3IGNvbnN0cnVjdG9yIGJlaGF2aW91clxuICBjb25zdCBuZXdDb25zdHJ1Y3RvcjogYW55ID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgaW5zdGFuY2U6IFJldHVyblR5cGU8dHlwZW9mIG9yaWdpbmFsPiA9IGNvbnN0cnVjdChvcmlnaW5hbCwgLi4uYXJncyk7XG4gICAgYmluZE1vZGVsUHJvdG90eXBlKGluc3RhbmNlKTtcblxuICAgIC8vIHJlLWFwcGx5IG9yaWdpbmFsIGNvbnN0cnVjdG9yXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlLCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBvcmlnaW5hbCxcbiAgICB9KTtcblxuICAgIC8vIHJ1biBhIGJ1aWxkZXIgZnVuY3Rpb24gaWYgZGVmaW5lZCB3aXRoIHRoZSBmaXJzdCBhcmd1bWVudCAoVGhlIE1vZGVsQXJnKVxuICAgIGNvbnN0IGJ1aWxkZXIgPSBNb2RlbC5nZXRCdWlsZGVyKCk7XG4gICAgaWYgKGJ1aWxkZXIpIGJ1aWxkZXIoaW5zdGFuY2UsIGFyZ3MubGVuZ3RoID8gYXJnc1swXSA6IHVuZGVmaW5lZCk7XG5cbiAgICBtZXRhZGF0YShNb2RlbC5rZXkoTW9kZWxLZXlzLk1PREVMKSwgb3JpZ2luYWwubmFtZSkoaW5zdGFuY2UuY29uc3RydWN0b3IpO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xuXG4gIC8vIGNvcHkgcHJvdG90eXBlIHNvIGluc3RhbmNlb2Ygb3BlcmF0b3Igc3RpbGwgd29ya3NcbiAgbmV3Q29uc3RydWN0b3IucHJvdG90eXBlID0gb3JpZ2luYWwucHJvdG90eXBlO1xuXG4gIG1ldGFkYXRhKE1vZGVsLmtleShNb2RlbEtleXMuTU9ERUwpLCBvcmlnaW5hbC5uYW1lKShvcmlnaW5hbCk7XG5cbiAgUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMob3JpZ2luYWwpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBrZXksXG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKGtleSwgb3JpZ2luYWwpLFxuICAgICAgbmV3Q29uc3RydWN0b3JcbiAgICApO1xuICB9KTtcbiAgLy8gU2V0cyB0aGUgcHJvcGVyIGNvbnN0cnVjdG9yIG5hbWUgZm9yIHR5cGUgdmVyaWZpY2F0aW9uXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdDb25zdHJ1Y3RvciwgXCJuYW1lXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBvcmlnaW5hbC5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZSxcbiAgfSk7XG4gIC8vXG4gIC8vIGFuY2hvcnMgdGhlIG9yaWdpbmFsIGNvbnN0cnVjdG9yIGZvciBmdXR1cmUgcmVmZXJlbmNlXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdDb25zdHJ1Y3RvciwgTW9kZWxLZXlzLkFOQ0hPUiwge1xuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBvcmlnaW5hbCxcbiAgfSk7XG5cbiAgTWV0YWRhdGEuc2V0KG5ld0NvbnN0cnVjdG9yLCBEZWNvcmF0aW9uS2V5cy5DT05TVFJVQ1RPUiwgb3JpZ2luYWwpO1xuICAvL1xuICAvLyAvLyBhbmNob3JzIHRoZSBuZXcgY29uc3RydWN0b3IgZm9yIGZ1dHVyZSByZWZlcmVuY2VcbiAgLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KG9yaWdpbmFsLCBNb2RlbEtleXMuQU5DSE9SLCB7XG4gIC8vICAgd3JpdGFibGU6IGZhbHNlLFxuICAvLyAgIGVudW1lcmFibGU6IHRydWUsXG4gIC8vICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgLy8gICB2YWx1ZTogbmV3Q29uc3RydWN0b3IsXG4gIC8vIH0pO1xuXG4gIE1vZGVsLnJlZ2lzdGVyKG5ld0NvbnN0cnVjdG9yLCBvcmlnaW5hbC5uYW1lKTtcblxuICAvLyByZXR1cm4gbmV3IGNvbnN0cnVjdG9yICh3aWxsIG92ZXJyaWRlIG9yaWdpbmFsKVxuICByZXR1cm4gbmV3Q29uc3RydWN0b3I7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGEgTW9kZWwgY2xhc3NcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIC0gUmVnaXN0ZXJzIHRoZSBjbGFzcyB1bmRlciB0aGUgbW9kZWwgcmVnaXN0cnkgc28gaXQgY2FuIGJlIGVhc2lseSByZWJ1aWx0O1xuICogLSBPdmVycmlkZXMgdGhlIGNsYXNzIGNvbnN0cnVjdG9yO1xuICogLSBSdW5zIHRoZSBnbG9iYWwge0BsaW5rIE1vZGVsQnVpbGRlckZ1bmN0aW9ufSBpZiBkZWZpbmVkO1xuICpcbiAqIEBmdW5jdGlvbiBtb2RlbFxuICpcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbCgpIHtcbiAgY29uc3Qga2V5ID0gTW9kZWwua2V5KE1vZGVsS2V5cy5NT0RFTCk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpLmRlZmluZShtb2RlbEJhc2VEZWNvcmF0b3IpLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgaGFzaGluZyBhbGdvcml0aG0gdG8gdXNlIG9uIHRoZSBtb2RlbFxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogLSBSZWdpc3RlcnMgdGhlIGNsYXNzIHVuZGVyIHRoZSBtb2RlbCByZWdpc3RyeSBzbyBpdCBjYW4gYmUgZWFzaWx5IHJlYnVpbHQ7XG4gKiAtIE92ZXJyaWRlcyB0aGUgY2xhc3MgY29uc3RydWN0b3I7XG4gKiAtIFJ1bnMgdGhlIGdsb2JhbCB7QGxpbmsgTW9kZWxCdWlsZGVyRnVuY3Rpb259IGlmIGRlZmluZWQ7XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFsZ29yaXRobSB0aGUgYWxnb3JpdGhtIHRvIHVzZVxuICpcbiAqIEBmdW5jdGlvbiBoYXNoZWRCeVxuICpcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoZWRCeShhbGdvcml0aG06IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgcmV0dXJuIG1ldGFkYXRhKE1vZGVsLmtleShNb2RlbEtleXMuSEFTSElORyksIHtcbiAgICBhbGdvcml0aG06IGFsZ29yaXRobSxcbiAgICBhcmdzOiBhcmdzLFxuICB9KTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzZXJpYWxpemF0aW9uIGFsZ29yaXRobSB0byB1c2Ugb24gdGhlIG1vZGVsXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNlcmlhbGl6ZXIgdGhlIGFsZ29yaXRobSB0byB1c2VcbiAqXG4gKiBAZnVuY3Rpb24gc2VyaWFsaXplZEJ5XG4gKlxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZWRCeShzZXJpYWxpemVyOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gIHJldHVybiBtZXRhZGF0YShNb2RlbC5rZXkoTW9kZWxLZXlzLlNFUklBTElaQVRJT04pLCB7XG4gICAgc2VyaWFsaXplcjogc2VyaWFsaXplcixcbiAgICBhcmdzOiBhcmdzLFxuICB9KTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBBcHBsaWVzIGRlc2NyaXB0aXZlIG1ldGFkYXRhIHRvIGEgY2xhc3MsIHByb3BlcnR5IG9yIG1ldGhvZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiB0aGUgZGVzY3JpcHRpb24gdG8gYXBwbHlcbiAqXG4gKiBAZnVuY3Rpb24gZGVzY3JpcHRpb25cbiAqXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZykge1xuICByZXR1cm4gbWV0YWRhdGEoTW9kZWwua2V5KE1vZGVsS2V5cy5ERVNDUklQVElPTiksIGRlc2NyaXB0aW9uKTtcbn1cbiIsIi8qKlxuICogQG1vZHVsZSBkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGRlc2NyaXB0aW9uIFR5cGVTY3JpcHQgZGVjb3JhdG9yLWJhc2VkIHZhbGlkYXRpb24gbGlicmFyeVxuICogQHN1bW1hcnkgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHVzaW5nIFR5cGVTY3JpcHQgZGVjb3JhdG9ycy5cbiAqIEl0IGV4cG9zZXMgdXRpbGl0eSBmdW5jdGlvbnMsIHZhbGlkYXRpb24gZGVjb3JhdG9ycywgYW5kIG1vZGVsLXJlbGF0ZWQgZnVuY3Rpb25hbGl0eSBmb3JcbiAqIGltcGxlbWVudGluZyB0eXBlLXNhZmUsIGRlY2xhcmF0aXZlIHZhbGlkYXRpb24gaW4gVHlwZVNjcmlwdCBhcHBsaWNhdGlvbnMuXG4gKi9cbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHZlcnNpb24gb2YgdGhlIHJlZmxlY3Rpb24gcGFja2FnZVxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcGFja2FnZVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFt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
@@ -16,4 +16,4 @@ export * from "./model";
16
16
  * @const VERSION
17
17
  * @memberOf module:decorator-validation
18
18
  */
19
- export declare const VERSION = "1.7.18";
19
+ export declare const VERSION = "1.7.19";
package/lib/esm/index.js CHANGED
@@ -16,5 +16,5 @@ export * from "./model/index.js";
16
16
  * @const VERSION
17
17
  * @memberOf module:decorator-validation
18
18
  */
19
- export const VERSION = "1.7.18";
19
+ export const VERSION = "1.7.19";
20
20
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gscUNBQTRCO0FBQzVCLGlDQUF3QjtBQUN4QixpQ0FBd0I7QUFDeEIsc0NBQTZCO0FBQzdCLGlDQUF3QjtBQUV4Qjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBUeXBlU2NyaXB0IGRlY29yYXRvci1iYXNlZCB2YWxpZGF0aW9uIGxpYnJhcnlcbiAqIEBzdW1tYXJ5IFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIGZyYW1ld29yayB1c2luZyBUeXBlU2NyaXB0IGRlY29yYXRvcnMuXG4gKiBJdCBleHBvc2VzIHV0aWxpdHkgZnVuY3Rpb25zLCB2YWxpZGF0aW9uIGRlY29yYXRvcnMsIGFuZCBtb2RlbC1yZWxhdGVkIGZ1bmN0aW9uYWxpdHkgZm9yXG4gKiBpbXBsZW1lbnRpbmcgdHlwZS1zYWZlLCBkZWNsYXJhdGl2ZSB2YWxpZGF0aW9uIGluIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zLlxuICovXG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSByZWZsZWN0aW9uIHBhY2thZ2VcbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHBhY2thZ2VcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl19
package/lib/index.cjs CHANGED
@@ -33,5 +33,5 @@ __exportStar(require("./model/index.cjs"), exports);
33
33
  * @const VERSION
34
34
  * @memberOf module:decorator-validation
35
35
  */
36
- exports.VERSION = "1.7.18";
36
+ exports.VERSION = "1.7.19";
37
37
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7O0dBTUc7QUFDSCx3REFBNEI7QUFDNUIsb0RBQXdCO0FBQ3hCLG9EQUF3QjtBQUN4Qix5REFBNkI7QUFDN0Isb0RBQXdCO0FBRXhCOzs7OztHQUtHO0FBQ1UsUUFBQSxPQUFPLEdBQUcsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAZGVzY3JpcHRpb24gVHlwZVNjcmlwdCBkZWNvcmF0b3ItYmFzZWQgdmFsaWRhdGlvbiBsaWJyYXJ5XG4gKiBAc3VtbWFyeSBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgdXNpbmcgVHlwZVNjcmlwdCBkZWNvcmF0b3JzLlxuICogSXQgZXhwb3NlcyB1dGlsaXR5IGZ1bmN0aW9ucywgdmFsaWRhdGlvbiBkZWNvcmF0b3JzLCBhbmQgbW9kZWwtcmVsYXRlZCBmdW5jdGlvbmFsaXR5IGZvclxuICogaW1wbGVtZW50aW5nIHR5cGUtc2FmZSwgZGVjbGFyYXRpdmUgdmFsaWRhdGlvbiBpbiBUeXBlU2NyaXB0IGFwcGxpY2F0aW9ucy5cbiAqL1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZhbGlkYXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZGVsXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcmVmbGVjdGlvbiBwYWNrYWdlXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdfQ==
package/lib/index.d.ts CHANGED
@@ -16,4 +16,4 @@ export * from "./model";
16
16
  * @const VERSION
17
17
  * @memberOf module:decorator-validation
18
18
  */
19
- export declare const VERSION = "1.7.18";
19
+ export declare const VERSION = "1.7.19";
package/package.json CHANGED
@@ -1,16 +1,18 @@
1
1
  {
2
2
  "name": "@decaf-ts/decorator-validation",
3
- "version": "1.7.18",
3
+ "version": "1.7.19",
4
4
  "description": "simple decorator based validation engine",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  ".": {
8
+ "types": "./lib/index.d.ts",
8
9
  "require": "./lib/index.cjs",
9
10
  "import": "./lib/esm/index.js"
10
11
  },
11
12
  "./mcp": {
12
13
  "require": "./lib/mcp/index.cjs",
13
- "import": "./lib/esm/mcp/index.js"
14
+ "import": "./lib/esm/mcp/index.js",
15
+ "types": "./lib/index.d.ts"
14
16
  }
15
17
  },
16
18
  "types": "lib/index.d.ts",
@@ -34,14 +36,21 @@
34
36
  "coverage": "rimraf ./workdocs/reports/data/*.json && npm run test:all -- --coverage --config=./workdocs/reports/jest.coverage.config.ts",
35
37
  "lint": "eslint .",
36
38
  "lint-fix": "eslint --fix .",
37
- "prepare-pr": "npm run lint-fix && npm run build:prod && npm run coverage && npm run docs",
39
+ "prepare-pr": "npm run repo:pr && npm run lint-fix && npm run build:prod && npm run coverage && npm run docs",
38
40
  "prepare-release": "npm run lint-fix && npm run build:prod && npm run coverage && npm run docs",
39
41
  "release": "./bin/tag-release.sh",
40
42
  "clean-publish": "npx clean-publish",
41
43
  "drawings": "for FILE in workdocs/drawings/*.drawio; do echo \"converting $FILE to image...\" && docker run --rm -v $(pwd):/data rlespinasse/drawio-export --format png $FILE; done && cp -rf workdocs/drawings/export/* workdocs/resources/",
42
44
  "uml": "cd workdocs/uml && for FILE in ./*.puml; do docker run --rm -v $(pwd):/work -w /work miy4/plantuml -DPLANTUML_LIMIT_SIZE=8192 -tpng $FILE; done && cd ../.. && cp -fr workdocs/uml/*.png workdocs/resources/",
43
45
  "docs": "npx rimraf ./docs && mkdir docs && npx build-scripts --docs",
44
- "publish-docs": "docker run -it --rm --user $(id -u):$(id -g) -v \"$(pwd)/workdocs/confluence:/content\" -e ATLASSIAN_API_TOKEN=$(cat .confluence-token) ghcr.io/markdown-confluence/publish:latest"
46
+ "publish-docs": "docker run -it --rm --user $(id -u):$(id -g) -v \"$(pwd)/workdocs/confluence:/content\" -e ATLASSIAN_API_TOKEN=$(cat .confluence-token) ghcr.io/markdown-confluence/publish:latest",
47
+ "repo:init": "codex exec \"$(cat ./.codex/prompts/repo-setup.md)\nbase_path is `./`, initialize the repository\"",
48
+ "repo:setup": "codex exec \"$(cat ./.codex/prompts/repo-setup.md)\nbase_path is ./\"",
49
+ "repo:doc": "codex exec \"$(cat ./.codex/prompts/doc.md) $(cat ./.codex/prompts/bulk-docs.md)\nbase_path is ./\"",
50
+ "repo:tests": "codex exec \"$(cat ./.codex/prompts/bulk-tests.md)\nbase_path is ./ and coverage is 95%\" -s workspace-write",
51
+ "repo:readme": "codex exec \"$(cat ./.codex/prompts/update-readme.md)\nbase_path is ./\"",
52
+ "repo:pr": "npm run repo:doc && npm run repo:tests && npm run repo:readme",
53
+ "sync-codex": "./bin/sync-codex.sh"
45
54
  },
46
55
  "repository": {
47
56
  "type": "git",