UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

503 lines 60.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // ------------------------------------------------------------- // WARNING: this file is used by both the client and the server. // Do not use any browser or node-specific API! // ------------------------------------------------------------- const types_1 = require("../types"); // Base //-------------------------------------------------------------------- class TestRunErrorBase { constructor(code) { this.code = code; this.isTestCafeError = true; this.callsite = null; } } class ActionOptionErrorBase extends TestRunErrorBase { constructor(code, optionName, actualValue) { super(code); this.optionName = optionName; this.actualValue = actualValue; } } class ActionArgumentErrorBase extends TestRunErrorBase { constructor(code, argumentName, actualValue) { super(code); this.argumentName = argumentName; this.actualValue = actualValue; } } // Synchronization errors //-------------------------------------------------------------------- class MissingAwaitError extends TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.missingAwaitError); this.callsite = callsite; } } exports.MissingAwaitError = MissingAwaitError; // Client function errors //-------------------------------------------------------------------- class ClientFunctionExecutionInterruptionError extends TestRunErrorBase { constructor(instantiationCallsiteName) { super(types_1.TEST_RUN_ERRORS.clientFunctionExecutionInterruptionError); this.instantiationCallsiteName = instantiationCallsiteName; } } exports.ClientFunctionExecutionInterruptionError = ClientFunctionExecutionInterruptionError; class DomNodeClientFunctionResultError extends TestRunErrorBase { constructor(instantiationCallsiteName) { super(types_1.TEST_RUN_ERRORS.domNodeClientFunctionResultError); this.instantiationCallsiteName = instantiationCallsiteName; } } exports.DomNodeClientFunctionResultError = DomNodeClientFunctionResultError; // Selector errors //-------------------------------------------------------------------- class SelectorErrorBase extends TestRunErrorBase { constructor(code, { apiFnChain, apiFnIndex }) { super(code); this.apiFnChain = apiFnChain; this.apiFnIndex = apiFnIndex; } } class InvalidSelectorResultError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.invalidSelectorResultError); } } exports.InvalidSelectorResultError = InvalidSelectorResultError; class CannotObtainInfoForElementSpecifiedBySelectorError extends SelectorErrorBase { constructor(callsite, apiFnArgs) { super(types_1.TEST_RUN_ERRORS.cannotObtainInfoForElementSpecifiedBySelectorError, apiFnArgs); this.callsite = callsite; } } exports.CannotObtainInfoForElementSpecifiedBySelectorError = CannotObtainInfoForElementSpecifiedBySelectorError; // Page errors //-------------------------------------------------------------------- class PageLoadError extends TestRunErrorBase { constructor(errMsg, url) { super(types_1.TEST_RUN_ERRORS.pageLoadError); this.url = url; this.errMsg = errMsg; } } exports.PageLoadError = PageLoadError; // Uncaught errors //-------------------------------------------------------------------- class UncaughtErrorOnPage extends TestRunErrorBase { constructor(errStack, pageDestUrl) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorOnPage); this.errStack = errStack; this.pageDestUrl = pageDestUrl; } } exports.UncaughtErrorOnPage = UncaughtErrorOnPage; class UncaughtErrorInTestCode extends TestRunErrorBase { constructor(err, callsite) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInTestCode); this.errMsg = String(err.rawMessage || err); this.callsite = err.callsite || callsite; this.originError = err; } } exports.UncaughtErrorInTestCode = UncaughtErrorInTestCode; class UncaughtNonErrorObjectInTestCode extends TestRunErrorBase { constructor(obj) { super(types_1.TEST_RUN_ERRORS.uncaughtNonErrorObjectInTestCode); this.objType = typeof obj; this.objStr = String(obj); } } exports.UncaughtNonErrorObjectInTestCode = UncaughtNonErrorObjectInTestCode; class UncaughtErrorInClientFunctionCode extends TestRunErrorBase { constructor(instantiationCallsiteName, err) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInClientFunctionCode); this.errMsg = String(err); this.instantiationCallsiteName = instantiationCallsiteName; } } exports.UncaughtErrorInClientFunctionCode = UncaughtErrorInClientFunctionCode; class UncaughtErrorInCustomDOMPropertyCode extends TestRunErrorBase { constructor(instantiationCallsiteName, err, prop) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomDOMPropertyCode, err, prop); this.errMsg = String(err); this.property = prop; this.instantiationCallsiteName = instantiationCallsiteName; } } exports.UncaughtErrorInCustomDOMPropertyCode = UncaughtErrorInCustomDOMPropertyCode; class UnhandledPromiseRejectionError extends TestRunErrorBase { constructor(err) { super(types_1.TEST_RUN_ERRORS.unhandledPromiseRejection); this.errMsg = String(err); } } exports.UnhandledPromiseRejectionError = UnhandledPromiseRejectionError; class UncaughtExceptionError extends TestRunErrorBase { constructor(err) { super(types_1.TEST_RUN_ERRORS.uncaughtException); this.errMsg = String(err); } } exports.UncaughtExceptionError = UncaughtExceptionError; // Assertion errors //-------------------------------------------------------------------- class ExternalAssertionLibraryError extends TestRunErrorBase { constructor(err, callsite) { super(types_1.TEST_RUN_ERRORS.externalAssertionLibraryError); this.errMsg = String(err); this.callsite = callsite; } } exports.ExternalAssertionLibraryError = ExternalAssertionLibraryError; class AssertionExecutableArgumentError extends ActionArgumentErrorBase { constructor(argumentName, argumentValue, err, isAPIError) { super(types_1.TEST_RUN_ERRORS.assertionExecutableArgumentError, argumentName, argumentValue); this.errMsg = isAPIError ? err.rawMessage : err.message; this.originError = err; } } exports.AssertionExecutableArgumentError = AssertionExecutableArgumentError; class AssertionWithoutMethodCallError extends TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.assertionWithoutMethodCallError); this.callsite = callsite; } } exports.AssertionWithoutMethodCallError = AssertionWithoutMethodCallError; class AssertionUnawaitedPromiseError extends TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.assertionUnawaitedPromiseError); this.callsite = callsite; } } exports.AssertionUnawaitedPromiseError = AssertionUnawaitedPromiseError; // Action parameters errors //-------------------------------------------------------------------- // Options errors class ActionIntegerOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionIntegerOptionError, optionName, actualValue); } } exports.ActionIntegerOptionError = ActionIntegerOptionError; class ActionPositiveIntegerOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionPositiveIntegerOptionError, optionName, actualValue); } } exports.ActionPositiveIntegerOptionError = ActionPositiveIntegerOptionError; class ActionBooleanOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionBooleanOptionError, optionName, actualValue); } } exports.ActionBooleanOptionError = ActionBooleanOptionError; class ActionBooleanArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionBooleanArgumentError, argumentName, actualValue); } } exports.ActionBooleanArgumentError = ActionBooleanArgumentError; class ActionSpeedOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionSpeedOptionError, optionName, actualValue); } } exports.ActionSpeedOptionError = ActionSpeedOptionError; class ActionOptionsTypeError extends TestRunErrorBase { constructor(actualType) { super(types_1.TEST_RUN_ERRORS.actionOptionsTypeError); this.actualType = actualType; } } exports.ActionOptionsTypeError = ActionOptionsTypeError; // Arguments errors class ActionStringArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionStringArgumentError, argumentName, actualValue); } } exports.ActionStringArgumentError = ActionStringArgumentError; class ActionNullableStringArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionNullableStringArgumentError, argumentName, actualValue); } } exports.ActionNullableStringArgumentError = ActionNullableStringArgumentError; class ActionIntegerArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionIntegerArgumentError, argumentName, actualValue); } } exports.ActionIntegerArgumentError = ActionIntegerArgumentError; class ActionRoleArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionRoleArgumentError, argumentName, actualValue); } } exports.ActionRoleArgumentError = ActionRoleArgumentError; class ActionPositiveIntegerArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionPositiveIntegerArgumentError, argumentName, actualValue); } } exports.ActionPositiveIntegerArgumentError = ActionPositiveIntegerArgumentError; class ActionStringOrStringArrayArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionStringOrStringArrayArgumentError, argumentName, actualValue); } } exports.ActionStringOrStringArrayArgumentError = ActionStringOrStringArrayArgumentError; class ActionStringArrayElementError extends ActionArgumentErrorBase { constructor(argumentName, actualValue, elementIndex) { super(types_1.TEST_RUN_ERRORS.actionStringArrayElementError, argumentName, actualValue); this.elementIndex = elementIndex; } } exports.ActionStringArrayElementError = ActionStringArrayElementError; class SetTestSpeedArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.setTestSpeedArgumentError, argumentName, actualValue); } } exports.SetTestSpeedArgumentError = SetTestSpeedArgumentError; class ActionUnsupportedDeviceTypeError extends ActionArgumentErrorBase { constructor(argumentName, argumentValue) { super(types_1.TEST_RUN_ERRORS.actionUnsupportedDeviceTypeError, argumentName, argumentValue); } } exports.ActionUnsupportedDeviceTypeError = ActionUnsupportedDeviceTypeError; // Selector errors class ActionSelectorError extends TestRunErrorBase { constructor(selectorName, err, isAPIError) { super(types_1.TEST_RUN_ERRORS.actionSelectorError); this.selectorName = selectorName; this.errMsg = isAPIError ? err.rawMessage : err.message; this.originError = err; } } exports.ActionSelectorError = ActionSelectorError; // Action execution errors //-------------------------------------------------------------------- class ActionElementNotFoundError extends SelectorErrorBase { constructor(apiFnArgs) { super(types_1.TEST_RUN_ERRORS.actionElementNotFoundError, apiFnArgs); } } exports.ActionElementNotFoundError = ActionElementNotFoundError; class ActionElementIsInvisibleError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionElementIsInvisibleError); } } exports.ActionElementIsInvisibleError = ActionElementIsInvisibleError; class ActionSelectorMatchesWrongNodeTypeError extends TestRunErrorBase { constructor(nodeDescription) { super(types_1.TEST_RUN_ERRORS.actionSelectorMatchesWrongNodeTypeError); this.nodeDescription = nodeDescription; } } exports.ActionSelectorMatchesWrongNodeTypeError = ActionSelectorMatchesWrongNodeTypeError; class ActionAdditionalElementNotFoundError extends SelectorErrorBase { constructor(argumentName, apiFnArgs) { super(types_1.TEST_RUN_ERRORS.actionAdditionalElementNotFoundError, apiFnArgs); this.argumentName = argumentName; } } exports.ActionAdditionalElementNotFoundError = ActionAdditionalElementNotFoundError; class ActionAdditionalElementIsInvisibleError extends TestRunErrorBase { constructor(argumentName) { super(types_1.TEST_RUN_ERRORS.actionAdditionalElementIsInvisibleError); this.argumentName = argumentName; } } exports.ActionAdditionalElementIsInvisibleError = ActionAdditionalElementIsInvisibleError; class ActionAdditionalSelectorMatchesWrongNodeTypeError extends TestRunErrorBase { constructor(argumentName, nodeDescription) { super(types_1.TEST_RUN_ERRORS.actionAdditionalSelectorMatchesWrongNodeTypeError); this.argumentName = argumentName; this.nodeDescription = nodeDescription; } } exports.ActionAdditionalSelectorMatchesWrongNodeTypeError = ActionAdditionalSelectorMatchesWrongNodeTypeError; class ActionElementNonEditableError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionElementNonEditableError); } } exports.ActionElementNonEditableError = ActionElementNonEditableError; class ActionElementNotTextAreaError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionElementNotTextAreaError); } } exports.ActionElementNotTextAreaError = ActionElementNotTextAreaError; class ActionElementNonContentEditableError extends TestRunErrorBase { constructor(argumentName) { super(types_1.TEST_RUN_ERRORS.actionElementNonContentEditableError); this.argumentName = argumentName; } } exports.ActionElementNonContentEditableError = ActionElementNonContentEditableError; class ActionRootContainerNotFoundError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionRootContainerNotFoundError); } } exports.ActionRootContainerNotFoundError = ActionRootContainerNotFoundError; class ActionIncorrectKeysError extends TestRunErrorBase { constructor(argumentName) { super(types_1.TEST_RUN_ERRORS.actionIncorrectKeysError); this.argumentName = argumentName; } } exports.ActionIncorrectKeysError = ActionIncorrectKeysError; class ActionCannotFindFileToUploadError extends TestRunErrorBase { constructor(filePaths) { super(types_1.TEST_RUN_ERRORS.actionCannotFindFileToUploadError); this.filePaths = filePaths; } } exports.ActionCannotFindFileToUploadError = ActionCannotFindFileToUploadError; class ActionElementIsNotFileInputError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionElementIsNotFileInputError); } } exports.ActionElementIsNotFileInputError = ActionElementIsNotFileInputError; class ActionInvalidScrollTargetError extends TestRunErrorBase { constructor(scrollTargetXValid, scrollTargetYValid) { super(types_1.TEST_RUN_ERRORS.actionInvalidScrollTargetError); if (!scrollTargetXValid) { if (!scrollTargetYValid) this.properties = 'scrollTargetX and scrollTargetY properties'; else this.properties = 'scrollTargetX property'; } else this.properties = 'scrollTargetY property'; } } exports.ActionInvalidScrollTargetError = ActionInvalidScrollTargetError; class WindowDimensionsOverflowError extends TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.windowDimensionsOverflowError); this.callsite = callsite; } } exports.WindowDimensionsOverflowError = WindowDimensionsOverflowError; class InvalidElementScreenshotDimensionsError extends TestRunErrorBase { constructor(width, height) { super(types_1.TEST_RUN_ERRORS.invalidElementScreenshotDimensionsError); const widthIsInvalid = width <= 0; const heightIsInvalid = height <= 0; if (widthIsInvalid) { if (heightIsInvalid) { this.verb = 'are'; this.dimensions = 'width and height'; } else { this.verb = 'is'; this.dimensions = 'width'; } } else { this.verb = 'is'; this.dimensions = 'height'; } } } exports.InvalidElementScreenshotDimensionsError = InvalidElementScreenshotDimensionsError; class ForbiddenCharactersInScreenshotPathError extends TestRunErrorBase { constructor(screenshotPath, forbiddenCharsList) { super(types_1.TEST_RUN_ERRORS.forbiddenCharactersInScreenshotPathError); this.screenshotPath = screenshotPath; this.forbiddenCharsList = forbiddenCharsList; } } exports.ForbiddenCharactersInScreenshotPathError = ForbiddenCharactersInScreenshotPathError; class RoleSwitchInRoleInitializerError extends TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.roleSwitchInRoleInitializerError); this.callsite = callsite; } } exports.RoleSwitchInRoleInitializerError = RoleSwitchInRoleInitializerError; // Iframe errors class ActionElementNotIframeError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionElementNotIframeError); } } exports.ActionElementNotIframeError = ActionElementNotIframeError; class ActionIframeIsNotLoadedError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionIframeIsNotLoadedError); } } exports.ActionIframeIsNotLoadedError = ActionIframeIsNotLoadedError; class CurrentIframeIsNotLoadedError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.currentIframeIsNotLoadedError); } } exports.CurrentIframeIsNotLoadedError = CurrentIframeIsNotLoadedError; class CurrentIframeNotFoundError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.currentIframeNotFoundError); } } exports.CurrentIframeNotFoundError = CurrentIframeNotFoundError; class CurrentIframeIsInvisibleError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.currentIframeIsInvisibleError); } } exports.CurrentIframeIsInvisibleError = CurrentIframeIsInvisibleError; // Native dialog errors class NativeDialogNotHandledError extends TestRunErrorBase { constructor(dialogType, url) { super(types_1.TEST_RUN_ERRORS.nativeDialogNotHandledError); this.dialogType = dialogType; this.pageUrl = url; } } exports.NativeDialogNotHandledError = NativeDialogNotHandledError; class UncaughtErrorInNativeDialogHandler extends TestRunErrorBase { constructor(dialogType, errMsg, url) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInNativeDialogHandler); this.dialogType = dialogType; this.errMsg = errMsg; this.pageUrl = url; } } exports.UncaughtErrorInNativeDialogHandler = UncaughtErrorInNativeDialogHandler; class SetNativeDialogHandlerCodeWrongTypeError extends TestRunErrorBase { constructor(actualType) { super(types_1.TEST_RUN_ERRORS.setNativeDialogHandlerCodeWrongTypeError); this.actualType = actualType; } } exports.SetNativeDialogHandlerCodeWrongTypeError = SetNativeDialogHandlerCodeWrongTypeError; class RequestHookUnhandledError extends TestRunErrorBase { constructor(err, hookClassName, methodName) { super(types_1.TEST_RUN_ERRORS.requestHookUnhandledError); this.errMsg = String(err); this.hookClassName = hookClassName; this.methodName = methodName; } } exports.RequestHookUnhandledError = RequestHookUnhandledError; class RequestHookNotImplementedMethodError extends TestRunErrorBase { constructor(methodName, hookClassName) { super(types_1.TEST_RUN_ERRORS.requestHookNotImplementedError); this.methodName = methodName; this.hookClassName = hookClassName; } } exports.RequestHookNotImplementedMethodError = RequestHookNotImplementedMethodError; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXJyb3JzL3Rlc3QtcnVuL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsZ0VBQWdFO0FBQ2hFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsZ0VBQWdFO0FBQ2hFLG9DQUEyQztBQUUzQyxPQUFPO0FBQ1Asc0VBQXNFO0FBQ3RFLE1BQU0sZ0JBQWdCO0lBQ2xCLFlBQWEsSUFBSTtRQUNiLElBQUksQ0FBQyxJQUFJLEdBQWMsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLEdBQVUsSUFBSSxDQUFDO0lBQ2hDLENBQUM7Q0FDSjtBQUVELE1BQU0scUJBQXNCLFNBQVEsZ0JBQWdCO0lBQ2hELFlBQWEsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXO1FBQ3RDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVaLElBQUksQ0FBQyxVQUFVLEdBQUksVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ25DLENBQUM7Q0FDSjtBQUVELE1BQU0sdUJBQXdCLFNBQVEsZ0JBQWdCO0lBQ2xELFlBQWEsSUFBSSxFQUFFLFlBQVksRUFBRSxXQUFXO1FBQ3hDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVaLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUksV0FBVyxDQUFDO0lBQ3BDLENBQUM7Q0FDSjtBQUVELHlCQUF5QjtBQUN6QixzRUFBc0U7QUFDdEUsTUFBYSxpQkFBa0IsU0FBUSxnQkFBZ0I7SUFDbkQsWUFBYSxRQUFRO1FBQ2pCLEtBQUssQ0FBQyx1QkFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDN0IsQ0FBQztDQUNKO0FBTkQsOENBTUM7QUFHRCx5QkFBeUI7QUFDekIsc0VBQXNFO0FBQ3RFLE1BQWEsd0NBQXlDLFNBQVEsZ0JBQWdCO0lBQzFFLFlBQWEseUJBQXlCO1FBQ2xDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFFaEUsSUFBSSxDQUFDLHlCQUF5QixHQUFHLHlCQUF5QixDQUFDO0lBQy9ELENBQUM7Q0FDSjtBQU5ELDRGQU1DO0FBRUQsTUFBYSxnQ0FBaUMsU0FBUSxnQkFBZ0I7SUFDbEUsWUFBYSx5QkFBeUI7UUFDbEMsS0FBSyxDQUFDLHVCQUFlLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMseUJBQXlCLEdBQUcseUJBQXlCLENBQUM7SUFDL0QsQ0FBQztDQUNKO0FBTkQsNEVBTUM7QUFFRCxrQkFBa0I7QUFDbEIsc0VBQXNFO0FBQ3RFLE1BQU0saUJBQWtCLFNBQVEsZ0JBQWdCO0lBQzVDLFlBQWEsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRTtRQUN6QyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFWixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUNqQyxDQUFDO0NBQ0o7QUFFRCxNQUFhLDBCQUEyQixTQUFRLGdCQUFnQjtJQUM1RDtRQUNJLEtBQUssQ0FBQyx1QkFBZSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDdEQsQ0FBQztDQUNKO0FBSkQsZ0VBSUM7QUFFRCxNQUFhLGtEQUFtRCxTQUFRLGlCQUFpQjtJQUNyRixZQUFhLFFBQVEsRUFBRSxTQUFTO1FBQzVCLEtBQUssQ0FBQyx1QkFBZSxDQUFDLGtEQUFrRCxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXJGLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzdCLENBQUM7Q0FDSjtBQU5ELGdIQU1DO0FBRUQsY0FBYztBQUNkLHNFQUFzRTtBQUN0RSxNQUFhLGFBQWMsU0FBUSxnQkFBZ0I7SUFDL0MsWUFBYSxNQUFNLEVBQUUsR0FBRztRQUNwQixLQUFLLENBQUMsdUJBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVyQyxJQUFJLENBQUMsR0FBRyxHQUFNLEdBQUcsQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN6QixDQUFDO0NBQ0o7QUFQRCxzQ0FPQztBQUdELGtCQUFrQjtBQUNsQixzRUFBc0U7QUFDdEUsTUFBYSxtQkFBb0IsU0FBUSxnQkFBZ0I7SUFDckQsWUFBYSxRQUFRLEVBQUUsV0FBVztRQUM5QixLQUFLLENBQUMsdUJBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRTNDLElBQUksQ0FBQyxRQUFRLEdBQU0sUUFBUSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ25DLENBQUM7Q0FDSjtBQVBELGtEQU9DO0FBRUQsTUFBYSx1QkFBd0IsU0FBUSxnQkFBZ0I7SUFDekQsWUFBYSxHQUFHLEVBQUUsUUFBUTtRQUN0QixLQUFLLENBQUMsdUJBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBRS9DLElBQUksQ0FBQyxNQUFNLEdBQVEsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFFBQVEsR0FBTSxHQUFHLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztJQUMzQixDQUFDO0NBQ0o7QUFSRCwwREFRQztBQUVELE1BQWEsZ0NBQWlDLFNBQVEsZ0JBQWdCO0lBQ2xFLFlBQWEsR0FBRztRQUNaLEtBQUssQ0FBQyx1QkFBZSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFFeEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLEdBQUcsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxHQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0o7QUFQRCw0RUFPQztBQUVELE1BQWEsaUNBQWtDLFNBQVEsZ0JBQWdCO0lBQ25FLFlBQWEseUJBQXlCLEVBQUUsR0FBRztRQUN2QyxLQUFLLENBQUMsdUJBQWUsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQyxNQUFNLEdBQXNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMseUJBQXlCLEdBQUcseUJBQXlCLENBQUM7SUFDL0QsQ0FBQztDQUNKO0FBUEQsOEVBT0M7QUFFRCxNQUFhLG9DQUFxQyxTQUFRLGdCQUFnQjtJQUN0RSxZQUFhLHlCQUF5QixFQUFFLEdBQUcsRUFBRSxJQUFJO1FBQzdDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV2RSxJQUFJLENBQUMsTUFBTSxHQUFzQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFFBQVEsR0FBb0IsSUFBSSxDQUFDO1FBQ3RDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyx5QkFBeUIsQ0FBQztJQUMvRCxDQUFDO0NBQ0o7QUFSRCxvRkFRQztBQUVELE1BQWEsOEJBQStCLFNBQVEsZ0JBQWdCO0lBQ2hFLFlBQWEsR0FBRztRQUNaLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNKO0FBTkQsd0VBTUM7QUFFRCxNQUFhLHNCQUF1QixTQUFRLGdCQUFnQjtJQUN4RCxZQUFhLEdBQUc7UUFDWixLQUFLLENBQUMsdUJBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXpDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDSjtBQU5ELHdEQU1DO0FBR0QsbUJBQW1CO0FBQ25CLHNFQUFzRTtBQUN0RSxNQUFhLDZCQUE4QixTQUFRLGdCQUFnQjtJQUMvRCxZQUFhLEdBQUcsRUFBRSxRQUFRO1FBQ3RCLEtBQUssQ0FBQyx1QkFBZSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLE1BQU0sR0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDN0IsQ0FBQztDQUNKO0FBUEQsc0VBT0M7QUFFRCxNQUFhLGdDQUFpQyxTQUFRLHVCQUF1QjtJQUN6RSxZQUFhLFlBQVksRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLFVBQVU7UUFDckQsS0FBSyxDQUFDLHVCQUFlLENBQUMsZ0NBQWdDLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRXJGLElBQUksQ0FBQyxNQUFNLEdBQVEsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQzdELElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO0lBQzNCLENBQUM7Q0FDSjtBQVBELDRFQU9DO0FBRUQsTUFBYSwrQkFBZ0MsU0FBUSxnQkFBZ0I7SUFDakUsWUFBYSxRQUFRO1FBQ2pCLEtBQUssQ0FBQyx1QkFBZSxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFFdkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDN0IsQ0FBQztDQUNKO0FBTkQsMEVBTUM7QUFFRCxNQUFhLDhCQUErQixTQUFRLGdCQUFnQjtJQUNoRSxZQUFhLFFBQVE7UUFDakIsS0FBSyxDQUFDLHVCQUFlLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUM3QixDQUFDO0NBQ0o7QUFORCx3RUFNQztBQUVELDJCQUEyQjtBQUMzQixzRUFBc0U7QUFDdEUsaUJBQWlCO0FBQ2pCLE1BQWEsd0JBQXlCLFNBQVEscUJBQXFCO0lBQy9ELFlBQWEsVUFBVSxFQUFFLFdBQVc7UUFDaEMsS0FBSyxDQUFDLHVCQUFlLENBQUMsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzdFLENBQUM7Q0FDSjtBQUpELDREQUlDO0FBRUQsTUFBYSxnQ0FBaUMsU0FBUSxxQkFBcUI7SUFDdkUsWUFBYSxVQUFVLEVBQUUsV0FBVztRQUNoQyxLQUFLLENBQUMsdUJBQWUsQ0FBQyxnQ0FBZ0MsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckYsQ0FBQztDQUNKO0FBSkQsNEVBSUM7QUFFRCxNQUFhLHdCQUF5QixTQUFRLHFCQUFxQjtJQUMvRCxZQUFhLFVBQVUsRUFBRSxXQUFXO1FBQ2hDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM3RSxDQUFDO0NBQ0o7QUFKRCw0REFJQztBQUVELE1BQWEsMEJBQTJCLFNBQVEsdUJBQXVCO0lBQ25FLFlBQWEsWUFBWSxFQUFFLFdBQVc7UUFDbEMsS0FBSyxDQUFDLHVCQUFlLENBQUMsMEJBQTBCLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7Q0FDSjtBQUpELGdFQUlDO0FBRUQsTUFBYSxzQkFBdUIsU0FBUSxxQkFBcUI7SUFDN0QsWUFBYSxVQUFVLEVBQUUsV0FBVztRQUNoQyxLQUFLLENBQUMsdUJBQWUsQ0FBQyxzQkFBc0IsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDM0UsQ0FBQztDQUNKO0FBSkQsd0RBSUM7QUFFRCxNQUFhLHNCQUF1QixTQUFRLGdCQUFnQjtJQUN4RCxZQUFhLFVBQVU7UUFDbkIsS0FBSyxDQUFDLHVCQUFlLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUU5QyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUNqQyxDQUFDO0NBQ0o7QUFORCx3REFNQztBQUdELG1CQUFtQjtBQUNuQixNQUFhLHlCQUEwQixTQUFRLHVCQUF1QjtJQUNsRSxZQUFhLFlBQVksRUFBRSxXQUFXO1FBQ2xDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHlCQUF5QixFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRixDQUFDO0NBQ0o7QUFKRCw4REFJQztBQUVELE1BQWEsaUNBQWtDLFNBQVEsdUJBQXVCO0lBQzFFLFlBQWEsWUFBWSxFQUFFLFdBQVc7UUFDbEMsS0FBSyxDQUFDLHVCQUFlLENBQUMsaUNBQWlDLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7Q0FDSjtBQUpELDhFQUlDO0FBRUQsTUFBYSwwQkFBMkIsU0FBUSx1QkFBdUI7SUFDbkUsWUFBYSxZQUFZLEVBQUUsV0FBVztRQUNsQyxLQUFLLENBQUMsdUJBQWUsQ0FBQywwQkFBMEIsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDakYsQ0FBQztDQUNKO0FBSkQsZ0VBSUM7QUFFRCxNQUFhLHVCQUF3QixTQUFRLHVCQUF1QjtJQUNoRSxZQUFhLFlBQVksRUFBRSxXQUFXO1FBQ2xDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHVCQUF1QixFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM5RSxDQUFDO0NBQ0o7QUFKRCwwREFJQztBQUVELE1BQWEsa0NBQW1DLFNBQVEsdUJBQXVCO0lBQzNFLFlBQWEsWUFBWSxFQUFFLFdBQVc7UUFDbEMsS0FBSyxDQUFDLHVCQUFlLENBQUMsa0NBQWtDLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7Q0FDSjtBQUpELGdGQUlDO0FBRUQsTUFBYSxzQ0FBdUMsU0FBUSx1QkFBdUI7SUFDL0UsWUFBYSxZQUFZLEVBQUUsV0FBVztRQUNsQyxLQUFLLENBQUMsdUJBQWUsQ0FBQyxzQ0FBc0MsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDN0YsQ0FBQztDQUNKO0FBSkQsd0ZBSUM7QUFFRCxNQUFhLDZCQUE4QixTQUFRLHVCQUF1QjtJQUN0RSxZQUFhLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWTtRQUNoRCxLQUFLLENBQUMsdUJBQWUsQ0FBQyw2QkFBNkIsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFaEYsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDckMsQ0FBQztDQUNKO0FBTkQsc0VBTUM7QUFFRCxNQUFhLHlCQUEwQixTQUFRLHVCQUF1QjtJQUNsRSxZQUFhLFlBQVksRUFBRSxXQUFXO1FBQ2xDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHlCQUF5QixFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRixDQUFDO0NBQ0o7QUFKRCw4REFJQztBQUVELE1BQWEsZ0NBQWlDLFNBQVEsdUJBQXVCO0lBQ3pFLFlBQWEsWUFBWSxFQUFFLGFBQWE7UUFDcEMsS0FBSyxDQUFDLHVCQUFlLENBQUMsZ0NBQWdDLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7Q0FDSjtBQUpELDRFQUlDO0FBRUQsa0JBQWtCO0FBQ2xCLE1BQWEsbUJBQW9CLFNBQVEsZ0JBQWdCO0lBQ3JELFlBQWEsWUFBWSxFQUFFLEdBQUcsRUFBRSxVQUFVO1FBQ3RDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDOUQsSUFBSSxDQUFDLFdBQVcsR0FBSSxHQUFHLENBQUM7SUFDNUIsQ0FBQztDQUNKO0FBUkQsa0RBUUM7QUFFRCwwQkFBMEI7QUFDMUIsc0VBQXNFO0FBQ3RFLE1BQWEsMEJBQTJCLFNBQVEsaUJBQWlCO0lBQzdELFlBQWEsU0FBUztRQUNsQixLQUFLLENBQUMsdUJBQWUsQ0FBQywwQkFBMEIsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNqRSxDQUFDO0NBQ0o7QUFKRCxnRUFJQztBQUVELE1BQWEsNkJBQThCLFNBQVEsZ0JBQWdCO0lBQy9EO1FBQ0ksS0FBSyxDQUFDLHVCQUFlLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0o7QUFKRCxzRUFJQztBQUVELE1BQWEsdUNBQXdDLFNBQVEsZ0JBQWdCO0lBQ3pFLFlBQWEsZUFBZTtRQUN4QixLQUFLLENBQUMsdUJBQWUsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBRS9ELElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO0lBQzNDLENBQUM7Q0FDSjtBQU5ELDBGQU1DO0FBRUQsTUFBYSxvQ0FBcUMsU0FBUSxpQkFBaUI7SUFDdkUsWUFBYSxZQUFZLEVBQUUsU0FBUztRQUNoQyxLQUFLLENBQUMsdUJBQWUsQ0FBQyxvQ0FBb0MsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUV2RSxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNyQyxDQUFDO0NBQ0o7QUFORCxvRkFNQztBQUVELE1BQWEsdUNBQXdDLFNBQVEsZ0JBQWdCO0lBQ3pFLFlBQWEsWUFBWTtRQUNyQixLQUFLLENBQUMsdUJBQWUsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBRS9ELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ3JDLENBQUM7Q0FDSjtBQU5ELDBGQU1DO0FBRUQsTUFBYSxpREFBa0QsU0FBUSxnQkFBZ0I7SUFDbkYsWUFBYSxZQUFZLEVBQUUsZUFBZTtRQUN0QyxLQUFLLENBQUMsdUJBQWUsQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1FBRXpFLElBQUksQ0FBQyxZQUFZLEdBQU0sWUFBWSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO0lBQzNDLENBQUM7Q0FDSjtBQVBELDhHQU9DO0FBRUQsTUFBYSw2QkFBOEIsU0FBUSxnQkFBZ0I7SUFDL0Q7UUFDSSxLQUFLLENBQUMsdUJBQWUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDSjtBQUpELHNFQUlDO0FBRUQsTUFBYSw2QkFBOEIsU0FBUSxnQkFBZ0I7SUFDL0Q7UUFDSSxLQUFLLENBQUMsdUJBQWUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDSjtBQUpELHNFQUlDO0FBRUQsTUFBYSxvQ0FBcUMsU0FBUSxnQkFBZ0I7SUFDdEUsWUFBYSxZQUFZO1FBQ3JCLEtBQUssQ0FBQyx1QkFBZSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDckMsQ0FBQztDQUNKO0FBTkQsb0ZBTUM7QUFFRCxNQUFhLGdDQUFpQyxTQUFRLGdCQUFnQjtJQUNsRTtRQUNJLEtBQUssQ0FBQyx1QkFBZSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztDQUNKO0FBSkQsNEVBSUM7QUFFRCxNQUFhLHdCQUF5QixTQUFRLGdCQUFnQjtJQUMxRCxZQUFhLFlBQVk7UUFDckIsS0FBSyxDQUFDLHVCQUFlLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNyQyxDQUFDO0NBQ0o7QUFORCw0REFNQztBQUVELE1BQWEsaUNBQWtDLFNBQVEsZ0JBQWdCO0lBQ25FLFlBQWEsU0FBUztRQUNsQixLQUFLLENBQUMsdUJBQWUsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7Q0FDSjtBQU5ELDhFQU1DO0FBRUQsTUFBYSxnQ0FBaUMsU0FBUSxnQkFBZ0I7SUFDbEU7UUFDSSxLQUFLLENBQUMsdUJBQWUsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQzVELENBQUM7Q0FDSjtBQUpELDRFQUlDO0FBRUQsTUFBYSw4QkFBK0IsU0FBUSxnQkFBZ0I7SUFDaEUsWUFBYSxrQkFBa0IsRUFBRSxrQkFBa0I7UUFDL0MsS0FBSyxDQUFDLHVCQUFlLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDckIsSUFBSSxDQUFDLGtCQUFrQjtnQkFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyw0Q0FBNEMsQ0FBQzs7Z0JBRS9ELElBQUksQ0FBQyxVQUFVLEdBQUcsd0JBQXdCLENBQUM7U0FDbEQ7O1lBRUcsSUFBSSxDQUFDLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQztJQUNuRCxDQUFDO0NBQ0o7QUFiRCx3RUFhQztBQUVELE1BQWEsNkJBQThCLFNBQVEsZ0JBQWdCO0lBQy9ELFlBQWEsUUFBUTtRQUNqQixLQUFLLENBQUMsdUJBQWUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzdCLENBQUM7Q0FDSjtBQU5ELHNFQU1DO0FBRUQsTUFBYSx1Q0FBd0MsU0FBUSxnQkFBZ0I7SUFDekUsWUFBYSxLQUFLLEVBQUUsTUFBTTtRQUN0QixLQUFLLENBQUMsdUJBQWUsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBRS9ELE1BQU0sY0FBYyxHQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDbkMsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUVwQyxJQUFJLGNBQWMsRUFBRTtZQUNoQixJQUFJLGVBQWUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLElBQUksR0FBUyxLQUFLLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsa0JBQWtCLENBQUM7YUFDeEM7aUJBQ0k7Z0JBQ0QsSUFBSSxDQUFDLElBQUksR0FBUyxJQUFJLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDO2FBQzdCO1NBQ0o7YUFDSTtZQUNELElBQUksQ0FBQyxJQUFJLEdBQVMsSUFBSSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO1NBQzlCO0lBQ0wsQ0FBQztDQUNKO0FBdEJELDBGQXNCQztBQUVELE1BQWEsd0NBQXlDLFNBQVEsZ0JBQWdCO0lBQzFFLFlBQWEsY0FBYyxFQUFFLGtCQUFrQjtRQUMzQyxLQUFLLENBQUMsdUJBQWUsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBRWhFLElBQUksQ0FBQyxjQUFjLEdBQU8sY0FBYyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztJQUNqRCxDQUFDO0NBQ0o7QUFQRCw0RkFPQztBQUdELE1BQWEsZ0NBQWlDLFNBQVEsZ0JBQWdCO0lBQ2xFLFlBQWEsUUFBUTtRQUNqQixLQUFLLENBQUMsdUJBQWUsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzdCLENBQUM7Q0FDSjtBQU5ELDRFQU1DO0FBR0QsZ0JBQWdCO0FBQ2hCLE1BQWEsMkJBQTRCLFNBQVEsZ0JBQWdCO0lBQzdEO1FBQ0ksS0FBSyxDQUFDLHVCQUFlLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUN2RCxDQUFDO0NBQ0o7QUFKRCxrRUFJQztBQUVELE1BQWEsNEJBQTZCLFNBQVEsZ0JBQWdCO0lBQzlEO1FBQ0ksS0FBSyxDQUFDLHVCQUFlLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUN4RCxDQUFDO0NBQ0o7QUFKRCxvRUFJQztBQUVELE1BQWEsNkJBQThCLFNBQVEsZ0JBQWdCO0lBQy9EO1FBQ0ksS0FBSyxDQUFDLHVCQUFlLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0o7QUFKRCxzRUFJQztBQUVELE1BQWEsMEJBQTJCLFNBQVEsZ0JBQWdCO0lBQzVEO1FBQ0ksS0FBSyxDQUFDLHVCQUFlLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0o7QUFKRCxnRUFJQztBQUVELE1BQWEsNkJBQThCLFNBQVEsZ0JBQWdCO0lBQy9EO1FBQ0ksS0FBSyxDQUFDLHVCQUFlLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0o7QUFKRCxzRUFJQztBQUVELHVCQUF1QjtBQUN2QixNQUFhLDJCQUE0QixTQUFRLGdCQUFnQjtJQUM3RCxZQUFhLFVBQVUsRUFBRSxHQUFHO1FBQ3hCLEtBQUssQ0FBQyx1QkFBZSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBTSxHQUFHLENBQUM7SUFDMUIsQ0FBQztDQUNKO0FBUEQsa0VBT0M7QUFFRCxNQUFhLGtDQUFtQyxTQUFRLGdCQUFnQjtJQUNwRSxZQUFhLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRztRQUNoQyxLQUFLLENBQUMsdUJBQWUsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQU8sTUFBTSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQU0sR0FBRyxDQUFDO0lBQzFCLENBQUM7Q0FDSjtBQVJELGdGQVFDO0FBRUQsTUFBYSx3Q0FBeUMsU0FBUSxnQkFBZ0I7SUFDMUUsWUFBYSxVQUFVO1FBQ25CLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFFaEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDakMsQ0FBQztDQUNKO0FBTkQsNEZBTUM7QUFFRCxNQUFhLHlCQUEwQixTQUFRLGdCQUFnQjtJQUMzRCxZQUFhLEdBQUcsRUFBRSxhQUFhLEVBQUUsVUFBVTtRQUN2QyxLQUFLLENBQUMsdUJBQWUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxNQUFNLEdBQVUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLEdBQU0sVUFBVSxDQUFDO0lBQ3BDLENBQUM7Q0FDSjtBQVJELDhEQVFDO0FBRUQsTUFBYSxvQ0FBcUMsU0FBUSxnQkFBZ0I7SUFDdEUsWUFBYSxVQUFVLEVBQUUsYUFBYTtRQUNsQyxLQUFLLENBQUMsdUJBQWUsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxVQUFVLEdBQU0sVUFBVSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7Q0FFSjtBQVJELG9GQVFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV0FSTklORzogdGhpcyBmaWxlIGlzIHVzZWQgYnkgYm90aCB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLlxuLy8gRG8gbm90IHVzZSBhbnkgYnJvd3NlciBvciBub2RlLXNwZWNpZmljIEFQSSFcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmltcG9ydCB7IFRFU1RfUlVOX0VSUk9SUyB9IGZyb20gJy4uL3R5cGVzJztcblxuLy8gQmFzZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY2xhc3MgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGNvZGUpIHtcbiAgICAgICAgdGhpcy5jb2RlICAgICAgICAgICAgPSBjb2RlO1xuICAgICAgICB0aGlzLmlzVGVzdENhZmVFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuY2FsbHNpdGUgICAgICAgID0gbnVsbDtcbiAgICB9XG59XG5cbmNsYXNzIEFjdGlvbk9wdGlvbkVycm9yQmFzZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjb2RlLCBvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihjb2RlKTtcblxuICAgICAgICB0aGlzLm9wdGlvbk5hbWUgID0gb3B0aW9uTmFtZTtcbiAgICAgICAgdGhpcy5hY3R1YWxWYWx1ZSA9IGFjdHVhbFZhbHVlO1xuICAgIH1cbn1cblxuY2xhc3MgQWN0aW9uQXJndW1lbnRFcnJvckJhc2UgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY29kZSwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihjb2RlKTtcblxuICAgICAgICB0aGlzLmFyZ3VtZW50TmFtZSA9IGFyZ3VtZW50TmFtZTtcbiAgICAgICAgdGhpcy5hY3R1YWxWYWx1ZSAgPSBhY3R1YWxWYWx1ZTtcbiAgICB9XG59XG5cbi8vIFN5bmNocm9uaXphdGlvbiBlcnJvcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBjbGFzcyBNaXNzaW5nQXdhaXRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjYWxsc2l0ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMubWlzc2luZ0F3YWl0RXJyb3IpO1xuXG4gICAgICAgIHRoaXMuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcbiAgICB9XG59XG5cblxuLy8gQ2xpZW50IGZ1bmN0aW9uIGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNsYXNzIENsaWVudEZ1bmN0aW9uRXhlY3V0aW9uSW50ZXJydXB0aW9uRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuY2xpZW50RnVuY3Rpb25FeGVjdXRpb25JbnRlcnJ1cHRpb25FcnJvcik7XG5cbiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lID0gaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEb21Ob2RlQ2xpZW50RnVuY3Rpb25SZXN1bHRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5kb21Ob2RlQ2xpZW50RnVuY3Rpb25SZXN1bHRFcnJvcik7XG5cbiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lID0gaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZTtcbiAgICB9XG59XG5cbi8vIFNlbGVjdG9yIGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY2xhc3MgU2VsZWN0b3JFcnJvckJhc2UgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY29kZSwgeyBhcGlGbkNoYWluLCBhcGlGbkluZGV4IH0pIHtcbiAgICAgICAgc3VwZXIoY29kZSk7XG5cbiAgICAgICAgdGhpcy5hcGlGbkNoYWluID0gYXBpRm5DaGFpbjtcbiAgICAgICAgdGhpcy5hcGlGbkluZGV4ID0gYXBpRm5JbmRleDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkU2VsZWN0b3JSZXN1bHRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmludmFsaWRTZWxlY3RvclJlc3VsdEVycm9yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYW5ub3RPYnRhaW5JbmZvRm9yRWxlbWVudFNwZWNpZmllZEJ5U2VsZWN0b3JFcnJvciBleHRlbmRzIFNlbGVjdG9yRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY2FsbHNpdGUsIGFwaUZuQXJncykge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuY2Fubm90T2J0YWluSW5mb0ZvckVsZW1lbnRTcGVjaWZpZWRCeVNlbGVjdG9yRXJyb3IsIGFwaUZuQXJncyk7XG5cbiAgICAgICAgdGhpcy5jYWxsc2l0ZSA9IGNhbGxzaXRlO1xuICAgIH1cbn1cblxuLy8gUGFnZSBlcnJvcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBjbGFzcyBQYWdlTG9hZEVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVyck1zZywgdXJsKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5wYWdlTG9hZEVycm9yKTtcblxuICAgICAgICB0aGlzLnVybCAgICA9IHVybDtcbiAgICAgICAgdGhpcy5lcnJNc2cgPSBlcnJNc2c7XG4gICAgfVxufVxuXG5cbi8vIFVuY2F1Z2h0IGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNsYXNzIFVuY2F1Z2h0RXJyb3JPblBhZ2UgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoZXJyU3RhY2ssIHBhZ2VEZXN0VXJsKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9yT25QYWdlKTtcblxuICAgICAgICB0aGlzLmVyclN0YWNrICAgID0gZXJyU3RhY2s7XG4gICAgICAgIHRoaXMucGFnZURlc3RVcmwgPSBwYWdlRGVzdFVybDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmNhdWdodEVycm9ySW5UZXN0Q29kZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChlcnIsIGNhbGxzaXRlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5UZXN0Q29kZSk7XG5cbiAgICAgICAgdGhpcy5lcnJNc2cgICAgICA9IFN0cmluZyhlcnIucmF3TWVzc2FnZSB8fCBlcnIpO1xuICAgICAgICB0aGlzLmNhbGxzaXRlICAgID0gZXJyLmNhbGxzaXRlIHx8IGNhbGxzaXRlO1xuICAgICAgICB0aGlzLm9yaWdpbkVycm9yID0gZXJyO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuY2F1Z2h0Tm9uRXJyb3JPYmplY3RJblRlc3RDb2RlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKG9iaikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHROb25FcnJvck9iamVjdEluVGVzdENvZGUpO1xuXG4gICAgICAgIHRoaXMub2JqVHlwZSA9IHR5cGVvZiBvYmo7XG4gICAgICAgIHRoaXMub2JqU3RyICA9IFN0cmluZyhvYmopO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuY2F1Z2h0RXJyb3JJbkNsaWVudEZ1bmN0aW9uQ29kZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lLCBlcnIpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXJyb3JJbkNsaWVudEZ1bmN0aW9uQ29kZSk7XG5cbiAgICAgICAgdGhpcy5lcnJNc2cgICAgICAgICAgICAgICAgICAgID0gU3RyaW5nKGVycik7XG4gICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZSA9IGluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5jYXVnaHRFcnJvckluQ3VzdG9tRE9NUHJvcGVydHlDb2RlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWUsIGVyciwgcHJvcCkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluQ3VzdG9tRE9NUHJvcGVydHlDb2RlLCBlcnIsIHByb3ApO1xuXG4gICAgICAgIHRoaXMuZXJyTXNnICAgICAgICAgICAgICAgICAgICA9IFN0cmluZyhlcnIpO1xuICAgICAgICB0aGlzLnByb3BlcnR5ICAgICAgICAgICAgICAgICAgPSBwcm9wO1xuICAgICAgICB0aGlzLmluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWUgPSBpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuaGFuZGxlZFByb21pc2VSZWplY3Rpb25FcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChlcnIpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLnVuaGFuZGxlZFByb21pc2VSZWplY3Rpb24pO1xuXG4gICAgICAgIHRoaXMuZXJyTXNnID0gU3RyaW5nKGVycik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5jYXVnaHRFeGNlcHRpb25FcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChlcnIpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXhjZXB0aW9uKTtcblxuICAgICAgICB0aGlzLmVyck1zZyA9IFN0cmluZyhlcnIpO1xuICAgIH1cbn1cblxuXG4vLyBBc3NlcnRpb24gZXJyb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxBc3NlcnRpb25MaWJyYXJ5RXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoZXJyLCBjYWxsc2l0ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuZXh0ZXJuYWxBc3NlcnRpb25MaWJyYXJ5RXJyb3IpO1xuXG4gICAgICAgIHRoaXMuZXJyTXNnICAgPSBTdHJpbmcoZXJyKTtcbiAgICAgICAgdGhpcy5jYWxsc2l0ZSA9IGNhbGxzaXRlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzc2VydGlvbkV4ZWN1dGFibGVBcmd1bWVudEVycm9yIGV4dGVuZHMgQWN0aW9uQXJndW1lbnRFcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChhcmd1bWVudE5hbWUsIGFyZ3VtZW50VmFsdWUsIGVyciwgaXNBUElFcnJvcikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYXNzZXJ0aW9uRXhlY3V0YWJsZUFyZ3VtZW50RXJyb3IsIGFyZ3VtZW50TmFtZSwgYXJndW1lbnRWYWx1ZSk7XG5cbiAgICAgICAgdGhpcy5lcnJNc2cgICAgICA9IGlzQVBJRXJyb3IgPyBlcnIucmF3TWVzc2FnZSA6IGVyci5tZXNzYWdlO1xuICAgICAgICB0aGlzLm9yaWdpbkVycm9yID0gZXJyO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzc2VydGlvbldpdGhvdXRNZXRob2RDYWxsRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY2FsbHNpdGUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFzc2VydGlvbldpdGhvdXRNZXRob2RDYWxsRXJyb3IpO1xuXG4gICAgICAgIHRoaXMuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3NlcnRpb25VbmF3YWl0ZWRQcm9taXNlRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY2FsbHNpdGUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFzc2VydGlvblVuYXdhaXRlZFByb21pc2VFcnJvcik7XG5cbiAgICAgICAgdGhpcy5jYWxsc2l0ZSA9IGNhbGxzaXRlO1xuICAgIH1cbn1cblxuLy8gQWN0aW9uIHBhcmFtZXRlcnMgZXJyb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBPcHRpb25zIGVycm9yc1xuZXhwb3J0IGNsYXNzIEFjdGlvbkludGVnZXJPcHRpb25FcnJvciBleHRlbmRzIEFjdGlvbk9wdGlvbkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25JbnRlZ2VyT3B0aW9uRXJyb3IsIG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25Qb3NpdGl2ZUludGVnZXJPcHRpb25FcnJvciBleHRlbmRzIEFjdGlvbk9wdGlvbkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25Qb3NpdGl2ZUludGVnZXJPcHRpb25FcnJvciwgb3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkJvb2xlYW5PcHRpb25FcnJvciBleHRlbmRzIEFjdGlvbk9wdGlvbkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25Cb29sZWFuT3B0aW9uRXJyb3IsIG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25Cb29sZWFuQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uQm9vbGVhbkFyZ3VtZW50RXJyb3IsIGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblNwZWVkT3B0aW9uRXJyb3IgZXh0ZW5kcyBBY3Rpb25PcHRpb25FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uU3BlZWRPcHRpb25FcnJvciwgb3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbk9wdGlvbnNUeXBlRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYWN0dWFsVHlwZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uT3B0aW9uc1R5cGVFcnJvcik7XG5cbiAgICAgICAgdGhpcy5hY3R1YWxUeXBlID0gYWN0dWFsVHlwZTtcbiAgICB9XG59XG5cblxuLy8gQXJndW1lbnRzIGVycm9yc1xuZXhwb3J0IGNsYXNzIEFjdGlvblN0cmluZ0FyZ3VtZW50RXJyb3IgZXh0ZW5kcyBBY3Rpb25Bcmd1bWVudEVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblN0cmluZ0FyZ3VtZW50RXJyb3IsIGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbk51bGxhYmxlU3RyaW5nQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uTnVsbGFibGVTdHJpbmdBcmd1bWVudEVycm9yLCBhcmd1bWVudE5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25JbnRlZ2VyQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uSW50ZWdlckFyZ3VtZW50RXJyb3IsIGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblJvbGVBcmd1bWVudEVycm9yIGV4dGVuZHMgQWN0aW9uQXJndW1lbnRFcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChhcmd1bWVudE5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25Sb2xlQXJndW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uUG9zaXRpdmVJbnRlZ2VyQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uUG9zaXRpdmVJbnRlZ2VyQXJndW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uU3RyaW5nT3JTdHJpbmdBcnJheUFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBBY3Rpb25Bcmd1bWVudEVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblN0cmluZ09yU3RyaW5nQXJyYXlBcmd1bWVudEVycm9yLCBhcmd1bWVudE5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25TdHJpbmdBcnJheUVsZW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSwgZWxlbWVudEluZGV4KSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25TdHJpbmdBcnJheUVsZW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG5cbiAgICAgICAgdGhpcy5lbGVtZW50SW5kZXggPSBlbGVtZW50SW5kZXg7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0VGVzdFNwZWVkQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuc2V0VGVzdFNwZWVkQXJndW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uVW5zdXBwb3J0ZWREZXZpY2VUeXBlRXJyb3IgZXh0ZW5kcyBBY3Rpb25Bcmd1bWVudEVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSwgYXJndW1lbnRWYWx1ZSkge1xuICAgI