1 | ;
|
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 lodash_1 = require("lodash");
|
7 | const test_run_controller_1 = __importDefault(require("./test-run-controller"));
|
8 | const controller_1 = __importDefault(require("./controller"));
|
9 | const runner_1 = __importDefault(require("../runner"));
|
10 | const bootstrapper_1 = __importDefault(require("./bootstrapper"));
|
11 | const parse_file_list_1 = __importDefault(require("../utils/parse-file-list"));
|
12 | const runtime_1 = require("../errors/runtime");
|
13 | const types_1 = require("../errors/types");
|
14 | class LiveModeRunner extends runner_1.default {
|
15 | constructor(proxy, browserConnectionGateway, options) {
|
16 | super(proxy, browserConnectionGateway, options);
|
17 | this.stopping = false;
|
18 | this.runnerTaskPromise = null;
|
19 | this.stopInfiniteWaiting = lodash_1.noop;
|
20 | this.rejectInfiniteWaiting = lodash_1.noop;
|
21 | this.assets = null;
|
22 | this.testRunController = new test_run_controller_1.default();
|
23 | this.controller = this._createController();
|
24 | this.embeddingOptions({
|
25 | TestRunCtor: this.testRunController.TestRunCtor,
|
26 | assets: []
|
27 | });
|
28 | this.controller = this._createController();
|
29 | this.configurationCache = null;
|
30 | }
|
31 | runTests(isFirstRun = false) {
|
32 | let runError = null;
|
33 | return this._finishPreviousTestRuns()
|
34 | .then(() => {
|
35 | return this._validateRunnableConfiguration(isFirstRun);
|
36 | })
|
37 | .then(() => {
|
38 | this.testRunController.setExpectedTestCount(this.configurationCache.tests.filter(t => !t.skip).length);
|
39 | })
|
40 | .then(() => {
|
41 | this.runnerTaskPromise = super.run(this.opts);
|
42 | return this.runnerTaskPromise;
|
43 | })
|
44 | .catch(err => {
|
45 | this.setBootstrappingError(null);
|
46 | runError = err;
|
47 | })
|
48 | .then(() => {
|
49 | this.runnerTaskPromise = null;
|
50 | this.controller.onTestRunDone(runError);
|
51 | });
|
52 | }
|
53 | _validateRunOptions() {
|
54 | return super._validateRunOptions()
|
55 | .catch(err => {
|
56 | this.rejectInfiniteWaiting(err);
|
57 | });
|
58 | }
|
59 | _createRunnableConfiguration() {
|
60 | if (this.configurationCache)
|
61 | return Promise.resolve(this.configurationCache);
|
62 | return super._createRunnableConfiguration()
|
63 | .then(configuration => {
|
64 | this.configurationCache = configuration;
|
65 | return configuration;
|
66 | })
|
67 | .catch(err => {
|
68 | this.rejectInfiniteWaiting(err);
|
69 | });
|
70 | }
|
71 | setBootstrappingError(err) {
|
72 | this.bootstrappingError = err;
|
73 | }
|
74 | run(options) {
|
75 | this.configurationCache = null;
|
76 | if (this._running)
|
77 | throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotRunLiveModeRunnerMultipleTimes);
|
78 | this._running = this._waitUntilExit()
|
79 | .then(() => {
|
80 | return this._dispose();
|
81 | })
|
82 | .then(() => {
|
83 | delete this._running;
|
84 | });
|
85 | this.opts = Object.assign({}, this.opts, options);
|
86 | this._setBootstrapperOptions();
|
87 | const fileListPromise = parse_file_list_1.default(this.bootstrapper.sources, process.cwd());
|
88 | fileListPromise
|
89 | .then(files => {
|
90 | return this.controller.init(files);
|
91 | })
|
92 | .then(() => this._createRunnableConfiguration())
|
93 | .then(() => this.runTests(true));
|
94 | return this._running;
|
95 | }
|
96 | suspend() {
|
97 | if (!this.runnerTaskPromise)
|
98 | return Promise.resolve();
|
99 | this.stopping = true;
|
100 | this.testRunController.stop();
|
101 | this.runnerTaskPromise.cancel();
|
102 | return this.testRunController.allTestsCompletePromise
|
103 | .then(() => {
|
104 | this.stopping = false;
|
105 | this.controller.onTestRunDone();
|
106 | });
|
107 | }
|
108 | stop() {
|
109 | return super.stop()
|
110 | .then(() => {
|
111 | return this.controller.exit();
|
112 | });
|
113 | }
|
114 | exit() {
|
115 | if (this.runnerTaskPromise)
|
116 | this.runnerTaskPromise.cancel();
|
117 | return Promise.resolve()
|
118 | .then(() => this.stopInfiniteWaiting())
|
119 | .then(() => this._running);
|
120 | }
|
121 | async _finishPreviousTestRuns() {
|
122 | if (!this.configurationCache.tests)
|
123 | return;
|
124 | this.testRunController.run();
|
125 | }
|
126 | _validateRunnableConfiguration(isFirstRun) {
|
127 | if (isFirstRun) {
|
128 | if (this.bootstrappingError)
|
129 | return Promise.reject(this.bootstrappingError);
|
130 | return Promise.resolve();
|
131 | }
|
132 | return this.bootstrapper._getTests()
|
133 | .then(tests => {
|
134 | this.configurationCache.tests = tests;
|
135 | return this.bootstrappingError ? Promise.reject(this.bootstrappingError) : Promise.resolve();
|
136 | });
|
137 | }
|
138 | _createTask(tests, browserConnectionGroups, proxy, opts) {
|
139 | opts.live = true;
|
140 | return super._createTask(tests, browserConnectionGroups, proxy, opts);
|
141 | }
|
142 | _createBootstrapper(browserConnectionGateway) {
|
143 | return new bootstrapper_1.default(this, browserConnectionGateway);
|
144 | }
|
145 | _createController() {
|
146 | return new controller_1.default(this);
|
147 | }
|
148 | _waitUntilExit() {
|
149 | return new Promise((resolve, reject) => {
|
150 | this.stopInfiniteWaiting = resolve;
|
151 | this.rejectInfiniteWaiting = reject;
|
152 | });
|
153 | }
|
154 | _disposeAssets(browserSet, reporters, testedApp) {
|
155 | this.assets = { browserSet, reporters, testedApp };
|
156 | return Promise.resolve();
|
157 | }
|
158 | _dispose() {
|
159 | this.controller.dispose();
|
160 | if (!this.assets)
|
161 | return Promise.resolve();
|
162 | const { browserSet, reporters, testedApp } = this.assets;
|
163 | return super._disposeAssets(browserSet, reporters, testedApp);
|
164 | }
|
165 | }
|
166 | exports.default = LiveModeRunner;
|
167 | module.exports = exports.default;
|
168 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGl2ZS90ZXN0LXJ1bm5lci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUE4QjtBQUM5QixnRkFBOEQ7QUFDOUQsOERBQThDO0FBQzlDLHVEQUErQjtBQUMvQixrRUFBa0Q7QUFDbEQsK0VBQXFEO0FBQ3JELCtDQUFpRDtBQUNqRCwyQ0FBaUQ7QUFFakQsTUFBTSxjQUFlLFNBQVEsZ0JBQU07SUFDL0IsWUFBYSxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsT0FBTztRQUNqRCxLQUFLLENBQUMsS0FBSyxFQUFFLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRWhELElBQUksQ0FBQyxRQUFRLEdBQWdCLEtBQUssQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEdBQU8sSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxtQkFBbUIsR0FBSyxhQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLGFBQUksQ0FBQztRQUVsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUVuQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSw2QkFBeUIsRUFBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxVQUFVLEdBQVUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFHbEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQ2xCLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVztZQUMvQyxNQUFNLEVBQU8sRUFBRTtTQUNsQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFXLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDbkMsQ0FBQztJQUVELFFBQVEsQ0FBRSxVQUFVLEdBQUcsS0FBSztRQUN4QixJQUFJLFFBQVEsR0FBRyxJQUFJ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O0lBQzFFLENBQUM7SUFFRCxtQkFBbUIsQ0FBRSx3QkFBd0I7UUFDekMsT0FBTyxJQUFJLHNCQUFvQixDQUFDLElBQUksRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxpQkFBaUI7UUFDYixPQUFPLElBQUksb0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELGNBQWM7UUFDVixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ25DLElBQUksQ0FBQyxtQkFBbUIsR0FBSyxPQUFPLENBQUM7WUFDckMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxjQUFjLENBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBRW5ELE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUxQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDWixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU3QixNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRXpELE9BQU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7Q0FDSjtBQUVELGtCQUFlLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG5vb3AgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IExpdmVNb2RlVGVzdFJ1bkNvbnRyb2xsZXIgZnJvbSAnLi90ZXN0LXJ1bi1jb250cm9sbGVyJztcbmltcG9ydCBMaXZlTW9kZUNvbnRyb2xsZXIgZnJvbSAnLi9jb250cm9sbGVyJztcbmltcG9ydCBSdW5uZXIgZnJvbSAnLi4vcnVubmVyJztcbmltcG9ydCBMaXZlTW9kZUJvb3RzdHJhcHBlciBmcm9tICcuL2Jvb3RzdHJhcHBlcic7XG5pbXBvcnQgcGFyc2VGaWxlTGlzdCBmcm9tICcuLi91dGlscy9wYXJzZS1maWxlLWxpc3QnO1xuaW1wb3J0IHsgR2VuZXJhbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi9lcnJvcnMvdHlwZXMnO1xuXG5jbGFzcyBMaXZlTW9kZVJ1bm5lciBleHRlbmRzIFJ1bm5lciB7XG4gICAgY29uc3RydWN0b3IgKHByb3h5LCBicm93c2VyQ29ubmVjdGlvbkdhdGV3YXksIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIocHJveHksIGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5zdG9wcGluZyAgICAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ydW5uZXJUYXNrUHJvbWlzZSAgICAgPSBudWxsO1xuICAgICAgICB0aGlzLnN0b3BJbmZpbml0ZVdhaXRpbmcgICA9IG5vb3A7XG4gICAgICAgIHRoaXMucmVqZWN0SW5maW5pdGVXYWl0aW5nID0gbm9vcDtcblxuICAgICAgICB0aGlzLmFzc2V0cyA9IG51bGw7XG5cbiAgICAgICAgdGhpcy50ZXN0UnVuQ29udHJvbGxlciA9IG5ldyBMaXZlTW9kZVRlc3RSdW5Db250cm9sbGVyKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciAgICAgICAgPSB0aGlzLl9jcmVhdGVDb250cm9sbGVyKCk7XG5cblxuICAgICAgICB0aGlzLmVtYmVkZGluZ09wdGlvbnMoe1xuICAgICAgICAgICAgVGVzdFJ1bkN0b3I6IHRoaXMudGVzdFJ1bkNvbnRyb2xsZXIuVGVzdFJ1bkN0b3IsXG4gICAgICAgICAgICBhc3NldHM6ICAgICAgW11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciAgICAgICAgID0gdGhpcy5fY3JlYXRlQ29udHJvbGxlcigpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25DYWNoZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcnVuVGVzdHMgKGlzRmlyc3RSdW4gPSBmYWxzZSkge1xuICAgICAgICBsZXQgcnVuRXJyb3IgPSBudWxsO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9maW5pc2hQcmV2aW91c1Rlc3RSdW5zKClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVSdW5uYWJsZUNvbmZpZ3VyYXRpb24oaXNGaXJzdFJ1bik7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGVzdFJ1bkNvbnRyb2xsZXIuc2V0RXhwZWN0ZWRUZXN0Q291bnQodGhpcy5jb25maWd1cmF0aW9uQ2FjaGUudGVzdHMuZmlsdGVyKHQgPT4gIXQuc2tpcCkubGVuZ3RoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJUYXNrUHJvbWlzZSA9IHN1cGVyLnJ1bih0aGlzLm9wdHMpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVubmVyVGFza1Byb21pc2U7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRCb290c3RyYXBwaW5nRXJyb3IobnVsbCk7XG5cbiAgICAgICAgICAgICAgICBydW5FcnJvciA9IGVycjtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJUYXNrUHJvbWlzZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIub25UZXN0UnVuRG9uZShydW5FcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVSdW5PcHRpb25zICgpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLl92YWxpZGF0ZVJ1bk9wdGlvbnMoKVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWplY3RJbmZpbml0ZVdhaXRpbmcoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9jcmVhdGVSdW5uYWJsZUNvbmZpZ3VyYXRpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uQ2FjaGUpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29uZmlndXJhdGlvbkNhY2hlKTtcblxuICAgICAgICByZXR1cm4gc3VwZXIuX2NyZWF0ZVJ1bm5hYmxlQ29uZmlndXJhdGlvbigpXG4gICAgICAgICAgICAudGhlbihjb25maWd1cmF0aW9uID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25DYWNoZSA9IGNvbmZpZ3VyYXRpb247XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbjtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlamVjdEluZmluaXRlV2FpdGluZyhlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0Qm9vdHN0cmFwcGluZ0Vycm9yIChlcnIpIHtcbiAgICAgICAgdGhpcy5ib290c3RyYXBwaW5nRXJyb3IgPSBlcnI7XG4gICAgfVxuXG4gICAgcnVuIChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkNhY2hlID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5fcnVubmluZylcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2Fubm90UnVuTGl2ZU1vZGVSdW5uZXJNdWx0aXBsZVRpbWVzKTtcblxuICAgICAgICB0aGlzLl9ydW5uaW5nID0gdGhpcy5fd2FpdFVudGlsRXhpdCgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3Bvc2UoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3J1bm5pbmc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuX3NldEJvb3RzdHJhcHBlck9wdGlvbnMoKTtcblxuICAgICAgICBjb25zdCBmaWxlTGlzdFByb21pc2UgPSBwYXJzZUZpbGVMaXN0KHRoaXMuYm9vdHN0cmFwcGVyLnNvdXJjZXMsIHByb2Nlc3MuY3dkKCkpO1xuXG4gICAgICAgIGZpbGVMaXN0UHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oZmlsZXMgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuaW5pdChmaWxlcyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5fY3JlYXRlUnVubmFibGVDb25maWd1cmF0aW9uKCkpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJ1blRlc3RzKHRydWUpKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fcnVubmluZztcbiAgICB9XG5cbiAgICBzdXNwZW5kICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJ1bm5lclRhc2tQcm9taXNlKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgIHRoaXMuc3RvcHBpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlc3RSdW5Db250cm9sbGVyLnN0b3AoKTtcbiAgICAgICAgdGhpcy5ydW5uZXJUYXNrUHJvbWlzZS5jYW5jZWwoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy50ZXN0UnVuQ29udHJvbGxlci5hbGxUZXN0c0NvbXBsZXRlUHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcHBpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5vblRlc3RSdW5Eb25lKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdG9wICgpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnN0b3AoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZXhpdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZXhpdCAoKSB7XG4gICAgICAgIGlmICh0aGlzLnJ1bm5lclRhc2tQcm9taXNlKVxuICAgICAgICAgICAgdGhpcy5ydW5uZXJUYXNrUHJvbWlzZS5jYW5jZWwoKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuc3RvcEluZmluaXRlV2FpdGluZygpKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5fcnVubmluZyk7XG4gICAgfVxuXG4gICAgYXN5bmMgX2ZpbmlzaFByZXZpb3VzVGVzdFJ1bnMgKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbkNhY2hlLnRlc3RzKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy50ZXN0UnVuQ29udHJvbGxlci5ydW4oKTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVSdW5uYWJsZUNvbmZpZ3VyYXRpb24gKGlzRmlyc3RSdW4pIHtcbiAgICAgICAgaWYgKGlzRmlyc3RSdW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJvb3RzdHJhcHBpbmdFcnJvcilcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QodGhpcy5ib290c3RyYXBwaW5nRXJyb3IpO1xuXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5ib290c3RyYXBwZXIuX2dldFRlc3RzKClcbiAgICAgICAgICAgIC50aGVuKHRlc3RzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25DYWNoZS50ZXN0cyA9IHRlc3RzO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYm9vdHN0cmFwcGluZ0Vycm9yID8gUHJvbWlzZS5yZWplY3QodGhpcy5ib290c3RyYXBwaW5nRXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfY3JlYXRlVGFzayAodGVzdHMsIGJyb3dzZXJDb25uZWN0aW9uR3JvdXBzLCBwcm94eSwgb3B0cykge1xuICAgICAgICBvcHRzLmxpdmUgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBzdXBlci5fY3JlYXRlVGFzayh0ZXN0cywgYnJvd3NlckNvbm5lY3Rpb25Hcm91cHMsIHByb3h5LCBvcHRzKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQm9vdHN0cmFwcGVyIChicm93c2VyQ29ubmVjdGlvbkdhdGV3YXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMaXZlTW9kZUJvb3RzdHJhcHBlcih0aGlzLCBicm93c2VyQ29ubmVjdGlvbkdhdGV3YXkpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDb250cm9sbGVyICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMaXZlTW9kZUNvbnRyb2xsZXIodGhpcyk7XG4gICAgfVxuXG4gICAgX3dhaXRVbnRpbEV4aXQgKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdG9wSW5maW5pdGVXYWl0aW5nICAgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5yZWplY3RJbmZpbml0ZVdhaXRpbmcgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9kaXNwb3NlQXNzZXRzIChicm93c2VyU2V0LCByZXBvcnRlcnMsIHRlc3RlZEFwcCkge1xuICAgICAgICB0aGlzLmFzc2V0cyA9IHsgYnJvd3NlclNldCwgcmVwb3J0ZXJzLCB0ZXN0ZWRBcHAgfTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgX2Rpc3Bvc2UgKCkge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZGlzcG9zZSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5hc3NldHMpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgY29uc3QgeyBicm93c2VyU2V0LCByZXBvcnRlcnMsIHRlc3RlZEFwcCB9ID0gdGhpcy5hc3NldHM7XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9kaXNwb3NlQXNzZXRzKGJyb3dzZXJTZXQsIHJlcG9ydGVycywgdGVzdGVkQXBwKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpdmVNb2RlUnVubmVyO1xuIl19 |
\ | No newline at end of file |