UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

454 lines 55.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SwitchToWindowPredicateError = exports.CannotCloseWindowWithoutParentError = exports.CannotCloseWindowWithChildrenError = exports.CloseChildWindowError = exports.CannotSwitchToWindowError = exports.ChildWindowIsNotLoadedError = exports.ChildWindowNotFoundError = exports.CurrentIframeIsNotLoadedError = exports.ActionIframeIsNotLoadedError = exports.ActionElementNotIframeError = exports.InvalidElementScreenshotDimensionsError = exports.ActionInvalidScrollTargetError = exports.ActionElementIsNotFileInputError = exports.ActionCannotFindFileToUploadError = exports.ActionIncorrectKeysError = exports.ActionRootContainerNotFoundError = exports.ActionElementNonContentEditableError = exports.ActionElementNotTextAreaError = exports.ActionElementNonEditableError = exports.ActionAdditionalSelectorMatchesWrongNodeTypeError = exports.ActionAdditionalElementIsInvisibleError = exports.ActionElementIsNotTargetError = exports.ActionAdditionalElementNotFoundError = exports.ActionSelectorMatchesWrongNodeTypeError = exports.ActionElementIsInvisibleError = exports.ActionElementNotFoundError = exports.ActionInvalidObjectPropertyError = exports.ActionFunctionOptionError = exports.ActionObjectOptionError = exports.ActionUrlSearchParamsOptionError = exports.ActionUrlOptionError = exports.ActionNumberOptionError = exports.ActionDateOptionError = exports.ActionStringOrRegexOptionError = exports.ActionStringOptionError = exports.ActionSpeedOptionError = exports.ActionBooleanOptionError = exports.ActionPositiveIntegerOptionError = exports.ActionIntegerOptionError = exports.UncaughtErrorInCustomClientScriptLoadedFromModule = exports.UncaughtErrorInCustomClientScriptCode = exports.UncaughtErrorInCustomDOMPropertyCode = exports.UncaughtErrorInClientFunctionCode = exports.UncaughtErrorOnPage = exports.CannotObtainInfoForElementSpecifiedBySelectorError = exports.InvalidSelectorResultError = exports.SelectorErrorBase = exports.DomNodeClientFunctionResultError = exports.ClientFunctionExecutionInterruptionError = exports.TestRunErrorBase = void 0; exports.MultipleWindowsModeIsNotSupportedInNativeAutomationModeError = exports.UncaughtErrorInNativeDialogHandler = exports.NativeDialogNotHandledError = exports.CurrentIframeIsInvisibleError = exports.CurrentIframeNotFoundError = exports.CannotRestoreChildWindowError = exports.ChildWindowClosedBeforeSwitchingError = exports.PreviousWindowNotFoundError = exports.ParentWindowNotFoundError = exports.WindowNotFoundError = void 0; // ------------------------------------------------------------- // 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("../../errors/types"); // Base //-------------------------------------------------------------------- class TestRunErrorBase { constructor(code, callsite) { this.code = code; this.isTestCafeError = true; this.callsite = callsite || null; } } exports.TestRunErrorBase = TestRunErrorBase; class ActionOptionErrorBase extends TestRunErrorBase { constructor(code, optionName, actualValue) { super(code); this.optionName = optionName; this.actualValue = actualValue; } } // Client function errors //-------------------------------------------------------------------- class ClientFunctionExecutionInterruptionError extends TestRunErrorBase { constructor(instantiationCallsiteName, callsite) { super(types_1.TEST_RUN_ERRORS.clientFunctionExecutionInterruptionError, callsite); this.instantiationCallsiteName = instantiationCallsiteName; } } exports.ClientFunctionExecutionInterruptionError = ClientFunctionExecutionInterruptionError; class DomNodeClientFunctionResultError extends TestRunErrorBase { constructor(instantiationCallsiteName, callsite) { super(types_1.TEST_RUN_ERRORS.domNodeClientFunctionResultError, callsite); this.instantiationCallsiteName = instantiationCallsiteName; } } exports.DomNodeClientFunctionResultError = DomNodeClientFunctionResultError; // Selector errors //-------------------------------------------------------------------- class SelectorErrorBase extends TestRunErrorBase { constructor(code, { apiFnChain, apiFnIndex, reason } = {}, callsite) { super(code, callsite); this.apiFnChain = apiFnChain; this.apiFnIndex = apiFnIndex; this.reason = reason; } } exports.SelectorErrorBase = SelectorErrorBase; class InvalidSelectorResultError extends TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.invalidSelectorResultError, callsite); } } exports.InvalidSelectorResultError = InvalidSelectorResultError; class CannotObtainInfoForElementSpecifiedBySelectorError extends SelectorErrorBase { constructor(callsite, apiFnArgs) { super(types_1.TEST_RUN_ERRORS.cannotObtainInfoForElementSpecifiedBySelectorError, apiFnArgs, callsite); } } exports.CannotObtainInfoForElementSpecifiedBySelectorError = CannotObtainInfoForElementSpecifiedBySelectorError; // 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 UncaughtErrorInClientFunctionCode extends TestRunErrorBase { constructor(instantiationCallsiteName, err, callsite) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInClientFunctionCode, callsite); this.errMsg = String(err); this.instantiationCallsiteName = instantiationCallsiteName; } } exports.UncaughtErrorInClientFunctionCode = UncaughtErrorInClientFunctionCode; class UncaughtErrorInCustomDOMPropertyCode extends TestRunErrorBase { constructor(instantiationCallsiteName, err, prop, callsite) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomDOMPropertyCode, callsite); this.errMsg = String(err); this.property = prop; this.instantiationCallsiteName = instantiationCallsiteName; } } exports.UncaughtErrorInCustomDOMPropertyCode = UncaughtErrorInCustomDOMPropertyCode; class UncaughtErrorInCustomClientScriptCode extends TestRunErrorBase { constructor(err) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomClientScriptCode); this.errMsg = String(err); } } exports.UncaughtErrorInCustomClientScriptCode = UncaughtErrorInCustomClientScriptCode; class UncaughtErrorInCustomClientScriptLoadedFromModule extends TestRunErrorBase { constructor(err, moduleName) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomClientScriptCodeLoadedFromModule); this.errMsg = String(err); this.moduleName = moduleName; } } exports.UncaughtErrorInCustomClientScriptLoadedFromModule = UncaughtErrorInCustomClientScriptLoadedFromModule; // 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 ActionSpeedOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionSpeedOptionError, optionName, actualValue); } } exports.ActionSpeedOptionError = ActionSpeedOptionError; class ActionStringOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionStringOptionError, optionName, actualValue); } } exports.ActionStringOptionError = ActionStringOptionError; class ActionStringOrRegexOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionStringOrRegexOptionError, optionName, actualValue); } } exports.ActionStringOrRegexOptionError = ActionStringOrRegexOptionError; class ActionDateOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionDateOptionError, optionName, actualValue); } } exports.ActionDateOptionError = ActionDateOptionError; class ActionNumberOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionNumberOptionError, optionName, actualValue); } } exports.ActionNumberOptionError = ActionNumberOptionError; class ActionUrlOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionUrlOptionError, optionName, actualValue); } } exports.ActionUrlOptionError = ActionUrlOptionError; class ActionUrlSearchParamsOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionUrlSearchParamsOptionError, optionName, actualValue); } } exports.ActionUrlSearchParamsOptionError = ActionUrlSearchParamsOptionError; class ActionObjectOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionObjectOptionError, optionName, actualValue); } } exports.ActionObjectOptionError = ActionObjectOptionError; class ActionFunctionOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionFunctionOptionError, optionName, actualValue); } } exports.ActionFunctionOptionError = ActionFunctionOptionError; class ActionInvalidObjectPropertyError extends TestRunErrorBase { constructor(objectName, propertyName, availableProperties) { super(types_1.TEST_RUN_ERRORS.actionInvalidObjectPropertyError); this.objectName = objectName; this.propertyName = propertyName; this.availableProperties = availableProperties; } } exports.ActionInvalidObjectPropertyError = ActionInvalidObjectPropertyError; // Action execution errors //-------------------------------------------------------------------- class ActionElementNotFoundError extends SelectorErrorBase { constructor(callsite, apiFnArgs) { super(types_1.TEST_RUN_ERRORS.actionElementNotFoundError, apiFnArgs, callsite); } } exports.ActionElementNotFoundError = ActionElementNotFoundError; class ActionElementIsInvisibleError extends SelectorErrorBase { constructor(callsite, apiFnArgs) { super(types_1.TEST_RUN_ERRORS.actionElementIsInvisibleError, apiFnArgs, callsite); } } 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 ActionElementIsNotTargetError extends TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.actionElementIsNotTargetError, callsite); } } exports.ActionElementIsNotTargetError = ActionElementIsNotTargetError; class ActionAdditionalElementIsInvisibleError extends SelectorErrorBase { constructor(argumentName, apiFnArgs) { super(types_1.TEST_RUN_ERRORS.actionAdditionalElementIsInvisibleError, apiFnArgs); 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, scannedFilePaths) { super(types_1.TEST_RUN_ERRORS.actionCannotFindFileToUploadError); this.filePaths = filePaths; this.scannedFilePaths = scannedFilePaths; } } 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 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; // Iframe errors //-------------------------------------------------------------------- class ActionElementNotIframeError extends TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.actionElementNotIframeError, callsite); } } 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 ChildWindowNotFoundError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.childWindowNotFoundError); } } exports.ChildWindowNotFoundError = ChildWindowNotFoundError; class ChildWindowIsNotLoadedError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.childWindowIsNotLoadedError); } } exports.ChildWindowIsNotLoadedError = ChildWindowIsNotLoadedError; class CannotSwitchToWindowError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.cannotSwitchToWindowError); } } exports.CannotSwitchToWindowError = CannotSwitchToWindowError; class CloseChildWindowError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.closeChildWindowError); } } exports.CloseChildWindowError = CloseChildWindowError; class CannotCloseWindowWithChildrenError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.cannotCloseWindowWithChildrenError); } } exports.CannotCloseWindowWithChildrenError = CannotCloseWindowWithChildrenError; class CannotCloseWindowWithoutParentError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.cannotCloseWindowWithoutParent); } } exports.CannotCloseWindowWithoutParentError = CannotCloseWindowWithoutParentError; class SwitchToWindowPredicateError extends TestRunErrorBase { constructor(errMsg) { super(types_1.TEST_RUN_ERRORS.switchToWindowPredicateError); this.errMsg = errMsg; } } exports.SwitchToWindowPredicateError = SwitchToWindowPredicateError; class WindowNotFoundError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.targetWindowNotFoundError); } } exports.WindowNotFoundError = WindowNotFoundError; class ParentWindowNotFoundError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.parentWindowNotFoundError); } } exports.ParentWindowNotFoundError = ParentWindowNotFoundError; class PreviousWindowNotFoundError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.previousWindowNotFoundError); } } exports.PreviousWindowNotFoundError = PreviousWindowNotFoundError; class ChildWindowClosedBeforeSwitchingError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.childWindowClosedBeforeSwitchingError); } } exports.ChildWindowClosedBeforeSwitchingError = ChildWindowClosedBeforeSwitchingError; class CannotRestoreChildWindowError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.cannotRestoreChildWindowError); } } exports.CannotRestoreChildWindowError = CannotRestoreChildWindowError; 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 MultipleWindowsModeIsNotSupportedInNativeAutomationModeError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.multipleWindowsModeIsNotSupportedInNativeAutomationError); } } exports.MultipleWindowsModeIsNotSupportedInNativeAutomationModeError = MultipleWindowsModeIsNotSupportedInNativeAutomationModeError; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2hhcmVkL2Vycm9ycy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsZ0VBQWdFO0FBQ2hFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsZ0VBQWdFO0FBQ2hFLDhDQUFxRDtBQUVyRCxPQUFPO0FBQ1Asc0VBQXNFO0FBQ3RFLE1BQWEsZ0JBQWdCO0lBQ3pCLFlBQWEsSUFBSSxFQUFFLFFBQVE7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBYyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBVSxRQUFRLElBQUksSUFBSSxDQUFDO0lBQzVDLENBQUM7Q0FDSjtBQU5ELDRDQU1DO0FBRUQsTUFBTSxxQkFBc0IsU0FBUSxnQkFBZ0I7SUFDaEQsWUFBYSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVc7UUFDdEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRVosSUFBSSxDQUFDLFVBQVUsR0FBSSxVQUFVLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDbkMsQ0FBQztDQUNKO0FBR0QseUJBQXlCO0FBQ3pCLHNFQUFzRTtBQUN0RSxNQUFhLHdDQUF5QyxTQUFRLGdCQUFnQjtJQUMxRSxZQUFhLHlCQUF5QixFQUFFLFFBQVE7UUFDNUMsS0FBSyxDQUFDLHVCQUFlLENBQUMsd0NBQXdDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFMUUsSUFBSSxDQUFDLHlCQUF5QixHQUFHLHlCQUF5QixDQUFDO0lBQy9ELENBQUM7Q0FDSjtBQU5ELDRGQU1DO0FBRUQsTUFBYSxnQ0FBaUMsU0FBUSxnQkFBZ0I7SUFDbEUsWUFBYSx5QkFBeUIsRUFBRSxRQUFRO1FBQzVDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLGdDQUFnQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWxFLElBQUksQ0FBQyx5QkFBeUIsR0FBRyx5QkFBeUIsQ0FBQztJQUMvRCxDQUFDO0NBQ0o7QUFORCw0RUFNQztBQUVELGtCQUFrQjtBQUNsQixzRUFBc0U7QUFDdEUsTUFBYSxpQkFBa0IsU0FBUSxnQkFBZ0I7SUFDbkQsWUFBYSxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxRQUFRO1FBQ2hFLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBTyxNQUFNLENBQUM7SUFDN0IsQ0FBQztDQUNKO0FBUkQsOENBUUM7QUFFRCxNQUFhLDBCQUEyQixTQUFRLGdCQUFnQjtJQUM1RCxZQUFhLFFBQVE7UUFDakIsS0FBSyxDQUFDLHVCQUFlLENBQUMsMEJBQTBCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEUsQ0FBQztDQUNKO0FBSkQsZ0VBSUM7QUFFRCxNQUFhLGtEQUFtRCxTQUFRLGlCQUFpQjtJQUNyRixZQUFhLFFBQVEsRUFBRSxTQUFTO1FBQzVCLEtBQUssQ0FBQyx1QkFBZSxDQUFDLGtEQUFrRCxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRyxDQUFDO0NBQ0o7QUFKRCxnSEFJQztBQUdELGtCQUFrQjtBQUNsQixzRUFBc0U7QUFDdEUsTUFBYSxtQkFBb0IsU0FBUSxnQkFBZ0I7SUFDckQsWUFBYSxRQUFRLEVBQUUsV0FBVztRQUM5QixLQUFLLENBQUMsdUJBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRTNDLElBQUksQ0FBQyxRQUFRLEdBQU0sUUFBUSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ25DLENBQUM7Q0FDSjtBQVBELGtEQU9DO0FBRUQsTUFBYSxpQ0FBa0MsU0FBUSxnQkFBZ0I7SUFDbkUsWUFBYSx5QkFBeUIsRUFBRSxHQUFHLEVBQUUsUUFBUTtRQUNqRCxLQUFLLENBQUMsdUJBQWUsQ0FBQyxpQ0FBaUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVuRSxJQUFJLENBQUMsTUFBTSxHQUFzQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLHlCQUF5QixHQUFHLHlCQUF5QixDQUFDO0lBQy9ELENBQUM7Q0FDSjtBQVBELDhFQU9DO0FBRUQsTUFBYSxvQ0FBcUMsU0FBUSxnQkFBZ0I7SUFDdEUsWUFBYSx5QkFBeUIsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVE7UUFDdkQsS0FBSyxDQUFDLHVCQUFlLENBQUMsb0NBQW9DLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFdEUsSUFBSSxDQUFDLE1BQU0sR0FBc0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLEdBQW9CLElBQUksQ0FBQztRQUN0QyxJQUFJLENBQUMseUJBQXlCLEdBQUcseUJBQXlCLENBQUM7SUFDL0QsQ0FBQztDQUNKO0FBUkQsb0ZBUUM7QUFFRCxNQUFhLHFDQUFzQyxTQUFRLGdCQUFnQjtJQUN2RSxZQUFhLEdBQUc7UUFDWixLQUFLLENBQUMsdUJBQWUsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBRTdELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDSjtBQU5ELHNGQU1DO0FBRUQsTUFBYSxpREFBa0QsU0FBUSxnQkFBZ0I7SUFDbkYsWUFBYSxHQUFHLEVBQUUsVUFBVTtRQUN4QixLQUFLLENBQUMsdUJBQWUsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBRTdFLElBQUksQ0FBQyxNQUFNLEdBQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQ2pDLENBQUM7Q0FDSjtBQVBELDhHQU9DO0FBR0QsMkJBQTJCO0FBQzNCLHNFQUFzRTtBQUN0RSxpQkFBaUI7QUFDakIsc0VBQXNFO0FBQ3RFLE1BQWEsd0JBQXlCLFNBQVEscUJBQXFCO0lBQy9ELFlBQWEsVUFBVSxFQUFFLFdBQVc7UUFDaEMsS0FBSyxDQUFDLHVCQUFlLENBQUMsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzdFLENBQUM7Q0FDSjtBQUpELDREQUlDO0FBRUQsTUFBYSxnQ0FBaUMsU0FBUSxxQkFBcUI7SUFDdkUsWUFBYSxVQUFVLEVBQUUsV0FBVztRQUNoQyxLQUFLLENBQUMsdUJBQWUsQ0FBQyxnQ0FBZ0MsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckYsQ0FBQztDQUNKO0FBSkQsNEVBSUM7QUFFRCxNQUFhLHdCQUF5QixTQUFRLHFCQUFxQjtJQUMvRCxZQUFhLFVBQVUsRUFBRSxXQUFXO1FBQ2hDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM3RSxDQUFDO0NBQ0o7QUFKRCw0REFJQztBQUVELE1BQWEsc0JBQXVCLFNBQVEscUJBQXFCO0lBQzdELFlBQWEsVUFBVSxFQUFFLFdBQVc7UUFDaEMsS0FBSyxDQUFDLHVCQUFlLENBQUMsc0JBQXNCLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzNFLENBQUM7Q0FDSjtBQUpELHdEQUlDO0FBRUQsTUFBYSx1QkFBd0IsU0FBUSxxQkFBcUI7SUFDOUQsWUFBYSxVQUFVLEVBQUUsV0FBVztRQUNoQyxLQUFLLENBQUMsdUJBQWUsQ0FBQyx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDNUUsQ0FBQztDQUNKO0FBSkQsMERBSUM7QUFDRCxNQUFhLDhCQUErQixTQUFRLHFCQUFxQjtJQUNyRSxZQUFhLFVBQVUsRUFBRSxXQUFXO1FBQ2hDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLDhCQUE4QixFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNuRixDQUFDO0NBQ0o7QUFKRCx3RUFJQztBQUVELE1BQWEscUJBQXNCLFNBQVEscUJBQXFCO0lBQzVELFlBQWEsVUFBVSxFQUFFLFdBQVc7UUFDaEMsS0FBSyxDQUFDLHVCQUFlLENBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFFLENBQUM7Q0FDSjtBQUpELHNEQUlDO0FBRUQsTUFBYSx1QkFBd0IsU0FBUSxxQkFBcUI7SUFDOUQsWUFBYSxVQUFVLEVBQUUsV0FBVztRQUNoQyxLQUFLLENBQUMsdUJBQWUsQ0FBQyx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDNUUsQ0FBQztDQUNKO0FBSkQsMERBSUM7QUFFRCxNQUFhLG9CQUFxQixTQUFRLHFCQUFxQjtJQUMzRCxZQUFhLFVBQVUsRUFBRSxXQUFXO1FBQ2hDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN6RSxDQUFDO0NBQ0o7QUFKRCxvREFJQztBQUVELE1BQWEsZ0NBQWlDLFNBQVEscUJBQXFCO0lBQ3ZFLFlBQWEsVUFBVSxFQUFFLFdBQVc7UUFDaEMsS0FBSyxDQUFDLHVCQUFlLENBQUMsZ0NBQWdDLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7Q0FDSjtBQUpELDRFQUlDO0FBRUQsTUFBYSx1QkFBd0IsU0FBUSxxQkFBcUI7SUFDOUQsWUFBYSxVQUFVLEVBQUUsV0FBVztRQUNoQyxLQUFLLENBQUMsdUJBQWUsQ0FBQyx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDNUUsQ0FBQztDQUNKO0FBSkQsMERBSUM7QUFFRCxNQUFhLHlCQUEwQixTQUFRLHFCQUFxQjtJQUNoRSxZQUFhLFVBQVUsRUFBRSxXQUFXO1FBQ2hDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHlCQUF5QixFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM5RSxDQUFDO0NBQ0o7QUFKRCw4REFJQztBQUVELE1BQWEsZ0NBQWlDLFNBQVEsZ0JBQWdCO0lBQ2xFLFlBQWEsVUFBVSxFQUFFLFlBQVksRUFBRSxtQkFBbUI7UUFDdEQsS0FBSyxDQUFDLHVCQUFlLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMsVUFBVSxHQUFZLFVBQVUsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxHQUFVLFlBQVksQ0FBQztRQUN4QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7SUFDbkQsQ0FBQztDQUNKO0FBUkQsNEVBUUM7QUFFRCwwQkFBMEI7QUFDMUIsc0VBQXNFO0FBQ3RFLE1BQWEsMEJBQTJCLFNBQVEsaUJBQWlCO0lBQzdELFlBQWEsUUFBUSxFQUFFLFNBQVM7UUFDNUIsS0FBSyxDQUFDLHVCQUFlLENBQUMsMEJBQTBCLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzNFLENBQUM7Q0FDSjtBQUpELGdFQUlDO0FBRUQsTUFBYSw2QkFBOEIsU0FBUSxpQkFBaUI7SUFDaEUsWUFBYSxRQUFRLEVBQUUsU0FBUztRQUM1QixLQUFLLENBQUMsdUJBQWUsQ0FBQyw2QkFBNkIsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDOUUsQ0FBQztDQUNKO0FBSkQsc0VBSUM7QUFFRCxNQUFhLHVDQUF3QyxTQUFRLGdCQUFnQjtJQUN6RSxZQUFhLGVBQWU7UUFDeEIsS0FBSyxDQUFDLHVCQUFlLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUMzQyxDQUFDO0NBQ0o7QUFORCwwRkFNQztBQUVELE1BQWEsb0NBQXFDLFNBQVEsaUJBQWlCO0lBQ3ZFLFlBQWEsWUFBWSxFQUFFLFNBQVM7UUFDaEMsS0FBSyxDQUFDLHVCQUFlLENBQUMsb0NBQW9DLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFdkUsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDckMsQ0FBQztDQUNKO0FBTkQsb0ZBTUM7QUFFRCxNQUFhLDZCQUE4QixTQUFRLGdCQUFnQjtJQUMvRCxZQUFhLFFBQVE7UUFDakIsS0FBSyxDQUFDLHVCQUFlLENBQUMsNkJBQTZCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkUsQ0FBQztDQUNKO0FBSkQsc0VBSUM7QUFFRCxNQUFhLHVDQUF3QyxTQUFRLGlCQUFpQjtJQUMxRSxZQUFhLFlBQVksRUFBRSxTQUFTO1FBQ2hDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHVDQUF1QyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTFFLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ3JDLENBQUM7Q0FDSjtBQU5ELDBGQU1DO0FBRUQsTUFBYSxpREFBa0QsU0FBUSxnQkFBZ0I7SUFDbkYsWUFBYSxZQUFZLEVBQUUsZUFBZTtRQUN0QyxLQUFLLENBQUMsdUJBQWUsQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1FBRXpFLElBQUksQ0FBQyxZQUFZLEdBQU0sWUFBWSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO0lBQzNDLENBQUM7Q0FDSjtBQVBELDhHQU9DO0FBRUQsTUFBYSw2QkFBOEIsU0FBUSxnQkFBZ0I7SUFDL0Q7UUFDSSxLQUFLLENBQUMsdUJBQWUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDSjtBQUpELHNFQUlDO0FBRUQsTUFBYSw2QkFBOEIsU0FBUSxnQkFBZ0I7SUFDL0Q7UUFDSSxLQUFLLENBQUMsdUJBQWUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDSjtBQUpELHNFQUlDO0FBRUQsTUFBYSxvQ0FBcUMsU0FBUSxnQkFBZ0I7SUFDdEUsWUFBYSxZQUFZO1FBQ3JCLEtBQUssQ0FBQyx1QkFBZSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDckMsQ0FBQztDQUNKO0FBTkQsb0ZBTUM7QUFFRCxNQUFhLGdDQUFpQyxTQUFRLGdCQUFnQjtJQUNsRTtRQUNJLEtBQUssQ0FBQyx1QkFBZSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztDQUNKO0FBSkQsNEVBSUM7QUFFRCxNQUFhLHdCQUF5QixTQUFRLGdCQUFnQjtJQUMxRCxZQUFhLFlBQVk7UUFDckIsS0FBSyxDQUFDLHVCQUFlLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNyQyxDQUFDO0NBQ0o7QUFORCw0REFNQztBQUVELE1BQWEsaUNBQWtDLFNBQVEsZ0JBQWdCO0lBQ25FLFlBQWEsU0FBUyxFQUFFLGdCQUFnQjtRQUNwQyxLQUFLLENBQUMsdUJBQWUsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQyxTQUFTLEdBQVUsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUM3QyxDQUFDO0NBQ0o7QUFQRCw4RUFPQztBQUVELE1BQWEsZ0NBQWlDLFNBQVEsZ0JBQWdCO0lBQ2xFO1FBQ0ksS0FBSyxDQUFDLHVCQUFlLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0NBQ0o7QUFKRCw0RUFJQztBQUVELE1BQWEsOEJBQStCLFNBQVEsZ0JBQWdCO0lBQ2hFLFlBQWEsa0JBQWtCLEVBQUUsa0JBQWtCO1FBQy9DLEtBQUssQ0FBQyx1QkFBZSxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3JCLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsNENBQTRDLENBQUM7O2dCQUUvRCxJQUFJLENBQUMsVUFBVSxHQUFHLHdCQUF3QixDQUFDO1NBQ2xEOztZQUVHLElBQUksQ0FBQyxVQUFVLEdBQUcsd0JBQXdCLENBQUM7SUFDbkQsQ0FBQztDQUNKO0FBYkQsd0VBYUM7QUFFRCxNQUFhLHVDQUF3QyxTQUFRLGdCQUFnQjtJQUN6RSxZQUFhLEtBQUssRUFBRSxNQUFNO1FBQ3RCLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFFL0QsTUFBTSxjQUFjLEdBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNuQyxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBRXBDLElBQUksY0FBYyxFQUFFO1lBQ2hCLElBQUksZUFBZSxFQUFFO2dCQUNqQixJQUFJLENBQUMsSUFBSSxHQUFTLEtBQUssQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQzthQUN4QztpQkFDSTtnQkFDRCxJQUFJLENBQUMsSUFBSSxHQUFTLElBQUksQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7YUFDN0I7U0FDSjthQUNJO1lBQ0QsSUFBSSxDQUFDLElBQUksR0FBUyxJQUFJLENBQUM7WUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7U0FDOUI7SUFDTCxDQUFDO0NBQ0o7QUF0QkQsMEZBc0JDO0FBR0QsZ0JBQWdCO0FBQ2hCLHNFQUFzRTtBQUN0RSxNQUFhLDJCQUE0QixTQUFRLGdCQUFnQjtJQUM3RCxZQUFhLFFBQVE7UUFDakIsS0FBSyxDQUFDLHVCQUFlLENBQUMsMkJBQTJCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDakUsQ0FBQztDQUNKO0FBSkQsa0VBSUM7QUFFRCxNQUFhLDRCQUE2QixTQUFRLGdCQUFnQjtJQUM5RDtRQUNJLEtBQUssQ0FBQyx1QkFBZSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNKO0FBSkQsb0VBSUM7QUFFRCxNQUFhLDZCQUE4QixTQUFRLGdCQUFnQjtJQUMvRDtRQUNJLEtBQUssQ0FBQyx1QkFBZSxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDekQsQ0FBQztDQUNKO0FBSkQsc0VBSUM7QUFFRCxNQUFhLHdCQUF5QixTQUFRLGdCQUFnQjtJQUMxRDtRQUNJLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNKO0FBSkQsNERBSUM7QUFFRCxNQUFhLDJCQUE0QixTQUFRLGdCQUFnQjtJQUM3RDtRQUNJLEtBQUssQ0FBQyx1QkFBZSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNKO0FBSkQsa0VBSUM7QUFFRCxNQUFhLHlCQUEwQixTQUFRLGdCQUFnQjtJQUMzRDtRQUNJLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDckQsQ0FBQztDQUNKO0FBSkQsOERBSUM7QUFFRCxNQUFhLHFCQUFzQixTQUFRLGdCQUFnQjtJQUN2RDtRQUNJLEtBQUssQ0FBQyx1QkFBZSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNKO0FBSkQsc0RBSUM7QUFFRCxNQUFhLGtDQUFtQyxTQUFRLGdCQUFnQjtJQUNwRTtRQUNJLEtBQUssQ0FBQyx1QkFBZSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztDQUNKO0FBSkQsZ0ZBSUM7QUFFRCxNQUFhLG1DQUFvQyxTQUFRLGdCQUFnQjtJQUNyRTtRQUNJLEtBQUssQ0FBQyx1QkFBZSxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDMUQsQ0FBQztDQUNKO0FBSkQsa0ZBSUM7QUFFRCxNQUFhLDRCQUE2QixTQUFRLGdCQUFnQjtJQUM5RCxZQUFhLE1BQU07UUFDZixLQUFLLENBQUMsdUJBQWUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBRXBELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3pCLENBQUM7Q0FDSjtBQU5ELG9FQU1DO0FBRUQsTUFBYSxtQkFBb0IsU0FBUSxnQkFBZ0I7SUFDckQ7UUFDSSxLQUFLLENBQUMsdUJBQWUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3JELENBQUM7Q0FDSjtBQUpELGtEQUlDO0FBRUQsTUFBYSx5QkFBMEIsU0FBUSxnQkFBZ0I7SUFDM0Q7UUFDSSxLQUFLLENBQUMsdUJBQWUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3JELENBQUM7Q0FDSjtBQUpELDhEQUlDO0FBRUQsTUFBYSwyQkFBNEIsU0FBUSxnQkFBZ0I7SUFDN0Q7UUFDSSxLQUFLLENBQUMsdUJBQWUsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7Q0FDSjtBQUpELGtFQUlDO0FBRUQsTUFBYSxxQ0FBc0MsU0FBUSxnQkFBZ0I7SUFDdkU7UUFDSSxLQUFLLENBQUMsdUJBQWUsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7Q0FDSjtBQUpELHNGQUlDO0FBRUQsTUFBYSw2QkFBOEIsU0FBUSxnQkFBZ0I7SUFDL0Q7UUFDSSxLQUFLLENBQUMsdUJBQWUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDSjtBQUpELHNFQUlDO0FBRUQsTUFBYSwwQkFBMkIsU0FBUSxnQkFBZ0I7SUFDNUQ7UUFDSSxLQUFLLENBQUMsdUJBQWUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FDSjtBQUpELGdFQUlDO0FBRUQsTUFBYSw2QkFBOEIsU0FBUSxnQkFBZ0I7SUFDL0Q7UUFDSSxLQUFLLENBQUMsdUJBQWUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDSjtBQUpELHNFQUlDO0FBR0QsdUJBQXVCO0FBQ3ZCLHNFQUFzRTtBQUN0RSxNQUFhLDJCQUE0QixTQUFRLGdCQUFnQjtJQUM3RCxZQUFhLFVBQVUsRUFBRSxHQUFHO1FBQ3hCLEtBQUssQ0FBQyx1QkFBZSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBTSxHQUFHLENBQUM7SUFDMUIsQ0FBQztDQUNKO0FBUEQsa0VBT0M7QUFFRCxNQUFhLGtDQUFtQyxTQUFRLGdCQUFnQjtJQUNwRSxZQUFhLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRztRQUNoQyxLQUFLLENBQUMsdUJBQWUsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQU8sTUFBTSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQU0sR0FBRyxDQUFDO0lBQzFCLENBQUM7Q0FDSjtBQVJELGdGQVFDO0FBRUQsTUFBYSw0REFBNkQsU0FBUSxnQkFBZ0I7SUFDOUY7UUFDSSxLQUFLLENBQUMsdUJBQWUsQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7Q0FDSjtBQUpELG9JQUlDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV0FSTklORzogdGhpcyBmaWxlIGlzIHVzZWQgYnkgYm90aCB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLlxuLy8gRG8gbm90IHVzZSBhbnkgYnJvd3NlciBvciBub2RlLXNwZWNpZmljIEFQSSFcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmltcG9ydCB7IFRFU1RfUlVOX0VSUk9SUyB9IGZyb20gJy4uLy4uL2Vycm9ycy90eXBlcyc7XG5cbi8vIEJhc2Vcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBjbGFzcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY29kZSwgY2FsbHNpdGUpIHtcbiAgICAgICAgdGhpcy5jb2RlICAgICAgICAgICAgPSBjb2RlO1xuICAgICAgICB0aGlzLmlzVGVzdENhZmVFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuY2FsbHNpdGUgICAgICAgID0gY2FsbHNpdGUgfHwgbnVsbDtcbiAgICB9XG59XG5cbmNsYXNzIEFjdGlvbk9wdGlvbkVycm9yQmFzZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjb2RlLCBvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihjb2RlKTtcblxuICAgICAgICB0aGlzLm9wdGlvbk5hbWUgID0gb3B0aW9uTmFtZTtcbiAgICAgICAgdGhpcy5hY3R1YWxWYWx1ZSA9IGFjdHVhbFZhbHVlO1xuICAgIH1cbn1cblxuXG4vLyBDbGllbnQgZnVuY3Rpb24gZXJyb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY2xhc3MgQ2xpZW50RnVuY3Rpb25FeGVjdXRpb25JbnRlcnJ1cHRpb25FcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lLCBjYWxsc2l0ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuY2xpZW50RnVuY3Rpb25FeGVjdXRpb25JbnRlcnJ1cHRpb25FcnJvciwgY2FsbHNpdGUpO1xuXG4gICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZSA9IGluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRG9tTm9kZUNsaWVudEZ1bmN0aW9uUmVzdWx0RXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZSwgY2FsbHNpdGUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmRvbU5vZGVDbGllbnRGdW5jdGlvblJlc3VsdEVycm9yLCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lID0gaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZTtcbiAgICB9XG59XG5cbi8vIFNlbGVjdG9yIGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNsYXNzIFNlbGVjdG9yRXJyb3JCYXNlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGNvZGUsIHsgYXBpRm5DaGFpbiwgYXBpRm5JbmRleCwgcmVhc29uIH0gPSB7fSwgY2FsbHNpdGUpIHtcbiAgICAgICAgc3VwZXIoY29kZSwgY2FsbHNpdGUpO1xuXG4gICAgICAgIHRoaXMuYXBpRm5DaGFpbiA9IGFwaUZuQ2hhaW47XG4gICAgICAgIHRoaXMuYXBpRm5JbmRleCA9IGFwaUZuSW5kZXg7XG4gICAgICAgIHRoaXMucmVhc29uICAgICA9IHJlYXNvbjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkU2VsZWN0b3JSZXN1bHRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjYWxsc2l0ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuaW52YWxpZFNlbGVjdG9yUmVzdWx0RXJyb3IsIGNhbGxzaXRlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYW5ub3RPYnRhaW5JbmZvRm9yRWxlbWVudFNwZWNpZmllZEJ5U2VsZWN0b3JFcnJvciBleHRlbmRzIFNlbGVjdG9yRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY2FsbHNpdGUsIGFwaUZuQXJncykge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuY2Fubm90T2J0YWluSW5mb0ZvckVsZW1lbnRTcGVjaWZpZWRCeVNlbGVjdG9yRXJyb3IsIGFwaUZuQXJncywgY2FsbHNpdGUpO1xuICAgIH1cbn1cblxuXG4vLyBVbmNhdWdodCBlcnJvcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBjbGFzcyBVbmNhdWdodEVycm9yT25QYWdlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVyclN0YWNrLCBwYWdlRGVzdFVybCkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvck9uUGFnZSk7XG5cbiAgICAgICAgdGhpcy5lcnJTdGFjayAgICA9IGVyclN0YWNrO1xuICAgICAgICB0aGlzLnBhZ2VEZXN0VXJsID0gcGFnZURlc3RVcmw7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5jYXVnaHRFcnJvckluQ2xpZW50RnVuY3Rpb25Db2RlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWUsIGVyciwgY2FsbHNpdGUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXJyb3JJbkNsaWVudEZ1bmN0aW9uQ29kZSwgY2FsbHNpdGUpO1xuXG4gICAgICAgIHRoaXMuZXJyTXNnICAgICAgICAgICAgICAgICAgICA9IFN0cmluZyhlcnIpO1xuICAgICAgICB0aGlzLmluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWUgPSBpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuY2F1Z2h0RXJyb3JJbkN1c3RvbURPTVByb3BlcnR5Q29kZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lLCBlcnIsIHByb3AsIGNhbGxzaXRlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5DdXN0b21ET01Qcm9wZXJ0eUNvZGUsIGNhbGxzaXRlKTtcblxuICAgICAgICB0aGlzLmVyck1zZyAgICAgICAgICAgICAgICAgICAgPSBTdHJpbmcoZXJyKTtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eSAgICAgICAgICAgICAgICAgID0gcHJvcDtcbiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lID0gaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmNhdWdodEVycm9ySW5DdXN0b21DbGllbnRTY3JpcHRDb2RlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVycikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluQ3VzdG9tQ2xpZW50U2NyaXB0Q29kZSk7XG5cbiAgICAgICAgdGhpcy5lcnJNc2cgPSBTdHJpbmcoZXJyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmNhdWdodEVycm9ySW5DdXN0b21DbGllbnRTY3JpcHRMb2FkZWRGcm9tTW9kdWxlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVyciwgbW9kdWxlTmFtZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluQ3VzdG9tQ2xpZW50U2NyaXB0Q29kZUxvYWRlZEZyb21Nb2R1bGUpO1xuXG4gICAgICAgIHRoaXMuZXJyTXNnICAgICA9IFN0cmluZyhlcnIpO1xuICAgICAgICB0aGlzLm1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lO1xuICAgIH1cbn1cblxuXG4vLyBBY3Rpb24gcGFyYW1ldGVycyBlcnJvcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE9wdGlvbnMgZXJyb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY2xhc3MgQWN0aW9uSW50ZWdlck9wdGlvbkVycm9yIGV4dGVuZHMgQWN0aW9uT3B0aW9uRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkludGVnZXJPcHRpb25FcnJvciwgb3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblBvc2l0aXZlSW50ZWdlck9wdGlvbkVycm9yIGV4dGVuZHMgQWN0aW9uT3B0aW9uRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblBvc2l0aXZlSW50ZWdlck9wdGlvbkVycm9yLCBvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uQm9vbGVhbk9wdGlvbkVycm9yIGV4dGVuZHMgQWN0aW9uT3B0aW9uRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkJvb2xlYW5PcHRpb25FcnJvciwgb3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblNwZWVkT3B0aW9uRXJyb3IgZXh0ZW5kcyBBY3Rpb25PcHRpb25FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uU3BlZWRPcHRpb25FcnJvciwgb3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblN0cmluZ09wdGlvbkVycm9yIGV4dGVuZHMgQWN0aW9uT3B0aW9uRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblN0cmluZ09wdGlvbkVycm9yLCBvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFjdGlvblN0cmluZ09yUmVnZXhPcHRpb25FcnJvciBleHRlbmRzIEFjdGlvbk9wdGlvbkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25TdHJpbmdPclJlZ2V4T3B0aW9uRXJyb3IsIG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25EYXRlT3B0aW9uRXJyb3IgZXh0ZW5kcyBBY3Rpb25PcHRpb25FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uRGF0ZU9wdGlvbkVycm9yLCBvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uTnVtYmVyT3B0aW9uRXJyb3IgZXh0ZW5kcyBBY3Rpb25PcHRpb25FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uTnVtYmVyT3B0aW9uRXJyb3IsIG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25VcmxPcHRpb25FcnJvciBleHRlbmRzIEFjdGlvbk9wdGlvbkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25VcmxPcHRpb25FcnJvciwgb3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblVybFNlYXJjaFBhcmFtc09wdGlvbkVycm9yIGV4dGVuZHMgQWN0aW9uT3B0aW9uRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblVybFNlYXJjaFBhcmFtc09wdGlvbkVycm9yLCBvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uT2JqZWN0T3B0aW9uRXJyb3IgZXh0ZW5kcyBBY3Rpb25PcHRpb25FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uT2JqZWN0T3B0aW9uRXJyb3IsIG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25GdW5jdGlvbk9wdGlvbkVycm9yIGV4dGVuZHMgQWN0aW9uT3B0aW9uRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkZ1bmN0aW9uT3B0aW9uRXJyb3IsIG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25JbnZhbGlkT2JqZWN0UHJvcGVydHlFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChvYmplY3ROYW1lLCBwcm9wZXJ0eU5hbWUsIGF2YWlsYWJsZVByb3BlcnRpZXMpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkludmFsaWRPYmplY3RQcm9wZXJ0eUVycm9yKTtcblxuICAgICAgICB0aGlzLm9iamVjdE5hbWUgICAgICAgICAgPSBvYmplY3ROYW1lO1xuICAgICAgICB0aGlzLnByb3BlcnR5TmFtZSAgICAgICAgPSBwcm9wZXJ0eU5hbWU7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlUHJvcGVydGllcyA9IGF2YWlsYWJsZVByb3BlcnRpZXM7XG4gICAgfVxufVxuXG4vLyBBY3Rpb24gZXhlY3V0aW9uIGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNsYXNzIEFjdGlvbkVsZW1lbnROb3RGb3VuZEVycm9yIGV4dGVuZHMgU2VsZWN0b3JFcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjYWxsc2l0ZSwgYXBpRm5BcmdzKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50Tm90Rm91bmRFcnJvciwgYXBpRm5BcmdzLCBjYWxsc2l0ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRWxlbWVudElzSW52aXNpYmxlRXJyb3IgZXh0ZW5kcyBTZWxlY3RvckVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGNhbGxzaXRlLCBhcGlGbkFyZ3MpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkVsZW1lbnRJc0ludmlzaWJsZUVycm9yLCBhcGlGbkFyZ3MsIGNhbGxzaXRlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25TZWxlY3Rvck1hdGNoZXNXcm9uZ05vZGVUeXBlRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAobm9kZURlc2NyaXB0aW9uKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25TZWxlY3Rvck1hdGNoZXNXcm9uZ05vZGVUeXBlRXJyb3IpO1xuXG4gICAgICAgIHRoaXMubm9kZURlc2NyaXB0aW9uID0gbm9kZURlc2NyaXB0aW9uO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkFkZGl0aW9uYWxFbGVtZW50Tm90Rm91bmRFcnJvciBleHRlbmRzIFNlbGVjdG9yRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhcGlGbkFyZ3MpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkFkZGl0aW9uYWxFbGVtZW50Tm90Rm91bmRFcnJvciwgYXBpRm5BcmdzKTtcblxuICAgICAgICB0aGlzLmFyZ3VtZW50TmFtZSA9IGFyZ3VtZW50TmFtZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25FbGVtZW50SXNOb3RUYXJnZXRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjYWxsc2l0ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uRWxlbWVudElzTm90VGFyZ2V0RXJyb3IsIGNhbGxzaXRlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25BZGRpdGlvbmFsRWxlbWVudElzSW52aXNpYmxlRXJyb3IgZXh0ZW5kcyBTZWxlY3RvckVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSwgYXBpRm5BcmdzKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25BZGRpdGlvbmFsRWxlbWVudElzSW52aXNpYmxlRXJyb3IsIGFwaUZuQXJncyk7XG5cbiAgICAgICAgdGhpcy5hcmd1bWVudE5hbWUgPSBhcmd1bWVudE5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uQWRkaXRpb25hbFNlbGVjdG9yTWF0Y2hlc1dyb25nTm9kZVR5cGVFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChhcmd1bWVudE5hbWUsIG5vZGVEZXNjcmlwdGlvbikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uQWRkaXRpb25hbFNlbGVjdG9yTWF0Y2hlc1dyb25nTm9kZVR5cGVFcnJvcik7XG5cbiAgICAgICAgdGhpcy5hcmd1bWVudE5hbWUgICAgPSBhcmd1bWVudE5hbWU7XG4gICAgICAgIHRoaXMubm9kZURlc2NyaXB0aW9uID0gbm9kZURlc2NyaXB0aW9uO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkVsZW1lbnROb25FZGl0YWJsZUVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uRWxlbWVudE5vbkVkaXRhYmxlRXJyb3IpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkVsZW1lbnROb3RUZXh0QXJlYUVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uRWxlbWVudE5vdFRleHRBcmVhRXJyb3IpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkVsZW1lbnROb25Db250ZW50RWRpdGFibGVFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChhcmd1bWVudE5hbWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkVsZW1lbnROb25Db250ZW50RWRpdGFibGVFcnJvcik7XG5cbiAgICAgICAgdGhpcy5hcmd1bWVudE5hbWUgPSBhcmd1bWVudE5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uUm9vdENvbnRhaW5lck5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25Sb290Q29udGFpbmVyTm90Rm91bmRFcnJvcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uSW5jb3JyZWN0S2V5c0Vycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uSW5jb3JyZWN0S2V5c0Vycm9yKTtcblxuICAgICAgICB0aGlzLmFyZ3VtZW50TmFtZSA9IGFyZ3VtZW50TmFtZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25DYW5ub3RGaW5kRmlsZVRvVXBsb2FkRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoZmlsZVBhdGhzLCBzY2FubmVkRmlsZVBhdGhzKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25DYW5ub3RGaW5kRmlsZVRvVXBsb2FkRXJyb3IpO1xuXG4gICAgICAgIHRoaXMuZmlsZVBhdGhzICAgICAgICA9IGZpbGVQYXRocztcbiAgICAgICAgdGhpcy5zY2FubmVkRmlsZVBhdGhzID0gc2Nhbm5lZEZpbGVQYXRocztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25FbGVtZW50SXNOb3RGaWxlSW5wdXRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkVsZW1lbnRJc05vdEZpbGVJbnB1dEVycm9yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25JbnZhbGlkU2Nyb2xsVGFyZ2V0RXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoc2Nyb2xsVGFyZ2V0WFZhbGlkLCBzY3JvbGxUYXJnZXRZVmFsaWQpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkludmFsaWRTY3JvbGxUYXJnZXRFcnJvcik7XG5cbiAgICAgICAgaWYgKCFzY3JvbGxUYXJnZXRYVmFsaWQpIHtcbiAgICAgICAgICAgIGlmICghc2Nyb2xsVGFyZ2V0WVZhbGlkKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyA9ICdzY3JvbGxUYXJnZXRYIGFuZCBzY3JvbGxUYXJnZXRZIHByb3BlcnRpZXMnO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyA9ICdzY3JvbGxUYXJnZXRYIHByb3BlcnR5JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSAnc2Nyb2xsVGFyZ2V0WSBwcm9wZXJ0eSc7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZEVsZW1lbnRTY3JlZW5zaG90RGltZW5zaW9uc0Vycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmludmFsaWRFbGVtZW50U2NyZWVuc2hvdERpbWVuc2lvbnNFcnJvcik7XG5cbiAgICAgICAgY29uc3Qgd2lkdGhJc0ludmFsaWQgID0gd2lkdGggPD0gMDtcbiAgICAgICAgY29uc3QgaGVpZ2h0SXNJbnZhbGlkID0gaGVpZ