testcafe 1.14.1 → 1.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/LICENSE +21 -21
- package/bin/testcafe-with-v8-flag-filter.js +0 -0
- package/lib/api/exportable-lib/index.js +49 -49
- package/lib/api/request-hooks/assert-type.js +7 -7
- package/lib/api/request-hooks/hook-method-names.js +9 -9
- package/lib/api/request-hooks/hook.js +32 -32
- package/lib/api/request-hooks/interfaces.js +2 -2
- package/lib/api/request-hooks/request-logger.js +112 -112
- package/lib/api/request-hooks/request-mock/create-request-mock.js +10 -10
- package/lib/api/request-hooks/request-mock/index.js +44 -44
- package/lib/api/request-hooks/request-mock.js +46 -46
- package/lib/api/structure/base-unit.js +11 -11
- package/lib/api/structure/fixture.js +75 -75
- package/lib/api/structure/interfaces.js +2 -2
- package/lib/api/structure/test-file.js +31 -31
- package/lib/api/structure/test-timeout.js +9 -9
- package/lib/api/structure/test.js +85 -85
- package/lib/api/structure/testing-unit.js +89 -89
- package/lib/api/structure/unit-type.js +9 -9
- package/lib/api/test-controller/assertion.js +88 -88
- package/lib/api/test-controller/execution-context.js +82 -82
- package/lib/api/test-controller/index.js +358 -358
- package/lib/api/test-controller/proxy.js +28 -28
- package/lib/api/test-page-url.js +60 -60
- package/lib/api/test-run-tracker.js +68 -68
- package/lib/api/wrap-test-function.js +49 -49
- package/lib/assertions/executor.js +74 -74
- package/lib/assertions/get-fn.js +46 -46
- package/lib/assertions/type.js +20 -20
- package/lib/assets/content-types.js +9 -9
- package/lib/assets/injectables.js +18 -18
- package/lib/browser/connection/command.js +10 -10
- package/lib/browser/connection/error-hints.js +9 -9
- package/lib/browser/connection/gateway.js +159 -159
- package/lib/browser/connection/get-hints.js +33 -33
- package/lib/browser/connection/heartbeat-status.js +8 -8
- package/lib/browser/connection/index.js +328 -328
- package/lib/browser/connection/remotes-queue.js +46 -46
- package/lib/browser/connection/service-routes.js +12 -12
- package/lib/browser/connection/status.js +12 -12
- package/lib/browser/interfaces.js +2 -2
- package/lib/browser/provider/built-in/dedicated/base.js +80 -80
- package/lib/browser/provider/built-in/dedicated/chrome/browser-client.js +204 -204
- package/lib/browser/provider/built-in/dedicated/chrome/build-chrome-args.js +17 -17
- package/lib/browser/provider/built-in/dedicated/chrome/config.js +110 -110
- package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +45 -45
- package/lib/browser/provider/built-in/dedicated/chrome/elapsed-upperbounds.js +15 -15
- package/lib/browser/provider/built-in/dedicated/chrome/index.js +102 -102
- package/lib/browser/provider/built-in/dedicated/chrome/interfaces.js +2 -2
- package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +24 -24
- package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +29 -29
- package/lib/browser/provider/built-in/dedicated/edge/index.js +10 -10
- package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +29 -29
- package/lib/browser/provider/built-in/dedicated/firefox/config.js +33 -33
- package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +78 -78
- package/lib/browser/provider/built-in/dedicated/firefox/index.js +73 -73
- package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +36 -36
- package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/commands.js +13 -13
- package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +200 -200
- package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +17 -17
- package/lib/browser/provider/built-in/index.js +21 -21
- package/lib/browser/provider/built-in/locally-installed.js +30 -30
- package/lib/browser/provider/built-in/path.js +47 -47
- package/lib/browser/provider/built-in/remote.js +58 -58
- package/lib/browser/provider/index.js +303 -303
- package/lib/browser/provider/parse-provider-name.js +16 -16
- package/lib/browser/provider/plugin-host.js +121 -121
- package/lib/browser/provider/pool.js +115 -115
- package/lib/browser/provider/utils/argument-parsing.js +74 -74
- package/lib/browser/provider/utils/browser-starter.js +34 -34
- package/lib/browser/provider/utils/client-functions.js +24 -24
- package/lib/browser/provider/utils/get-maximized-headless-window-size.js +9 -9
- package/lib/cli/argument-parser.js +284 -284
- package/lib/cli/authentication-helper.js +35 -35
- package/lib/cli/cli.js +134 -134
- package/lib/cli/correct-browsers-and-sources.js +40 -40
- package/lib/cli/index.js +19 -19
- package/lib/cli/log.js +43 -43
- package/lib/cli/remotes-wizard.js +36 -36
- package/lib/cli/termination-handler.js +38 -38
- package/lib/client/automation/index.js +34 -16
- package/lib/client/automation/index.min.js +1 -1
- package/lib/client/browser/idle-page/index.html.mustache +35 -35
- package/lib/client/browser/idle-page/logo.svg +86 -86
- package/lib/client/core/index.js +14 -14
- package/lib/client/driver/index.js +46 -16
- package/lib/client/driver/index.min.js +1 -1
- package/lib/client/driver/internal-properties.js +9 -9
- package/lib/client/test-run/iframe.js.mustache +17 -17
- package/lib/client/test-run/index.js.mustache +51 -51
- package/lib/client/ui/index.js +14 -14
- package/lib/client/ui/sprite.svg +42 -42
- package/lib/client-functions/builder-symbol.js +4 -4
- package/lib/client-functions/client-function-builder.js +155 -155
- package/lib/client-functions/replicator.js +61 -61
- package/lib/client-functions/return-single-prop-mode.js +8 -8
- package/lib/client-functions/selector-api-execution-mode.js +20 -20
- package/lib/client-functions/selectors/add-api.js +645 -645
- package/lib/client-functions/selectors/create-snapshot-methods.js +13 -13
- package/lib/client-functions/selectors/prepare-api-args.js +20 -20
- package/lib/client-functions/selectors/selector-attribute-filter.js +22 -22
- package/lib/client-functions/selectors/selector-builder.js +153 -153
- package/lib/client-functions/selectors/selector-text-filter.js +43 -43
- package/lib/client-functions/selectors/snapshot-properties.js +48 -48
- package/lib/client-functions/types.js +18 -18
- package/lib/compiler/babel/format-babel-produced-code.js +10 -10
- package/lib/compiler/babel/get-base-babel-options.js +11 -11
- package/lib/compiler/babel/load-libs.js +63 -63
- package/lib/compiler/babel/preset-stage-2.js +19 -19
- package/lib/compiler/compile-client-function.js +73 -73
- package/lib/compiler/compilers.js +33 -33
- package/lib/compiler/index.js +92 -92
- package/lib/compiler/interfaces.js +2 -2
- package/lib/compiler/test-file/api-based.js +146 -146
- package/lib/compiler/test-file/base.js +36 -36
- package/lib/compiler/test-file/exportble-lib-path.js +5 -5
- package/lib/compiler/test-file/formats/coffeescript/compiler.js +38 -38
- package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +29 -29
- package/lib/compiler/test-file/formats/es-next/compiler.js +42 -42
- package/lib/compiler/test-file/formats/es-next/get-test-list.js +166 -166
- package/lib/compiler/test-file/formats/es-next/is-flow-code.js +7 -7
- package/lib/compiler/test-file/formats/raw.js +85 -85
- package/lib/compiler/test-file/formats/typescript/compiler.js +135 -135
- package/lib/compiler/test-file/formats/typescript/get-test-list.js +185 -185
- package/lib/compiler/test-file/test-file-parser-base.js +214 -214
- package/lib/configuration/configuration-base.js +165 -165
- package/lib/configuration/constants.js +9 -9
- package/lib/configuration/customizable-compilers.js +7 -7
- package/lib/configuration/default-values.js +51 -51
- package/lib/configuration/interfaces.js +2 -2
- package/lib/configuration/option-names.js +53 -53
- package/lib/configuration/option-source.js +9 -9
- package/lib/configuration/option.js +14 -14
- package/lib/configuration/quarantine-option-names.js +8 -8
- package/lib/configuration/run-option-names.js +26 -26
- package/lib/configuration/screenshot-option-names.js +10 -10
- package/lib/configuration/testcafe-configuration.js +163 -163
- package/lib/configuration/types.js +2 -2
- package/lib/configuration/typescript-configuration.js +62 -62
- package/lib/custom-client-scripts/assert-type.js +7 -7
- package/lib/custom-client-scripts/client-script-init.js +2 -2
- package/lib/custom-client-scripts/client-script.js +106 -106
- package/lib/custom-client-scripts/get-code.js +11 -11
- package/lib/custom-client-scripts/get-url.js +6 -6
- package/lib/custom-client-scripts/load.js +15 -15
- package/lib/custom-client-scripts/problematic-scripts.js +2 -2
- package/lib/custom-client-scripts/routing.js +36 -36
- package/lib/custom-client-scripts/utils.js +60 -60
- package/lib/embedding-utils.js +83 -83
- package/lib/errors/create-stack-filter.js +18 -18
- package/lib/errors/error-list.js +26 -26
- package/lib/errors/get-callsite.js +31 -31
- package/lib/errors/internal-modules-prefix.js +8 -8
- package/lib/errors/is-internal-stack-frame.js +45 -45
- package/lib/errors/process-test-fn-error.js +37 -37
- package/lib/errors/runtime/index.js +123 -123
- package/lib/errors/runtime/templates.js +115 -115
- package/lib/errors/runtime/type-assertions.js +112 -112
- package/lib/errors/stack-cleaning-hook.js +64 -64
- package/lib/errors/test-run/formattable-adapter.js +59 -59
- package/lib/errors/test-run/index.js +301 -301
- package/lib/errors/test-run/render-error-template.js +31 -31
- package/lib/errors/test-run/templates.js +91 -91
- package/lib/errors/test-run/utils.js +89 -89
- package/lib/errors/types.js +156 -156
- package/lib/index.js +81 -81
- package/lib/live/bootstrapper.js +43 -43
- package/lib/live/controller.js +107 -107
- package/lib/live/file-watcher/index.js +67 -67
- package/lib/live/file-watcher/modules-graph.js +58 -58
- package/lib/live/keyboard-observer.js +76 -76
- package/lib/live/logger/index.js +64 -64
- package/lib/live/test-run-controller.js +96 -96
- package/lib/live/test-run-state.js +6 -6
- package/lib/live/test-run.js +56 -56
- package/lib/live/test-runner.js +167 -167
- package/lib/load-assets.js +29 -29
- package/lib/notifications/add-rendered-warning.js +16 -16
- package/lib/notifications/debug-logger.js +78 -78
- package/lib/notifications/deprecated.js +24 -24
- package/lib/notifications/information-message.js +9 -9
- package/lib/notifications/warning-log.js +31 -31
- package/lib/notifications/warning-message.js +47 -47
- package/lib/reporter/command/command-formatter.js +120 -109
- package/lib/reporter/command/format-command.js +8 -8
- package/lib/reporter/command/interfaces.js +2 -2
- package/lib/reporter/index.js +319 -314
- package/lib/reporter/interfaces.js +2 -2
- package/lib/reporter/plugin-host.js +135 -135
- package/lib/reporter/plugin-methods.js +12 -12
- package/lib/role/index.js +74 -74
- package/lib/role/marker-symbol.js +7 -7
- package/lib/role/phase.js +9 -9
- package/lib/runner/bootstrapper.js +271 -271
- package/lib/runner/browser-job-result.js +9 -9
- package/lib/runner/browser-job.js +152 -152
- package/lib/runner/browser-set.js +114 -114
- package/lib/runner/fixture-hook-controller.js +85 -85
- package/lib/runner/index.js +449 -449
- package/lib/runner/interfaces.js +2 -2
- package/lib/runner/reporter-stream-controller.js +27 -27
- package/lib/runner/task/index.js +151 -151
- package/lib/runner/task/phase.js +9 -9
- package/lib/runner/test-run-controller.js +165 -165
- package/lib/runner/tested-app.js +72 -72
- package/lib/screenshots/capturer.js +141 -141
- package/lib/screenshots/constants.js +11 -11
- package/lib/screenshots/crop.js +111 -111
- package/lib/screenshots/default-extension.js +4 -4
- package/lib/screenshots/index.js +67 -67
- package/lib/screenshots/utils.js +39 -39
- package/lib/services/compiler/host.js +190 -190
- package/lib/services/compiler/io.js +9 -9
- package/lib/services/compiler/protocol.js +17 -16
- package/lib/services/compiler/service.js +225 -212
- package/lib/services/compiler/test-run-proxy.js +111 -111
- package/lib/services/interfaces.js +2 -2
- package/lib/services/process-title.js +8 -8
- package/lib/services/serialization/prepare-options.js +17 -17
- package/lib/services/serialization/replicator/create-replicator.js +25 -25
- package/lib/services/serialization/replicator/custom-error-transform.js +26 -26
- package/lib/services/serialization/test-structure.js +92 -92
- package/lib/services/utils/ipc/interfaces.js +30 -30
- package/lib/services/utils/ipc/io.js +108 -108
- package/lib/services/utils/ipc/message.js +75 -75
- package/lib/services/utils/ipc/packet.js +55 -55
- package/lib/services/utils/ipc/proxy.js +109 -109
- package/lib/services/utils/ipc/transport.js +64 -64
- package/lib/shared/errors/index.js +382 -382
- package/lib/shared/node-modules-folder-name.js +4 -4
- package/lib/test-run/bookmark.js +90 -90
- package/lib/test-run/browser-console-messages.js +73 -73
- package/lib/test-run/browser-manipulation-queue.js +92 -92
- package/lib/test-run/client-messages.js +9 -9
- package/lib/test-run/commands/actions.js +486 -483
- package/lib/test-run/commands/assertion.js +45 -45
- package/lib/test-run/commands/base.js +14 -14
- package/lib/test-run/commands/browser-manipulation.js +95 -95
- package/lib/test-run/commands/from-object.js +82 -82
- package/lib/test-run/commands/observation.js +61 -61
- package/lib/test-run/commands/options.js +231 -215
- package/lib/test-run/commands/service.js +54 -48
- package/lib/test-run/commands/type.js +65 -64
- package/lib/test-run/commands/utils.js +87 -87
- package/lib/test-run/commands/validations/argument.js +90 -90
- package/lib/test-run/commands/validations/factories.js +47 -47
- package/lib/test-run/commands/validations/initializers.js +44 -44
- package/lib/test-run/debug-log.js +32 -32
- package/lib/test-run/execute-js-expression.js +74 -74
- package/lib/test-run/index.js +823 -799
- package/lib/test-run/marker-symbol.js +7 -7
- package/lib/test-run/observed-callsites-storage.js +17 -17
- package/lib/test-run/phase.js +16 -16
- package/lib/test-run/session-controller.js +104 -104
- package/lib/testcafe.js +118 -118
- package/lib/utils/assignable.js +39 -39
- package/lib/utils/async-event-emitter.js +28 -28
- package/lib/utils/async-queue.js +14 -14
- package/lib/utils/browser-connection-timeouts.js +19 -19
- package/lib/utils/callsite.js +17 -17
- package/lib/utils/check-file-path.js +31 -31
- package/lib/utils/check-url.js +51 -51
- package/lib/utils/convert-to-best-fit-type.js +16 -16
- package/lib/utils/correct-file-path.js +21 -21
- package/lib/utils/define-lazy-property.js +13 -13
- package/lib/utils/delay.js +6 -6
- package/lib/utils/delegated-api.js +44 -44
- package/lib/utils/detect-display.js +6 -6
- package/lib/utils/detect-ffmpeg.js +44 -44
- package/lib/utils/diff/colors.js +29 -29
- package/lib/utils/diff/index.js +52 -52
- package/lib/utils/diff/util.js +23 -23
- package/lib/utils/diff.js +29 -29
- package/lib/utils/escape-user-agent.js +10 -10
- package/lib/utils/flag-list.js +17 -17
- package/lib/utils/get-any-key.js +8 -8
- package/lib/utils/get-browser.js +8 -8
- package/lib/utils/get-common-path.js +34 -34
- package/lib/utils/get-filter-fn.js +40 -40
- package/lib/utils/get-options/base.js +36 -36
- package/lib/utils/get-options/compiler.js +33 -33
- package/lib/utils/get-options/grep.js +15 -15
- package/lib/utils/get-options/index.js +20 -20
- package/lib/utils/get-options/meta.js +22 -22
- package/lib/utils/get-options/quarantine.js +91 -91
- package/lib/utils/get-options/screenshot.js +17 -17
- package/lib/utils/get-options/ssl.js +45 -45
- package/lib/utils/get-options/video.js +10 -10
- package/lib/utils/get-viewport-width.js +17 -17
- package/lib/utils/guard-time-execution.js +10 -10
- package/lib/utils/handle-errors.js +74 -74
- package/lib/utils/handle-tag-args.js +8 -8
- package/lib/utils/http.js +30 -30
- package/lib/utils/is-localhost.js +11 -11
- package/lib/utils/is-password-input.js +11 -0
- package/lib/utils/is-repl.js +10 -10
- package/lib/utils/is-window-in-iframe.js +6 -6
- package/lib/utils/limit-number.js +10 -10
- package/lib/utils/make-reg-exp.js +7 -7
- package/lib/utils/moment-loader.js +20 -20
- package/lib/utils/parse-file-list.js +71 -71
- package/lib/utils/parse-user-agent.js +55 -55
- package/lib/utils/path-pattern.js +114 -114
- package/lib/utils/prepare-reporters.js +30 -30
- package/lib/utils/prerender-callsite.js +18 -18
- package/lib/utils/process.js +119 -119
- package/lib/utils/promisified-functions.js +46 -46
- package/lib/utils/re-executable-promise.js +39 -39
- package/lib/utils/render-callsite-sync.js +29 -29
- package/lib/utils/render-template.js +9 -9
- package/lib/utils/reporter.js +30 -30
- package/lib/utils/resolve-path-relatively-cwd.js +7 -7
- package/lib/utils/string.js +105 -105
- package/lib/utils/temp-directory/cleanup-process/commands.js +7 -7
- package/lib/utils/temp-directory/cleanup-process/index.js +143 -143
- package/lib/utils/temp-directory/cleanup-process/worker.js +58 -58
- package/lib/utils/temp-directory/index.js +87 -87
- package/lib/utils/temp-directory/lockfile.js +56 -56
- package/lib/utils/thennable.js +7 -7
- package/lib/utils/timer.js +15 -15
- package/lib/utils/to-posix-path.js +8 -8
- package/lib/utils/types.js +2 -2
- package/lib/video-recorder/interfaces.js +2 -2
- package/lib/video-recorder/process.js +126 -126
- package/lib/video-recorder/recorder.js +136 -136
- package/lib/video-recorder/test-run-video-recorder.js +69 -69
- package/lib/video-recorder/videos.js +37 -37
- package/package.json +2 -2
- package/ts-defs/index.d.ts +25 -14
- package/ts-defs/selectors.d.ts +16 -5
- package/ts-defs/testcafe-scripts.d.ts +17 -6
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const callsite_record_1 = require("callsite-record");
|
|
7
|
-
const types_1 = require("../types");
|
|
8
|
-
const utils_1 = require("./utils");
|
|
9
|
-
const templates_1 = __importDefault(require("./templates"));
|
|
10
|
-
function getTestCafeErrorInCustomScriptError(err, viewportWidth) {
|
|
11
|
-
const originErrTemplate = templates_1.default[err.originError.code];
|
|
12
|
-
const originErrMessage = '\n' + err.originError.message;
|
|
13
|
-
let originCallsiteMarkup = '';
|
|
14
|
-
if (err.errCallsite && originErrTemplate && !utils_1.shouldSkipCallsite(err.originError)) {
|
|
15
|
-
// HACK: we need to get callsite for custom TestCafe script without real file for it.
|
|
16
|
-
// We use expression as a file content
|
|
17
|
-
originCallsiteMarkup = err.errCallsite._renderRecord(err.expression, {
|
|
18
|
-
renderer: callsite_record_1.renderers.html,
|
|
19
|
-
stack: false
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
const originErrorText = originErrTemplate ? originErrTemplate(err.originError, viewportWidth) : originErrMessage +
|
|
23
|
-
'\n';
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const callsite_record_1 = require("callsite-record");
|
|
7
|
+
const types_1 = require("../types");
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
const templates_1 = __importDefault(require("./templates"));
|
|
10
|
+
function getTestCafeErrorInCustomScriptError(err, viewportWidth) {
|
|
11
|
+
const originErrTemplate = templates_1.default[err.originError.code];
|
|
12
|
+
const originErrMessage = '\n' + err.originError.message;
|
|
13
|
+
let originCallsiteMarkup = '';
|
|
14
|
+
if (err.errCallsite && originErrTemplate && !utils_1.shouldSkipCallsite(err.originError)) {
|
|
15
|
+
// HACK: we need to get callsite for custom TestCafe script without real file for it.
|
|
16
|
+
// We use expression as a file content
|
|
17
|
+
originCallsiteMarkup = err.errCallsite._renderRecord(err.expression, {
|
|
18
|
+
renderer: callsite_record_1.renderers.html,
|
|
19
|
+
stack: false
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
const originErrorText = originErrTemplate ? originErrTemplate(err.originError, viewportWidth) : originErrMessage +
|
|
23
|
+
'\n';
|
|
24
24
|
return utils_1.markup(err, `
|
|
25
25
|
An unhandled error occurred in the custom script:
|
|
26
26
|
${originErrorText}${!originCallsiteMarkup ? `\n${utils_1.formatExpressionMessage(err.expression, err.line, err.column)}` : ''}
|
|
27
|
-
`, originCallsiteMarkup);
|
|
28
|
-
}
|
|
29
|
-
function renderErrorTemplate(err, viewportWidth) {
|
|
30
|
-
if (err.code === types_1.TEST_RUN_ERRORS.uncaughtTestCafeErrorInCustomScript)
|
|
31
|
-
return getTestCafeErrorInCustomScriptError(err, viewportWidth);
|
|
32
|
-
return utils_1.markup(err, templates_1.default[err.code](err, viewportWidth));
|
|
33
|
-
}
|
|
34
|
-
exports.default = renderErrorTemplate;
|
|
27
|
+
`, originCallsiteMarkup);
|
|
28
|
+
}
|
|
29
|
+
function renderErrorTemplate(err, viewportWidth) {
|
|
30
|
+
if (err.code === types_1.TEST_RUN_ERRORS.uncaughtTestCafeErrorInCustomScript)
|
|
31
|
+
return getTestCafeErrorInCustomScriptError(err, viewportWidth);
|
|
32
|
+
return utils_1.markup(err, templates_1.default[err.code](err, viewportWidth));
|
|
33
|
+
}
|
|
34
|
+
exports.default = renderErrorTemplate;
|
|
35
35
|
module.exports = exports.default;
|
|
36
36
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWVycm9yLXRlbXBsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Vycm9ycy90ZXN0LXJ1bi9yZW5kZXItZXJyb3ItdGVtcGxhdGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBNEM7QUFDNUMsb0NBQTJDO0FBQzNDLG1DQUlpQjtBQUVqQiw0REFBb0M7QUFFcEMsU0FBUyxtQ0FBbUMsQ0FBRSxHQUFHLEVBQUUsYUFBYTtJQUM1RCxNQUFNLGlCQUFpQixHQUFJLG1CQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRCxNQUFNLGdCQUFnQixHQUFLLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztJQUMxRCxJQUFJLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztJQUU5QixJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksaUJBQWlCLElBQUksQ0FBQywwQkFBa0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDOUUscUZBQXFGO1FBQ3JGLHNDQUFzQztRQUN0QyxvQkFBb0IsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO1lBQ2pFLFFBQVEsRUFBRSwyQkFBUyxDQUFDLElBQUk7WUFDeEIsS0FBSyxFQUFLLEtBQUs7U0FDbEIsQ0FBQyxDQUFDO0tBQ047SUFFRCxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO1FBQ2hCLElBQUksQ0FBQztJQUVyRyxPQUFPLGNBQU0sQ0FBQyxHQUFHLEVBQUU7O1VBRWIsZUFBZSxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEtBQUssK0JBQXVCLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO0tBQ3hILEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsU0FBd0IsbUJBQW1CLENBQUUsR0FBRyxFQUFFLGFBQWE7SUFDM0QsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLHVCQUFlLENBQUMsbUNBQW1DO1FBQ2hFLE9BQU8sbUNBQW1DLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRW5FLE9BQU8sY0FBTSxDQUFDLEdBQUcsRUFBRSxtQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBTEQsc0NBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW5kZXJlcnMgfSBmcm9tICdjYWxsc2l0ZS1yZWNvcmQnO1xuaW1wb3J0IHsgVEVTVF9SVU5fRVJST1JTIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgICBtYXJrdXAsXG4gICAgc2hvdWxkU2tpcENhbGxzaXRlLFxuICAgIGZvcm1hdEV4cHJlc3Npb25NZXNzYWdlXG59IGZyb20gJy4vdXRpbHMnO1xuXG5pbXBvcnQgVEVNUExBVEVTIGZyb20gJy4vdGVtcGxhdGVzJztcblxuZnVuY3Rpb24gZ2V0VGVzdENhZmVFcnJvckluQ3VzdG9tU2NyaXB0RXJyb3IgKGVyciwgdmlld3BvcnRXaWR0aCkge1xuICAgIGNvbnN0IG9yaWdpbkVyclRlbXBsYXRlICA9IFRFTVBMQVRFU1tlcnIub3JpZ2luRXJyb3IuY29kZV07XG4gICAgY29uc3Qgb3JpZ2luRXJyTWVzc2FnZSAgID0gJ1xcbicgKyBlcnIub3JpZ2luRXJyb3IubWVzc2FnZTtcbiAgICBsZXQgb3JpZ2luQ2FsbHNpdGVNYXJrdXAgPSAnJztcblxuICAgIGlmIChlcnIuZXJyQ2FsbHNpdGUgJiYgb3JpZ2luRXJyVGVtcGxhdGUgJiYgIXNob3VsZFNraXBDYWxsc2l0ZShlcnIub3JpZ2luRXJyb3IpKSB7XG4gICAgICAgIC8vIEhBQ0s6IHdlIG5lZWQgdG8gZ2V0IGNhbGxzaXRlIGZvciBjdXN0b20gVGVzdENhZmUgc2NyaXB0IHdpdGhvdXQgcmVhbCBmaWxlIGZvciBpdC5cbiAgICAgICAgLy8gV2UgdXNlIGV4cHJlc3Npb24gYXMgYSBmaWxlIGNvbnRlbnRcbiAgICAgICAgb3JpZ2luQ2FsbHNpdGVNYXJrdXAgPSBlcnIuZXJyQ2FsbHNpdGUuX3JlbmRlclJlY29yZChlcnIuZXhwcmVzc2lvbiwge1xuICAgICAgICAgICAgcmVuZGVyZXI6IHJlbmRlcmVycy5odG1sLFxuICAgICAgICAgICAgc3RhY2s6ICAgIGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbkVycm9yVGV4dCA9IG9yaWdpbkVyclRlbXBsYXRlID8gb3JpZ2luRXJyVGVtcGxhdGUoZXJyLm9yaWdpbkVycm9yLCB2aWV3cG9ydFdpZHRoKSA6IG9yaWdpbkVyck1lc3NhZ2UgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nO1xuXG4gICAgcmV0dXJuIG1hcmt1cChlcnIsIGBcbiAgICAgICAgQW4gdW5oYW5kbGVkIGVycm9yIG9jY3VycmVkIGluIHRoZSBjdXN0b20gc2NyaXB0OlxuICAgICAgICAke29yaWdpbkVycm9yVGV4dH0keyFvcmlnaW5DYWxsc2l0ZU1hcmt1cCA/IGBcXG4ke2Zvcm1hdEV4cHJlc3Npb25NZXNzYWdlKGVyci5leHByZXNzaW9uLCBlcnIubGluZSwgZXJyLmNvbHVtbil9YCA6ICcnfVxuICAgIGAsIG9yaWdpbkNhbGxzaXRlTWFya3VwKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVuZGVyRXJyb3JUZW1wbGF0ZSAoZXJyLCB2aWV3cG9ydFdpZHRoKSB7XG4gICAgaWYgKGVyci5jb2RlID09PSBURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRUZXN0Q2FmZUVycm9ySW5DdXN0b21TY3JpcHQpXG4gICAgICAgIHJldHVybiBnZXRUZXN0Q2FmZUVycm9ySW5DdXN0b21TY3JpcHRFcnJvcihlcnIsIHZpZXdwb3J0V2lkdGgpO1xuXG4gICAgcmV0dXJuIG1hcmt1cChlcnIsIFRFTVBMQVRFU1tlcnIuY29kZV0oZXJyLCB2aWV3cG9ydFdpZHRoKSk7XG59XG5cbiJdfQ==
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const lodash_1 = require("lodash");
|
|
4
|
-
const types_1 = require("../types");
|
|
5
|
-
const utils_1 = require("./utils");
|
|
6
|
-
const EXTERNAL_LINKS = {
|
|
7
|
-
createNewIssue: 'https://github.com/DevExpress/testcafe/issues/new?template=bug-report.md',
|
|
8
|
-
troubleshootNetwork: 'https://go.devexpress.com/TestCafe_FAQ_ARequestHasFailed.aspx',
|
|
9
|
-
viewportSizes: 'https://github.com/DevExpress/device-specs/blob/master/viewport-sizes.json'
|
|
10
|
-
};
|
|
11
|
-
exports.default = {
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const lodash_1 = require("lodash");
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
const utils_1 = require("./utils");
|
|
6
|
+
const EXTERNAL_LINKS = {
|
|
7
|
+
createNewIssue: 'https://github.com/DevExpress/testcafe/issues/new?template=bug-report.md',
|
|
8
|
+
troubleshootNetwork: 'https://go.devexpress.com/TestCafe_FAQ_ARequestHasFailed.aspx',
|
|
9
|
+
viewportSizes: 'https://github.com/DevExpress/device-specs/blob/master/viewport-sizes.json'
|
|
10
|
+
};
|
|
11
|
+
exports.default = {
|
|
12
12
|
[types_1.TEST_RUN_ERRORS.actionIntegerOptionError]: err => `
|
|
13
13
|
The "${err.optionName}" option is expected to be an integer, but it was ${err.actualValue}.
|
|
14
|
-
`,
|
|
14
|
+
`,
|
|
15
15
|
[types_1.TEST_RUN_ERRORS.actionPositiveIntegerOptionError]: err => `
|
|
16
16
|
The "${err.optionName}" option is expected to be a positive integer, but it was ${err.actualValue}.
|
|
17
|
-
`,
|
|
17
|
+
`,
|
|
18
18
|
[types_1.TEST_RUN_ERRORS.actionBooleanOptionError]: err => `
|
|
19
19
|
The "${err.optionName}" option is expected to be a boolean value, but it was ${err.actualValue}.
|
|
20
|
-
`,
|
|
20
|
+
`,
|
|
21
21
|
[types_1.TEST_RUN_ERRORS.actionSpeedOptionError]: err => `
|
|
22
22
|
The "${err.optionName}" option is expected to be a number between 0.01 and 1, but it was ${err.actualValue}.
|
|
23
|
-
`,
|
|
23
|
+
`,
|
|
24
24
|
[types_1.TEST_RUN_ERRORS.pageLoadError]: err => `
|
|
25
25
|
Failed to load the page at ${utils_1.formatUrl(err.url)}.
|
|
26
26
|
Increase the value of the "pageRequestTimeout" variable, enable the "retryTestPages" option, or use quarantine mode to perform additional attempts to execute this test.
|
|
@@ -28,7 +28,7 @@ exports.default = {
|
|
|
28
28
|
|
|
29
29
|
Error details:
|
|
30
30
|
${err.errMsg}
|
|
31
|
-
`,
|
|
31
|
+
`,
|
|
32
32
|
[types_1.TEST_RUN_ERRORS.uncaughtErrorOnPage]: err => `
|
|
33
33
|
A JavaScript error occurred on ${utils_1.formatUrl(err.pageDestUrl)}.
|
|
34
34
|
Repeat test actions in the browser and check the console for errors.
|
|
@@ -38,114 +38,114 @@ exports.default = {
|
|
|
38
38
|
|
|
39
39
|
JavaScript error details:
|
|
40
40
|
${utils_1.replaceLeadingSpacesWithNbsp(lodash_1.escape(err.errStack))}
|
|
41
|
-
`,
|
|
41
|
+
`,
|
|
42
42
|
[types_1.TEST_RUN_ERRORS.uncaughtErrorInTestCode]: err => `
|
|
43
43
|
${lodash_1.escape(err.errMsg)}
|
|
44
|
-
`,
|
|
44
|
+
`,
|
|
45
45
|
[types_1.TEST_RUN_ERRORS.nativeDialogNotHandledError]: err => `
|
|
46
46
|
A native ${err.dialogType} dialog was invoked on page ${utils_1.formatUrl(err.pageUrl)}, but no handler was set for it. Use the "setNativeDialogHandler" function to introduce a handler function for native dialogs.
|
|
47
|
-
`,
|
|
47
|
+
`,
|
|
48
48
|
[types_1.TEST_RUN_ERRORS.uncaughtErrorInNativeDialogHandler]: err => `
|
|
49
49
|
An error occurred in the native dialog handler called for a native ${err.dialogType} dialog on page ${utils_1.formatUrl(err.pageUrl)}:
|
|
50
50
|
|
|
51
51
|
${lodash_1.escape(err.errMsg)}
|
|
52
|
-
`,
|
|
52
|
+
`,
|
|
53
53
|
[types_1.TEST_RUN_ERRORS.setTestSpeedArgumentError]: err => `
|
|
54
54
|
Speed is expected to be a number between 0.01 and 1, but ${err.actualValue} was passed.
|
|
55
|
-
`,
|
|
55
|
+
`,
|
|
56
56
|
[types_1.TEST_RUN_ERRORS.setNativeDialogHandlerCodeWrongTypeError]: err => `
|
|
57
57
|
The native dialog handler is expected to be a function, ClientFunction or null, but it was ${err.actualType}.
|
|
58
|
-
`,
|
|
58
|
+
`,
|
|
59
59
|
[types_1.TEST_RUN_ERRORS.uncaughtErrorInClientFunctionCode]: err => `
|
|
60
60
|
An error occurred in ${err.instantiationCallsiteName} code:
|
|
61
61
|
|
|
62
62
|
${lodash_1.escape(err.errMsg)}
|
|
63
|
-
`,
|
|
63
|
+
`,
|
|
64
64
|
[types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomDOMPropertyCode]: err => `
|
|
65
65
|
An error occurred when trying to calculate a custom Selector property "${err.property}":
|
|
66
66
|
|
|
67
67
|
${lodash_1.escape(err.errMsg)}
|
|
68
|
-
`,
|
|
68
|
+
`,
|
|
69
69
|
[types_1.TEST_RUN_ERRORS.clientFunctionExecutionInterruptionError]: err => `
|
|
70
70
|
${err.instantiationCallsiteName} execution was interrupted by page unload. This problem may appear if you trigger page navigation from ${err.instantiationCallsiteName} code.
|
|
71
|
-
`,
|
|
71
|
+
`,
|
|
72
72
|
[types_1.TEST_RUN_ERRORS.uncaughtNonErrorObjectInTestCode]: err => `
|
|
73
73
|
Uncaught ${err.objType} "${lodash_1.escape(err.objStr)}" was thrown. Throw Error instead.
|
|
74
|
-
`,
|
|
74
|
+
`,
|
|
75
75
|
[types_1.TEST_RUN_ERRORS.unhandledPromiseRejection]: err => `
|
|
76
76
|
Unhandled promise rejection:
|
|
77
77
|
|
|
78
78
|
${lodash_1.escape(err.errMsg)}
|
|
79
|
-
`,
|
|
79
|
+
`,
|
|
80
80
|
[types_1.TEST_RUN_ERRORS.uncaughtException]: err => `
|
|
81
81
|
Uncaught exception:
|
|
82
82
|
|
|
83
83
|
${lodash_1.escape(err.errMsg)}
|
|
84
|
-
`,
|
|
84
|
+
`,
|
|
85
85
|
[types_1.TEST_RUN_ERRORS.actionOptionsTypeError]: err => `
|
|
86
86
|
Action options is expected to be an object, null or undefined but it was ${err.actualType}.
|
|
87
|
-
`,
|
|
87
|
+
`,
|
|
88
88
|
[types_1.TEST_RUN_ERRORS.actionStringArgumentError]: err => `
|
|
89
89
|
The "${err.argumentName}" argument is expected to be a non-empty string, but it was ${err.actualValue}.
|
|
90
|
-
`,
|
|
90
|
+
`,
|
|
91
91
|
[types_1.TEST_RUN_ERRORS.actionBooleanArgumentError]: err => `
|
|
92
92
|
The "${err.argumentName}" argument is expected to be a boolean value, but it was ${err.actualValue}.
|
|
93
|
-
`,
|
|
93
|
+
`,
|
|
94
94
|
[types_1.TEST_RUN_ERRORS.actionNullableStringArgumentError]: err => `
|
|
95
95
|
The "${err.argumentName}" argument is expected to be a null or a string, but it was ${err.actualValue}.
|
|
96
|
-
`,
|
|
96
|
+
`,
|
|
97
97
|
[types_1.TEST_RUN_ERRORS.actionStringOrStringArrayArgumentError]: err => `
|
|
98
98
|
The "${err.argumentName}" argument is expected to be a non-empty string or a string array, but it was ${err.actualValue}.
|
|
99
|
-
`,
|
|
99
|
+
`,
|
|
100
100
|
[types_1.TEST_RUN_ERRORS.actionStringArrayElementError]: err => `
|
|
101
101
|
Elements of the "${err.argumentName}" argument are expected to be non-empty strings, but the element at index ${err.elementIndex} was ${err.actualValue}.
|
|
102
|
-
`,
|
|
102
|
+
`,
|
|
103
103
|
[types_1.TEST_RUN_ERRORS.actionIntegerArgumentError]: err => `
|
|
104
104
|
The "${err.argumentName}" argument is expected to be an integer, but it was ${err.actualValue}.
|
|
105
|
-
`,
|
|
105
|
+
`,
|
|
106
106
|
[types_1.TEST_RUN_ERRORS.actionRoleArgumentError]: err => `
|
|
107
107
|
The "${err.argumentName}" argument is expected to be a Role instance, but it was ${err.actualValue}.
|
|
108
|
-
`,
|
|
108
|
+
`,
|
|
109
109
|
[types_1.TEST_RUN_ERRORS.actionFunctionArgumentError]: err => `
|
|
110
110
|
The "${err.argumentName}" argument is expected to be a function, but it was ${err.actualValue}.
|
|
111
|
-
`,
|
|
111
|
+
`,
|
|
112
112
|
[types_1.TEST_RUN_ERRORS.actionPositiveIntegerArgumentError]: err => `
|
|
113
113
|
The "${err.argumentName}" argument is expected to be a positive integer, but it was ${err.actualValue}.
|
|
114
|
-
`,
|
|
114
|
+
`,
|
|
115
115
|
[types_1.TEST_RUN_ERRORS.actionElementNotFoundError]: (err, viewportWidth) => `
|
|
116
116
|
The specified selector does not match any element in the DOM tree.
|
|
117
117
|
|
|
118
118
|
${utils_1.formatSelectorCallstack(err.apiFnChain, err.apiFnIndex, viewportWidth)}
|
|
119
|
-
`,
|
|
119
|
+
`,
|
|
120
120
|
[types_1.TEST_RUN_ERRORS.actionElementIsInvisibleError]: () => `
|
|
121
121
|
The element that matches the specified selector is not visible.
|
|
122
|
-
`,
|
|
122
|
+
`,
|
|
123
123
|
[types_1.TEST_RUN_ERRORS.actionSelectorMatchesWrongNodeTypeError]: err => `
|
|
124
124
|
The specified selector is expected to match a DOM element, but it matches a ${err.nodeDescription} node.
|
|
125
|
-
`,
|
|
125
|
+
`,
|
|
126
126
|
[types_1.TEST_RUN_ERRORS.actionAdditionalElementNotFoundError]: (err, viewportWidth) => `
|
|
127
127
|
The specified "${err.argumentName}" does not match any element in the DOM tree.
|
|
128
128
|
|
|
129
129
|
${utils_1.formatSelectorCallstack(err.apiFnChain, err.apiFnIndex, viewportWidth)}
|
|
130
|
-
`,
|
|
130
|
+
`,
|
|
131
131
|
[types_1.TEST_RUN_ERRORS.actionAdditionalElementIsInvisibleError]: err => `
|
|
132
132
|
The element that matches the specified "${err.argumentName}" is not visible.
|
|
133
|
-
`,
|
|
133
|
+
`,
|
|
134
134
|
[types_1.TEST_RUN_ERRORS.actionAdditionalSelectorMatchesWrongNodeTypeError]: err => `
|
|
135
135
|
The specified "${err.argumentName}" is expected to match a DOM element, but it matches a ${err.nodeDescription} node.
|
|
136
|
-
`,
|
|
136
|
+
`,
|
|
137
137
|
[types_1.TEST_RUN_ERRORS.actionElementNonEditableError]: () => `
|
|
138
138
|
The action element is expected to be editable (an input, textarea or element with the contentEditable attribute).
|
|
139
|
-
`,
|
|
139
|
+
`,
|
|
140
140
|
[types_1.TEST_RUN_ERRORS.actionElementNonContentEditableError]: err => `
|
|
141
141
|
The element that matches the specified "${err.argumentName}" is expected to have the contentEditable attribute enabled or the entire document should be in design mode.
|
|
142
|
-
`,
|
|
142
|
+
`,
|
|
143
143
|
[types_1.TEST_RUN_ERRORS.actionRootContainerNotFoundError]: () => `
|
|
144
144
|
Content between the action elements cannot be selected because the root container for the selection range cannot be found, i.e. these elements do not have a common ancestor with the contentEditable attribute.
|
|
145
|
-
`,
|
|
145
|
+
`,
|
|
146
146
|
[types_1.TEST_RUN_ERRORS.actionElementIsNotFileInputError]: () => `
|
|
147
147
|
The specified selector does not match a file input element.
|
|
148
|
-
`,
|
|
148
|
+
`,
|
|
149
149
|
[types_1.TEST_RUN_ERRORS.actionCannotFindFileToUploadError]: err => `
|
|
150
150
|
Cannot find the following file(s) to upload:
|
|
151
151
|
${err.filePaths.map(path => lodash_1.escape(path)).join('\n')}
|
|
@@ -154,153 +154,153 @@ exports.default = {
|
|
|
154
154
|
${err.scannedFilePaths.map(path => lodash_1.escape(path)).join('\n')}
|
|
155
155
|
|
|
156
156
|
Ensure these files exist or change the working directory.
|
|
157
|
-
`,
|
|
157
|
+
`,
|
|
158
158
|
[types_1.TEST_RUN_ERRORS.actionElementNotTextAreaError]: () => `
|
|
159
159
|
The action element is expected to be a <textarea>.
|
|
160
|
-
`,
|
|
160
|
+
`,
|
|
161
161
|
[types_1.TEST_RUN_ERRORS.actionElementNotIframeError]: () => `
|
|
162
162
|
The action element is expected to be an <iframe>.
|
|
163
|
-
`,
|
|
163
|
+
`,
|
|
164
164
|
[types_1.TEST_RUN_ERRORS.actionIncorrectKeysError]: err => `
|
|
165
165
|
The "${err.argumentName}" argument contains an incorrect key or key combination.
|
|
166
|
-
`,
|
|
166
|
+
`,
|
|
167
167
|
[types_1.TEST_RUN_ERRORS.actionUnsupportedDeviceTypeError]: err => `
|
|
168
168
|
The "${err.argumentName}" argument specifies an unsupported "${err.actualValue}" device. For a list of supported devices, refer to ${utils_1.formatUrl(EXTERNAL_LINKS.viewportSizes)}.
|
|
169
|
-
`,
|
|
169
|
+
`,
|
|
170
170
|
[types_1.TEST_RUN_ERRORS.actionInvalidScrollTargetError]: err => `
|
|
171
171
|
Unable to scroll to the specified point because a point with the specified ${err.properties} is not located inside the element's cropping region.
|
|
172
|
-
`,
|
|
172
|
+
`,
|
|
173
173
|
[types_1.TEST_RUN_ERRORS.actionIframeIsNotLoadedError]: () => `
|
|
174
174
|
Content of the iframe to which you are switching did not load.
|
|
175
|
-
`,
|
|
175
|
+
`,
|
|
176
176
|
[types_1.TEST_RUN_ERRORS.currentIframeIsNotLoadedError]: () => `
|
|
177
177
|
Content of the iframe in which the test is currently operating did not load.
|
|
178
|
-
`,
|
|
178
|
+
`,
|
|
179
179
|
[types_1.TEST_RUN_ERRORS.currentIframeNotFoundError]: () => `
|
|
180
180
|
The iframe in which the test is currently operating does not exist anymore.
|
|
181
|
-
`,
|
|
181
|
+
`,
|
|
182
182
|
[types_1.TEST_RUN_ERRORS.currentIframeIsInvisibleError]: () => `
|
|
183
183
|
The iframe in which the test is currently operating is not visible anymore.
|
|
184
|
-
`,
|
|
184
|
+
`,
|
|
185
185
|
[types_1.TEST_RUN_ERRORS.missingAwaitError]: () => `
|
|
186
186
|
A call to an async function is not awaited. Use the "await" keyword before actions, assertions or chains of them to ensure that they run in the right sequence.
|
|
187
|
-
`,
|
|
187
|
+
`,
|
|
188
188
|
[types_1.TEST_RUN_ERRORS.externalAssertionLibraryError]: err => `
|
|
189
189
|
${lodash_1.escape(err.errMsg)}
|
|
190
190
|
|
|
191
191
|
${utils_1.renderDiff(err.diff)}
|
|
192
|
-
`,
|
|
192
|
+
`,
|
|
193
193
|
[types_1.TEST_RUN_ERRORS.domNodeClientFunctionResultError]: err => `
|
|
194
194
|
${err.instantiationCallsiteName} cannot return DOM elements. Use Selector functions for this purpose.
|
|
195
|
-
`,
|
|
195
|
+
`,
|
|
196
196
|
[types_1.TEST_RUN_ERRORS.invalidSelectorResultError]: () => `
|
|
197
197
|
Function that specifies a selector can only return a DOM node, an array of nodes, NodeList, HTMLCollection, null or undefined. Use ClientFunction to return other values.
|
|
198
|
-
`,
|
|
198
|
+
`,
|
|
199
199
|
[types_1.TEST_RUN_ERRORS.actionSelectorError]: err => `
|
|
200
200
|
Action "${err.selectorName}" argument error:
|
|
201
201
|
|
|
202
202
|
${lodash_1.escape(err.errMsg)}
|
|
203
|
-
`,
|
|
203
|
+
`,
|
|
204
204
|
[types_1.TEST_RUN_ERRORS.cannotObtainInfoForElementSpecifiedBySelectorError]: (err, viewportWidth) => `
|
|
205
205
|
Cannot obtain information about the node because the specified selector does not match any node in the DOM tree.
|
|
206
206
|
|
|
207
207
|
${utils_1.formatSelectorCallstack(err.apiFnChain, err.apiFnIndex, viewportWidth)}
|
|
208
|
-
`,
|
|
208
|
+
`,
|
|
209
209
|
[types_1.TEST_RUN_ERRORS.windowDimensionsOverflowError]: () => `
|
|
210
210
|
Unable to resize the window because the specified size exceeds the screen size. On macOS, a window cannot be larger than the screen.
|
|
211
|
-
`,
|
|
211
|
+
`,
|
|
212
212
|
[types_1.TEST_RUN_ERRORS.forbiddenCharactersInScreenshotPathError]: err => `
|
|
213
213
|
There are forbidden characters in the "${err.screenshotPath}" screenshot path:
|
|
214
214
|
${utils_1.renderForbiddenCharsList(err.forbiddenCharsList)}
|
|
215
|
-
`,
|
|
215
|
+
`,
|
|
216
216
|
[types_1.TEST_RUN_ERRORS.invalidElementScreenshotDimensionsError]: err => `
|
|
217
217
|
Unable to capture an element image because the resulting image ${err.dimensions} ${err.verb} zero or negative.
|
|
218
|
-
`,
|
|
218
|
+
`,
|
|
219
219
|
[types_1.TEST_RUN_ERRORS.roleSwitchInRoleInitializerError]: () => `
|
|
220
220
|
Role cannot be switched while another role is being initialized.
|
|
221
|
-
`,
|
|
221
|
+
`,
|
|
222
222
|
[types_1.TEST_RUN_ERRORS.assertionExecutableArgumentError]: err => `
|
|
223
223
|
Cannot evaluate the "${err.actualValue}" expression in the "${err.argumentName}" parameter because of the following error:
|
|
224
224
|
|
|
225
225
|
${err.errMsg}
|
|
226
|
-
`,
|
|
226
|
+
`,
|
|
227
227
|
[types_1.TEST_RUN_ERRORS.assertionWithoutMethodCallError]: () => `
|
|
228
228
|
An assertion method is not specified.
|
|
229
|
-
`,
|
|
229
|
+
`,
|
|
230
230
|
[types_1.TEST_RUN_ERRORS.assertionUnawaitedPromiseError]: () => `
|
|
231
231
|
Attempted to run assertions on a Promise object. Did you forget to await it? If not, pass "{ allowUnawaitedPromise: true }" to the assertion options.
|
|
232
|
-
`,
|
|
232
|
+
`,
|
|
233
233
|
[types_1.TEST_RUN_ERRORS.requestHookNotImplementedError]: err => `
|
|
234
234
|
You should implement the "${err.methodName}" method in the "${err.hookClassName}" class.
|
|
235
|
-
`,
|
|
235
|
+
`,
|
|
236
236
|
[types_1.TEST_RUN_ERRORS.requestHookUnhandledError]: err => `
|
|
237
237
|
An unhandled error occurred in the "${err.methodName}" method of the "${err.hookClassName}" class:
|
|
238
238
|
|
|
239
239
|
${lodash_1.escape(err.errMsg)}
|
|
240
|
-
`,
|
|
240
|
+
`,
|
|
241
241
|
[types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomClientScriptCode]: err => `
|
|
242
242
|
An error occurred in a script injected into the tested page:
|
|
243
243
|
|
|
244
244
|
${lodash_1.escape(err.errMsg)}
|
|
245
|
-
`,
|
|
245
|
+
`,
|
|
246
246
|
[types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomClientScriptCodeLoadedFromModule]: err => `
|
|
247
247
|
An error occurred in the '${err.moduleName}' module injected into the tested page. Make sure that this module can be executed in the browser environment.
|
|
248
248
|
|
|
249
249
|
Error details:
|
|
250
250
|
${lodash_1.escape(err.errMsg)}
|
|
251
|
-
`,
|
|
251
|
+
`,
|
|
252
252
|
[types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomScript]: err => `
|
|
253
253
|
An unhandled error occurred in the custom script:
|
|
254
254
|
|
|
255
255
|
Error details: ${lodash_1.escape(err.errMsg)}
|
|
256
256
|
|
|
257
257
|
${utils_1.formatExpressionMessage(err.expression, err.line, err.column)}
|
|
258
|
-
`,
|
|
258
|
+
`,
|
|
259
259
|
[types_1.TEST_RUN_ERRORS.childWindowIsNotLoadedError]: () => `
|
|
260
260
|
The page in the child window is not loaded.
|
|
261
|
-
`,
|
|
261
|
+
`,
|
|
262
262
|
[types_1.TEST_RUN_ERRORS.childWindowNotFoundError]: () => `
|
|
263
263
|
The child window is not found.
|
|
264
|
-
`,
|
|
264
|
+
`,
|
|
265
265
|
[types_1.TEST_RUN_ERRORS.cannotSwitchToWindowError]: () => `
|
|
266
266
|
Cannot switch to the window.
|
|
267
|
-
`,
|
|
267
|
+
`,
|
|
268
268
|
[types_1.TEST_RUN_ERRORS.closeChildWindowError]: () => `
|
|
269
269
|
An error occurred while closing child windows.
|
|
270
|
-
`,
|
|
270
|
+
`,
|
|
271
271
|
[types_1.TEST_RUN_ERRORS.childWindowClosedBeforeSwitchingError]: () => `
|
|
272
272
|
The child window was closed before TestCafe could switch to it.
|
|
273
|
-
`,
|
|
273
|
+
`,
|
|
274
274
|
[types_1.TEST_RUN_ERRORS.cannotCloseWindowWithChildrenError]: () => `
|
|
275
275
|
Cannot close a window that has an open child window.
|
|
276
|
-
`,
|
|
276
|
+
`,
|
|
277
277
|
[types_1.TEST_RUN_ERRORS.targetWindowNotFoundError]: () => `
|
|
278
278
|
Cannot find the window specified in the action parameters.
|
|
279
|
-
`,
|
|
279
|
+
`,
|
|
280
280
|
[types_1.TEST_RUN_ERRORS.parentWindowNotFoundError]: () => `
|
|
281
281
|
Cannot find the parent window. Make sure that the tested window was opened from another window.
|
|
282
|
-
`,
|
|
282
|
+
`,
|
|
283
283
|
[types_1.TEST_RUN_ERRORS.previousWindowNotFoundError]: () => `
|
|
284
284
|
Cannot find the previous window. Make sure that the previous window is opened.
|
|
285
|
-
`,
|
|
285
|
+
`,
|
|
286
286
|
[types_1.TEST_RUN_ERRORS.switchToWindowPredicateError]: err => `
|
|
287
287
|
An error occurred inside the "switchToWindow" argument function.
|
|
288
288
|
|
|
289
289
|
Error details:
|
|
290
290
|
${lodash_1.escape(err.errMsg)}
|
|
291
|
-
`,
|
|
291
|
+
`,
|
|
292
292
|
[types_1.TEST_RUN_ERRORS.multipleWindowsModeIsDisabledError]: err => `
|
|
293
293
|
Multi-window mode is disabled. To use the "${err.methodName}" method, remove the "disableMultipleWindows" option.
|
|
294
|
-
`,
|
|
294
|
+
`,
|
|
295
295
|
[types_1.TEST_RUN_ERRORS.multipleWindowsModeIsNotSupportedInRemoteBrowserError]: err => `
|
|
296
296
|
Multi-window mode is supported in Chrome, Chromium, Edge 84+ and Firefox only. Run tests in these browsers to use the "${err.methodName}" method.
|
|
297
|
-
`,
|
|
297
|
+
`,
|
|
298
298
|
[types_1.TEST_RUN_ERRORS.cannotCloseWindowWithoutParent]: () => `
|
|
299
299
|
Cannot close the window because it does not have a parent. The parent window was closed or you are attempting to close the root browser window where tests were launched.
|
|
300
|
-
`,
|
|
300
|
+
`,
|
|
301
301
|
[types_1.TEST_RUN_ERRORS.cannotRestoreChildWindowError]: () => `
|
|
302
302
|
Failed to restore connection to window within the allocated timeout.
|
|
303
|
-
`,
|
|
304
|
-
};
|
|
303
|
+
`,
|
|
304
|
+
};
|
|
305
305
|
module.exports = exports.default;
|
|
306
306
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Vycm9ycy90ZXN0LXJ1bi90ZW1wbGF0ZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBOEM7QUFDOUMsb0NBQTJDO0FBQzNDLG1DQU9pQjtBQUVqQixNQUFNLGNBQWMsR0FBRztJQUNuQixjQUFjLEVBQU8sMEVBQTBFO0lBQy9GLG1CQUFtQixFQUFFLCtEQUErRDtJQUNwRixhQUFhLEVBQVEsNEVBQTRFO0NBQ3BHLENBQUM7QUFFRixrQkFBZTtJQUNYLENBQUMsdUJBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7ZUFDeEMsR0FBRyxDQUFDLFVBQVUscURBQXFELEdBQUcsQ0FBQyxXQUFXO0tBQzVGO0lBRUQsQ0FBQyx1QkFBZSxDQUFDLGdDQUFnQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztlQUNoRCxHQUFHLENBQUMsVUFBVSw2REFBNkQsR0FBRyxDQUFDLFdBQVc7S0FDcEc7SUFFRCxDQUFDLHVCQUFlLENBQUMsd0JBQXdCLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2VBQ3hDLEdBQUcsQ0FBQyxVQUFVLDBEQUEwRCxHQUFHLENBQUMsV0FBVztLQUNqRztJQUVELENBQUMsdUJBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7ZUFDdEMsR0FBRyxDQUFDLFVBQVUsc0VBQXNFLEdBQUcsQ0FBQyxXQUFXO0tBQzdHO0lBRUQsQ0FBQyx1QkFBZSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7cUNBQ1AsaUJBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDOztxRUFFYyxpQkFBUyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQzs7O1VBR3hHLEdBQUcsQ0FBQyxNQUFNO0tBQ2Y7SUFFRCxDQUFDLHVCQUFlLENBQUMsbUJBQW1C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WyJpbXBvcnQgeyBlc2NhcGUgYXMgZXNjYXBlSHRtbCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBURVNUX1JVTl9FUlJPUlMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge1xuICAgIHJlbmRlckZvcmJpZGRlbkNoYXJzTGlzdCxcbiAgICByZW5kZXJEaWZmLFxuICAgIGZvcm1hdFNlbGVjdG9yQ2FsbHN0YWNrLFxuICAgIGZvcm1hdFVybCxcbiAgICByZXBsYWNlTGVhZGluZ1NwYWNlc1dpdGhOYnNwLFxuICAgIGZvcm1hdEV4cHJlc3Npb25NZXNzYWdlXG59IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBFWFRFUk5BTF9MSU5LUyA9IHtcbiAgICBjcmVhdGVOZXdJc3N1ZTogICAgICAnaHR0cHM6Ly9naXRodWIuY29tL0RldkV4cHJlc3MvdGVzdGNhZmUvaXNzdWVzL25ldz90ZW1wbGF0ZT1idWctcmVwb3J0Lm1kJyxcbiAgICB0cm91Ymxlc2hvb3ROZXR3b3JrOiAnaHR0cHM6Ly9nby5kZXZleHByZXNzLmNvbS9UZXN0Q2FmZV9GQVFfQVJlcXVlc3RIYXNGYWlsZWQuYXNweCcsXG4gICAgdmlld3BvcnRTaXplczogICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9EZXZFeHByZXNzL2RldmljZS1zcGVjcy9ibG9iL21hc3Rlci92aWV3cG9ydC1zaXplcy5qc29uJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uSW50ZWdlck9wdGlvbkVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIub3B0aW9uTmFtZX1cIiBvcHRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgYW4gaW50ZWdlciwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uUG9zaXRpdmVJbnRlZ2VyT3B0aW9uRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5vcHRpb25OYW1lfVwiIG9wdGlvbiBpcyBleHBlY3RlZCB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkJvb2xlYW5PcHRpb25FcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLm9wdGlvbk5hbWV9XCIgb3B0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGEgYm9vbGVhbiB2YWx1ZSwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uU3BlZWRPcHRpb25FcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLm9wdGlvbk5hbWV9XCIgb3B0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGEgbnVtYmVyIGJldHdlZW4gMC4wMSBhbmQgMSwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMucGFnZUxvYWRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIEZhaWxlZCB0byBsb2FkIHRoZSBwYWdlIGF0ICR7Zm9ybWF0VXJsKGVyci51cmwpfS5cbiAgICAgICAgSW5jcmVhc2UgdGhlIHZhbHVlIG9mIHRoZSBcInBhZ2VSZXF1ZXN0VGltZW91dFwiIHZhcmlhYmxlLCBlbmFibGUgdGhlIFwicmV0cnlUZXN0UGFnZXNcIiBvcHRpb24sIG9yIHVzZSBxdWFyYW50aW5lIG1vZGUgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIGF0dGVtcHRzIHRvIGV4ZWN1dGUgdGhpcyB0ZXN0LlxuICAgICAgICBZb3UgY2FuIGZpbmQgdHJvdWJsZXNob290aW5nIGluZm9ybWF0aW9uIGZvciB0aGlzIGlzc3VlIGF0ICR7Zm9ybWF0VXJsKEVYVEVSTkFMX0xJTktTLnRyb3VibGVzaG9vdE5ldHdvcmspfS5cblxuICAgICAgICBFcnJvciBkZXRhaWxzOlxuICAgICAgICAke2Vyci5lcnJNc2d9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvck9uUGFnZV06IGVyciA9PiBgXG4gICAgICAgIEEgSmF2YVNjcmlwdCBlcnJvciBvY2N1cnJlZCBvbiAke2Zvcm1hdFVybChlcnIucGFnZURlc3RVcmwpfS5cbiAgICAgICAgUmVwZWF0IHRlc3QgYWN0aW9ucyBpbiB0aGUgYnJvd3NlciBhbmQgY2hlY2sgdGhlIGNvbnNvbGUgZm9yIGVycm9ycy5cbiAgICAgICAgVG8gaWdub3JlIGNsaWVudC1zaWRlIEphdmFTY3JpcHQgZXJyb3JzLCBlbmFibGUgdGhlIFwiLS1za2lwLWpzLWVycm9yc1wiIENMSSBvcHRpb24sIG9yIHNldCB0aGUgXCJza2lwSnNFcnJvcnNcIiBjb25maWd1cmF0aW9uIGZpbGUgcHJvcGVydHkgdG8gXCJ0cnVlXCIuXG4gICAgICAgIElmIHRoZSB3ZWJzaXRlIG9ubHkgdGhyb3dzIHRoaXMgZXJyb3Igd2hlbiB5b3UgdGVzdCBpdCB3aXRoIFRlc3RDYWZlLCBwbGVhc2UgY3JlYXRlIGEgbmV3IGlzc3VlIGF0OlxuICAgICAgICAke2Zvcm1hdFVybChFWFRFUk5BTF9MSU5LUy5jcmVhdGVOZXdJc3N1ZSl9LlxuXG4gICAgICAgIEphdmFTY3JpcHQgZXJyb3IgZGV0YWlsczpcbiAgICAgICAgJHtyZXBsYWNlTGVhZGluZ1NwYWNlc1dpdGhOYnNwKGVzY2FwZUh0bWwoZXJyLmVyclN0YWNrKSl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluVGVzdENvZGVdOiBlcnIgPT4gYFxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMubmF0aXZlRGlhbG9nTm90SGFuZGxlZEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgQSBuYXRpdmUgJHtlcnIuZGlhbG9nVHlwZX0gZGlhbG9nIHdhcyBpbnZva2VkIG9uIHBhZ2UgJHtmb3JtYXRVcmwoZXJyLnBhZ2VVcmwpfSwgYnV0IG5vIGhhbmRsZXIgd2FzIHNldCBmb3IgaXQuIFVzZSB0aGUgXCJzZXROYXRpdmVEaWFsb2dIYW5kbGVyXCIgZnVuY3Rpb24gdG8gaW50cm9kdWNlIGEgaGFuZGxlciBmdW5jdGlvbiBmb3IgbmF0aXZlIGRpYWxvZ3MuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluTmF0aXZlRGlhbG9nSGFuZGxlcl06IGVyciA9PiBgXG4gICAgICAgIEFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBuYXRpdmUgZGlhbG9nIGhhbmRsZXIgY2FsbGVkIGZvciBhIG5hdGl2ZSAke2Vyci5kaWFsb2dUeXBlfSBkaWFsb2cgb24gcGFnZSAke2Zvcm1hdFVybChlcnIucGFnZVVybCl9OlxuXG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5zZXRUZXN0U3BlZWRBcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgU3BlZWQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBudW1iZXIgYmV0d2VlbiAwLjAxIGFuZCAxLCBidXQgJHtlcnIuYWN0dWFsVmFsdWV9IHdhcyBwYXNzZWQuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuc2V0TmF0aXZlRGlhbG9nSGFuZGxlckNvZGVXcm9uZ1R5cGVFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBuYXRpdmUgZGlhbG9nIGhhbmRsZXIgaXMgZXhwZWN0ZWQgdG8gYmUgYSBmdW5jdGlvbiwgQ2xpZW50RnVuY3Rpb24gb3IgbnVsbCwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxUeXBlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5DbGllbnRGdW5jdGlvbkNvZGVdOiBlcnIgPT4gYFxuICAgICAgICBBbiBlcnJvciBvY2N1cnJlZCBpbiAke2Vyci5pbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lfSBjb2RlOlxuXG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5DdXN0b21ET01Qcm9wZXJ0eUNvZGVdOiBlcnIgPT4gYFxuICAgICAgICBBbiBlcnJvciBvY2N1cnJlZCB3aGVuIHRyeWluZyB0byBjYWxjdWxhdGUgYSBjdXN0b20gU2VsZWN0b3IgcHJvcGVydHkgXCIke2Vyci5wcm9wZXJ0eX1cIjpcblxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY2xpZW50RnVuY3Rpb25FeGVjdXRpb25JbnRlcnJ1cHRpb25FcnJvcl06IGVyciA9PiBgXG4gICAgICAgICR7ZXJyLmluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWV9IGV4ZWN1dGlvbiB3YXMgaW50ZXJydXB0ZWQgYnkgcGFnZSB1bmxvYWQuIFRoaXMgcHJvYmxlbSBtYXkgYXBwZWFyIGlmIHlvdSB0cmlnZ2VyIHBhZ2UgbmF2aWdhdGlvbiBmcm9tICR7ZXJyLmluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWV9IGNvZGUuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHROb25FcnJvck9iamVjdEluVGVzdENvZGVdOiBlcnIgPT4gYFxuICAgICAgICBVbmNhdWdodCAke2Vyci5vYmpUeXBlfSBcIiR7ZXNjYXBlSHRtbChlcnIub2JqU3RyKX1cIiB3YXMgdGhyb3duLiBUaHJvdyBFcnJvciBpbnN0ZWFkLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnVuaGFuZGxlZFByb21pc2VSZWplY3Rpb25dOiBlcnIgPT4gYFxuICAgICAgICBVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb246XG5cbiAgICAgICAgJHtlc2NhcGVIdG1sKGVyci5lcnJNc2cpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXhjZXB0aW9uXTogZXJyID0+IGBcbiAgICAgICAgVW5jYXVnaHQgZXhjZXB0aW9uOlxuXG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25PcHRpb25zVHlwZUVycm9yXTogZXJyID0+IGBcbiAgICAgICAgQWN0aW9uIG9wdGlvbnMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gb2JqZWN0LCBudWxsIG9yIHVuZGVmaW5lZCBidXQgaXQgd2FzICR7ZXJyLmFjdHVhbFR5cGV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvblN0cmluZ0FyZ3VtZW50RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgYXJndW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBub24tZW1wdHkgc3RyaW5nLCBidXQgaXQgd2FzICR7ZXJyLmFjdHVhbFZhbHVlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25Cb29sZWFuQXJndW1lbnRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBhcmd1bWVudCBpcyBleHBlY3RlZCB0byBiZSBhIGJvb2xlYW4gdmFsdWUsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbk51bGxhYmxlU3RyaW5nQXJndW1lbnRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBhcmd1bWVudCBpcyBleHBlY3RlZCB0byBiZSBhIG51bGwgb3IgYSBzdHJpbmcsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvblN0cmluZ09yU3RyaW5nQXJyYXlBcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHN0cmluZyBhcnJheSwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uU3RyaW5nQXJyYXlFbGVtZW50RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBFbGVtZW50cyBvZiB0aGUgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgYXJndW1lbnQgYXJlIGV4cGVjdGVkIHRvIGJlIG5vbi1lbXB0eSBzdHJpbmdzLCBidXQgdGhlIGVsZW1lbnQgYXQgaW5kZXggJHtlcnIuZWxlbWVudEluZGV4fSB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkludGVnZXJBcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGFuIGludGVnZXIsIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvblJvbGVBcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgUm9sZSBpbnN0YW5jZSwgYnV0IGl0IHdhcyAke2Vyci5hY3R1YWxWYWx1ZX0uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uRnVuY3Rpb25Bcmd1bWVudEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGFyZ3VtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgZnVuY3Rpb24sIGJ1dCBpdCB3YXMgJHtlcnIuYWN0dWFsVmFsdWV9LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvblBvc2l0aXZlSW50ZWdlckFyZ3VtZW50RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgXCIke2Vyci5hcmd1bWVudE5hbWV9XCIgYXJndW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgaXQgd2FzICR7ZXJyLmFjdHVhbFZhbHVlfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50Tm90Rm91bmRFcnJvcl06IChlcnIsIHZpZXdwb3J0V2lkdGgpID0+IGBcbiAgICAgICAgVGhlIHNwZWNpZmllZCBzZWxlY3RvciBkb2VzIG5vdCBtYXRjaCBhbnkgZWxlbWVudCBpbiB0aGUgRE9NIHRyZWUuXG5cbiAgICAgICAgJHtmb3JtYXRTZWxlY3RvckNhbGxzdGFjayhlcnIuYXBpRm5DaGFpbiwgZXJyLmFwaUZuSW5kZXgsIHZpZXdwb3J0V2lkdGgpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkVsZW1lbnRJc0ludmlzaWJsZUVycm9yXTogKCkgPT4gYFxuICAgICAgICBUaGUgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBzZWxlY3RvciBpcyBub3QgdmlzaWJsZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25TZWxlY3Rvck1hdGNoZXNXcm9uZ05vZGVUeXBlRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgc3BlY2lmaWVkIHNlbGVjdG9yIGlzIGV4cGVjdGVkIHRvIG1hdGNoIGEgRE9NIGVsZW1lbnQsIGJ1dCBpdCBtYXRjaGVzIGEgJHtlcnIubm9kZURlc2NyaXB0aW9ufSBub2RlLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkFkZGl0aW9uYWxFbGVtZW50Tm90Rm91bmRFcnJvcl06IChlcnIsIHZpZXdwb3J0V2lkdGgpID0+IGBcbiAgICAgICAgVGhlIHNwZWNpZmllZCBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBkb2VzIG5vdCBtYXRjaCBhbnkgZWxlbWVudCBpbiB0aGUgRE9NIHRyZWUuXG5cbiAgICAgICAgJHtmb3JtYXRTZWxlY3RvckNhbGxzdGFjayhlcnIuYXBpRm5DaGFpbiwgZXJyLmFwaUZuSW5kZXgsIHZpZXdwb3J0V2lkdGgpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkFkZGl0aW9uYWxFbGVtZW50SXNJbnZpc2libGVFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGlzIG5vdCB2aXNpYmxlLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkFkZGl0aW9uYWxTZWxlY3Rvck1hdGNoZXNXcm9uZ05vZGVUeXBlRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBUaGUgc3BlY2lmaWVkIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGlzIGV4cGVjdGVkIHRvIG1hdGNoIGEgRE9NIGVsZW1lbnQsIGJ1dCBpdCBtYXRjaGVzIGEgJHtlcnIubm9kZURlc2NyaXB0aW9ufSBub2RlLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkVsZW1lbnROb25FZGl0YWJsZUVycm9yXTogKCkgPT4gYFxuICAgICAgICBUaGUgYWN0aW9uIGVsZW1lbnQgaXMgZXhwZWN0ZWQgdG8gYmUgZWRpdGFibGUgKGFuIGlucHV0LCB0ZXh0YXJlYSBvciBlbGVtZW50IHdpdGggdGhlIGNvbnRlbnRFZGl0YWJsZSBhdHRyaWJ1dGUpLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkVsZW1lbnROb25Db250ZW50RWRpdGFibGVFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIFwiJHtlcnIuYXJndW1lbnROYW1lfVwiIGlzIGV4cGVjdGVkIHRvIGhhdmUgdGhlIGNvbnRlbnRFZGl0YWJsZSBhdHRyaWJ1dGUgZW5hYmxlZCBvciB0aGUgZW50aXJlIGRvY3VtZW50IHNob3VsZCBiZSBpbiBkZXNpZ24gbW9kZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25Sb290Q29udGFpbmVyTm90Rm91bmRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgQ29udGVudCBiZXR3ZWVuIHRoZSBhY3Rpb24gZWxlbWVudHMgY2Fubm90IGJlIHNlbGVjdGVkIGJlY2F1c2UgdGhlIHJvb3QgY29udGFpbmVyIGZvciB0aGUgc2VsZWN0aW9uIHJhbmdlIGNhbm5vdCBiZSBmb3VuZCwgaS5lLiB0aGVzZSBlbGVtZW50cyBkbyBub3QgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvciB3aXRoIHRoZSBjb250ZW50RWRpdGFibGUgYXR0cmlidXRlLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkVsZW1lbnRJc05vdEZpbGVJbnB1dEVycm9yXTogKCkgPT4gYFxuICAgICAgICBUaGUgc3BlY2lmaWVkIHNlbGVjdG9yIGRvZXMgbm90IG1hdGNoIGEgZmlsZSBpbnB1dCBlbGVtZW50LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkNhbm5vdEZpbmRGaWxlVG9VcGxvYWRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIENhbm5vdCBmaW5kIHRoZSBmb2xsb3dpbmcgZmlsZShzKSB0byB1cGxvYWQ6XG4gICAgICAgICR7ZXJyLmZpbGVQYXRocy5tYXAocGF0aCA9PiBlc2NhcGVIdG1sKHBhdGgpKS5qb2luKCdcXG4nKX1cblxuICAgICAgICBUaGUgZm9sbG93aW5nIGxvY2F0aW9ucyB3ZXJlIHNjYW5uZWQgZm9yIHRoZSBtaXNzaW5nIHVwbG9hZCBmaWxlczpcbiAgICAgICAgJHtlcnIuc2Nhbm5lZEZpbGVQYXRocy5tYXAocGF0aCA9PiBlc2NhcGVIdG1sKHBhdGgpKS5qb2luKCdcXG4nKX1cblxuICAgICAgICBFbnN1cmUgdGhlc2UgZmlsZXMgZXhpc3Qgb3IgY2hhbmdlIHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50Tm90VGV4dEFyZWFFcnJvcl06ICgpID0+IGBcbiAgICAgICAgVGhlIGFjdGlvbiBlbGVtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgJmx0O3RleHRhcmVhJmd0Oy5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50Tm90SWZyYW1lRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIFRoZSBhY3Rpb24gZWxlbWVudCBpcyBleHBlY3RlZCB0byBiZSBhbiAmbHQ7aWZyYW1lJmd0LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvbkluY29ycmVjdEtleXNFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBhcmd1bWVudCBjb250YWlucyBhbiBpbmNvcnJlY3Qga2V5IG9yIGtleSBjb21iaW5hdGlvbi5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25VbnN1cHBvcnRlZERldmljZVR5cGVFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIFRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBhcmd1bWVudCBzcGVjaWZpZXMgYW4gdW5zdXBwb3J0ZWQgXCIke2Vyci5hY3R1YWxWYWx1ZX1cIiBkZXZpY2UuIEZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMsIHJlZmVyIHRvICR7Zm9ybWF0VXJsKEVYVEVSTkFMX0xJTktTLnZpZXdwb3J0U2l6ZXMpfS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hY3Rpb25JbnZhbGlkU2Nyb2xsVGFyZ2V0RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBVbmFibGUgdG8gc2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgcG9pbnQgYmVjYXVzZSBhIHBvaW50IHdpdGggdGhlIHNwZWNpZmllZCAke2Vyci5wcm9wZXJ0aWVzfSBpcyBub3QgbG9jYXRlZCBpbnNpZGUgdGhlIGVsZW1lbnQncyBjcm9wcGluZyByZWdpb24uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYWN0aW9uSWZyYW1lSXNOb3RMb2FkZWRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgQ29udGVudCBvZiB0aGUgaWZyYW1lIHRvIHdoaWNoIHlvdSBhcmUgc3dpdGNoaW5nIGRpZCBub3QgbG9hZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jdXJyZW50SWZyYW1lSXNOb3RMb2FkZWRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgQ29udGVudCBvZiB0aGUgaWZyYW1lIGluIHdoaWNoIHRoZSB0ZXN0IGlzIGN1cnJlbnRseSBvcGVyYXRpbmcgZGlkIG5vdCBsb2FkLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmN1cnJlbnRJZnJhbWVOb3RGb3VuZEVycm9yXTogKCkgPT4gYFxuICAgICAgICBUaGUgaWZyYW1lIGluIHdoaWNoIHRoZSB0ZXN0IGlzIGN1cnJlbnRseSBvcGVyYXRpbmcgZG9lcyBub3QgZXhpc3QgYW55bW9yZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jdXJyZW50SWZyYW1lSXNJbnZpc2libGVFcnJvcl06ICgpID0+IGBcbiAgICAgICAgVGhlIGlmcmFtZSBpbiB3aGljaCB0aGUgdGVzdCBpcyBjdXJyZW50bHkgb3BlcmF0aW5nIGlzIG5vdCB2aXNpYmxlIGFueW1vcmUuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMubWlzc2luZ0F3YWl0RXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIEEgY2FsbCB0byBhbiBhc3luYyBmdW5jdGlvbiBpcyBub3QgYXdhaXRlZC4gVXNlIHRoZSBcImF3YWl0XCIga2V5d29yZCBiZWZvcmUgYWN0aW9ucywgYXNzZXJ0aW9ucyBvciBjaGFpbnMgb2YgdGhlbSB0byBlbnN1cmUgdGhhdCB0aGV5IHJ1biBpbiB0aGUgcmlnaHQgc2VxdWVuY2UuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuZXh0ZXJuYWxBc3NlcnRpb25MaWJyYXJ5RXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG5cbiAgICAgICAgJHtyZW5kZXJEaWZmKGVyci5kaWZmKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5kb21Ob2RlQ2xpZW50RnVuY3Rpb25SZXN1bHRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgJHtlcnIuaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZX0gY2Fubm90IHJldHVybiBET00gZWxlbWVudHMuIFVzZSBTZWxlY3RvciBmdW5jdGlvbnMgZm9yIHRoaXMgcHVycG9zZS5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5pbnZhbGlkU2VsZWN0b3JSZXN1bHRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgRnVuY3Rpb24gdGhhdCBzcGVjaWZpZXMgYSBzZWxlY3RvciBjYW4gb25seSByZXR1cm4gYSBET00gbm9kZSwgYW4gYXJyYXkgb2Ygbm9kZXMsIE5vZGVMaXN0LCBIVE1MQ29sbGVjdGlvbiwgbnVsbCBvciB1bmRlZmluZWQuIFVzZSBDbGllbnRGdW5jdGlvbiB0byByZXR1cm4gb3RoZXIgdmFsdWVzLlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmFjdGlvblNlbGVjdG9yRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBBY3Rpb24gXCIke2Vyci5zZWxlY3Rvck5hbWV9XCIgYXJndW1lbnQgZXJyb3I6XG5cbiAgICAgICAgJHtlc2NhcGVIdG1sKGVyci5lcnJNc2cpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLmNhbm5vdE9idGFpbkluZm9Gb3JFbGVtZW50U3BlY2lmaWVkQnlTZWxlY3RvckVycm9yXTogKGVyciwgdmlld3BvcnRXaWR0aCkgPT4gYFxuICAgICAgICBDYW5ub3Qgb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBub2RlIGJlY2F1c2UgdGhlIHNwZWNpZmllZCBzZWxlY3RvciBkb2VzIG5vdCBtYXRjaCBhbnkgbm9kZSBpbiB0aGUgRE9NIHRyZWUuXG5cbiAgICAgICAgJHtmb3JtYXRTZWxlY3RvckNhbGxzdGFjayhlcnIuYXBpRm5DaGFpbiwgZXJyLmFwaUZuSW5kZXgsIHZpZXdwb3J0V2lkdGgpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLndpbmRvd0RpbWVuc2lvbnNPdmVyZmxvd0Vycm9yXTogKCkgPT4gYFxuICAgICAgICBVbmFibGUgdG8gcmVzaXplIHRoZSB3aW5kb3cgYmVjYXVzZSB0aGUgc3BlY2lmaWVkIHNpemUgZXhjZWVkcyB0aGUgc2NyZWVuIHNpemUuIE9uIG1hY09TLCBhIHdpbmRvdyBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gdGhlIHNjcmVlbi5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5mb3JiaWRkZW5DaGFyYWN0ZXJzSW5TY3JlZW5zaG90UGF0aEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgVGhlcmUgYXJlIGZvcmJpZGRlbiBjaGFyYWN0ZXJzIGluIHRoZSBcIiR7ZXJyLnNjcmVlbnNob3RQYXRofVwiIHNjcmVlbnNob3QgcGF0aDpcbiAgICAgICAgJHtyZW5kZXJGb3JiaWRkZW5DaGFyc0xpc3QoZXJyLmZvcmJpZGRlbkNoYXJzTGlzdCl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuaW52YWxpZEVsZW1lbnRTY3JlZW5zaG90RGltZW5zaW9uc0Vycm9yXTogZXJyID0+IGBcbiAgICAgICAgIFVuYWJsZSB0byBjYXB0dXJlIGFuIGVsZW1lbnQgaW1hZ2UgYmVjYXVzZSB0aGUgcmVzdWx0aW5nIGltYWdlICR7ZXJyLmRpbWVuc2lvbnN9ICR7ZXJyLnZlcmJ9IHplcm8gb3IgbmVnYXRpdmUuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMucm9sZVN3aXRjaEluUm9sZUluaXRpYWxpemVyRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIFJvbGUgY2Fubm90IGJlIHN3aXRjaGVkIHdoaWxlIGFub3RoZXIgcm9sZSBpcyBiZWluZyBpbml0aWFsaXplZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hc3NlcnRpb25FeGVjdXRhYmxlQXJndW1lbnRFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIENhbm5vdCBldmFsdWF0ZSB0aGUgXCIke2Vyci5hY3R1YWxWYWx1ZX1cIiBleHByZXNzaW9uIGluIHRoZSBcIiR7ZXJyLmFyZ3VtZW50TmFtZX1cIiBwYXJhbWV0ZXIgYmVjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGVycm9yOlxuXG4gICAgICAgICR7ZXJyLmVyck1zZ31cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5hc3NlcnRpb25XaXRob3V0TWV0aG9kQ2FsbEVycm9yXTogKCkgPT4gYFxuICAgICAgICBBbiBhc3NlcnRpb24gbWV0aG9kIGlzIG5vdCBzcGVjaWZpZWQuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuYXNzZXJ0aW9uVW5hd2FpdGVkUHJvbWlzZUVycm9yXTogKCkgPT4gYFxuICAgICAgICBBdHRlbXB0ZWQgdG8gcnVuIGFzc2VydGlvbnMgb24gYSBQcm9taXNlIG9iamVjdC4gRGlkIHlvdSBmb3JnZXQgdG8gYXdhaXQgaXQ/IElmIG5vdCwgcGFzcyBcInsgYWxsb3dVbmF3YWl0ZWRQcm9taXNlOiB0cnVlIH1cIiB0byB0aGUgYXNzZXJ0aW9uIG9wdGlvbnMuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMucmVxdWVzdEhvb2tOb3RJbXBsZW1lbnRlZEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgWW91IHNob3VsZCBpbXBsZW1lbnQgdGhlIFwiJHtlcnIubWV0aG9kTmFtZX1cIiBtZXRob2QgaW4gdGhlIFwiJHtlcnIuaG9va0NsYXNzTmFtZX1cIiBjbGFzcy5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5yZXF1ZXN0SG9va1VuaGFuZGxlZEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgQW4gdW5oYW5kbGVkIGVycm9yIG9jY3VycmVkIGluIHRoZSBcIiR7ZXJyLm1ldGhvZE5hbWV9XCIgbWV0aG9kIG9mIHRoZSBcIiR7ZXJyLmhvb2tDbGFzc05hbWV9XCIgY2xhc3M6XG5cbiAgICAgICAgJHtlc2NhcGVIdG1sKGVyci5lcnJNc2cpfVxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXJyb3JJbkN1c3RvbUNsaWVudFNjcmlwdENvZGVdOiBlcnIgPT4gYFxuICAgICAgICBBbiBlcnJvciBvY2N1cnJlZCBpbiBhIHNjcmlwdCBpbmplY3RlZCBpbnRvIHRoZSB0ZXN0ZWQgcGFnZTpcblxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluQ3VzdG9tQ2xpZW50U2NyaXB0Q29kZUxvYWRlZEZyb21Nb2R1bGVdOiBlcnIgPT4gYFxuICAgICAgICBBbiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgJyR7ZXJyLm1vZHVsZU5hbWV9JyBtb2R1bGUgaW5qZWN0ZWQgaW50byB0aGUgdGVzdGVkIHBhZ2UuIE1ha2Ugc3VyZSB0aGF0IHRoaXMgbW9kdWxlIGNhbiBiZSBleGVjdXRlZCBpbiB0aGUgYnJvd3NlciBlbnZpcm9ubWVudC5cblxuICAgICAgICBFcnJvciBkZXRhaWxzOlxuICAgICAgICAke2VzY2FwZUh0bWwoZXJyLmVyck1zZyl9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluQ3VzdG9tU2NyaXB0XTogZXJyID0+IGBcbiAgICAgICAgQW4gdW5oYW5kbGVkIGVycm9yIG9jY3VycmVkIGluIHRoZSBjdXN0b20gc2NyaXB0OlxuXG4gICAgICAgIEVycm9yIGRldGFpbHM6ICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cblxuICAgICAgICAke2Zvcm1hdEV4cHJlc3Npb25NZXNzYWdlKGVyci5leHByZXNzaW9uLCBlcnIubGluZSwgZXJyLmNvbHVtbil9XG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY2hpbGRXaW5kb3dJc05vdExvYWRlZEVycm9yXTogKCkgPT4gYFxuICAgICAgICBUaGUgcGFnZSBpbiB0aGUgY2hpbGQgd2luZG93IGlzIG5vdCBsb2FkZWQuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY2hpbGRXaW5kb3dOb3RGb3VuZEVycm9yXTogKCkgPT4gYFxuICAgICAgICBUaGUgY2hpbGQgd2luZG93IGlzIG5vdCBmb3VuZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jYW5ub3RTd2l0Y2hUb1dpbmRvd0Vycm9yXTogKCkgPT4gYFxuICAgICAgICBDYW5ub3Qgc3dpdGNoIHRvIHRoZSB3aW5kb3cuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY2xvc2VDaGlsZFdpbmRvd0Vycm9yXTogKCkgPT4gYFxuICAgICAgICBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjbG9zaW5nIGNoaWxkIHdpbmRvd3MuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY2hpbGRXaW5kb3dDbG9zZWRCZWZvcmVTd2l0Y2hpbmdFcnJvcl06ICgpID0+IGBcbiAgICAgICAgVGhlIGNoaWxkIHdpbmRvdyB3YXMgY2xvc2VkIGJlZm9yZSBUZXN0Q2FmZSBjb3VsZCBzd2l0Y2ggdG8gaXQuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuY2Fubm90Q2xvc2VXaW5kb3dXaXRoQ2hpbGRyZW5FcnJvcl06ICgpID0+IGBcbiAgICAgICAgQ2Fubm90IGNsb3NlIGEgd2luZG93IHRoYXQgaGFzIGFuIG9wZW4gY2hpbGQgd2luZG93LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnRhcmdldFdpbmRvd05vdEZvdW5kRXJyb3JdOiAoKSA9PiBgXG4gICAgICAgIENhbm5vdCBmaW5kIHRoZSB3aW5kb3cgc3BlY2lmaWVkIGluIHRoZSBhY3Rpb24gcGFyYW1ldGVycy5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5wYXJlbnRXaW5kb3dOb3RGb3VuZEVycm9yXTogKCkgPT4gYFxuICAgICAgICBDYW5ub3QgZmluZCB0aGUgcGFyZW50IHdpbmRvdy4gTWFrZSBzdXJlIHRoYXQgdGhlIHRlc3RlZCB3aW5kb3cgd2FzIG9wZW5lZCBmcm9tIGFub3RoZXIgd2luZG93LlxuICAgIGAsXG5cbiAgICBbVEVTVF9SVU5fRVJST1JTLnByZXZpb3VzV2luZG93Tm90Rm91bmRFcnJvcl06ICgpID0+IGBcbiAgICAgICAgQ2Fubm90IGZpbmQgdGhlIHByZXZpb3VzIHdpbmRvdy4gTWFrZSBzdXJlIHRoYXQgdGhlIHByZXZpb3VzIHdpbmRvdyBpcyBvcGVuZWQuXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMuc3dpdGNoVG9XaW5kb3dQcmVkaWNhdGVFcnJvcl06IGVyciA9PiBgXG4gICAgICAgIEFuIGVycm9yIG9jY3VycmVkIGluc2lkZSB0aGUgXCJzd2l0Y2hUb1dpbmRvd1wiIGFyZ3VtZW50IGZ1bmN0aW9uLlxuXG4gICAgICAgIEVycm9yIGRldGFpbHM6XG4gICAgICAgICR7ZXNjYXBlSHRtbChlcnIuZXJyTXNnKX1cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5tdWx0aXBsZVdpbmRvd3NNb2RlSXNEaXNhYmxlZEVycm9yXTogZXJyID0+IGBcbiAgICAgICAgTXVsdGktd2luZG93IG1vZGUgaXMgZGlzYWJsZWQuIFRvIHVzZSB0aGUgXCIke2Vyci5tZXRob2ROYW1lfVwiIG1ldGhvZCwgcmVtb3ZlIHRoZSBcImRpc2FibGVNdWx0aXBsZVdpbmRvd3NcIiBvcHRpb24uXG4gICAgYCxcblxuICAgIFtURVNUX1JVTl9FUlJPUlMubXVsdGlwbGVXaW5kb3dzTW9kZUlzTm90U3VwcG9ydGVkSW5SZW1vdGVCcm93c2VyRXJyb3JdOiBlcnIgPT4gYFxuICAgICAgICBNdWx0aS13aW5kb3cgbW9kZSBpcyBzdXBwb3J0ZWQgaW4gQ2hyb21lLCBDaHJvbWl1bSwgRWRnZSA4NCsgYW5kIEZpcmVmb3ggb25seS4gUnVuIHRlc3RzIGluIHRoZXNlIGJyb3dzZXJzIHRvIHVzZSB0aGUgXCIke2Vyci5tZXRob2ROYW1lfVwiIG1ldGhvZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jYW5ub3RDbG9zZVdpbmRvd1dpdGhvdXRQYXJlbnRdOiAoKSA9PiBgXG4gICAgICAgIENhbm5vdCBjbG9zZSB0aGUgd2luZG93IGJlY2F1c2UgaXQgZG9lcyBub3QgaGF2ZSBhIHBhcmVudC4gVGhlIHBhcmVudCB3aW5kb3cgd2FzIGNsb3NlZCBvciB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gY2xvc2UgdGhlIHJvb3QgYnJvd3NlciB3aW5kb3cgd2hlcmUgdGVzdHMgd2VyZSBsYXVuY2hlZC5cbiAgICBgLFxuXG4gICAgW1RFU1RfUlVOX0VSUk9SUy5jYW5ub3RSZXN0b3JlQ2hpbGRXaW5kb3dFcnJvcl06ICgpID0+IGBcbiAgICAgICAgRmFpbGVkIHRvIHJlc3RvcmUgY29ubmVjdGlvbiB0byB3aW5kb3cgd2l0aGluIHRoZSBhbGxvY2F0ZWQgdGltZW91dC5cbiAgICBgLFxufTtcbiJdfQ==
|