"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const runtime_1 = require("./errors/runtime"); const types_1 = require("./errors/types"); const content_types_1 = __importDefault(require("./assets/content-types")); const option_names_1 = __importDefault(require("./configuration/option-names")); const INJECTABLES = __importStar(require("./assets/injectables")); const setup_sourcemap_support_1 = require("./utils/setup-sourcemap-support"); const lazyRequire = require('import-lazy')(require); const hammerhead = lazyRequire('testcafe-hammerhead'); const loadAssets = lazyRequire('./load-assets'); const errorHandlers = lazyRequire('./utils/handle-errors'); const BrowserConnectionGateway = lazyRequire('./browser/connection/gateway'); const BrowserConnection = lazyRequire('./browser/connection'); const browserProviderPool = lazyRequire('./browser/provider/pool'); const CompilerHost = lazyRequire('./services/compiler/host'); const Runner = lazyRequire('./runner'); const LiveModeRunner = lazyRequire('./live/test-runner'); // NOTE: CoffeeScript can't be loaded lazily, because it will break stack traces require('coffeescript'); class TestCafe { constructor(configuration) { (0, setup_sourcemap_support_1.setupSourceMapSupport)(); errorHandlers.registerErrorHandlers(); const { hostname, port1, port2, options } = configuration.startOptions; this.closed = false; this.proxy = new hammerhead.Proxy(hostname, port1, port2, options); this.runners = []; this.configuration = configuration; this.browserConnectionGateway = new BrowserConnectionGateway(this.proxy, { retryTestPages: configuration.getOption(option_names_1.default.retryTestPages), proxyless: configuration.getOption(option_names_1.default.experimentalProxyless), }); if (configuration.getOption(option_names_1.default.experimentalDebug)) { const developmentMode = configuration.getOption(option_names_1.default.developmentMode); const v8Flags = configuration.getOption(option_names_1.default.v8Flags); this.compilerService = new CompilerHost({ developmentMode, v8Flags }); } this._registerAssets(options.developmentMode); } _registerAssets(developmentMode) { const { favIcon, coreScript, driverScript, uiScript, uiStyle, uiSprite, uiSpriteSvg, automationScript, legacyRunnerScript } = loadAssets(developmentMode); this.proxy.GET(INJECTABLES.TESTCAFE_CORE, { content: coreScript, contentType: content_types_1.default.javascript }); this.proxy.GET(INJECTABLES.TESTCAFE_DRIVER, { content: driverScript, contentType: content_types_1.default.javascript }); this.proxy.GET(INJECTABLES.TESTCAFE_LEGACY_RUNNER, { content: legacyRunnerScript, contentType: content_types_1.default.javascript, }); this.proxy.GET(INJECTABLES.TESTCAFE_AUTOMATION, { content: automationScript, contentType: content_types_1.default.javascript }); this.proxy.GET(INJECTABLES.TESTCAFE_UI, { content: uiScript, contentType: content_types_1.default.javascript }); this.proxy.GET(INJECTABLES.TESTCAFE_UI_SPRITE, { content: uiSprite, contentType: content_types_1.default.png }); this.proxy.GET(INJECTABLES.TESTCAFE_UI_SPRITE_SVG, { content: uiSpriteSvg, contentType: content_types_1.default.svg }); this.proxy.GET(INJECTABLES.DEFAULT_FAVICON_PATH, { content: favIcon, contentType: content_types_1.default.icon }); this.proxy.GET(INJECTABLES.TESTCAFE_UI_STYLES, { content: uiStyle, contentType: content_types_1.default.css, isShadowUIStylesheet: true, }); } _createRunner(isLiveMode) { const Ctor = isLiveMode ? LiveModeRunner : Runner; const newRunner = new Ctor({ proxy: this.proxy, browserConnectionGateway: this.browserConnectionGateway, configuration: this.configuration.clone(option_names_1.default.hooks), compilerService: this.compilerService, }); this.runners.push(newRunner); return newRunner; } // API async createBrowserConnection() { const browserInfo = await browserProviderPool.getBrowserInfo('remote'); return new BrowserConnection(this.browserConnectionGateway, browserInfo, true); } createRunner() { return this._createRunner(false); } createLiveModeRunner() { if (this.runners.some(runner => runner instanceof LiveModeRunner)) throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotCreateMultipleLiveModeRunners); return this._createRunner(true); } async close() { if (this.closed) return; this.closed = true; await Promise.all(this.runners.map(runner => runner.stop())); await browserProviderPool.dispose(); if (this.compilerService) this.compilerService.stop(); await this.browserConnectionGateway.close(); this.proxy.close(); } } exports.default = TestCafe; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGNhZmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGVzdGNhZmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQUFnRDtBQUNoRCwwQ0FBZ0Q7QUFDaEQsMkVBQW1EO0FBQ25ELGdGQUF3RDtBQUN4RCxrRUFBb0Q7QUFDcEQsNkVBQXdFO0FBRXhFLE1BQU0sV0FBVyxHQUFnQixPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakUsTUFBTSxVQUFVLEdBQWlCLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ3BFLE1BQU0sVUFBVSxHQUFpQixXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDOUQsTUFBTSxhQUFhLEdBQWMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDdEUsTUFBTSx3QkFBd0IsR0FBRyxXQUFXLENBQUMsOEJBQThCLENBQUMsQ0FBQztBQUM3RSxNQUFNLGlCQUFpQixHQUFVLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3JFLE1BQU0sbUJBQW1CLEdBQVEsV0FBVyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDeEUsTUFBTSxZQUFZLEdBQWUsV0FBVyxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFDekUsTUFBTSxNQUFNLEdBQXFCLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN6RCxNQUFNLGNBQWMsR0FBYSxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUVuRSxnRkFBZ0Y7QUFDaEYsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRXhCLE1BQXFCLFFBQVE7SUFDekIsWUFBYSxhQUFhO1FBQ3RCLElBQUEsK0NBQXFCLEdBQUUsQ0FBQztRQUN4QixhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUV0QyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxF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QUFDO0lBQ3JDLENBQUM7SUFFRCxvQkFBb0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sWUFBWSxjQUFjLENBQUM7WUFDN0QsTUFBTSxJQUFJLHNCQUFZLENBQUMsc0JBQWMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBRS9FLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDUCxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQ1gsT0FBTztRQUVYLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBRW5CLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFN0QsTUFBTSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVwQyxJQUFJLElBQUksQ0FBQyxlQUFlO1lBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFaEMsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO0NBQ0o7QUFwR0QsMkJBb0dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2VuZXJhbEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCBDT05URU5UX1RZUEVTIGZyb20gJy4vYXNzZXRzL2NvbnRlbnQtdHlwZXMnO1xuaW1wb3J0IE9QVElPTl9OQU1FUyBmcm9tICcuL2NvbmZpZ3VyYXRpb24vb3B0aW9uLW5hbWVzJztcbmltcG9ydCAqIGFzIElOSkVDVEFCTEVTIGZyb20gJy4vYXNzZXRzL2luamVjdGFibGVzJztcbmltcG9ydCB7IHNldHVwU291cmNlTWFwU3VwcG9ydCB9IGZyb20gJy4vdXRpbHMvc2V0dXAtc291cmNlbWFwLXN1cHBvcnQnO1xuXG5jb25zdCBsYXp5UmVxdWlyZSAgICAgICAgICAgICAgPSByZXF1aXJlKCdpbXBvcnQtbGF6eScpKHJlcXVpcmUpO1xuY29uc3QgaGFtbWVyaGVhZCAgICAgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnKTtcbmNvbnN0IGxvYWRBc3NldHMgICAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2xvYWQtYXNzZXRzJyk7XG5jb25zdCBlcnJvckhhbmRsZXJzICAgICAgICAgICAgPSBsYXp5UmVxdWlyZSgnLi91dGlscy9oYW5kbGUtZXJyb3JzJyk7XG5jb25zdCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkgPSBsYXp5UmVxdWlyZSgnLi9icm93c2VyL2Nvbm5lY3Rpb24vZ2F0ZXdheScpO1xuY29uc3QgQnJvd3NlckNvbm5lY3Rpb24gICAgICAgID0gbGF6eVJlcXVpcmUoJy4vYnJvd3Nlci9jb25uZWN0aW9uJyk7XG5jb25zdCBicm93c2VyUHJvdmlkZXJQb29sICAgICAgPSBsYXp5UmVxdWlyZSgnLi9icm93c2VyL3Byb3ZpZGVyL3Bvb2wnKTtcbmNvbnN0IENvbXBpbGVySG9zdCAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL3NlcnZpY2VzL2NvbXBpbGVyL2hvc3QnKTtcbmNvbnN0IFJ1bm5lciAgICAgICAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL3J1bm5lcicpO1xuY29uc3QgTGl2ZU1vZGVSdW5uZXIgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJy4vbGl2ZS90ZXN0LXJ1bm5lcicpO1xuXG4vLyBOT1RFOiBDb2ZmZWVTY3JpcHQgY2FuJ3QgYmUgbG9hZGVkIGxhemlseSwgYmVjYXVzZSBpdCB3aWxsIGJyZWFrIHN0YWNrIHRyYWNlc1xucmVxdWlyZSgnY29mZmVlc2NyaXB0Jyk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RDYWZlIHtcbiAgICBjb25zdHJ1Y3RvciAoY29uZmlndXJhdGlvbikge1xuICAgICAgICBzZXR1cFNvdXJjZU1hcFN1cHBvcnQoKTtcbiAgICAgICAgZXJyb3JIYW5kbGVycy5yZWdpc3RlckVycm9ySGFuZGxlcnMoKTtcblxuICAgICAgICBjb25zdCB7IGhvc3RuYW1lLCBwb3J0MSwgcG9ydDIsIG9wdGlvbnMgfSA9IGNvbmZpZ3VyYXRpb24uc3RhcnRPcHRpb25zO1xuXG4gICAgICAgIHRoaXMuY2xvc2VkICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByb3h5ICAgICAgICAgPSBuZXcgaGFtbWVyaGVhZC5Qcm94eShob3N0bmFtZSwgcG9ydDEsIHBvcnQyLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5ydW5uZXJzICAgICAgID0gW107XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG5cbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkgPSBuZXcgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5KHRoaXMucHJveHksIHtcbiAgICAgICAgICAgIHJldHJ5VGVzdFBhZ2VzOiBjb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMucmV0cnlUZXN0UGFnZXMpLFxuICAgICAgICAgICAgcHJveHlsZXNzOiAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5leHBlcmltZW50YWxQcm94eWxlc3MpLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmV4cGVyaW1lbnRhbERlYnVnKSkge1xuICAgICAgICAgICAgY29uc3QgZGV2ZWxvcG1lbnRNb2RlID0gY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmRldmVsb3BtZW50TW9kZSk7XG4gICAgICAgICAgICBjb25zdCB2OEZsYWdzICAgICAgICAgPSBjb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMudjhGbGFncyk7XG5cbiAgICAgICAgICAgIHRoaXMuY29tcGlsZXJTZXJ2aWNlID0gbmV3IENvbXBpbGVySG9zdCh7IGRldmVsb3BtZW50TW9kZSwgdjhGbGFncyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyQXNzZXRzKG9wdGlvbnMuZGV2ZWxvcG1lbnRNb2RlKTtcbiAgICB9XG5cbiAgICBfcmVnaXN0ZXJBc3NldHMgKGRldmVsb3BtZW50TW9kZSkge1xuICAgICAgICBjb25zdCB7IGZhdkljb24sIGNvcmVTY3JpcHQsIGRyaXZlclNjcmlwdCwgdWlTY3JpcHQsXG4gICAgICAgICAgICB1aVN0eWxlLCB1aVNwcml0ZSwgdWlTcHJpdGVTdmcsIGF1dG9tYXRpb25TY3JpcHQsIGxlZ2FjeVJ1bm5lclNjcmlwdCB9ID0gbG9hZEFzc2V0cyhkZXZlbG9wbWVudE1vZGUpO1xuXG4gICAgICAgIHRoaXMucHJveHkuR0VUKElOSkVDVEFCTEVTLlRFU1RDQUZFX0NPUkUsIHsgY29udGVudDogY29yZVNjcmlwdCwgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdCB9KTtcbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuVEVTVENBRkVfRFJJVkVSLCB7IGNvbnRlbnQ6IGRyaXZlclNjcmlwdCwgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdCB9KTtcblxuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9MRUdBQ1lfUlVOTkVSLCB7XG4gICAgICAgICAgICBjb250ZW50OiAgICAgbGVnYWN5UnVubmVyU2NyaXB0LFxuICAgICAgICAgICAgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuVEVTVENBRkVfQVVUT01BVElPTiwgeyBjb250ZW50OiBhdXRvbWF0aW9uU2NyaXB0LCBjb250ZW50VHlwZTogQ09OVEVOVF9UWVBFUy5qYXZhc2NyaXB0IH0pO1xuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9VSSwgeyBjb250ZW50OiB1aVNjcmlwdCwgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdCB9KTtcbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuVEVTVENBRkVfVUlfU1BSSVRFLCB7IGNvbnRlbnQ6IHVpU3ByaXRlLCBjb250ZW50VHlwZTogQ09OVEVOVF9UWVBFUy5wbmcgfSk7XG4gICAgICAgIHRoaXMucHJveHkuR0VUKElOSkVDVEFCTEVTLlRFU1RDQUZFX1VJX1NQUklURV9TVkcsIHsgY29udGVudDogdWlTcHJpdGVTdmcsIGNvbnRlbnRUeXBlOiBDT05URU5UX1RZUEVTLnN2ZyB9KTtcbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuREVGQVVMVF9GQVZJQ09OX1BBVEgsIHsgY29udGVudDogZmF2SWNvbiwgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuaWNvbiB9KTtcblxuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9VSV9TVFlMRVMsIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6ICAgICAgICAgICAgICB1aVN0eWxlLFxuICAgICAgICAgICAgY29udGVudFR5cGU6ICAgICAgICAgIENPTlRFTlRfVFlQRVMuY3NzLFxuICAgICAgICAgICAgaXNTaGFkb3dVSVN0eWxlc2hlZXQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9jcmVhdGVSdW5uZXIgKGlzTGl2ZU1vZGUpIHtcbiAgICAgICAgY29uc3QgQ3RvciAgICAgID0gaXNMaXZlTW9kZSA/IExpdmVNb2RlUnVubmVyIDogUnVubmVyO1xuICAgICAgICBjb25zdCBuZXdSdW5uZXIgPSBuZXcgQ3Rvcih7XG4gICAgICAgICAgICBwcm94eTogICAgICAgICAgICAgICAgICAgIHRoaXMucHJveHksXG4gICAgICAgICAgICBicm93c2VyQ29ubmVjdGlvbkdhdGV3YXk6IHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LFxuICAgICAgICAgICAgY29uZmlndXJhdGlvbjogICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uY2xvbmUoT1BUSU9OX05BTUVTLmhvb2tzKSxcbiAgICAgICAgICAgIGNvbXBpbGVyU2VydmljZTogICAgICAgICAgdGhpcy5jb21waWxlclNlcnZpY2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucnVubmVycy5wdXNoKG5ld1J1bm5lcik7XG5cbiAgICAgICAgcmV0dXJuIG5ld1J1bm5lcjtcbiAgICB9XG5cbiAgICAvLyBBUElcbiAgICBhc3luYyBjcmVhdGVCcm93c2VyQ29ubmVjdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJJbmZvID0gYXdhaXQgYnJvd3NlclByb3ZpZGVyUG9vbC5nZXRCcm93c2VySW5mbygncmVtb3RlJyk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBCcm93c2VyQ29ubmVjdGlvbih0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSwgYnJvd3NlckluZm8sIHRydWUpO1xuICAgIH1cblxuICAgIGNyZWF0ZVJ1bm5lciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVSdW5uZXIoZmFsc2UpO1xuICAgIH1cblxuICAgIGNyZWF0ZUxpdmVNb2RlUnVubmVyICgpIHtcbiAgICAgICAgaWYgKHRoaXMucnVubmVycy5zb21lKHJ1bm5lciA9PiBydW5uZXIgaW5zdGFuY2VvZiBMaXZlTW9kZVJ1bm5lcikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLmNhbm5vdENyZWF0ZU11bHRpcGxlTGl2ZU1vZGVSdW5uZXJzKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlUnVubmVyKHRydWUpO1xuICAgIH1cblxuICAgIGFzeW5jIGNsb3NlICgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnJ1bm5lcnMubWFwKHJ1bm5lciA9PiBydW5uZXIuc3RvcCgpKSk7XG5cbiAgICAgICAgYXdhaXQgYnJvd3NlclByb3ZpZGVyUG9vbC5kaXNwb3NlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcGlsZXJTZXJ2aWNlKVxuICAgICAgICAgICAgdGhpcy5jb21waWxlclNlcnZpY2Uuc3RvcCgpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LmNsb3NlKCk7XG4gICAgICAgIHRoaXMucHJveHkuY2xvc2UoKTtcbiAgICB9XG59XG4iXX0=