testcafe
Version:
Automated browser testing for the modern web development stack.
503 lines • 60.2 kB
JavaScript
"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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXJyb3JzL3Rlc3QtcnVuL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsZ0VBQWdFO0FBQ2hFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsZ0VBQWdFO0FBQ2hFLG9DQUEyQztBQUUzQyxPQUFPO0FBQ1Asc0VBQXNFO0FBQ3RFLE1BQU0sZ0JBQWdCO0lBQ2xCLFlBQWEsSUFBSTtRQUNiLElBQUksQ0FBQyxJQUFJLEdBQWMsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLEdBQVUsSUFBSSxDQUFDO0lBQ2hDLENBQUM7Q0FDSjtBQUVELE1BQU0scUJBQXNCLFNBQVEsZ0JBQWdCO0lBQ2hELFlBQWEsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXO1FBQ3RDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVaLElBQUksQ0FBQyxVQUFVLEdBQUksVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ25DLENBQUM7Q0FDSjtBQUVELE1BQU0sdUJBQXdCLFNBQVEsZ0JBQWdCO0lBQ2xELFlBQWEsSUFBSSxFQUFFLFlBQVksRUFBRSxXQUFXO1FBQ3hDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVaLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUksV0FBVyxDQUFDO0lBQ3BDLENBQUM7Q0FDSjtBQUVELHlCQUF5QjtBQUN6QixzRUFBc0U7QUFDdEUsTUFBYSxpQkFBa0IsU0FBUSxnQkFBZ0I7SUFDbkQsWUFBYSxRQUFRO1FBQ2pCLEtBQUssQ0FBQyx1QkFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDN0IsQ0FBQztDQUNK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QVFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV0FSTklORzogdGhpcyBmaWxlIGlzIHVzZWQgYnkgYm90aCB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLlxuLy8gRG8gbm90IHVzZSBhbnkgYnJvd3NlciBvciBub2RlLXNwZWNpZmljIEFQSSFcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmltcG9ydCB7IFRFU1RfUlVOX0VSUk9SUyB9IGZyb20gJy4uL3R5cGVzJztcblxuLy8gQmFzZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY2xhc3MgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGNvZGUpIHtcbiAgICAgICAgdGhpcy5jb2RlICAgICAgICAgICAgPSBjb2RlO1xuICAgICAgICB0aGlzLmlzVGVzdENhZmVFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuY2FsbHNpdGUgICAgICAgID0gbnVsbDtcbiAgICB9XG59XG5cbmNsYXNzIEFjdGlvbk9wdGlvbkVycm9yQmFzZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjb2RlLCBvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihjb2RlKTtcblxuICAgICAgICB0aGlzLm9wdGlvbk5hbWUgID0gb3B0aW9uTmFtZTtcbiAgICAgICAgdGhpcy5hY3R1YWxWYWx1ZSA9IGFjdHVhbFZhbHVlO1xuICAgIH1cbn1cblxuY2xhc3MgQWN0aW9uQXJndW1lbnRFcnJvckJhc2UgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY29kZSwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihjb2RlKTtcblxuICAgICAgICB0aGlzLmFyZ3VtZW50TmFtZSA9IGFyZ3VtZW50TmFtZTtcbiAgICAgICAgdGhpcy5hY3R1YWxWYWx1ZSAgPSBhY3R1YWxWYWx1ZTtcbiAgICB9XG59XG5cbi8vIFN5bmNocm9uaXphdGlvbiBlcnJvcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBjbGFzcyBNaXNzaW5nQXdhaXRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjYWxsc2l0ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMubWlzc2luZ0F3YWl0RXJyb3IpO1xuXG4gICAgICAgIHRoaXMuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcbiAgICB9XG59XG5cblxuLy8gQ2xpZW50IGZ1bmN0aW9uIGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNsYXNzIENsaWVudEZ1bmN0aW9uRXhlY3V0aW9uSW50ZXJydXB0aW9uRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuY2xpZW50RnVuY3Rpb25FeGVjdXRpb25JbnRlcnJ1cHRpb25FcnJvcik7XG5cbiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lID0gaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEb21Ob2RlQ2xpZW50RnVuY3Rpb25SZXN1bHRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5kb21Ob2RlQ2xpZW50RnVuY3Rpb25SZXN1bHRFcnJvcik7XG5cbiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lID0gaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZTtcbiAgICB9XG59XG5cbi8vIFNlbGVjdG9yIGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY2xhc3MgU2VsZWN0b3JFcnJvckJhc2UgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY29kZSwgeyBhcGlGbkNoYWluLCBhcGlGbkluZGV4IH0pIHtcbiAgICAgICAgc3VwZXIoY29kZSk7XG5cbiAgICAgICAgdGhpcy5hcGlGbkNoYWluID0gYXBpRm5DaGFpbjtcbiAgICAgICAgdGhpcy5hcGlGbkluZGV4ID0gYXBpRm5JbmRleDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkU2VsZWN0b3JSZXN1bHRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmludmFsaWRTZWxlY3RvclJlc3VsdEVycm9yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYW5ub3RPYnRhaW5JbmZvRm9yRWxlbWVudFNwZWNpZmllZEJ5U2VsZWN0b3JFcnJvciBleHRlbmRzIFNlbGVjdG9yRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY2FsbHNpdGUsIGFwaUZuQXJncykge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuY2Fubm90T2J0YWluSW5mb0ZvckVsZW1lbnRTcGVjaWZpZWRCeVNlbGVjdG9yRXJyb3IsIGFwaUZuQXJncyk7XG5cbiAgICAgICAgdGhpcy5jYWxsc2l0ZSA9IGNhbGxzaXRlO1xuICAgIH1cbn1cblxuLy8gUGFnZSBlcnJvcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBjbGFzcyBQYWdlTG9hZEVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVyck1zZywgdXJsKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5wYWdlTG9hZEVycm9yKTtcblxuICAgICAgICB0aGlzLnVybCAgICA9IHVybDtcbiAgICAgICAgdGhpcy5lcnJNc2cgPSBlcnJNc2c7XG4gICAgfVxufVxuXG5cbi8vIFVuY2F1Z2h0IGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNsYXNzIFVuY2F1Z2h0RXJyb3JPblBhZ2UgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoZXJyU3RhY2ssIHBhZ2VEZXN0VXJsKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9yT25QYWdlKTtcblxuICAgICAgICB0aGlzLmVyclN0YWNrICAgID0gZXJyU3RhY2s7XG4gICAgICAgIHRoaXMucGFnZURlc3RVcmwgPSBwYWdlRGVzdFVybDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmNhdWdodEVycm9ySW5UZXN0Q29kZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChlcnIsIGNhbGxzaXRlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5UZXN0Q29kZSk7XG5cbiAgICAgICAgdGhpcy5lcnJNc2cgICAgICA9IFN0cmluZyhlcnIucmF3TWVzc2FnZSB8fCBlcnIpO1xuICAgICAgICB0aGlzLmNhbGxzaXRlICAgID0gZXJyLmNhbGxzaXRlIHx8IGNhbGxzaXRlO1xuICAgICAgICB0aGlzLm9yaWdpbkVycm9yID0gZXJyO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuY2F1Z2h0Tm9uRXJyb3JPYmplY3RJblRlc3RDb2RlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKG9iaikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHROb25FcnJvck9iamVjdEluVGVzdENvZGUpO1xuXG4gICAgICAgIHRoaXMub2JqVHlwZSA9IHR5cGVvZiBvYmo7XG4gICAgICAgIHRoaXMub2JqU3RyICA9IFN0cmluZyhvYmopO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuY2F1Z2h0RXJyb3JJbkNsaWVudEZ1bmN0aW9uQ29kZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lLCBlcnIpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXJyb3JJbkNsaWVudEZ1bmN0aW9uQ29kZSk7XG5cbiAgICAgICAgdGhpcy5lcnJNc2cgICAgICAgICAgICAgICAgICAgID0gU3RyaW5nKGVycik7XG4gICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZSA9IGluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5jYXVnaHRFcnJvckluQ3VzdG9tRE9NUHJvcGVydHlDb2RlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWUsIGVyciwgcHJvcCkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluQ3VzdG9tRE9NUHJvcGVydHlDb2RlLCBlcnIsIHByb3ApO1xuXG4gICAgICAgIHRoaXMuZXJyTXNnICAgICAgICAgICAgICAgICAgICA9IFN0cmluZyhlcnIpO1xuICAgICAgICB0aGlzLnByb3BlcnR5ICAgICAgICAgICAgICAgICAgPSBwcm9wO1xuICAgICAgICB0aGlzLmluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWUgPSBpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuaGFuZGxlZFByb21pc2VSZWplY3Rpb25FcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChlcnIpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLnVuaGFuZGxlZFByb21pc2VSZWplY3Rpb24pO1xuXG4gICAgICAgIHRoaXMuZXJyTXNnID0gU3RyaW5nKGVycik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5jYXVnaHRFeGNlcHRpb25FcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChlcnIpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXhjZXB0aW9uKTtcblxuICAgICAgICB0aGlzLmVyck1zZyA9IFN0cmluZyhlcnIpO1xuICAgIH1cbn1cblxuXG4vLyBBc3NlcnRpb24gZXJyb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxBc3NlcnRpb25MaWJyYXJ5RXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoZXJyLCBjYWxsc2l0ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuZXh0ZXJuYWxBc3NlcnRpb25MaWJyYXJ5RXJyb3IpO1xuXG4gICAgICAgIHRoaXMuZXJyTXNnICAgPSBTdHJpbmcoZXJyKTtcbiAgICAgICAgdGhpcy5jYWxsc2l0ZSA9IGNhbGxzaXRlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzc2VydGlvbkV4ZWN1dGFibGVBcmd1bWVudEVycm9yIGV4dGVuZHMgQWN0aW9uQXJndW1lbnRFcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChhcmd1bWVudE5hbWUsIGFyZ3VtZW50VmFsdWUsIGVyciwgaXNBUElFcnJvcikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYXNzZXJ0aW9uRXhlY3V0YWJsZUFyZ3VtZW50RXJyb3IsIGFyZ3VtZW50TmFtZSwgYXJndW1lbnRWYWx1ZSk7XG5cbiAgICAgICAgdGhpcy5lcnJNc2cgICAgICA9IGlzQVBJRXJyb3IgPyBlcnIucmF3TWVzc2FnZSA6IGVyci5tZXNzYWdlO1xuICAgICAgICB0aGlzLm9yaWdpbkVycm9yID0gZXJyO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzc2VydGlvbldpdGhvdXRNZXRob2RDYWxsRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY2FsbHNpdGUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFzc2VydGlvbldpdGhvdXRNZXRob2RDYWxsRXJyb3IpO1xuXG4gICAgICAgIHRoaXMuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3NlcnRpb25VbmF3YWl0ZWRQcm9taXNlRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY2FsbHNpdGUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFzc2VydGlvblVuYXdhaXRlZFByb21pc2VFcnJvcik7XG5cbiAgICAgICAgdGhpcy5jYWxsc2l0ZSA9IGNhbGxzaXRlO1xuICAgIH1cbn1cblxuLy8gQWN0aW9uIHBhcmFtZXRlcnMgZXJyb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBPcHRpb25zIGVycm9yc1xuZXhwb3J0IGNsYXNzIEFjdGlvbkludGVnZXJPcHRpb25FcnJvciBleHRlbmRzIEFjdGlvbk9wdGlvbkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25JbnRlZ2VyT3B0aW9uRXJyb3IsIG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25Qb3NpdGl2ZUludGVnZXJPcHRpb25FcnJvciBleHRlbmRzIEFjdGlvbk9wdGlvbkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25Qb3NpdGl2ZUludGVnZXJPcHRpb25FcnJvciwgb3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkJvb2xlYW5PcHRpb25FcnJvciBleHRlbmRzIEFjdGlvbk9wdGlvbkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25Cb29sZWFuT3B0aW9uRXJyb3IsIG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25Cb29sZWFuQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uQm9vbGVhbkFyZ3VtZW50RXJyb3IsIGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblNwZWVkT3B0aW9uRXJyb3IgZXh0ZW5kcyBBY3Rpb25PcHRpb25FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uU3BlZWRPcHRpb25FcnJvciwgb3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbk9wdGlvbnNUeXBlRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYWN0dWFsVHlwZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uT3B0aW9uc1R5cGVFcnJvcik7XG5cbiAgICAgICAgdGhpcy5hY3R1YWxUeXBlID0gYWN0dWFsVHlwZTtcbiAgICB9XG59XG5cblxuLy8gQXJndW1lbnRzIGVycm9yc1xuZXhwb3J0IGNsYXNzIEFjdGlvblN0cmluZ0FyZ3VtZW50RXJyb3IgZXh0ZW5kcyBBY3Rpb25Bcmd1bWVudEVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblN0cmluZ0FyZ3VtZW50RXJyb3IsIGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbk51bGxhYmxlU3RyaW5nQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uTnVsbGFibGVTdHJpbmdBcmd1bWVudEVycm9yLCBhcmd1bWVudE5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25JbnRlZ2VyQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uSW50ZWdlckFyZ3VtZW50RXJyb3IsIGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblJvbGVBcmd1bWVudEVycm9yIGV4dGVuZHMgQWN0aW9uQXJndW1lbnRFcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChhcmd1bWVudE5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25Sb2xlQXJndW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uUG9zaXRpdmVJbnRlZ2VyQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uUG9zaXRpdmVJbnRlZ2VyQXJndW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uU3RyaW5nT3JTdHJpbmdBcnJheUFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBBY3Rpb25Bcmd1bWVudEVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblN0cmluZ09yU3RyaW5nQXJyYXlBcmd1bWVudEVycm9yLCBhcmd1bWVudE5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25TdHJpbmdBcnJheUVsZW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSwgZWxlbWVudEluZGV4KSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25TdHJpbmdBcnJheUVsZW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG5cbiAgICAgICAgdGhpcy5lbGVtZW50SW5kZXggPSBlbGVtZW50SW5kZXg7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0VGVzdFNwZWVkQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuc2V0VGVzdFNwZWVkQXJndW1lbnRFcnJvciwgYXJndW1lbnROYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uVW5zdXBwb3J0ZWREZXZpY2VUeXBlRXJyb3IgZXh0ZW5kcyBBY3Rpb25Bcmd1bWVudEVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSwgYXJndW1lbnRWYWx1ZSkge1xuICAgI