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.
Files changed (332) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/LICENSE +21 -21
  3. package/bin/testcafe-with-v8-flag-filter.js +0 -0
  4. package/lib/api/exportable-lib/index.js +49 -49
  5. package/lib/api/request-hooks/assert-type.js +7 -7
  6. package/lib/api/request-hooks/hook-method-names.js +9 -9
  7. package/lib/api/request-hooks/hook.js +32 -32
  8. package/lib/api/request-hooks/interfaces.js +2 -2
  9. package/lib/api/request-hooks/request-logger.js +112 -112
  10. package/lib/api/request-hooks/request-mock/create-request-mock.js +10 -10
  11. package/lib/api/request-hooks/request-mock/index.js +44 -44
  12. package/lib/api/request-hooks/request-mock.js +46 -46
  13. package/lib/api/structure/base-unit.js +11 -11
  14. package/lib/api/structure/fixture.js +75 -75
  15. package/lib/api/structure/interfaces.js +2 -2
  16. package/lib/api/structure/test-file.js +31 -31
  17. package/lib/api/structure/test-timeout.js +9 -9
  18. package/lib/api/structure/test.js +85 -85
  19. package/lib/api/structure/testing-unit.js +89 -89
  20. package/lib/api/structure/unit-type.js +9 -9
  21. package/lib/api/test-controller/assertion.js +88 -88
  22. package/lib/api/test-controller/execution-context.js +82 -82
  23. package/lib/api/test-controller/index.js +358 -358
  24. package/lib/api/test-controller/proxy.js +28 -28
  25. package/lib/api/test-page-url.js +60 -60
  26. package/lib/api/test-run-tracker.js +68 -68
  27. package/lib/api/wrap-test-function.js +49 -49
  28. package/lib/assertions/executor.js +74 -74
  29. package/lib/assertions/get-fn.js +46 -46
  30. package/lib/assertions/type.js +20 -20
  31. package/lib/assets/content-types.js +9 -9
  32. package/lib/assets/injectables.js +18 -18
  33. package/lib/browser/connection/command.js +10 -10
  34. package/lib/browser/connection/error-hints.js +9 -9
  35. package/lib/browser/connection/gateway.js +159 -159
  36. package/lib/browser/connection/get-hints.js +33 -33
  37. package/lib/browser/connection/heartbeat-status.js +8 -8
  38. package/lib/browser/connection/index.js +328 -328
  39. package/lib/browser/connection/remotes-queue.js +46 -46
  40. package/lib/browser/connection/service-routes.js +12 -12
  41. package/lib/browser/connection/status.js +12 -12
  42. package/lib/browser/interfaces.js +2 -2
  43. package/lib/browser/provider/built-in/dedicated/base.js +80 -80
  44. package/lib/browser/provider/built-in/dedicated/chrome/browser-client.js +204 -204
  45. package/lib/browser/provider/built-in/dedicated/chrome/build-chrome-args.js +17 -17
  46. package/lib/browser/provider/built-in/dedicated/chrome/config.js +110 -110
  47. package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +45 -45
  48. package/lib/browser/provider/built-in/dedicated/chrome/elapsed-upperbounds.js +15 -15
  49. package/lib/browser/provider/built-in/dedicated/chrome/index.js +102 -102
  50. package/lib/browser/provider/built-in/dedicated/chrome/interfaces.js +2 -2
  51. package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +24 -24
  52. package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +29 -29
  53. package/lib/browser/provider/built-in/dedicated/edge/index.js +10 -10
  54. package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +29 -29
  55. package/lib/browser/provider/built-in/dedicated/firefox/config.js +33 -33
  56. package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +78 -78
  57. package/lib/browser/provider/built-in/dedicated/firefox/index.js +73 -73
  58. package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +36 -36
  59. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/commands.js +13 -13
  60. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +200 -200
  61. package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +17 -17
  62. package/lib/browser/provider/built-in/index.js +21 -21
  63. package/lib/browser/provider/built-in/locally-installed.js +30 -30
  64. package/lib/browser/provider/built-in/path.js +47 -47
  65. package/lib/browser/provider/built-in/remote.js +58 -58
  66. package/lib/browser/provider/index.js +303 -303
  67. package/lib/browser/provider/parse-provider-name.js +16 -16
  68. package/lib/browser/provider/plugin-host.js +121 -121
  69. package/lib/browser/provider/pool.js +115 -115
  70. package/lib/browser/provider/utils/argument-parsing.js +74 -74
  71. package/lib/browser/provider/utils/browser-starter.js +34 -34
  72. package/lib/browser/provider/utils/client-functions.js +24 -24
  73. package/lib/browser/provider/utils/get-maximized-headless-window-size.js +9 -9
  74. package/lib/cli/argument-parser.js +284 -284
  75. package/lib/cli/authentication-helper.js +35 -35
  76. package/lib/cli/cli.js +134 -134
  77. package/lib/cli/correct-browsers-and-sources.js +40 -40
  78. package/lib/cli/index.js +19 -19
  79. package/lib/cli/log.js +43 -43
  80. package/lib/cli/remotes-wizard.js +36 -36
  81. package/lib/cli/termination-handler.js +38 -38
  82. package/lib/client/automation/index.js +34 -16
  83. package/lib/client/automation/index.min.js +1 -1
  84. package/lib/client/browser/idle-page/index.html.mustache +35 -35
  85. package/lib/client/browser/idle-page/logo.svg +86 -86
  86. package/lib/client/core/index.js +14 -14
  87. package/lib/client/driver/index.js +46 -16
  88. package/lib/client/driver/index.min.js +1 -1
  89. package/lib/client/driver/internal-properties.js +9 -9
  90. package/lib/client/test-run/iframe.js.mustache +17 -17
  91. package/lib/client/test-run/index.js.mustache +51 -51
  92. package/lib/client/ui/index.js +14 -14
  93. package/lib/client/ui/sprite.svg +42 -42
  94. package/lib/client-functions/builder-symbol.js +4 -4
  95. package/lib/client-functions/client-function-builder.js +155 -155
  96. package/lib/client-functions/replicator.js +61 -61
  97. package/lib/client-functions/return-single-prop-mode.js +8 -8
  98. package/lib/client-functions/selector-api-execution-mode.js +20 -20
  99. package/lib/client-functions/selectors/add-api.js +645 -645
  100. package/lib/client-functions/selectors/create-snapshot-methods.js +13 -13
  101. package/lib/client-functions/selectors/prepare-api-args.js +20 -20
  102. package/lib/client-functions/selectors/selector-attribute-filter.js +22 -22
  103. package/lib/client-functions/selectors/selector-builder.js +153 -153
  104. package/lib/client-functions/selectors/selector-text-filter.js +43 -43
  105. package/lib/client-functions/selectors/snapshot-properties.js +48 -48
  106. package/lib/client-functions/types.js +18 -18
  107. package/lib/compiler/babel/format-babel-produced-code.js +10 -10
  108. package/lib/compiler/babel/get-base-babel-options.js +11 -11
  109. package/lib/compiler/babel/load-libs.js +63 -63
  110. package/lib/compiler/babel/preset-stage-2.js +19 -19
  111. package/lib/compiler/compile-client-function.js +73 -73
  112. package/lib/compiler/compilers.js +33 -33
  113. package/lib/compiler/index.js +92 -92
  114. package/lib/compiler/interfaces.js +2 -2
  115. package/lib/compiler/test-file/api-based.js +146 -146
  116. package/lib/compiler/test-file/base.js +36 -36
  117. package/lib/compiler/test-file/exportble-lib-path.js +5 -5
  118. package/lib/compiler/test-file/formats/coffeescript/compiler.js +38 -38
  119. package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +29 -29
  120. package/lib/compiler/test-file/formats/es-next/compiler.js +42 -42
  121. package/lib/compiler/test-file/formats/es-next/get-test-list.js +166 -166
  122. package/lib/compiler/test-file/formats/es-next/is-flow-code.js +7 -7
  123. package/lib/compiler/test-file/formats/raw.js +85 -85
  124. package/lib/compiler/test-file/formats/typescript/compiler.js +135 -135
  125. package/lib/compiler/test-file/formats/typescript/get-test-list.js +185 -185
  126. package/lib/compiler/test-file/test-file-parser-base.js +214 -214
  127. package/lib/configuration/configuration-base.js +165 -165
  128. package/lib/configuration/constants.js +9 -9
  129. package/lib/configuration/customizable-compilers.js +7 -7
  130. package/lib/configuration/default-values.js +51 -51
  131. package/lib/configuration/interfaces.js +2 -2
  132. package/lib/configuration/option-names.js +53 -53
  133. package/lib/configuration/option-source.js +9 -9
  134. package/lib/configuration/option.js +14 -14
  135. package/lib/configuration/quarantine-option-names.js +8 -8
  136. package/lib/configuration/run-option-names.js +26 -26
  137. package/lib/configuration/screenshot-option-names.js +10 -10
  138. package/lib/configuration/testcafe-configuration.js +163 -163
  139. package/lib/configuration/types.js +2 -2
  140. package/lib/configuration/typescript-configuration.js +62 -62
  141. package/lib/custom-client-scripts/assert-type.js +7 -7
  142. package/lib/custom-client-scripts/client-script-init.js +2 -2
  143. package/lib/custom-client-scripts/client-script.js +106 -106
  144. package/lib/custom-client-scripts/get-code.js +11 -11
  145. package/lib/custom-client-scripts/get-url.js +6 -6
  146. package/lib/custom-client-scripts/load.js +15 -15
  147. package/lib/custom-client-scripts/problematic-scripts.js +2 -2
  148. package/lib/custom-client-scripts/routing.js +36 -36
  149. package/lib/custom-client-scripts/utils.js +60 -60
  150. package/lib/embedding-utils.js +83 -83
  151. package/lib/errors/create-stack-filter.js +18 -18
  152. package/lib/errors/error-list.js +26 -26
  153. package/lib/errors/get-callsite.js +31 -31
  154. package/lib/errors/internal-modules-prefix.js +8 -8
  155. package/lib/errors/is-internal-stack-frame.js +45 -45
  156. package/lib/errors/process-test-fn-error.js +37 -37
  157. package/lib/errors/runtime/index.js +123 -123
  158. package/lib/errors/runtime/templates.js +115 -115
  159. package/lib/errors/runtime/type-assertions.js +112 -112
  160. package/lib/errors/stack-cleaning-hook.js +64 -64
  161. package/lib/errors/test-run/formattable-adapter.js +59 -59
  162. package/lib/errors/test-run/index.js +301 -301
  163. package/lib/errors/test-run/render-error-template.js +31 -31
  164. package/lib/errors/test-run/templates.js +91 -91
  165. package/lib/errors/test-run/utils.js +89 -89
  166. package/lib/errors/types.js +156 -156
  167. package/lib/index.js +81 -81
  168. package/lib/live/bootstrapper.js +43 -43
  169. package/lib/live/controller.js +107 -107
  170. package/lib/live/file-watcher/index.js +67 -67
  171. package/lib/live/file-watcher/modules-graph.js +58 -58
  172. package/lib/live/keyboard-observer.js +76 -76
  173. package/lib/live/logger/index.js +64 -64
  174. package/lib/live/test-run-controller.js +96 -96
  175. package/lib/live/test-run-state.js +6 -6
  176. package/lib/live/test-run.js +56 -56
  177. package/lib/live/test-runner.js +167 -167
  178. package/lib/load-assets.js +29 -29
  179. package/lib/notifications/add-rendered-warning.js +16 -16
  180. package/lib/notifications/debug-logger.js +78 -78
  181. package/lib/notifications/deprecated.js +24 -24
  182. package/lib/notifications/information-message.js +9 -9
  183. package/lib/notifications/warning-log.js +31 -31
  184. package/lib/notifications/warning-message.js +47 -47
  185. package/lib/reporter/command/command-formatter.js +120 -109
  186. package/lib/reporter/command/format-command.js +8 -8
  187. package/lib/reporter/command/interfaces.js +2 -2
  188. package/lib/reporter/index.js +319 -314
  189. package/lib/reporter/interfaces.js +2 -2
  190. package/lib/reporter/plugin-host.js +135 -135
  191. package/lib/reporter/plugin-methods.js +12 -12
  192. package/lib/role/index.js +74 -74
  193. package/lib/role/marker-symbol.js +7 -7
  194. package/lib/role/phase.js +9 -9
  195. package/lib/runner/bootstrapper.js +271 -271
  196. package/lib/runner/browser-job-result.js +9 -9
  197. package/lib/runner/browser-job.js +152 -152
  198. package/lib/runner/browser-set.js +114 -114
  199. package/lib/runner/fixture-hook-controller.js +85 -85
  200. package/lib/runner/index.js +449 -449
  201. package/lib/runner/interfaces.js +2 -2
  202. package/lib/runner/reporter-stream-controller.js +27 -27
  203. package/lib/runner/task/index.js +151 -151
  204. package/lib/runner/task/phase.js +9 -9
  205. package/lib/runner/test-run-controller.js +165 -165
  206. package/lib/runner/tested-app.js +72 -72
  207. package/lib/screenshots/capturer.js +141 -141
  208. package/lib/screenshots/constants.js +11 -11
  209. package/lib/screenshots/crop.js +111 -111
  210. package/lib/screenshots/default-extension.js +4 -4
  211. package/lib/screenshots/index.js +67 -67
  212. package/lib/screenshots/utils.js +39 -39
  213. package/lib/services/compiler/host.js +190 -190
  214. package/lib/services/compiler/io.js +9 -9
  215. package/lib/services/compiler/protocol.js +17 -16
  216. package/lib/services/compiler/service.js +225 -212
  217. package/lib/services/compiler/test-run-proxy.js +111 -111
  218. package/lib/services/interfaces.js +2 -2
  219. package/lib/services/process-title.js +8 -8
  220. package/lib/services/serialization/prepare-options.js +17 -17
  221. package/lib/services/serialization/replicator/create-replicator.js +25 -25
  222. package/lib/services/serialization/replicator/custom-error-transform.js +26 -26
  223. package/lib/services/serialization/test-structure.js +92 -92
  224. package/lib/services/utils/ipc/interfaces.js +30 -30
  225. package/lib/services/utils/ipc/io.js +108 -108
  226. package/lib/services/utils/ipc/message.js +75 -75
  227. package/lib/services/utils/ipc/packet.js +55 -55
  228. package/lib/services/utils/ipc/proxy.js +109 -109
  229. package/lib/services/utils/ipc/transport.js +64 -64
  230. package/lib/shared/errors/index.js +382 -382
  231. package/lib/shared/node-modules-folder-name.js +4 -4
  232. package/lib/test-run/bookmark.js +90 -90
  233. package/lib/test-run/browser-console-messages.js +73 -73
  234. package/lib/test-run/browser-manipulation-queue.js +92 -92
  235. package/lib/test-run/client-messages.js +9 -9
  236. package/lib/test-run/commands/actions.js +486 -483
  237. package/lib/test-run/commands/assertion.js +45 -45
  238. package/lib/test-run/commands/base.js +14 -14
  239. package/lib/test-run/commands/browser-manipulation.js +95 -95
  240. package/lib/test-run/commands/from-object.js +82 -82
  241. package/lib/test-run/commands/observation.js +61 -61
  242. package/lib/test-run/commands/options.js +231 -215
  243. package/lib/test-run/commands/service.js +54 -48
  244. package/lib/test-run/commands/type.js +65 -64
  245. package/lib/test-run/commands/utils.js +87 -87
  246. package/lib/test-run/commands/validations/argument.js +90 -90
  247. package/lib/test-run/commands/validations/factories.js +47 -47
  248. package/lib/test-run/commands/validations/initializers.js +44 -44
  249. package/lib/test-run/debug-log.js +32 -32
  250. package/lib/test-run/execute-js-expression.js +74 -74
  251. package/lib/test-run/index.js +823 -799
  252. package/lib/test-run/marker-symbol.js +7 -7
  253. package/lib/test-run/observed-callsites-storage.js +17 -17
  254. package/lib/test-run/phase.js +16 -16
  255. package/lib/test-run/session-controller.js +104 -104
  256. package/lib/testcafe.js +118 -118
  257. package/lib/utils/assignable.js +39 -39
  258. package/lib/utils/async-event-emitter.js +28 -28
  259. package/lib/utils/async-queue.js +14 -14
  260. package/lib/utils/browser-connection-timeouts.js +19 -19
  261. package/lib/utils/callsite.js +17 -17
  262. package/lib/utils/check-file-path.js +31 -31
  263. package/lib/utils/check-url.js +51 -51
  264. package/lib/utils/convert-to-best-fit-type.js +16 -16
  265. package/lib/utils/correct-file-path.js +21 -21
  266. package/lib/utils/define-lazy-property.js +13 -13
  267. package/lib/utils/delay.js +6 -6
  268. package/lib/utils/delegated-api.js +44 -44
  269. package/lib/utils/detect-display.js +6 -6
  270. package/lib/utils/detect-ffmpeg.js +44 -44
  271. package/lib/utils/diff/colors.js +29 -29
  272. package/lib/utils/diff/index.js +52 -52
  273. package/lib/utils/diff/util.js +23 -23
  274. package/lib/utils/diff.js +29 -29
  275. package/lib/utils/escape-user-agent.js +10 -10
  276. package/lib/utils/flag-list.js +17 -17
  277. package/lib/utils/get-any-key.js +8 -8
  278. package/lib/utils/get-browser.js +8 -8
  279. package/lib/utils/get-common-path.js +34 -34
  280. package/lib/utils/get-filter-fn.js +40 -40
  281. package/lib/utils/get-options/base.js +36 -36
  282. package/lib/utils/get-options/compiler.js +33 -33
  283. package/lib/utils/get-options/grep.js +15 -15
  284. package/lib/utils/get-options/index.js +20 -20
  285. package/lib/utils/get-options/meta.js +22 -22
  286. package/lib/utils/get-options/quarantine.js +91 -91
  287. package/lib/utils/get-options/screenshot.js +17 -17
  288. package/lib/utils/get-options/ssl.js +45 -45
  289. package/lib/utils/get-options/video.js +10 -10
  290. package/lib/utils/get-viewport-width.js +17 -17
  291. package/lib/utils/guard-time-execution.js +10 -10
  292. package/lib/utils/handle-errors.js +74 -74
  293. package/lib/utils/handle-tag-args.js +8 -8
  294. package/lib/utils/http.js +30 -30
  295. package/lib/utils/is-localhost.js +11 -11
  296. package/lib/utils/is-password-input.js +11 -0
  297. package/lib/utils/is-repl.js +10 -10
  298. package/lib/utils/is-window-in-iframe.js +6 -6
  299. package/lib/utils/limit-number.js +10 -10
  300. package/lib/utils/make-reg-exp.js +7 -7
  301. package/lib/utils/moment-loader.js +20 -20
  302. package/lib/utils/parse-file-list.js +71 -71
  303. package/lib/utils/parse-user-agent.js +55 -55
  304. package/lib/utils/path-pattern.js +114 -114
  305. package/lib/utils/prepare-reporters.js +30 -30
  306. package/lib/utils/prerender-callsite.js +18 -18
  307. package/lib/utils/process.js +119 -119
  308. package/lib/utils/promisified-functions.js +46 -46
  309. package/lib/utils/re-executable-promise.js +39 -39
  310. package/lib/utils/render-callsite-sync.js +29 -29
  311. package/lib/utils/render-template.js +9 -9
  312. package/lib/utils/reporter.js +30 -30
  313. package/lib/utils/resolve-path-relatively-cwd.js +7 -7
  314. package/lib/utils/string.js +105 -105
  315. package/lib/utils/temp-directory/cleanup-process/commands.js +7 -7
  316. package/lib/utils/temp-directory/cleanup-process/index.js +143 -143
  317. package/lib/utils/temp-directory/cleanup-process/worker.js +58 -58
  318. package/lib/utils/temp-directory/index.js +87 -87
  319. package/lib/utils/temp-directory/lockfile.js +56 -56
  320. package/lib/utils/thennable.js +7 -7
  321. package/lib/utils/timer.js +15 -15
  322. package/lib/utils/to-posix-path.js +8 -8
  323. package/lib/utils/types.js +2 -2
  324. package/lib/video-recorder/interfaces.js +2 -2
  325. package/lib/video-recorder/process.js +126 -126
  326. package/lib/video-recorder/recorder.js +136 -136
  327. package/lib/video-recorder/test-run-video-recorder.js +69 -69
  328. package/lib/video-recorder/videos.js +37 -37
  329. package/package.json +2 -2
  330. package/ts-defs/index.d.ts +25 -14
  331. package/ts-defs/selectors.d.ts +16 -5
  332. package/ts-defs/testcafe-scripts.d.ts +17 -6
@@ -1,124 +1,124 @@
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
- exports.BrowserConnectionError = exports.TimeoutError = exports.ReporterPluginError = exports.CompositeError = exports.ClientFunctionAPIError = exports.APIError = exports.TestCompilationError = exports.GeneralError = void 0;
7
- const callsite_record_1 = require("callsite-record");
8
- const templates_1 = __importDefault(require("./templates"));
9
- const create_stack_filter_1 = __importDefault(require("../create-stack-filter"));
10
- const get_callsite_1 = require("../get-callsite");
11
- const render_template_1 = __importDefault(require("../../utils/render-template"));
12
- const render_callsite_sync_1 = __importDefault(require("../../utils/render-callsite-sync"));
13
- const types_1 = require("../types");
14
- const ERROR_SEPARATOR = '\n\n';
15
- class ProcessTemplateInstruction {
16
- constructor(processFn) {
17
- this.processFn = processFn;
18
- }
19
- }
20
- // Errors
21
- class GeneralError extends Error {
22
- constructor(...args) {
23
- const code = args.shift();
24
- const template = templates_1.default[code];
25
- super(render_template_1.default(template, ...args));
26
- Object.assign(this, { code, data: args });
27
- Error.captureStackTrace(this, GeneralError);
28
- }
29
- static isGeneralError(arg) {
30
- return arg instanceof GeneralError;
31
- }
32
- }
33
- exports.GeneralError = GeneralError;
34
- class TestCompilationError extends Error {
35
- constructor(originalError) {
36
- const template = templates_1.default[types_1.RUNTIME_ERRORS.cannotPrepareTestsDueToError];
37
- const errorMessage = originalError.toString();
38
- super(render_template_1.default(template, errorMessage));
39
- Object.assign(this, {
40
- code: types_1.RUNTIME_ERRORS.cannotPrepareTestsDueToError,
41
- data: [errorMessage]
42
- });
43
- // NOTE: stack includes message as well.
44
- this.stack = render_template_1.default(template, originalError.stack);
45
- }
46
- }
47
- exports.TestCompilationError = TestCompilationError;
48
- class APIError extends Error {
49
- constructor(methodName, code, ...args) {
50
- let template = templates_1.default[code];
51
- template = APIError._prepareTemplateAndArgsIfNecessary(template, args);
52
- const rawMessage = render_template_1.default(template, ...args);
53
- super(render_template_1.default(templates_1.default[types_1.RUNTIME_ERRORS.cannotPrepareTestsDueToError], rawMessage));
54
- Object.assign(this, { code, data: args });
55
- // NOTE: `rawMessage` is used in error substitution if it occurs in test run.
56
- this.rawMessage = rawMessage;
57
- this.callsite = get_callsite_1.getCallsiteForMethod(methodName);
58
- // NOTE: We need property getters here because callsite can be replaced by an external code.
59
- // See https://github.com/DevExpress/testcafe/blob/v1.0.0/src/compiler/test-file/formats/raw.js#L22
60
- // Also we can't use an ES6 getter for the 'stack' property, because it will create a getter on the class prototype
61
- // that cannot override the instance property created by the Error parent class.
62
- Object.defineProperties(this, {
63
- 'stack': {
64
- get: () => this._createStack(callsite_record_1.renderers.noColor)
65
- },
66
- 'coloredStack': {
67
- get: () => this._createStack(callsite_record_1.renderers.default)
68
- }
69
- });
70
- }
71
- _createStack(renderer) {
72
- const renderedCallsite = render_callsite_sync_1.default(this.callsite, {
73
- renderer: renderer,
74
- stackFilter: create_stack_filter_1.default(Error.stackTraceLimit)
75
- });
76
- if (!renderedCallsite)
77
- return this.message;
78
- return this.message + ERROR_SEPARATOR + renderedCallsite;
79
- }
80
- static _prepareTemplateAndArgsIfNecessary(template, args) {
81
- const lastArg = args.pop();
82
- if (lastArg instanceof ProcessTemplateInstruction)
83
- template = lastArg.processFn(template);
84
- else
85
- args.push(lastArg);
86
- return template;
87
- }
88
- }
89
- exports.APIError = APIError;
90
- class ClientFunctionAPIError extends APIError {
91
- constructor(methodName, instantiationCallsiteName, code, ...args) {
92
- args.push(new ProcessTemplateInstruction(template => template.replace(/\{#instantiationCallsiteName\}/g, instantiationCallsiteName)));
93
- super(methodName, code, ...args);
94
- }
95
- }
96
- exports.ClientFunctionAPIError = ClientFunctionAPIError;
97
- class CompositeError extends Error {
98
- constructor(errors) {
99
- super(errors.map(({ message }) => message).join(ERROR_SEPARATOR));
100
- this.stack = errors.map(({ stack }) => stack).join(ERROR_SEPARATOR);
101
- this.code = types_1.RUNTIME_ERRORS.compositeArgumentsError;
102
- }
103
- }
104
- exports.CompositeError = CompositeError;
105
- class ReporterPluginError extends GeneralError {
106
- constructor({ name, method, originalError }) {
107
- const code = types_1.RUNTIME_ERRORS.uncaughtErrorInReporter;
108
- super(code, name, method, originalError.stack);
109
- }
110
- }
111
- exports.ReporterPluginError = ReporterPluginError;
112
- class TimeoutError extends GeneralError {
113
- constructor() {
114
- super(types_1.RUNTIME_ERRORS.timeLimitedPromiseTimeoutExpired);
115
- }
116
- }
117
- exports.TimeoutError = TimeoutError;
118
- class BrowserConnectionError extends GeneralError {
119
- constructor(...args) {
120
- super(types_1.RUNTIME_ERRORS.browserConnectionError, ...args);
121
- }
122
- }
123
- exports.BrowserConnectionError = BrowserConnectionError;
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
+ exports.BrowserConnectionError = exports.TimeoutError = exports.ReporterPluginError = exports.CompositeError = exports.ClientFunctionAPIError = exports.APIError = exports.TestCompilationError = exports.GeneralError = void 0;
7
+ const callsite_record_1 = require("callsite-record");
8
+ const templates_1 = __importDefault(require("./templates"));
9
+ const create_stack_filter_1 = __importDefault(require("../create-stack-filter"));
10
+ const get_callsite_1 = require("../get-callsite");
11
+ const render_template_1 = __importDefault(require("../../utils/render-template"));
12
+ const render_callsite_sync_1 = __importDefault(require("../../utils/render-callsite-sync"));
13
+ const types_1 = require("../types");
14
+ const ERROR_SEPARATOR = '\n\n';
15
+ class ProcessTemplateInstruction {
16
+ constructor(processFn) {
17
+ this.processFn = processFn;
18
+ }
19
+ }
20
+ // Errors
21
+ class GeneralError extends Error {
22
+ constructor(...args) {
23
+ const code = args.shift();
24
+ const template = templates_1.default[code];
25
+ super(render_template_1.default(template, ...args));
26
+ Object.assign(this, { code, data: args });
27
+ Error.captureStackTrace(this, GeneralError);
28
+ }
29
+ static isGeneralError(arg) {
30
+ return arg instanceof GeneralError;
31
+ }
32
+ }
33
+ exports.GeneralError = GeneralError;
34
+ class TestCompilationError extends Error {
35
+ constructor(originalError) {
36
+ const template = templates_1.default[types_1.RUNTIME_ERRORS.cannotPrepareTestsDueToError];
37
+ const errorMessage = originalError.toString();
38
+ super(render_template_1.default(template, errorMessage));
39
+ Object.assign(this, {
40
+ code: types_1.RUNTIME_ERRORS.cannotPrepareTestsDueToError,
41
+ data: [errorMessage]
42
+ });
43
+ // NOTE: stack includes message as well.
44
+ this.stack = render_template_1.default(template, originalError.stack);
45
+ }
46
+ }
47
+ exports.TestCompilationError = TestCompilationError;
48
+ class APIError extends Error {
49
+ constructor(methodName, code, ...args) {
50
+ let template = templates_1.default[code];
51
+ template = APIError._prepareTemplateAndArgsIfNecessary(template, args);
52
+ const rawMessage = render_template_1.default(template, ...args);
53
+ super(render_template_1.default(templates_1.default[types_1.RUNTIME_ERRORS.cannotPrepareTestsDueToError], rawMessage));
54
+ Object.assign(this, { code, data: args });
55
+ // NOTE: `rawMessage` is used in error substitution if it occurs in test run.
56
+ this.rawMessage = rawMessage;
57
+ this.callsite = get_callsite_1.getCallsiteForMethod(methodName);
58
+ // NOTE: We need property getters here because callsite can be replaced by an external code.
59
+ // See https://github.com/DevExpress/testcafe/blob/v1.0.0/src/compiler/test-file/formats/raw.js#L22
60
+ // Also we can't use an ES6 getter for the 'stack' property, because it will create a getter on the class prototype
61
+ // that cannot override the instance property created by the Error parent class.
62
+ Object.defineProperties(this, {
63
+ 'stack': {
64
+ get: () => this._createStack(callsite_record_1.renderers.noColor)
65
+ },
66
+ 'coloredStack': {
67
+ get: () => this._createStack(callsite_record_1.renderers.default)
68
+ }
69
+ });
70
+ }
71
+ _createStack(renderer) {
72
+ const renderedCallsite = render_callsite_sync_1.default(this.callsite, {
73
+ renderer: renderer,
74
+ stackFilter: create_stack_filter_1.default(Error.stackTraceLimit)
75
+ });
76
+ if (!renderedCallsite)
77
+ return this.message;
78
+ return this.message + ERROR_SEPARATOR + renderedCallsite;
79
+ }
80
+ static _prepareTemplateAndArgsIfNecessary(template, args) {
81
+ const lastArg = args.pop();
82
+ if (lastArg instanceof ProcessTemplateInstruction)
83
+ template = lastArg.processFn(template);
84
+ else
85
+ args.push(lastArg);
86
+ return template;
87
+ }
88
+ }
89
+ exports.APIError = APIError;
90
+ class ClientFunctionAPIError extends APIError {
91
+ constructor(methodName, instantiationCallsiteName, code, ...args) {
92
+ args.push(new ProcessTemplateInstruction(template => template.replace(/\{#instantiationCallsiteName\}/g, instantiationCallsiteName)));
93
+ super(methodName, code, ...args);
94
+ }
95
+ }
96
+ exports.ClientFunctionAPIError = ClientFunctionAPIError;
97
+ class CompositeError extends Error {
98
+ constructor(errors) {
99
+ super(errors.map(({ message }) => message).join(ERROR_SEPARATOR));
100
+ this.stack = errors.map(({ stack }) => stack).join(ERROR_SEPARATOR);
101
+ this.code = types_1.RUNTIME_ERRORS.compositeArgumentsError;
102
+ }
103
+ }
104
+ exports.CompositeError = CompositeError;
105
+ class ReporterPluginError extends GeneralError {
106
+ constructor({ name, method, originalError }) {
107
+ const code = types_1.RUNTIME_ERRORS.uncaughtErrorInReporter;
108
+ super(code, name, method, originalError.stack);
109
+ }
110
+ }
111
+ exports.ReporterPluginError = ReporterPluginError;
112
+ class TimeoutError extends GeneralError {
113
+ constructor() {
114
+ super(types_1.RUNTIME_ERRORS.timeLimitedPromiseTimeoutExpired);
115
+ }
116
+ }
117
+ exports.TimeoutError = TimeoutError;
118
+ class BrowserConnectionError extends GeneralError {
119
+ constructor(...args) {
120
+ super(types_1.RUNTIME_ERRORS.browserConnectionError, ...args);
121
+ }
122
+ }
123
+ exports.BrowserConnectionError = BrowserConnectionError;
124
124
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXJyb3JzL3J1bnRpbWUvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQTRDO0FBQzVDLDREQUFvQztBQUNwQyxpRkFBdUQ7QUFDdkQsa0RBQXVEO0FBQ3ZELGtGQUF5RDtBQUN6RCw0RkFBa0U7QUFDbEUsb0NBQTBDO0FBRTFDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUUvQixNQUFNLDBCQUEwQjtJQUM1QixZQUFhLFNBQVM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDL0IsQ0FBQztDQUNKO0FBRUQsU0FBUztBQUNULE1BQWEsWUFBYSxTQUFRLEtBQUs7SUFDbkMsWUFBYSxHQUFHLElBQUk7UUFDaEIsTUFBTSxJQUFJLEdBQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUFHLG1CQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakMsS0FBSyxDQUFDLHlCQUFjLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUV6QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFFLEdBQUc7UUFDdEIsT0FBTyxHQUFHLFlBQVksWUFBWSxDQUFDO0lBQ3ZDLENBQUM7Q0FDSjtBQWRELG9DQWNDO0FBRUQsTUFBYSxvQkFBcUIsU0FBUSxLQUFLO0lBQzNDLFlBQWEsYUFBYTtRQUN0QixNQUFNLFFBQVEsR0FBTyxtQkFBUyxDQUFDLHNCQUFjLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUM1RSxNQUFNLFlBQVksR0FB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QUcsSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQztDQUNKO0FBSkQsd0RBSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW5kZXJlcnMgfSBmcm9tICdjYWxsc2l0ZS1yZWNvcmQnO1xuaW1wb3J0IFRFTVBMQVRFUyBmcm9tICcuL3RlbXBsYXRlcyc7XG5pbXBvcnQgY3JlYXRlU3RhY2tGaWx0ZXIgZnJvbSAnLi4vY3JlYXRlLXN0YWNrLWZpbHRlcic7XG5pbXBvcnQgeyBnZXRDYWxsc2l0ZUZvck1ldGhvZCB9IGZyb20gJy4uL2dldC1jYWxsc2l0ZSc7XG5pbXBvcnQgcmVuZGVyVGVtcGxhdGUgZnJvbSAnLi4vLi4vdXRpbHMvcmVuZGVyLXRlbXBsYXRlJztcbmltcG9ydCByZW5kZXJDYWxsc2l0ZVN5bmMgZnJvbSAnLi4vLi4vdXRpbHMvcmVuZGVyLWNhbGxzaXRlLXN5bmMnO1xuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNvbnN0IEVSUk9SX1NFUEFSQVRPUiA9ICdcXG5cXG4nO1xuXG5jbGFzcyBQcm9jZXNzVGVtcGxhdGVJbnN0cnVjdGlvbiB7XG4gICAgY29uc3RydWN0b3IgKHByb2Nlc3NGbikge1xuICAgICAgICB0aGlzLnByb2Nlc3NGbiA9IHByb2Nlc3NGbjtcbiAgICB9XG59XG5cbi8vIEVycm9yc1xuZXhwb3J0IGNsYXNzIEdlbmVyYWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvciAoLi4uYXJncykge1xuICAgICAgICBjb25zdCBjb2RlICAgICA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBURU1QTEFURVNbY29kZV07XG5cbiAgICAgICAgc3VwZXIocmVuZGVyVGVtcGxhdGUodGVtcGxhdGUsIC4uLmFyZ3MpKTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHsgY29kZSwgZGF0YTogYXJncyB9KTtcbiAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgR2VuZXJhbEVycm9yKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNHZW5lcmFsRXJyb3IgKGFyZykge1xuICAgICAgICByZXR1cm4gYXJnIGluc3RhbmNlb2YgR2VuZXJhbEVycm9yO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRlc3RDb21waWxhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yIChvcmlnaW5hbEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlICAgICA9IFRFTVBMQVRFU1tSVU5USU1FX0VSUk9SUy5jYW5ub3RQcmVwYXJlVGVzdHNEdWVUb0Vycm9yXTtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gb3JpZ2luYWxFcnJvci50b1N0cmluZygpO1xuXG4gICAgICAgIHN1cGVyKHJlbmRlclRlbXBsYXRlKHRlbXBsYXRlLCBlcnJvck1lc3NhZ2UpKTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHtcbiAgICAgICAgICAgIGNvZGU6IFJVTlRJTUVfRVJST1JTLmNhbm5vdFByZXBhcmVUZXN0c0R1ZVRvRXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBbZXJyb3JNZXNzYWdlXVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBOT1RFOiBzdGFjayBpbmNsdWRlcyBtZXNzYWdlIGFzIHdlbGwuXG4gICAgICAgIHRoaXMuc3RhY2sgPSByZW5kZXJUZW1wbGF0ZSh0ZW1wbGF0ZSwgb3JpZ2luYWxFcnJvci5zdGFjayk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQVBJRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IgKG1ldGhvZE5hbWUsIGNvZGUsIC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IHRlbXBsYXRlID0gVEVNUExBVEVTW2NvZGVdO1xuXG4gICAgICAgIHRlbXBsYXRlID0gQVBJRXJyb3IuX3ByZXBhcmVUZW1wbGF0ZUFuZEFyZ3NJZk5lY2Vzc2FyeSh0ZW1wbGF0ZSwgYXJncyk7XG5cbiAgICAgICAgY29uc3QgcmF3TWVzc2FnZSA9IHJlbmRlclRlbXBsYXRlKHRlbXBsYXRlLCAuLi5hcmdzKTtcblxuICAgICAgICBzdXBlcihyZW5kZXJUZW1wbGF0ZShURU1QTEFURVNbUlVOVElNRV9FUlJPUlMuY2Fubm90UHJlcGFyZVRlc3RzRHVlVG9FcnJvcl0sIHJhd01lc3NhZ2UpKTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHsgY29kZSwgZGF0YTogYXJncyB9KTtcblxuICAgICAgICAvLyBOT1RFOiBgcmF3TWVzc2FnZWAgaXMgdXNlZCBpbiBlcnJvciBzdWJzdGl0dXRpb24gaWYgaXQgb2NjdXJzIGluIHRlc3QgcnVuLlxuICAgICAgICB0aGlzLnJhd01lc3NhZ2UgPSByYXdNZXNzYWdlO1xuICAgICAgICB0aGlzLmNhbGxzaXRlICAgPSBnZXRDYWxsc2l0ZUZvck1ldGhvZChtZXRob2ROYW1lKTtcblxuICAgICAgICAvLyBOT1RFOiBXZSBuZWVkIHByb3BlcnR5IGdldHRlcnMgaGVyZSBiZWNhdXNlIGNhbGxzaXRlIGNhbiBiZSByZXBsYWNlZCBieSBhbiBleHRlcm5hbCBjb2RlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0RldkV4cHJlc3MvdGVzdGNhZmUvYmxvYi92MS4wLjAvc3JjL2NvbXBpbGVyL3Rlc3QtZmlsZS9mb3JtYXRzL3Jhdy5qcyNMMjJcbiAgICAgICAgLy8gQWxzbyB3ZSBjYW4ndCB1c2UgYW4gRVM2IGdldHRlciBmb3IgdGhlICdzdGFjaycgcHJvcGVydHksIGJlY2F1c2UgaXQgd2lsbCBjcmVhdGUgYSBnZXR0ZXIgb24gdGhlIGNsYXNzIHByb3RvdHlwZVxuICAgICAgICAvLyB0aGF0IGNhbm5vdCBvdmVycmlkZSB0aGUgaW5zdGFuY2UgcHJvcGVydHkgY3JlYXRlZCBieSB0aGUgRXJyb3IgcGFyZW50IGNsYXNzLlxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICAnc3RhY2snOiB7XG4gICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9jcmVhdGVTdGFjayhyZW5kZXJlcnMubm9Db2xvcilcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICdjb2xvcmVkU3RhY2snOiB7XG4gICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9jcmVhdGVTdGFjayhyZW5kZXJlcnMuZGVmYXVsdClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZVN0YWNrIChyZW5kZXJlcikge1xuICAgICAgICBjb25zdCByZW5kZXJlZENhbGxzaXRlID0gcmVuZGVyQ2FsbHNpdGVTeW5jKHRoaXMuY2FsbHNpdGUsIHtcbiAgICAgICAgICAgIHJlbmRlcmVyOiAgICByZW5kZXJlcixcbiAgICAgICAgICAgIHN0YWNrRmlsdGVyOiBjcmVhdGVTdGFja0ZpbHRlcihFcnJvci5zdGFja1RyYWNlTGltaXQpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcmVuZGVyZWRDYWxsc2l0ZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZSArIEVSUk9SX1NFUEFSQVRPUiArIHJlbmRlcmVkQ2FsbHNpdGU7XG4gICAgfVxuXG4gICAgc3RhdGljIF9wcmVwYXJlVGVtcGxhdGVBbmRBcmdzSWZOZWNlc3NhcnkgKHRlbXBsYXRlLCBhcmdzKSB7XG4gICAgICAgIGNvbnN0IGxhc3RBcmcgPSBhcmdzLnBvcCgpO1xuXG4gICAgICAgIGlmIChsYXN0QXJnIGluc3RhbmNlb2YgUHJvY2Vzc1RlbXBsYXRlSW5zdHJ1Y3Rpb24pXG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IGxhc3RBcmcucHJvY2Vzc0ZuKHRlbXBsYXRlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgYXJncy5wdXNoKGxhc3RBcmcpO1xuXG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGllbnRGdW5jdGlvbkFQSUVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yIChtZXRob2ROYW1lLCBpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lLCBjb2RlLCAuLi5hcmdzKSB7XG4gICAgICAgIGFyZ3MucHVzaChuZXcgUHJvY2Vzc1RlbXBsYXRlSW5zdHJ1Y3Rpb24odGVtcGxhdGUgPT4gdGVtcGxhdGUucmVwbGFjZSgvXFx7I2luc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWVcXH0vZywgaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZSkpKTtcblxuICAgICAgICBzdXBlcihtZXRob2ROYW1lLCBjb2RlLCAuLi5hcmdzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvciAoZXJyb3JzKSB7XG4gICAgICAgIHN1cGVyKGVycm9ycy5tYXAoKHsgbWVzc2FnZSB9KSA9PiBtZXNzYWdlKS5qb2luKEVSUk9SX1NFUEFSQVRPUikpO1xuXG4gICAgICAgIHRoaXMuc3RhY2sgPSBlcnJvcnMubWFwKCh7IHN0YWNrIH0pID0+IHN0YWNrKS5qb2luKEVSUk9SX1NFUEFSQVRPUik7XG4gICAgICAgIHRoaXMuY29kZSAgPSBSVU5USU1FX0VSUk9SUy5jb21wb3NpdGVBcmd1bWVudHNFcnJvcjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZXBvcnRlclBsdWdpbkVycm9yIGV4dGVuZHMgR2VuZXJhbEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvciAoeyBuYW1lLCBtZXRob2QsIG9yaWdpbmFsRXJyb3IgfSkge1xuICAgICAgICBjb25zdCBjb2RlID0gUlVOVElNRV9FUlJPUlMudW5jYXVnaHRFcnJvckluUmVwb3J0ZXI7XG5cbiAgICAgICAgc3VwZXIoY29kZSwgbmFtZSwgbWV0aG9kLCBvcmlnaW5hbEVycm9yLnN0YWNrKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUaW1lb3V0RXJyb3IgZXh0ZW5kcyBHZW5lcmFsRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoUlVOVElNRV9FUlJPUlMudGltZUxpbWl0ZWRQcm9taXNlVGltZW91dEV4cGlyZWQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJyb3dzZXJDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBHZW5lcmFsRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yICguLi5hcmdzKSB7XG4gICAgICAgIHN1cGVyKFJVTlRJTUVfRVJST1JTLmJyb3dzZXJDb25uZWN0aW9uRXJyb3IsIC4uLmFyZ3MpO1xuICAgIH1cbn1cbiJdfQ==
@@ -1,117 +1,117 @@
1
- "use strict";
2
- // -------------------------------------------------------------
3
- // WARNING: this file is used by both the client and the server.
4
- // Do not use any browser or node-specific API!
5
- // -------------------------------------------------------------
6
- var __importDefault = (this && this.__importDefault) || function (mod) {
7
- return (mod && mod.__esModule) ? mod : { "default": mod };
8
- };
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- const types_1 = require("../types");
11
- const error_hints_1 = __importDefault(require("../../browser/connection/error-hints"));
12
- const DOCUMENTATION_LINKS = {
13
- TEST_SOURCE_PARAMETER: 'https://devexpress.github.io/testcafe/documentation/using-testcafe/command-line-interface.html#file-pathglob-pattern',
14
- FILTER_SETTINGS: 'https://devexpress.github.io/testcafe/documentation/using-testcafe/configuration-file.html#filter'
15
- };
16
- exports.default = {
17
- [types_1.RUNTIME_ERRORS.cannotCreateMultipleLiveModeRunners]: 'Cannot create multiple live mode runners.',
18
- [types_1.RUNTIME_ERRORS.cannotRunLiveModeRunnerMultipleTimes]: 'Cannot run a live mode runner multiple times.',
19
- [types_1.RUNTIME_ERRORS.browserDisconnected]: 'The {userAgent} browser disconnected. This problem may appear when a browser hangs or is closed, or due to network issues.',
20
- [types_1.RUNTIME_ERRORS.cannotRunAgainstDisconnectedBrowsers]: 'The following browsers disconnected: {userAgents}. Tests will not be run.',
21
- [types_1.RUNTIME_ERRORS.testRunRequestInDisconnectedBrowser]: '"{browser}" has disconnected during test execution',
22
- [types_1.RUNTIME_ERRORS.cannotEstablishBrowserConnection]: 'Unable to establish one or more of the specified browser connections.',
23
- [types_1.RUNTIME_ERRORS.cannotFindBrowser]: 'Unable to find the browser. "{browser}" is not a browser alias or path to an executable file.',
24
- [types_1.RUNTIME_ERRORS.browserProviderNotFound]: 'The specified "{providerName}" browser provider was not found.',
25
- [types_1.RUNTIME_ERRORS.browserNotSet]: 'No browser selected to test against.',
26
- [types_1.RUNTIME_ERRORS.testFilesNotFound]: 'TestCafe could not find the test files that match the following patterns:\n' +
27
- '{sourceList}\n\n' +
28
- 'The "{cwd}" current working directory was used as the base path.\n' +
29
- 'Ensure the file patterns are correct or change the current working directory.\n' +
30
- `For more information on how to specify test files, see ${DOCUMENTATION_LINKS.TEST_SOURCE_PARAMETER}.`,
31
- [types_1.RUNTIME_ERRORS.noTestsToRun]: 'No tests found in the specified source files.\n' +
32
- "Ensure the sources contain the 'fixture' and 'test' directives.",
33
- [types_1.RUNTIME_ERRORS.noTestsToRunDueFiltering]: 'The specified filter settings exclude all tests.\n' +
34
- 'Modify these settings to leave at least one available test.\n' +
35
- `For more information on how to specify filter settings, see ${DOCUMENTATION_LINKS.FILTER_SETTINGS}.`,
36
- [types_1.RUNTIME_ERRORS.cannotFindReporterForAlias]: 'The provided "{name}" reporter does not exist. Check that you have specified the report format correctly.',
37
- [types_1.RUNTIME_ERRORS.multipleSameStreamReporters]: 'The following reporters attempted to write to the same output stream: "{reporters}". Only one reporter can write to a stream.',
38
- [types_1.RUNTIME_ERRORS.optionValueIsNotValidRegExp]: 'The "{optionName}" option value is not a valid regular expression.',
39
- [types_1.RUNTIME_ERRORS.optionValueIsNotValidKeyValue]: 'The "{optionName}" option value is not a valid key-value pair.',
40
- [types_1.RUNTIME_ERRORS.invalidQuarantineOption]: 'The "{optionName}" option should be empty, otherwise one of "retryCount" or "passCount".',
41
- [types_1.RUNTIME_ERRORS.invalidRetryCountValue]: 'The "retryCount" value should be greater or equal to "passCount" ({passCount}).',
42
- [types_1.RUNTIME_ERRORS.invalidSpeedValue]: 'Speed should be a number between 0.01 and 1.',
43
- [types_1.RUNTIME_ERRORS.invalidConcurrencyFactor]: 'The concurrency factor should be an integer greater or equal to 1.',
44
- [types_1.RUNTIME_ERRORS.cannotDivideRemotesCountByConcurrency]: 'The number of remote browsers should be divisible by the factor of concurrency.',
45
- [types_1.RUNTIME_ERRORS.portsOptionRequiresTwoNumbers]: 'The "--ports" option requires two numbers to be specified.',
46
- [types_1.RUNTIME_ERRORS.portIsNotFree]: 'The specified {portNum} port is already in use by another program.',
47
- [types_1.RUNTIME_ERRORS.invalidHostname]: 'The specified "{hostname}" hostname cannot be resolved to the current machine.',
48
- [types_1.RUNTIME_ERRORS.cannotFindSpecifiedTestSource]: 'Cannot find a test source file at "{path}".',
49
- [types_1.RUNTIME_ERRORS.clientFunctionCodeIsNotAFunction]: '{#instantiationCallsiteName} code is expected to be specified as a function, but {type} was passed.',
50
- [types_1.RUNTIME_ERRORS.selectorInitializedWithWrongType]: '{#instantiationCallsiteName} is expected to be initialized with a function, CSS selector string, another Selector, node snapshot or a Promise returned by a Selector, but {type} was passed.',
51
- [types_1.RUNTIME_ERRORS.clientFunctionCannotResolveTestRun]: "{#instantiationCallsiteName} cannot implicitly resolve the test run in context of which it should be executed. If you need to call {#instantiationCallsiteName} from the Node.js API callback, pass the test controller manually via {#instantiationCallsiteName}'s `.with({ boundTestRun: t })` method first. Note that you cannot execute {#instantiationCallsiteName} outside the test code.",
52
- [types_1.RUNTIME_ERRORS.regeneratorInClientFunctionCode]: `{#instantiationCallsiteName} code, arguments or dependencies cannot contain generators or "async/await" syntax (use Promises instead).`,
53
- [types_1.RUNTIME_ERRORS.invalidClientFunctionTestRunBinding]: 'The "boundTestRun" option value is expected to be a test controller.',
54
- [types_1.RUNTIME_ERRORS.invalidValueType]: '{smthg} is expected to be a {type}, but it was {actual}.',
55
- [types_1.RUNTIME_ERRORS.unsupportedUrlProtocol]: 'The specified "{url}" test page URL uses an unsupported {protocol}:// protocol. Only relative URLs or absolute URLs with http://, https:// and file:// protocols are supported.',
56
- [types_1.RUNTIME_ERRORS.testControllerProxyCannotResolveTestRun]: `Cannot implicitly resolve the test run in the context of which the test controller action should be executed. Use test function's 't' argument instead.`,
57
- [types_1.RUNTIME_ERRORS.timeLimitedPromiseTimeoutExpired]: 'Timeout expired for a time limited promise',
58
- [types_1.RUNTIME_ERRORS.cannotSetVideoOptionsWithoutBaseVideoPathSpecified]: 'Unable to set video or encoding options when video recording is disabled. Specify the base path where video files are stored to enable recording.',
59
- [types_1.RUNTIME_ERRORS.multipleAPIMethodCallForbidden]: 'You cannot call the "{methodName}" method more than once. Pass an array of parameters to this method instead.',
60
- [types_1.RUNTIME_ERRORS.invalidReporterOutput]: "Specify a file name or a writable stream as the reporter's output target.",
61
- [types_1.RUNTIME_ERRORS.cannotReadSSLCertFile]: 'Unable to read the "{path}" file, specified by the "{option}" ssl option. Error details:\n' +
62
- '\n' +
63
- '{err}',
64
- [types_1.RUNTIME_ERRORS.cannotPrepareTestsDueToError]: 'Cannot prepare tests due to an error.\n' +
65
- '\n' +
66
- '{errMessage}',
67
- [types_1.RUNTIME_ERRORS.cannotParseRawFile]: 'Cannot parse a test source file in the raw format at "{path}" due to an error.\n' +
68
- '\n' +
69
- '{errMessage}',
70
- [types_1.RUNTIME_ERRORS.testedAppFailedWithError]: 'Tested app failed with an error:\n' +
71
- '\n' +
72
- '{errMessage}',
73
- [types_1.RUNTIME_ERRORS.unableToOpenBrowser]: 'Was unable to open the browser "{alias}" due to error.\n' +
74
- '\n' +
75
- '{errMessage}',
76
- [types_1.RUNTIME_ERRORS.requestHookConfigureAPIError]: 'There was an error while configuring the request hook:\n' +
77
- '\n' +
78
- '{requestHookName}: {errMsg}',
79
- [types_1.RUNTIME_ERRORS.forbiddenCharatersInScreenshotPath]: 'There are forbidden characters in the "{screenshotPath}" {screenshotPathType}:\n' +
80
- ' {forbiddenCharsDescription}',
81
- [types_1.RUNTIME_ERRORS.cannotFindFFMPEG]: 'Unable to locate the FFmpeg executable required to record videos. Do one of the following:\n' +
82
- '\n' +
83
- '* add the FFmpeg installation directory to the PATH environment variable,\n' +
84
- '* specify the path to the FFmpeg executable in the FFMPEG_PATH environment variable or the ffmpegPath video option,\n' +
85
- '* install the @ffmpeg-installer/ffmpeg package from npm.',
86
- [types_1.RUNTIME_ERRORS.cannotFindTypescriptConfigurationFile]: 'Unable to find the TypeScript configuration file in "{filePath}"',
87
- [types_1.RUNTIME_ERRORS.clientScriptInitializerIsNotSpecified]: 'Specify the JavaScript file path, module name or script content to inject a client script.',
88
- [types_1.RUNTIME_ERRORS.clientScriptBasePathIsNotSpecified]: 'Specify the base path for the client script file.',
89
- [types_1.RUNTIME_ERRORS.clientScriptInitializerMultipleContentSources]: 'You cannot combine the file path, module name and script content when you specify a client script to inject.',
90
- [types_1.RUNTIME_ERRORS.cannotLoadClientScriptFromPath]: 'Cannot load a client script from {path}.',
91
- [types_1.RUNTIME_ERRORS.clientScriptModuleEntryPointPathCalculationError]: 'An error occurred when trying to locate the injected client script module:\n\n{errorMessage}.',
92
- [types_1.RUNTIME_ERRORS.methodIsNotAvailableForAnIPCHost]: 'This method cannot be called on a service host.',
93
- [types_1.RUNTIME_ERRORS.tooLargeIPCPayload]: 'The specified payload is too large to form an IPC packet.',
94
- [types_1.RUNTIME_ERRORS.malformedIPCMessage]: 'Cannot process a malformed IPC message.',
95
- [types_1.RUNTIME_ERRORS.unexpectedIPCHeadPacket]: 'Cannot create an IPC message due to an unexpected IPC head packet.',
96
- [types_1.RUNTIME_ERRORS.unexpectedIPCBodyPacket]: 'Cannot create an IPC message due to an unexpected IPC body packet.',
97
- [types_1.RUNTIME_ERRORS.unexpectedIPCTailPacket]: 'Cannot create an IPC message due to an unexpected IPC tail packet.',
98
- [types_1.RUNTIME_ERRORS.cannotRunLocalNonHeadlessBrowserWithoutDisplay]: 'Your Linux version does not have a graphic subsystem to run {browserAlias} with a GUI. ' +
99
- 'You can launch the browser in headless mode. ' +
100
- 'If you use a portable browser version, ' +
101
- 'specify the browser alias before the path instead of the \'path\' prefix. ' +
102
- 'For more information, see https://devexpress.github.io/testcafe/documentation/guides/concepts/browsers.html#test-in-headless-mode',
103
- [types_1.RUNTIME_ERRORS.uncaughtErrorInReporter]: 'An uncaught error occurred in the "{reporterName}" reporter\'s "{methodName}" method. Error details:\n{originalError}',
104
- [types_1.RUNTIME_ERRORS.roleInitializedWithRelativeUrl]: 'You cannot specify relative login page URLs in the Role constructor. Use an absolute URL.',
105
- [types_1.RUNTIME_ERRORS.typeScriptCompilerLoadingError]: 'Unable to load the TypeScript compiler.\n{originErrorMessage}.',
106
- [types_1.RUNTIME_ERRORS.cannotCustomizeSpecifiedCompilers]: 'You cannot specify options for the {noncustomizableCompilerList} compiler{suffix}.',
107
- [types_1.RUNTIME_ERRORS.cannotEnableRetryTestPagesOption]: 'Cannot enable the \'retryTestPages\' option. Apply one of the following two solutions:\n' +
108
- '-- set \'localhost\' as the value of the \'hostname\' option\n' +
109
- '-- run TestCafe over HTTPS\n',
110
- [types_1.RUNTIME_ERRORS.browserConnectionError]: '{originErrorMessage}\n{numOfNotOpenedConnection} of {numOfAllConnections} browser connections have not been established:\n{listOfNotOpenedConnections}\n\nHints:\n{listOfHints}',
111
- [error_hints_1.default.TooHighConcurrencyFactor]: 'The error can be due to a concurrency factor that is too high for the host machine’s performance (the factor value {concurrencyFactor} was specified). ' +
112
- 'Try to decrease the concurrency factor or ensure more system resources are available on the host machine.',
113
- [error_hints_1.default.UseBrowserInitOption]: 'Use the "browserInitTimeout" option to allow more time for the browser to start. The timeout is set to {browserInitTimeoutMsg}.',
114
- [error_hints_1.default.RestErrorCauses]: 'The error can also be caused by network issues or remote device failure. Make sure that the connection is stable and the remote device can be reached.'
115
- };
1
+ "use strict";
2
+ // -------------------------------------------------------------
3
+ // WARNING: this file is used by both the client and the server.
4
+ // Do not use any browser or node-specific API!
5
+ // -------------------------------------------------------------
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const types_1 = require("../types");
11
+ const error_hints_1 = __importDefault(require("../../browser/connection/error-hints"));
12
+ const DOCUMENTATION_LINKS = {
13
+ TEST_SOURCE_PARAMETER: 'https://devexpress.github.io/testcafe/documentation/using-testcafe/command-line-interface.html#file-pathglob-pattern',
14
+ FILTER_SETTINGS: 'https://devexpress.github.io/testcafe/documentation/using-testcafe/configuration-file.html#filter'
15
+ };
16
+ exports.default = {
17
+ [types_1.RUNTIME_ERRORS.cannotCreateMultipleLiveModeRunners]: 'Cannot create multiple live mode runners.',
18
+ [types_1.RUNTIME_ERRORS.cannotRunLiveModeRunnerMultipleTimes]: 'Cannot run a live mode runner multiple times.',
19
+ [types_1.RUNTIME_ERRORS.browserDisconnected]: 'The {userAgent} browser disconnected. This problem may appear when a browser hangs or is closed, or due to network issues.',
20
+ [types_1.RUNTIME_ERRORS.cannotRunAgainstDisconnectedBrowsers]: 'The following browsers disconnected: {userAgents}. Tests will not be run.',
21
+ [types_1.RUNTIME_ERRORS.testRunRequestInDisconnectedBrowser]: '"{browser}" has disconnected during test execution',
22
+ [types_1.RUNTIME_ERRORS.cannotEstablishBrowserConnection]: 'Unable to establish one or more of the specified browser connections.',
23
+ [types_1.RUNTIME_ERRORS.cannotFindBrowser]: 'Unable to find the browser. "{browser}" is not a browser alias or path to an executable file.',
24
+ [types_1.RUNTIME_ERRORS.browserProviderNotFound]: 'The specified "{providerName}" browser provider was not found.',
25
+ [types_1.RUNTIME_ERRORS.browserNotSet]: 'No browser selected to test against.',
26
+ [types_1.RUNTIME_ERRORS.testFilesNotFound]: 'TestCafe could not find the test files that match the following patterns:\n' +
27
+ '{sourceList}\n\n' +
28
+ 'The "{cwd}" current working directory was used as the base path.\n' +
29
+ 'Ensure the file patterns are correct or change the current working directory.\n' +
30
+ `For more information on how to specify test files, see ${DOCUMENTATION_LINKS.TEST_SOURCE_PARAMETER}.`,
31
+ [types_1.RUNTIME_ERRORS.noTestsToRun]: 'No tests found in the specified source files.\n' +
32
+ "Ensure the sources contain the 'fixture' and 'test' directives.",
33
+ [types_1.RUNTIME_ERRORS.noTestsToRunDueFiltering]: 'The specified filter settings exclude all tests.\n' +
34
+ 'Modify these settings to leave at least one available test.\n' +
35
+ `For more information on how to specify filter settings, see ${DOCUMENTATION_LINKS.FILTER_SETTINGS}.`,
36
+ [types_1.RUNTIME_ERRORS.cannotFindReporterForAlias]: 'The provided "{name}" reporter does not exist. Check that you have specified the report format correctly.',
37
+ [types_1.RUNTIME_ERRORS.multipleSameStreamReporters]: 'The following reporters attempted to write to the same output stream: "{reporters}". Only one reporter can write to a stream.',
38
+ [types_1.RUNTIME_ERRORS.optionValueIsNotValidRegExp]: 'The "{optionName}" option value is not a valid regular expression.',
39
+ [types_1.RUNTIME_ERRORS.optionValueIsNotValidKeyValue]: 'The "{optionName}" option value is not a valid key-value pair.',
40
+ [types_1.RUNTIME_ERRORS.invalidQuarantineOption]: 'The "{optionName}" option should be empty, otherwise one of "retryCount" or "passCount".',
41
+ [types_1.RUNTIME_ERRORS.invalidRetryCountValue]: 'The "retryCount" value should be greater or equal to "passCount" ({passCount}).',
42
+ [types_1.RUNTIME_ERRORS.invalidSpeedValue]: 'Speed should be a number between 0.01 and 1.',
43
+ [types_1.RUNTIME_ERRORS.invalidConcurrencyFactor]: 'The concurrency factor should be an integer greater or equal to 1.',
44
+ [types_1.RUNTIME_ERRORS.cannotDivideRemotesCountByConcurrency]: 'The number of remote browsers should be divisible by the factor of concurrency.',
45
+ [types_1.RUNTIME_ERRORS.portsOptionRequiresTwoNumbers]: 'The "--ports" option requires two numbers to be specified.',
46
+ [types_1.RUNTIME_ERRORS.portIsNotFree]: 'The specified {portNum} port is already in use by another program.',
47
+ [types_1.RUNTIME_ERRORS.invalidHostname]: 'The specified "{hostname}" hostname cannot be resolved to the current machine.',
48
+ [types_1.RUNTIME_ERRORS.cannotFindSpecifiedTestSource]: 'Cannot find a test source file at "{path}".',
49
+ [types_1.RUNTIME_ERRORS.clientFunctionCodeIsNotAFunction]: '{#instantiationCallsiteName} code is expected to be specified as a function, but {type} was passed.',
50
+ [types_1.RUNTIME_ERRORS.selectorInitializedWithWrongType]: '{#instantiationCallsiteName} is expected to be initialized with a function, CSS selector string, another Selector, node snapshot or a Promise returned by a Selector, but {type} was passed.',
51
+ [types_1.RUNTIME_ERRORS.clientFunctionCannotResolveTestRun]: "{#instantiationCallsiteName} cannot implicitly resolve the test run in context of which it should be executed. If you need to call {#instantiationCallsiteName} from the Node.js API callback, pass the test controller manually via {#instantiationCallsiteName}'s `.with({ boundTestRun: t })` method first. Note that you cannot execute {#instantiationCallsiteName} outside the test code.",
52
+ [types_1.RUNTIME_ERRORS.regeneratorInClientFunctionCode]: `{#instantiationCallsiteName} code, arguments or dependencies cannot contain generators or "async/await" syntax (use Promises instead).`,
53
+ [types_1.RUNTIME_ERRORS.invalidClientFunctionTestRunBinding]: 'The "boundTestRun" option value is expected to be a test controller.',
54
+ [types_1.RUNTIME_ERRORS.invalidValueType]: '{smthg} is expected to be a {type}, but it was {actual}.',
55
+ [types_1.RUNTIME_ERRORS.unsupportedUrlProtocol]: 'The specified "{url}" test page URL uses an unsupported {protocol}:// protocol. Only relative URLs or absolute URLs with http://, https:// and file:// protocols are supported.',
56
+ [types_1.RUNTIME_ERRORS.testControllerProxyCannotResolveTestRun]: `Cannot implicitly resolve the test run in the context of which the test controller action should be executed. Use test function's 't' argument instead.`,
57
+ [types_1.RUNTIME_ERRORS.timeLimitedPromiseTimeoutExpired]: 'Timeout expired for a time limited promise',
58
+ [types_1.RUNTIME_ERRORS.cannotSetVideoOptionsWithoutBaseVideoPathSpecified]: 'Unable to set video or encoding options when video recording is disabled. Specify the base path where video files are stored to enable recording.',
59
+ [types_1.RUNTIME_ERRORS.multipleAPIMethodCallForbidden]: 'You cannot call the "{methodName}" method more than once. Pass an array of parameters to this method instead.',
60
+ [types_1.RUNTIME_ERRORS.invalidReporterOutput]: "Specify a file name or a writable stream as the reporter's output target.",
61
+ [types_1.RUNTIME_ERRORS.cannotReadSSLCertFile]: 'Unable to read the "{path}" file, specified by the "{option}" ssl option. Error details:\n' +
62
+ '\n' +
63
+ '{err}',
64
+ [types_1.RUNTIME_ERRORS.cannotPrepareTestsDueToError]: 'Cannot prepare tests due to an error.\n' +
65
+ '\n' +
66
+ '{errMessage}',
67
+ [types_1.RUNTIME_ERRORS.cannotParseRawFile]: 'Cannot parse a test source file in the raw format at "{path}" due to an error.\n' +
68
+ '\n' +
69
+ '{errMessage}',
70
+ [types_1.RUNTIME_ERRORS.testedAppFailedWithError]: 'Tested app failed with an error:\n' +
71
+ '\n' +
72
+ '{errMessage}',
73
+ [types_1.RUNTIME_ERRORS.unableToOpenBrowser]: 'Was unable to open the browser "{alias}" due to error.\n' +
74
+ '\n' +
75
+ '{errMessage}',
76
+ [types_1.RUNTIME_ERRORS.requestHookConfigureAPIError]: 'There was an error while configuring the request hook:\n' +
77
+ '\n' +
78
+ '{requestHookName}: {errMsg}',
79
+ [types_1.RUNTIME_ERRORS.forbiddenCharatersInScreenshotPath]: 'There are forbidden characters in the "{screenshotPath}" {screenshotPathType}:\n' +
80
+ ' {forbiddenCharsDescription}',
81
+ [types_1.RUNTIME_ERRORS.cannotFindFFMPEG]: 'Unable to locate the FFmpeg executable required to record videos. Do one of the following:\n' +
82
+ '\n' +
83
+ '* add the FFmpeg installation directory to the PATH environment variable,\n' +
84
+ '* specify the path to the FFmpeg executable in the FFMPEG_PATH environment variable or the ffmpegPath video option,\n' +
85
+ '* install the @ffmpeg-installer/ffmpeg package from npm.',
86
+ [types_1.RUNTIME_ERRORS.cannotFindTypescriptConfigurationFile]: 'Unable to find the TypeScript configuration file in "{filePath}"',
87
+ [types_1.RUNTIME_ERRORS.clientScriptInitializerIsNotSpecified]: 'Specify the JavaScript file path, module name or script content to inject a client script.',
88
+ [types_1.RUNTIME_ERRORS.clientScriptBasePathIsNotSpecified]: 'Specify the base path for the client script file.',
89
+ [types_1.RUNTIME_ERRORS.clientScriptInitializerMultipleContentSources]: 'You cannot combine the file path, module name and script content when you specify a client script to inject.',
90
+ [types_1.RUNTIME_ERRORS.cannotLoadClientScriptFromPath]: 'Cannot load a client script from {path}.',
91
+ [types_1.RUNTIME_ERRORS.clientScriptModuleEntryPointPathCalculationError]: 'An error occurred when trying to locate the injected client script module:\n\n{errorMessage}.',
92
+ [types_1.RUNTIME_ERRORS.methodIsNotAvailableForAnIPCHost]: 'This method cannot be called on a service host.',
93
+ [types_1.RUNTIME_ERRORS.tooLargeIPCPayload]: 'The specified payload is too large to form an IPC packet.',
94
+ [types_1.RUNTIME_ERRORS.malformedIPCMessage]: 'Cannot process a malformed IPC message.',
95
+ [types_1.RUNTIME_ERRORS.unexpectedIPCHeadPacket]: 'Cannot create an IPC message due to an unexpected IPC head packet.',
96
+ [types_1.RUNTIME_ERRORS.unexpectedIPCBodyPacket]: 'Cannot create an IPC message due to an unexpected IPC body packet.',
97
+ [types_1.RUNTIME_ERRORS.unexpectedIPCTailPacket]: 'Cannot create an IPC message due to an unexpected IPC tail packet.',
98
+ [types_1.RUNTIME_ERRORS.cannotRunLocalNonHeadlessBrowserWithoutDisplay]: 'Your Linux version does not have a graphic subsystem to run {browserAlias} with a GUI. ' +
99
+ 'You can launch the browser in headless mode. ' +
100
+ 'If you use a portable browser version, ' +
101
+ 'specify the browser alias before the path instead of the \'path\' prefix. ' +
102
+ 'For more information, see https://devexpress.github.io/testcafe/documentation/guides/concepts/browsers.html#test-in-headless-mode',
103
+ [types_1.RUNTIME_ERRORS.uncaughtErrorInReporter]: 'An uncaught error occurred in the "{reporterName}" reporter\'s "{methodName}" method. Error details:\n{originalError}',
104
+ [types_1.RUNTIME_ERRORS.roleInitializedWithRelativeUrl]: 'You cannot specify relative login page URLs in the Role constructor. Use an absolute URL.',
105
+ [types_1.RUNTIME_ERRORS.typeScriptCompilerLoadingError]: 'Unable to load the TypeScript compiler.\n{originErrorMessage}.',
106
+ [types_1.RUNTIME_ERRORS.cannotCustomizeSpecifiedCompilers]: 'You cannot specify options for the {noncustomizableCompilerList} compiler{suffix}.',
107
+ [types_1.RUNTIME_ERRORS.cannotEnableRetryTestPagesOption]: 'Cannot enable the \'retryTestPages\' option. Apply one of the following two solutions:\n' +
108
+ '-- set \'localhost\' as the value of the \'hostname\' option\n' +
109
+ '-- run TestCafe over HTTPS\n',
110
+ [types_1.RUNTIME_ERRORS.browserConnectionError]: '{originErrorMessage}\n{numOfNotOpenedConnection} of {numOfAllConnections} browser connections have not been established:\n{listOfNotOpenedConnections}\n\nHints:\n{listOfHints}',
111
+ [error_hints_1.default.TooHighConcurrencyFactor]: 'The error can be due to a concurrency factor that is too high for the host machine’s performance (the factor value {concurrencyFactor} was specified). ' +
112
+ 'Try to decrease the concurrency factor or ensure more system resources are available on the host machine.',
113
+ [error_hints_1.default.UseBrowserInitOption]: 'Use the "browserInitTimeout" option to allow more time for the browser to start. The timeout is set to {browserInitTimeoutMsg}.',
114
+ [error_hints_1.default.RestErrorCauses]: 'The error can also be caused by network issues or remote device failure. Make sure that the connection is stable and the remote device can be reached.'
115
+ };
116
116
  module.exports = exports.default;
117
117
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Vycm9ycy9ydW50aW1lL3RlbXBsYXRlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsZ0VBQWdFO0FBQ2hFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsZ0VBQWdFOzs7OztBQUVoRSxvQ0FBMEM7QUFDMUMsdUZBQThFO0FBRTlFLE1BQU0sbUJBQW1CLEdBQUc7SUFDeEIscUJBQXFCLEVBQUUsc0hBQXNIO0lBQzdJLGVBQWUsRUFBUSxtR0FBbUc7Q0FDN0gsQ0FBQztBQUVGLGtCQUFlO0lBQ1gsQ0FBQyxzQkFBYyxDQUFDLG1DQUFtQyxDQUFDLEVBQUcsMkNBQTJDO0lBQ2xHLENBQUMsc0JBQWMsQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLCtDQUErQztJQUN0RyxDQUFDLHNCQUFjLENBQUMsbUJBQW1CLENBQUMsRUFBbUIsNEhBQTRIO0lBQ25MLENBQUMsc0JBQWMsQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLDJFQUEyRTtJQUNsSSxDQUFDLHNCQUFjLENBQUMsbUNBQW1DLENBQUMsRUFBRyxvREFBb0Q7SUFDM0csQ0FBQyxzQkFBYyxDQUFDLGdDQUFnQyxDQUFDLEVBQU0sdUVBQXVFO0lBQzlILENBQUMsc0JBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFxQiwrRkFBK0Y7SUFDdEosQ0FBQyxzQkFBYyxDQUFDLHVCQUF1QixDQUFDLEVBQWUsZ0VBQWdFO0lBQ3ZILENBQUMsc0JBQWMsQ0FBQyxhQUFhLENBQUMsRUFBeUIsc0NBQXNDO0lBRTdGLENBQUMsc0JBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLDZFQUE2RTtRQUM3RSxrQkFBa0I7UUFDbEIsb0VBQW9FO1FBQ3BFLGlGQUFpRjtRQUNqRiwwREFBMEQsbUJBQW1CLENBQUMscUJBQXFCLEdBQUc7SUFFMUksQ0FBQyxzQkFBYyxDQUFDLFlBQVksQ0FBQyxFQUFFLGlEQUFpRDtRQUNqRCxpRUFBaUU7SUFFaEcsQ0FBQyxzQkFBYyxDQUFDLHdCQUF3QixDQUFDLEVBQUUsb0RBQW9EO1FBQ3BELCtEQUErRDtRQUMvRCwrREFBK0QsbUJBQW1CLENBQUMsZUFBZSxHQUFHO0lBRWhKLENBQUMsc0JBQWMsQ0FBQywwQkFBMEIsQ0FBQyxFQUEwQiwyR0FBMkc7SUFDaEwsQ0FBQyxzQkFBYyxDQUFDLDJCQUEyQixDQUFDLEVBQXlCLCtIQUErSDtJQUNwTSxDQUFDLHNCQUFjLENBQUMsMkJBQTJCLENBQUMsRUFBeUIsb0VBQW9FO0lBQ3pJLENBQUMsc0JBQWMsQ0FBQyw2QkFBNkIsQ0FBQyxFQUF1QixnRUFBZ0U7SUFDckksQ0FBQyxzQkFBYyxDQUFDLHVCQUF1QixDQUFDLEVBQTZCLDBGQUEwRjtJQUMvSixDQUFDLHNCQUFjLENBQUMsc0JBQXNCLENBQUMsRUFBOEIsaUZBQWlGO0lBQ3RKLENBQUMsc0JBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFtQyw4Q0FBOEM7SUFDbkgsQ0FBQyxzQkFBYyxDQUFDLHdCQUF3QixDQUFDLEVBQTRCLG9FQUFvRTtJQUN6SSxDQUFDLHNCQUFjLENBQUMscUNBQXFDLENBQUMsRUFBZSxpRkFBaUY7SUFDdEosQ0FBQyxzQkFBYyxDQUFDLDZCQUE2QixDQUFDLEVBQXVCLDREQUE0RDtJQUNqSSxDQUFDLHNCQUFjLENBQUMsYUFBYSxDQUFDLEVBQXVDLG9FQUFvRTtJQUN6SSxDQUFDLHNCQUFjLENBQUMsZUFBZSxDQUFDLEVBQXFDLGdGQUFnRjtJQUNySixDQUFDLHNCQUFjLENBQUMsNkJBQTZCLENBQUMsRUFBdUIsNkNBQTZDO0lBQ2xILENBQUMsc0JBQWMsQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFvQixxR0FBcUc7SUFDMUssQ0FBQyxzQkFBYyxDQUFDLGdDQUFnQyxDQUFDLEVBQW9CLDhMQUE4TDtJQUNuUSxDQUFDLHNCQUFjLENBQUMsa0NBQWtDLENBQUMsRUFBa0IsaVlBQWlZO0lBQ3RjLENBQUMsc0JBQWMsQ0FBQywrQkFBK0IsQ0FBQyxFQUFxQix3SUFBd0k7SUFDN00sQ0FBQyxzQkFBYyxDQUFDLG1DQUFtQyxDQUFDLEVBQWlCLHNFQUFzRTtJQUMzSSxDQUFDLHNCQUFjLENBQUMsZ0JBQWdCLENBQUMsRUFBb0MsMERBQTBEO0lBQy9ILENBQUMsc0JBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUE4QixpTEFBaUw7SUFDdFAsQ0FBQyxzQkFBYyxDQUFDLHVDQUF1QyxDQUFDLEVBQWEseUpBQXlKO0lBQzlOLENBQUMsc0JBQWMsQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFvQiw0Q0FBNEM7SUFDakgsQ0FBQyxzQkFBYyxDQUFDLGtEQUFrRCxDQUFDLEVBQUUsbUpBQW1KO0lBQ3hOLENBQUMsc0JBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFzQiwrR0FBK0c7SUFDcEwsQ0FBQyxzQkFBYyxDQUFDLHFCQUFxQixDQUFDLEVBQStCLDJFQUEyRTtJQUNoSixDQUFDLHNCQUFjLENBQUMscUJBQXFCLENBQUMsRUFBK0IsNEZBQTRGO1FBQzVGLElBQUk7UUFDSixPQUFPO0lBRTVFLENBQUMsc0JBQWMsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFLHlDQUF5QztRQUN6QyxJQUFJO1FBQ0osY0FBYztJQUU3RCxDQUFDLHNCQUFjLENBQUMsa0JBQWtCLENBQUMsRUFBRSxrRkFBa0Y7UUFDbEYsSUFBSTtRQUNKLGNBQWM7SUFFbkQsQ0FBQyxzQkFBYyxDQUFDLHdCQUF3QixDQUFDLEVBQUUsb0NBQW9DO1FBQ3BDLElBQUk7UUFDSixjQUFjO0lBRXpELENBQUMsc0JBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLDBEQUEwRDtRQUMxRCxJQUFJO1FBQ0osY0FBYztJQUVwRCxDQUFDLHNCQUFjLENBQUMsNEJBQTRCLENBQUMsRUFBRSwwREFBMEQ7UUFDMUQsSUFBSTtRQUNKLDZCQUE2QjtJQUU1RSxDQUFDLHNCQUFjLENBQUMsa0NBQWtDLENBQUMsRUFBRSxrRkFBa0Y7UUFDbEYsOEJBQThCO0lBRW5GLENBQUMsc0JBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLDhGQUE4RjtRQUM5RixJQUFJO1FBQ0osNkVBQTZFO1FBQzdFLHVIQUF1SDtRQUN2SCwwREFBMEQ7SUFFN0YsQ0FBQyxzQkFBYyxDQUFDLHFDQUFxQyxDQUFDLEVBQWEsa0VBQWtFO0lBQ3JJLENBQUMsc0JBQWMsQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFhLDRGQUE0RjtJQUMvSixDQUFDLHNCQUFjLENBQUMsa0NBQWtDLENBQUMsRUFBZ0IsbURBQW1EO0lBQ3RILENBQUMsc0JBQWMsQ0FBQyw2Q0FBNkMsQ0FBQyxFQUFLLDhHQUE4RztJQUNqTCxDQUFDLHNCQUFjLENBQUMsOEJBQThCLENBQUMsRUFBb0IsMENBQTBDO0lBQzdHLENBQUMsc0JBQWMsQ0FBQyxnREFBZ0QsQ0FBQyxFQUFFLCtGQUErRjtJQUNsSyxDQUFDLHNCQUFjLENBQUMsZ0NBQWdDLENBQUMsRUFBa0IsaURBQWlEO0lBQ3BILENBQUMsc0JBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFnQywyREFBMkQ7SUFDOUgsQ0FBQyxzQkFBYyxDQUFDLG1CQUFtQixDQUFDLEVBQStCLHlDQUF5QztJQUM1RyxDQUFDLHNCQUFjLENBQUMsdUJBQXVCLENBQUMsRUFBMkIsb0VBQW9FO0lBQ3ZJLENBQUMsc0JBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxFQUEyQixvRUFBb0U7SUFDdkksQ0FBQyxzQkFBYyxDQUFDLHVCQUF1QixDQUFDLEVBQTJCLG9FQUFvRTtJQUN2SSxDQUFDLHNCQUFjLENBQUMsOENBQThDLENBQUMsRUFDM0QseUZBQXlGO1FBQ3pGLCtDQUErQztRQUMvQyx5Q0FBeUM7UUFDekMsNEVBQTRFO1FBQzVFLG1JQUFtSTtJQUV2SSxDQUFDLHNCQUFjLENBQUMsdUJBQXVCLENBQUMsRUFBWSx1SEFBdUg7SUFDM0ssQ0FBQyxzQkFBYyxDQUFDLDhCQUE4QixDQUFDLEVBQUssMkZBQTJGO0lBQy9JLENBQUMsc0JBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFLLGdFQUFnRTtJQUNwSCxDQUFDLHNCQUFjLENBQUMsaUNBQWlDLENBQUMsRUFBRSxvRkFBb0Y7SUFFeEksQ0FBQyxzQkFBYyxDQUFDLGdDQUFnQyxDQUFDLEVBQzdDLDBGQUEwRjtRQUMxRixnRUFBZ0U7UUFDaEUsOEJBQThCO0lBRWxDLENBQUMsc0JBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFnQixpTEFBaUw7SUFDeE8sQ0FBQyxxQkFBMEIsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLHlKQUF5SjtRQUN6SiwyR0FBMkc7SUFDbEssQ0FBQyxxQkFBMEIsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLGlJQUFpSTtJQUNwTCxDQUFDLHFCQUEwQixDQUFDLGVBQWUsQ0FBQyxFQUFPLHdKQUF3SjtDQUM5TSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV0FSTklORzogdGhpcyBmaWxlIGlzIHVzZWQgYnkgYm90aCB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLlxuLy8gRG8gbm90IHVzZSBhbnkgYnJvd3NlciBvciBub2RlLXNwZWNpZmljIEFQSSFcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgQnJvd3NlckNvbm5lY3Rpb25FcnJvckhpbnQgZnJvbSAnLi4vLi4vYnJvd3Nlci9jb25uZWN0aW9uL2Vycm9yLWhpbnRzJztcblxuY29uc3QgRE9DVU1FTlRBVElPTl9MSU5LUyA9IHtcbiAgICBURVNUX1NPVVJDRV9QQVJBTUVURVI6ICdodHRwczovL2RldmV4cHJlc3MuZ2l0aHViLmlvL3Rlc3RjYWZlL2RvY3VtZW50YXRpb24vdXNpbmctdGVzdGNhZmUvY29tbWFuZC1saW5lLWludGVyZmFjZS5odG1sI2ZpbGUtcGF0aGdsb2ItcGF0dGVybicsXG4gICAgRklMVEVSX1NFVFRJTkdTOiAgICAgICAnaHR0cHM6Ly9kZXZleHByZXNzLmdpdGh1Yi5pby90ZXN0Y2FmZS9kb2N1bWVudGF0aW9uL3VzaW5nLXRlc3RjYWZlL2NvbmZpZ3VyYXRpb24tZmlsZS5odG1sI2ZpbHRlcidcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90Q3JlYXRlTXVsdGlwbGVMaXZlTW9kZVJ1bm5lcnNdOiAgJ0Nhbm5vdCBjcmVhdGUgbXVsdGlwbGUgbGl2ZSBtb2RlIHJ1bm5lcnMuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90UnVuTGl2ZU1vZGVSdW5uZXJNdWx0aXBsZVRpbWVzXTogJ0Nhbm5vdCBydW4gYSBsaXZlIG1vZGUgcnVubmVyIG11bHRpcGxlIHRpbWVzLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmJyb3dzZXJEaXNjb25uZWN0ZWRdOiAgICAgICAgICAgICAgICAgICdUaGUge3VzZXJBZ2VudH0gYnJvd3NlciBkaXNjb25uZWN0ZWQuIFRoaXMgcHJvYmxlbSBtYXkgYXBwZWFyIHdoZW4gYSBicm93c2VyIGhhbmdzIG9yIGlzIGNsb3NlZCwgb3IgZHVlIHRvIG5ldHdvcmsgaXNzdWVzLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmNhbm5vdFJ1bkFnYWluc3REaXNjb25uZWN0ZWRCcm93c2Vyc106ICdUaGUgZm9sbG93aW5nIGJyb3dzZXJzIGRpc2Nvbm5lY3RlZDoge3VzZXJBZ2VudHN9LiBUZXN0cyB3aWxsIG5vdCBiZSBydW4uJyxcbiAgICBbUlVOVElNRV9FUlJPUlMudGVzdFJ1blJlcXVlc3RJbkRpc2Nvbm5lY3RlZEJyb3dzZXJdOiAgJ1wie2Jyb3dzZXJ9XCIgaGFzIGRpc2Nvbm5lY3RlZCBkdXJpbmcgdGVzdCBleGVjdXRpb24nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RFc3RhYmxpc2hCcm93c2VyQ29ubmVjdGlvbl06ICAgICAnVW5hYmxlIHRvIGVzdGFibGlzaCBvbmUgb3IgbW9yZSBvZiB0aGUgc3BlY2lmaWVkIGJyb3dzZXIgY29ubmVjdGlvbnMuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90RmluZEJyb3dzZXJdOiAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBmaW5kIHRoZSBicm93c2VyLiBcInticm93c2VyfVwiIGlzIG5vdCBhIGJyb3dzZXIgYWxpYXMgb3IgcGF0aCB0byBhbiBleGVjdXRhYmxlIGZpbGUuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuYnJvd3NlclByb3ZpZGVyTm90Rm91bmRdOiAgICAgICAgICAgICAgJ1RoZSBzcGVjaWZpZWQgXCJ7cHJvdmlkZXJOYW1lfVwiIGJyb3dzZXIgcHJvdmlkZXIgd2FzIG5vdCBmb3VuZC4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5icm93c2VyTm90U2V0XTogICAgICAgICAgICAgICAgICAgICAgICAnTm8gYnJvd3NlciBzZWxlY3RlZCB0byB0ZXN0IGFnYWluc3QuJyxcblxuICAgIFtSVU5USU1FX0VSUk9SUy50ZXN0RmlsZXNOb3RGb3VuZF06ICdUZXN0Q2FmZSBjb3VsZCBub3QgZmluZCB0aGUgdGVzdCBmaWxlcyB0aGF0IG1hdGNoIHRoZSBmb2xsb3dpbmcgcGF0dGVybnM6XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3tzb3VyY2VMaXN0fVxcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgXCJ7Y3dkfVwiIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgd2FzIHVzZWQgYXMgdGhlIGJhc2UgcGF0aC5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRW5zdXJlIHRoZSBmaWxlIHBhdHRlcm5zIGFyZSBjb3JyZWN0IG9yIGNoYW5nZSB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIHNwZWNpZnkgdGVzdCBmaWxlcywgc2VlICR7RE9DVU1FTlRBVElPTl9MSU5LUy5URVNUX1NPVVJDRV9QQVJBTUVURVJ9LmAsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMubm9UZXN0c1RvUnVuXTogJ05vIHRlc3RzIGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgc291cmNlIGZpbGVzLlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVuc3VyZSB0aGUgc291cmNlcyBjb250YWluIHRoZSAnZml4dHVyZScgYW5kICd0ZXN0JyBkaXJlY3RpdmVzLlwiLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLm5vVGVzdHNUb1J1bkR1ZUZpbHRlcmluZ106ICdUaGUgc3BlY2lmaWVkIGZpbHRlciBzZXR0aW5ncyBleGNsdWRlIGFsbCB0ZXN0cy5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01vZGlmeSB0aGVzZSBzZXR0aW5ncyB0byBsZWF2ZSBhdCBsZWFzdCBvbmUgYXZhaWxhYmxlIHRlc3QuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gc3BlY2lmeSBmaWx0ZXIgc2V0dGluZ3MsIHNlZSAke0RPQ1VNRU5UQVRJT05fTElOS1MuRklMVEVSX1NFVFRJTkdTfS5gLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLmNhbm5vdEZpbmRSZXBvcnRlckZvckFsaWFzXTogICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBwcm92aWRlZCBcIntuYW1lfVwiIHJlcG9ydGVyIGRvZXMgbm90IGV4aXN0LiBDaGVjayB0aGF0IHlvdSBoYXZlIHNwZWNpZmllZCB0aGUgcmVwb3J0IGZvcm1hdCBjb3JyZWN0bHkuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMubXVsdGlwbGVTYW1lU3RyZWFtUmVwb3J0ZXJzXTogICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyByZXBvcnRlcnMgYXR0ZW1wdGVkIHRvIHdyaXRlIHRvIHRoZSBzYW1lIG91dHB1dCBzdHJlYW06IFwie3JlcG9ydGVyc31cIi4gT25seSBvbmUgcmVwb3J0ZXIgY2FuIHdyaXRlIHRvIGEgc3RyZWFtLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLm9wdGlvblZhbHVlSXNOb3RWYWxpZFJlZ0V4cF06ICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBcIntvcHRpb25OYW1lfVwiIG9wdGlvbiB2YWx1ZSBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uJyxcbiAgICBbUlVOVElNRV9FUlJPUlMub3B0aW9uVmFsdWVJc05vdFZhbGlkS2V5VmFsdWVdOiAgICAgICAgICAgICAgICAgICAgICAnVGhlIFwie29wdGlvbk5hbWV9XCIgb3B0aW9uIHZhbHVlIGlzIG5vdCBhIHZhbGlkIGtleS12YWx1ZSBwYWlyLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmludmFsaWRRdWFyYW50aW5lT3B0aW9uXTogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBcIntvcHRpb25OYW1lfVwiIG9wdGlvbiBzaG91bGQgYmUgZW1wdHksIG90aGVyd2lzZSBvbmUgb2YgXCJyZXRyeUNvdW50XCIgb3IgXCJwYXNzQ291bnRcIi4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5pbnZhbGlkUmV0cnlDb3VudFZhbHVlXTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgXCJyZXRyeUNvdW50XCIgdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gXCJwYXNzQ291bnRcIiAoe3Bhc3NDb3VudH0pLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmludmFsaWRTcGVlZFZhbHVlXTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NwZWVkIHNob3VsZCBiZSBhIG51bWJlciBiZXR3ZWVuIDAuMDEgYW5kIDEuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuaW52YWxpZENvbmN1cnJlbmN5RmFjdG9yXTogICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGNvbmN1cnJlbmN5IGZhY3RvciBzaG91bGQgYmUgYW4gaW50ZWdlciBncmVhdGVyIG9yIGVxdWFsIHRvIDEuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90RGl2aWRlUmVtb3Rlc0NvdW50QnlDb25jdXJyZW5jeV06ICAgICAgICAgICAgICAnVGhlIG51bWJlciBvZiByZW1vdGUgYnJvd3NlcnMgc2hvdWxkIGJlIGRpdmlzaWJsZSBieSB0aGUgZmFjdG9yIG9mIGNvbmN1cnJlbmN5LicsXG4gICAgW1JVTlRJTUVfRVJST1JTLnBvcnRzT3B0aW9uUmVxdWlyZXNUd29OdW1iZXJzXTogICAgICAgICAgICAgICAgICAgICAgJ1RoZSBcIi0tcG9ydHNcIiBvcHRpb24gcmVxdWlyZXMgdHdvIG51bWJlcnMgdG8gYmUgc3BlY2lmaWVkLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLnBvcnRJc05vdEZyZWVdOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBzcGVjaWZpZWQge3BvcnROdW19IHBvcnQgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciBwcm9ncmFtLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmludmFsaWRIb3N0bmFtZV06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBzcGVjaWZpZWQgXCJ7aG9zdG5hbWV9XCIgaG9zdG5hbWUgY2Fubm90IGJlIHJlc29sdmVkIHRvIHRoZSBjdXJyZW50IG1hY2hpbmUuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90RmluZFNwZWNpZmllZFRlc3RTb3VyY2VdOiAgICAgICAgICAgICAgICAgICAgICAnQ2Fubm90IGZpbmQgYSB0ZXN0IHNvdXJjZSBmaWxlIGF0IFwie3BhdGh9XCIuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2xpZW50RnVuY3Rpb25Db2RlSXNOb3RBRnVuY3Rpb25dOiAgICAgICAgICAgICAgICAgICAneyNpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lfSBjb2RlIGlzIGV4cGVjdGVkIHRvIGJlIHNwZWNpZmllZCBhcyBhIGZ1bmN0aW9uLCBidXQge3R5cGV9IHdhcyBwYXNzZWQuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuc2VsZWN0b3JJbml0aWFsaXplZFdpdGhXcm9uZ1R5cGVdOiAgICAgICAgICAgICAgICAgICAneyNpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lfSBpcyBleHBlY3RlZCB0byBiZSBpbml0aWFsaXplZCB3aXRoIGEgZnVuY3Rpb24sIENTUyBzZWxlY3RvciBzdHJpbmcsIGFub3RoZXIgU2VsZWN0b3IsIG5vZGUgc25hcHNob3Qgb3IgYSBQcm9taXNlIHJldHVybmVkIGJ5IGEgU2VsZWN0b3IsIGJ1dCB7dHlwZX0gd2FzIHBhc3NlZC4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jbGllbnRGdW5jdGlvbkNhbm5vdFJlc29sdmVUZXN0UnVuXTogICAgICAgICAgICAgICAgIFwieyNpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lfSBjYW5ub3QgaW1wbGljaXRseSByZXNvbHZlIHRoZSB0ZXN0IHJ1biBpbiBjb250ZXh0IG9mIHdoaWNoIGl0IHNob3VsZCBiZSBleGVjdXRlZC4gSWYgeW91IG5lZWQgdG8gY2FsbCB7I2luc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWV9IGZyb20gdGhlIE5vZGUuanMgQVBJIGNhbGxiYWNrLCBwYXNzIHRoZSB0ZXN0IGNvbnRyb2xsZXIgbWFudWFsbHkgdmlhIHsjaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZX0ncyBgLndpdGgoeyBib3VuZFRlc3RSdW46IHQgfSlgIG1ldGhvZCBmaXJzdC4gTm90ZSB0aGF0IHlvdSBjYW5ub3QgZXhlY3V0ZSB7I2luc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWV9IG91dHNpZGUgdGhlIHRlc3QgY29kZS5cIixcbiAgICBbUlVOVElNRV9FUlJPUlMucmVnZW5lcmF0b3JJbkNsaWVudEZ1bmN0aW9uQ29kZV06ICAgICAgICAgICAgICAgICAgICBgeyNpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lfSBjb2RlLCBhcmd1bWVudHMgb3IgZGVwZW5kZW5jaWVzIGNhbm5vdCBjb250YWluIGdlbmVyYXRvcnMgb3IgXCJhc3luYy9hd2FpdFwiIHN5bnRheCAodXNlIFByb21pc2VzIGluc3RlYWQpLmAsXG4gICAgW1JVTlRJTUVfRVJST1JTLmludmFsaWRDbGllbnRGdW5jdGlvblRlc3RSdW5CaW5kaW5nXTogICAgICAgICAgICAgICAgJ1RoZSBcImJvdW5kVGVzdFJ1blwiIG9wdGlvbiB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBhIHRlc3QgY29udHJvbGxlci4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5pbnZhbGlkVmFsdWVUeXBlXTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7c210aGd9IGlzIGV4cGVjdGVkIHRvIGJlIGEge3R5cGV9LCBidXQgaXQgd2FzIHthY3R1YWx9LicsXG4gICAgW1JVTlRJTUVfRVJST1JTLnVuc3VwcG9ydGVkVXJsUHJvdG9jb2xdOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBzcGVjaWZpZWQgXCJ7dXJsfVwiIHRlc3QgcGFnZSBVUkwgdXNlcyBhbiB1bnN1cHBvcnRlZCB7cHJvdG9jb2x9Oi8vIHByb3RvY29sLiBPbmx5IHJlbGF0aXZlIFVSTHMgb3IgYWJzb2x1dGUgVVJMcyB3aXRoIGh0dHA6Ly8sIGh0dHBzOi8vIGFuZCBmaWxlOi8vIHByb3RvY29scyBhcmUgc3VwcG9ydGVkLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLnRlc3RDb250cm9sbGVyUHJveHlDYW5ub3RSZXNvbHZlVGVzdFJ1bl06ICAgICAgICAgICAgYENhbm5vdCBpbXBsaWNpdGx5IHJlc29sdmUgdGhlIHRlc3QgcnVuIGluIHRoZSBjb250ZXh0IG9mIHdoaWNoIHRoZSB0ZXN0IGNvbnRyb2xsZXIgYWN0aW9uIHNob3VsZCBiZSBleGVjdXRlZC4gVXNlIHRlc3QgZnVuY3Rpb24ncyAndCcgYXJndW1lbnQgaW5zdGVhZC5gLFxuICAgIFtSVU5USU1FX0VSUk9SUy50aW1lTGltaXRlZFByb21pc2VUaW1lb3V0RXhwaXJlZF06ICAgICAgICAgICAgICAgICAgICdUaW1lb3V0IGV4cGlyZWQgZm9yIGEgdGltZSBsaW1pdGVkIHByb21pc2UnLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RTZXRWaWRlb09wdGlvbnNXaXRob3V0QmFzZVZpZGVvUGF0aFNwZWNpZmllZF06ICdVbmFibGUgdG8gc2V0IHZpZGVvIG9yIGVuY29kaW5nIG9wdGlvbnMgd2hlbiB2aWRlbyByZWNvcmRpbmcgaXMgZGlzYWJsZWQuIFNwZWNpZnkgdGhlIGJhc2UgcGF0aCB3aGVyZSB2aWRlbyBmaWxlcyBhcmUgc3RvcmVkIHRvIGVuYWJsZSByZWNvcmRpbmcuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMubXVsdGlwbGVBUElNZXRob2RDYWxsRm9yYmlkZGVuXTogICAgICAgICAgICAgICAgICAgICAnWW91IGNhbm5vdCBjYWxsIHRoZSBcInttZXRob2ROYW1lfVwiIG1ldGhvZCBtb3JlIHRoYW4gb25jZS4gUGFzcyBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIHRoaXMgbWV0aG9kIGluc3RlYWQuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuaW52YWxpZFJlcG9ydGVyT3V0cHV0XTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNwZWNpZnkgYSBmaWxlIG5hbWUgb3IgYSB3cml0YWJsZSBzdHJlYW0gYXMgdGhlIHJlcG9ydGVyJ3Mgb3V0cHV0IHRhcmdldC5cIixcbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90UmVhZFNTTENlcnRGaWxlXTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIHJlYWQgdGhlIFwie3BhdGh9XCIgZmlsZSwgc3BlY2lmaWVkIGJ5IHRoZSBcIntvcHRpb259XCIgc3NsIG9wdGlvbi4gRXJyb3IgZGV0YWlsczpcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3tlcnJ9JyxcblxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RQcmVwYXJlVGVzdHNEdWVUb0Vycm9yXTogJ0Nhbm5vdCBwcmVwYXJlIHRlc3RzIGR1ZSB0byBhbiBlcnJvci5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7ZXJyTWVzc2FnZX0nLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLmNhbm5vdFBhcnNlUmF3RmlsZV06ICdDYW5ub3QgcGFyc2UgYSB0ZXN0IHNvdXJjZSBmaWxlIGluIHRoZSByYXcgZm9ybWF0IGF0IFwie3BhdGh9XCIgZHVlIHRvIGFuIGVycm9yLlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7ZXJyTWVzc2FnZX0nLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLnRlc3RlZEFwcEZhaWxlZFdpdGhFcnJvcl06ICdUZXN0ZWQgYXBwIGZhaWxlZCB3aXRoIGFuIGVycm9yOlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7ZXJyTWVzc2FnZX0nLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLnVuYWJsZVRvT3BlbkJyb3dzZXJdOiAnV2FzIHVuYWJsZSB0byBvcGVuIHRoZSBicm93c2VyIFwie2FsaWFzfVwiIGR1ZSB0byBlcnJvci5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7ZXJyTWVzc2FnZX0nLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLnJlcXVlc3RIb29rQ29uZmlndXJlQVBJRXJyb3JdOiAnVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNvbmZpZ3VyaW5nIHRoZSByZXF1ZXN0IGhvb2s6XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAne3JlcXVlc3RIb29rTmFtZX06IHtlcnJNc2d9JyxcblxuICAgIFtSVU5USU1FX0VSUk9SUy5mb3JiaWRkZW5DaGFyYXRlcnNJblNjcmVlbnNob3RQYXRoXTogJ1RoZXJlIGFyZSBmb3JiaWRkZW4gY2hhcmFjdGVycyBpbiB0aGUgXCJ7c2NyZWVuc2hvdFBhdGh9XCIge3NjcmVlbnNob3RQYXRoVHlwZX06XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHtmb3JiaWRkZW5DaGFyc0Rlc2NyaXB0aW9ufScsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90RmluZEZGTVBFR106ICdVbmFibGUgdG8gbG9jYXRlIHRoZSBGRm1wZWcgZXhlY3V0YWJsZSByZXF1aXJlZCB0byByZWNvcmQgdmlkZW9zLiBEbyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqIGFkZCB0aGUgRkZtcGVnIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKiBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSBGRm1wZWcgZXhlY3V0YWJsZSBpbiB0aGUgRkZNUEVHX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgdGhlIGZmbXBlZ1BhdGggdmlkZW8gb3B0aW9uLFxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyogaW5zdGFsbCB0aGUgQGZmbXBlZy1pbnN0YWxsZXIvZmZtcGVnIHBhY2thZ2UgZnJvbSBucG0uJyxcblxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RGaW5kVHlwZXNjcmlwdENvbmZpZ3VyYXRpb25GaWxlXTogICAgICAgICAgICAnVW5hYmxlIHRvIGZpbmQgdGhlIFR5cGVTY3JpcHQgY29uZmlndXJhdGlvbiBmaWxlIGluIFwie2ZpbGVQYXRofVwiJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2xpZW50U2NyaXB0SW5pdGlhbGl6ZXJJc05vdFNwZWNpZmllZF06ICAgICAgICAgICAgJ1NwZWNpZnkgdGhlIEphdmFTY3JpcHQgZmlsZSBwYXRoLCBtb2R1bGUgbmFtZSBvciBzY3JpcHQgY29udGVudCB0byBpbmplY3QgYSBjbGllbnQgc2NyaXB0LicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmNsaWVudFNjcmlwdEJhc2VQYXRoSXNOb3RTcGVjaWZpZWRdOiAgICAgICAgICAgICAgICdTcGVjaWZ5IHRoZSBiYXNlIHBhdGggZm9yIHRoZSBjbGllbnQgc2NyaXB0IGZpbGUuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2xpZW50U2NyaXB0SW5pdGlhbGl6ZXJNdWx0aXBsZUNvbnRlbnRTb3VyY2VzXTogICAgJ1lvdSBjYW5ub3QgY29tYmluZSB0aGUgZmlsZSBwYXRoLCBtb2R1bGUgbmFtZSBhbmQgc2NyaXB0IGNvbnRlbnQgd2hlbiB5b3Ugc3BlY2lmeSBhIGNsaWVudCBzY3JpcHQgdG8gaW5qZWN0LicsXG4gICAgW1JVTlRJTUVfRVJST1JTLmNhbm5vdExvYWRDbGllbnRTY3JpcHRGcm9tUGF0aF06ICAgICAgICAgICAgICAgICAgICdDYW5ub3QgbG9hZCBhIGNsaWVudCBzY3JpcHQgZnJvbSB7cGF0aH0uJyxcbiAgICBbUlVOVElNRV9FUlJPUlMuY2xpZW50U2NyaXB0TW9kdWxlRW50cnlQb2ludFBhdGhDYWxjdWxhdGlvbkVycm9yXTogJ0FuIGVycm9yIG9jY3VycmVkIHdoZW4gdHJ5aW5nIHRvIGxvY2F0ZSB0aGUgaW5qZWN0ZWQgY2xpZW50IHNjcmlwdCBtb2R1bGU6XFxuXFxue2Vycm9yTWVzc2FnZX0uJyxcbiAgICBbUlVOVElNRV9FUlJPUlMubWV0aG9kSXNOb3RBdmFpbGFibGVGb3JBbklQQ0hvc3RdOiAgICAgICAgICAgICAgICAgJ1RoaXMgbWV0aG9kIGNhbm5vdCBiZSBjYWxsZWQgb24gYSBzZXJ2aWNlIGhvc3QuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMudG9vTGFyZ2VJUENQYXlsb2FkXTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBzcGVjaWZpZWQgcGF5bG9hZCBpcyB0b28gbGFyZ2UgdG8gZm9ybSBhbiBJUEMgcGFja2V0LicsXG4gICAgW1JVTlRJTUVfRVJST1JTLm1hbGZvcm1lZElQQ01lc3NhZ2VdOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDYW5ub3QgcHJvY2VzcyBhIG1hbGZvcm1lZCBJUEMgbWVzc2FnZS4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy51bmV4cGVjdGVkSVBDSGVhZFBhY2tldF06ICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2Fubm90IGNyZWF0ZSBhbiBJUEMgbWVzc2FnZSBkdWUgdG8gYW4gdW5leHBlY3RlZCBJUEMgaGVhZCBwYWNrZXQuJyxcbiAgICBbUlVOVElNRV9FUlJPUlMudW5leHBlY3RlZElQQ0JvZHlQYWNrZXRdOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Nhbm5vdCBjcmVhdGUgYW4gSVBDIG1lc3NhZ2UgZHVlIHRvIGFuIHVuZXhwZWN0ZWQgSVBDIGJvZHkgcGFja2V0LicsXG4gICAgW1JVTlRJTUVfRVJST1JTLnVuZXhwZWN0ZWRJUENUYWlsUGFja2V0XTogICAgICAgICAgICAgICAgICAgICAgICAgICdDYW5ub3QgY3JlYXRlIGFuIElQQyBtZXNzYWdlIGR1ZSB0byBhbiB1bmV4cGVjdGVkIElQQyB0YWlsIHBhY2tldC4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RSdW5Mb2NhbE5vbkhlYWRsZXNzQnJvd3NlcldpdGhvdXREaXNwbGF5XTpcbiAgICAgICAgJ1lvdXIgTGludXggdmVyc2lvbiBkb2VzIG5vdCBoYXZlIGEgZ3JhcGhpYyBzdWJzeXN0ZW0gdG8gcnVuIHticm93c2VyQWxpYXN9IHdpdGggYSBHVUkuICcgK1xuICAgICAgICAnWW91IGNhbiBsYXVuY2ggdGhlIGJyb3dzZXIgaW4gaGVhZGxlc3MgbW9kZS4gJyArXG4gICAgICAgICdJZiB5b3UgdXNlIGEgcG9ydGFibGUgYnJvd3NlciB2ZXJzaW9uLCAnICtcbiAgICAgICAgJ3NwZWNpZnkgdGhlIGJyb3dzZXIgYWxpYXMgYmVmb3JlIHRoZSBwYXRoIGluc3RlYWQgb2YgdGhlIFxcJ3BhdGhcXCcgcHJlZml4LiAnICtcbiAgICAgICAgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cHM6Ly9kZXZleHByZXNzLmdpdGh1Yi5pby90ZXN0Y2FmZS9kb2N1bWVudGF0aW9uL2d1aWRlcy9jb25jZXB0cy9icm93c2Vycy5odG1sI3Rlc3QtaW4taGVhZGxlc3MtbW9kZScsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMudW5jYXVnaHRFcnJvckluUmVwb3J0ZXJdOiAgICAgICAgICAgJ0FuIHVuY2F1Z2h0IGVycm9yIG9jY3VycmVkIGluIHRoZSBcIntyZXBvcnRlck5hbWV9XCIgcmVwb3J0ZXJcXCdzIFwie21ldGhvZE5hbWV9XCIgbWV0aG9kLiBFcnJvciBkZXRhaWxzOlxcbntvcmlnaW5hbEVycm9yfScsXG4gICAgW1JVTlRJTUVfRVJST1JTLnJvbGVJbml0aWFsaXplZFdpdGhSZWxhdGl2ZVVybF06ICAgICdZb3UgY2Fubm90IHNwZWNpZnkgcmVsYXRpdmUgbG9naW4gcGFnZSBVUkxzIGluIHRoZSBSb2xlIGNvbnN0cnVjdG9yLiBVc2UgYW4gYWJzb2x1dGUgVVJMLicsXG4gICAgW1JVTlRJTUVfRVJST1JTLnR5cGVTY3JpcHRDb21waWxlckxvYWRpbmdFcnJvcl06ICAgICdVbmFibGUgdG8gbG9hZCB0aGUgVHlwZVNjcmlwdCBjb21waWxlci5cXG57b3JpZ2luRXJyb3JNZXNzYWdlfS4nLFxuICAgIFtSVU5USU1FX0VSUk9SUy5jYW5ub3RDdXN0b21pemVTcGVjaWZpZWRDb21waWxlcnNdOiAnWW91IGNhbm5vdCBzcGVjaWZ5IG9wdGlvbnMgZm9yIHRoZSB7bm9uY3VzdG9taXphYmxlQ29tcGlsZXJMaXN0fSBjb21waWxlcntzdWZmaXh9LicsXG5cbiAgICBbUlVOVElNRV9FUlJPUlMuY2Fubm90RW5hYmxlUmV0cnlUZXN0UGFnZXNPcHRpb25dOlxuICAgICAgICAnQ2Fubm90IGVuYWJsZSB0aGUgXFwncmV0cnlUZXN0UGFnZXNcXCcgb3B0aW9uLiBBcHBseSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gc29sdXRpb25zOlxcbicgK1xuICAgICAgICAnLS0gc2V0IFxcJ2xvY2FsaG9zdFxcJyBhcyB0aGUgdmFsdWUgb2YgdGhlIFxcJ2hvc3RuYW1lXFwnIG9wdGlvblxcbicgK1xuICAgICAgICAnLS0gcnVuIFRlc3RDYWZlIG92ZXIgSFRUUFNcXG4nLFxuXG4gICAgW1JVTlRJTUVfRVJST1JTLmJyb3dzZXJDb25uZWN0aW9uRXJyb3JdOiAgICAgICAgICAgICAgICd7b3JpZ2luRXJyb3JNZXNzYWdlfVxcbntudW1PZk5vdE9wZW5lZENvbm5lY3Rpb259IG9mIHtudW1PZkFsbENvbm5lY3Rpb25zfSBicm93c2VyIGNvbm5lY3Rpb25zIGhhdmUgbm90IGJlZW4gZXN0YWJsaXNoZWQ6XFxue2xpc3RPZk5vdE9wZW5lZENvbm5lY3Rpb25zfVxcblxcbkhpbnRzOlxcbntsaXN0T2ZIaW50c30nLFxuICAgIFtCcm93c2VyQ29ubmVjdGlvbkVycm9ySGludC5Ub29IaWdoQ29uY3VycmVuY3lGYWN0b3JdOiAnVGhlIGVycm9yIGNhbiBiZSBkdWUgdG8gYSBjb25jdXJyZW5jeSBmYWN0b3IgdGhhdCBpcyB0b28gaGlnaCBmb3IgdGhlIGhvc3QgbWFjaGluZeKAmXMgcGVyZm9ybWFuY2UgKHRoZSBmYWN0b3IgdmFsdWUge2NvbmN1cnJlbmN5RmFjdG9yfSB3YXMgc3BlY2lmaWVkKS4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcnkgdG8gZGVjcmVhc2UgdGhlIGNvbmN1cnJlbmN5IGZhY3RvciBvciBlbnN1cmUgbW9yZSBzeXN0ZW0gcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgb24gdGhlIGhvc3QgbWFjaGluZS4nLFxuICAgIFtCcm93c2VyQ29ubmVjdGlvbkVycm9ySGludC5Vc2VCcm93c2VySW5pdE9wdGlvbl06ICdVc2UgdGhlIFwiYnJvd3NlckluaXRUaW1lb3V0XCIgb3B0aW9uIHRvIGFsbG93IG1vcmUgdGltZSBmb3IgdGhlIGJyb3dzZXIgdG8gc3RhcnQuIFRoZSB0aW1lb3V0IGlzIHNldCB0byB7YnJvd3NlckluaXRUaW1lb3V0TXNnfS4nLFxuICAgIFtCcm93c2VyQ29ubmVjdGlvbkVycm9ySGludC5SZXN0RXJyb3JDYXVzZXNdOiAgICAgICdUaGUgZXJyb3IgY2FuIGFsc28gYmUgY2F1c2VkIGJ5IG5ldHdvcmsgaXNzdWVzIG9yIHJlbW90ZSBkZXZpY2UgZmFpbHVyZS4gTWFrZSBzdXJlIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgc3RhYmxlIGFuZCB0aGUgcmVtb3RlIGRldmljZSBjYW4gYmUgcmVhY2hlZC4nXG59O1xuIl19