UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

101 lines 16.2 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const device_specs_1 = require("device-specs"); const utils_1 = require("./commands/utils"); const type_1 = __importDefault(require("./commands/type")); const warning_message_1 = __importDefault(require("../notifications/warning-message")); const test_run_1 = require("../errors/test-run/"); class BrowserManipulationQueue { constructor(browserConnection, screenshotCapturer, warningLog, isNativeAutomation) { this.commands = []; this.browserId = browserConnection.id; this.browserProvider = browserConnection.provider; this.screenshotCapturer = screenshotCapturer; this.warningLog = warningLog; this.isNativeAutomation = isNativeAutomation; } async _resizeWindow(width, height, currentWidth, currentHeight) { const canResizeWindow = await this.browserProvider.canResizeWindowToDimensions(this.browserId, width, height); if (!canResizeWindow) throw new test_run_1.WindowDimensionsOverflowError(); try { return await this.browserProvider.resizeWindow(this.browserId, width, height, currentWidth, currentHeight, this.isNativeAutomation); } catch (err) { this.warningLog.addWarning(warning_message_1.default.resizeError, err.message); return null; } } async _resizeWindowToFitDevice(device, portrait, currentWidth, currentHeight) { const { landscapeWidth, portraitWidth } = (0, device_specs_1.getViewportSize)(device); const width = portrait ? portraitWidth : landscapeWidth; const height = portrait ? landscapeWidth : portraitWidth; return await this._resizeWindow(width, height, currentWidth, currentHeight); } async _maximizeWindow() { try { return await this.browserProvider.maximizeWindow(this.browserId, this.isNativeAutomation); } catch (err) { this.warningLog.addWarning(warning_message_1.default.maximizeError, err.message); return null; } } async _takeScreenshot(capture) { return capture(); } async _executeCommand(driverMsg) { const command = this.commands.shift(); switch (command.type) { case type_1.default.takeElementScreenshot: case type_1.default.takeScreenshot: return await this._takeScreenshot(() => this.screenshotCapturer.captureAction({ actionId: command.actionId, customPath: command.path, customPathPattern: command.pathPattern, pageDimensions: driverMsg.pageDimensions, cropDimensions: driverMsg.cropDimensions, markSeed: command.markSeed, fullPage: command.fullPage, thumbnails: command.thumbnails, })); case type_1.default.takeScreenshotOnFail: return await this._takeScreenshot(() => this.screenshotCapturer.captureError({ actionId: command.actionId, failedActionId: command.failedActionId, pageDimensions: driverMsg.pageDimensions, markSeed: command.markSeed, fullPage: command.fullPage, })); case type_1.default.resizeWindow: return await this._resizeWindow(command.width, command.height, driverMsg.pageDimensions.innerWidth, driverMsg.pageDimensions.innerHeight); case type_1.default.resizeWindowToFitDevice: return await this._resizeWindowToFitDevice(command.device, command.options.portraitOrientation, driverMsg.pageDimensions.innerWidth, driverMsg.pageDimensions.innerHeight); case type_1.default.maximizeWindow: return await this._maximizeWindow(); } return null; } async executePendingManipulation(driverMsg, messageBus) { const command = this.commands[0]; const handleBrowserManipulationWarning = warning => { warning.actionId = warning.actionId || command.actionId; }; messageBus.on('before-warning-add', handleBrowserManipulationWarning); const result = await this._executeCommand(driverMsg); messageBus.off('before-warning-add', handleBrowserManipulationWarning); return result; } push(command) { this.commands.push(command); } removeAllNonServiceManipulations() { this.commands = this.commands.filter(command => (0, utils_1.isServiceCommand)(command)); } } exports.default = BrowserManipulationQueue; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1tYW5pcHVsYXRpb24tcXVldWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC1ydW4vYnJvd3Nlci1tYW5pcHVsYXRpb24tcXVldWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrQ0FBK0M7QUFDL0MsNENBQW9EO0FBQ3BELDJEQUEyQztBQUMzQyx1RkFBK0Q7QUFDL0Qsa0RBQW9FO0FBRXBFLE1BQXFCLHdCQUF3QjtJQUN6QyxZQUFhLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxrQkFBa0I7UUFDOUUsSUFBSSxDQUFDLFFBQVEsR0FBYSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBWSxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLGVBQWUsR0FBTSxpQkFBaUIsQ0FBQyxRQUFRLENBQUM7UUFDckQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxVQUFVLEdBQVcsVUFBVSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztJQUNqRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxhQUFhO1FBQzNELE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU5RyxJQUFJLENBQUMsZUFBZTtZQUNoQixNQUFNLElBQUksd0NBQTZCLEVBQUUsQ0FBQztRQUU5QyxJQUFJO1lBQ0EsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ3ZJO1FBQ0QsT0FBTyxHQUFHLEVBQUU7WUFDUixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyx5QkFBZSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFckUsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsd0JBQXdCLENBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsYUFBYTtRQUN6RSxNQUFNLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUEsOEJBQWUsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUVsRSxNQUFNLEtBQUssR0FBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO1FBQ3pELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFFekQsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlO1FBQ2pCLElBQUk7WUFDQSxPQUFPLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUM3RjtRQUNELE9BQU8sR0FBRyxFQUFFO1lBQ1IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMseUJBQWUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZFLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBRSxPQUFPO1FBQzFCLE9BQU8sT0FBTyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUUsU0FBUztRQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXRDLFFBQVEsT0FBTyxDQUFDLElBQUksRUFBRTtZQUNsQixLQUFLLGNBQVksQ0FBQyxxQkFBcUIsQ0FBQztZQUN4QyxLQUFLLGNBQVksQ0FBQyxjQUFjO2dCQUM1QixPQUFPLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDO29CQUMxRSxRQUFRLEVBQVcsT0FBTyxDQUFDLFFBQVE7b0JBQ25DLFVBQVUsRUFBUyxPQUFPLENBQUMsSUFBSTtvQkFDL0IsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLFdBQVc7b0JBQ3RDLGNBQWMsRUFBSyxTQUFTLENBQUMsY0FBYztvQkFDM0MsY0FBYyxFQUFLLFNBQVMsQ0FBQyxjQUFjO29CQUMzQyxRQUFRLEVBQVcsT0FBTyxDQUFDLFFBQVE7b0JBQ25DLFFBQVEsRUFBVyxPQUFPLENBQUMsUUFBUTtvQkFDbkMsVUFBVSxFQUFTLE9BQU8sQ0FBQyxVQUFVO2lCQUN4QyxDQUFDLENBQUMsQ0FBQztZQUVSLEtBQUssY0FBWSxDQUFDLG9CQUFvQjtnQkFDbEMsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQztvQkFDekUsUUFBUSxFQUFRLE9BQU8sQ0FBQyxRQUFRO29CQUNoQyxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7b0JBQ3RDLGNBQWMsRUFBRSxTQUFTLENBQUMsY0FBYztvQkFDeEMsUUFBUSxFQUFRLE9BQU8sQ0FBQyxRQUFRO29CQUNoQyxRQUFRLEVBQVEsT0FBTyxDQUFDLFFBQVE7aUJBQ25DLENBQUMsQ0FBQyxDQUFDO1lBRVIsS0FBSyxjQUFZLENBQUMsWUFBWTtnQkFDMUIsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFOUksS0FBSyxjQUFZLENBQUMsdUJBQXVCO2dCQUNyQyxPQUFPLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRS9LLEtBQUssY0FBWSxDQUFDLGNBQWM7Z0JBQzVCLE9BQU8sTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDM0M7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSyxDQUFDLDBCQUEwQixDQUFFLFNBQVMsRUFBRSxVQUFVO1FBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakMsTUFBTSxnQ0FBZ0MsR0FBRyxPQUFPLENBQUMsRUFBRTtZQUMvQyxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUM1RCxDQUFDLENBQUM7UUFFRixVQUFVLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLGdDQUFnQyxDQUFDLENBQUM7UUFFdEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXJELFVBQVUsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztRQUV2RSxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxDQUFFLE9BQU87UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsZ0NBQWdDO1FBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFBLHdCQUFnQixFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztDQUNKO0FBL0dELDJDQStHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFZpZXdwb3J0U2l6ZSB9IGZyb20gJ2RldmljZS1zcGVjcyc7XG5pbXBvcnQgeyBpc1NlcnZpY2VDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy91dGlscyc7XG5pbXBvcnQgQ09NTUFORF9UWVBFIGZyb20gJy4vY29tbWFuZHMvdHlwZSc7XG5pbXBvcnQgV0FSTklOR19NRVNTQUdFIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1tZXNzYWdlJztcbmltcG9ydCB7IFdpbmRvd0RpbWVuc2lvbnNPdmVyZmxvd0Vycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3Rlc3QtcnVuLyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJyb3dzZXJNYW5pcHVsYXRpb25RdWV1ZSB7XG4gICAgY29uc3RydWN0b3IgKGJyb3dzZXJDb25uZWN0aW9uLCBzY3JlZW5zaG90Q2FwdHVyZXIsIHdhcm5pbmdMb2csIGlzTmF0aXZlQXV0b21hdGlvbikge1xuICAgICAgICB0aGlzLmNvbW1hbmRzICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmJyb3dzZXJJZCAgICAgICAgICA9IGJyb3dzZXJDb25uZWN0aW9uLmlkO1xuICAgICAgICB0aGlzLmJyb3dzZXJQcm92aWRlciAgICA9IGJyb3dzZXJDb25uZWN0aW9uLnByb3ZpZGVyO1xuICAgICAgICB0aGlzLnNjcmVlbnNob3RDYXB0dXJlciA9IHNjcmVlbnNob3RDYXB0dXJlcjtcbiAgICAgICAgdGhpcy53YXJuaW5nTG9nICAgICAgICAgPSB3YXJuaW5nTG9nO1xuICAgICAgICB0aGlzLmlzTmF0aXZlQXV0b21hdGlvbiA9IGlzTmF0aXZlQXV0b21hdGlvbjtcbiAgICB9XG5cbiAgICBhc3luYyBfcmVzaXplV2luZG93ICh3aWR0aCwgaGVpZ2h0LCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQpIHtcbiAgICAgICAgY29uc3QgY2FuUmVzaXplV2luZG93ID0gYXdhaXQgdGhpcy5icm93c2VyUHJvdmlkZXIuY2FuUmVzaXplV2luZG93VG9EaW1lbnNpb25zKHRoaXMuYnJvd3NlcklkLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICBpZiAoIWNhblJlc2l6ZVdpbmRvdylcbiAgICAgICAgICAgIHRocm93IG5ldyBXaW5kb3dEaW1lbnNpb25zT3ZlcmZsb3dFcnJvcigpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5icm93c2VyUHJvdmlkZXIucmVzaXplV2luZG93KHRoaXMuYnJvd3NlcklkLCB3aWR0aCwgaGVpZ2h0LCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQsIHRoaXMuaXNOYXRpdmVBdXRvbWF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyhXQVJOSU5HX01FU1NBR0UucmVzaXplRXJyb3IsIGVyci5tZXNzYWdlKTtcblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBfcmVzaXplV2luZG93VG9GaXREZXZpY2UgKGRldmljZSwgcG9ydHJhaXQsIGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCkge1xuICAgICAgICBjb25zdCB7IGxhbmRzY2FwZVdpZHRoLCBwb3J0cmFpdFdpZHRoIH0gPSBnZXRWaWV3cG9ydFNpemUoZGV2aWNlKTtcblxuICAgICAgICBjb25zdCB3aWR0aCAgPSBwb3J0cmFpdCA/IHBvcnRyYWl0V2lkdGggOiBsYW5kc2NhcGVXaWR0aDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcG9ydHJhaXQgPyBsYW5kc2NhcGVXaWR0aCA6IHBvcnRyYWl0V2lkdGg7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3Jlc2l6ZVdpbmRvdyh3aWR0aCwgaGVpZ2h0LCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQpO1xuICAgIH1cblxuICAgIGFzeW5jIF9tYXhpbWl6ZVdpbmRvdyAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5icm93c2VyUHJvdmlkZXIubWF4aW1pemVXaW5kb3codGhpcy5icm93c2VySWQsIHRoaXMuaXNOYXRpdmVBdXRvbWF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyhXQVJOSU5HX01FU1NBR0UubWF4aW1pemVFcnJvciwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBfdGFrZVNjcmVlbnNob3QgKGNhcHR1cmUpIHtcbiAgICAgICAgcmV0dXJuIGNhcHR1cmUoKTtcbiAgICB9XG5cbiAgICBhc3luYyBfZXhlY3V0ZUNvbW1hbmQgKGRyaXZlck1zZykge1xuICAgICAgICBjb25zdCBjb21tYW5kID0gdGhpcy5jb21tYW5kcy5zaGlmdCgpO1xuXG4gICAgICAgIHN3aXRjaCAoY29tbWFuZC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIENPTU1BTkRfVFlQRS50YWtlRWxlbWVudFNjcmVlbnNob3Q6XG4gICAgICAgICAgICBjYXNlIENPTU1BTkRfVFlQRS50YWtlU2NyZWVuc2hvdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdGFrZVNjcmVlbnNob3QoKCkgPT4gdGhpcy5zY3JlZW5zaG90Q2FwdHVyZXIuY2FwdHVyZUFjdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbklkOiAgICAgICAgICBjb21tYW5kLmFjdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICBjdXN0b21QYXRoOiAgICAgICAgY29tbWFuZC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBjdXN0b21QYXRoUGF0dGVybjogY29tbWFuZC5wYXRoUGF0dGVybixcbiAgICAgICAgICAgICAgICAgICAgcGFnZURpbWVuc2lvbnM6ICAgIGRyaXZlck1zZy5wYWdlRGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgY3JvcERpbWVuc2lvbnM6ICAgIGRyaXZlck1zZy5jcm9wRGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgbWFya1NlZWQ6ICAgICAgICAgIGNvbW1hbmQubWFya1NlZWQsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGxQYWdlOiAgICAgICAgICBjb21tYW5kLmZ1bGxQYWdlLFxuICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWxzOiAgICAgICAgY29tbWFuZC50aHVtYm5haWxzLFxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgY2FzZSBDT01NQU5EX1RZUEUudGFrZVNjcmVlbnNob3RPbkZhaWw6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3Rha2VTY3JlZW5zaG90KCgpID0+IHRoaXMuc2NyZWVuc2hvdENhcHR1cmVyLmNhcHR1cmVFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbklkOiAgICAgICBjb21tYW5kLmFjdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICBmYWlsZWRBY3Rpb25JZDogY29tbWFuZC5mYWlsZWRBY3Rpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgcGFnZURpbWVuc2lvbnM6IGRyaXZlck1zZy5wYWdlRGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgbWFya1NlZWQ6ICAgICAgIGNvbW1hbmQubWFya1NlZWQsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGxQYWdlOiAgICAgICBjb21tYW5kLmZ1bGxQYWdlLFxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgY2FzZSBDT01NQU5EX1RZUEUucmVzaXplV2luZG93OlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZXNpemVXaW5kb3coY29tbWFuZC53aWR0aCwgY29tbWFuZC5oZWlnaHQsIGRyaXZlck1zZy5wYWdlRGltZW5zaW9ucy5pbm5lcldpZHRoLCBkcml2ZXJNc2cucGFnZURpbWVuc2lvbnMuaW5uZXJIZWlnaHQpO1xuXG4gICAgICAgICAgICBjYXNlIENPTU1BTkRfVFlQRS5yZXNpemVXaW5kb3dUb0ZpdERldmljZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVzaXplV2luZG93VG9GaXREZXZpY2UoY29tbWFuZC5kZXZpY2UsIGNvbW1hbmQub3B0aW9ucy5wb3J0cmFpdE9yaWVudGF0aW9uLCBkcml2ZXJNc2cucGFnZURpbWVuc2lvbnMuaW5uZXJXaWR0aCwgZHJpdmVyTXNnLnBhZ2VEaW1lbnNpb25zLmlubmVySGVpZ2h0KTtcblxuICAgICAgICAgICAgY2FzZSBDT01NQU5EX1RZUEUubWF4aW1pemVXaW5kb3c6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX21heGltaXplV2luZG93KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyBleGVjdXRlUGVuZGluZ01hbmlwdWxhdGlvbiAoZHJpdmVyTXNnLCBtZXNzYWdlQnVzKSB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSB0aGlzLmNvbW1hbmRzWzBdO1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZUJyb3dzZXJNYW5pcHVsYXRpb25XYXJuaW5nID0gd2FybmluZyA9PiB7XG4gICAgICAgICAgICB3YXJuaW5nLmFjdGlvbklkID0gd2FybmluZy5hY3Rpb25JZCB8fCBjb21tYW5kLmFjdGlvbklkO1xuICAgICAgICB9O1xuXG4gICAgICAgIG1lc3NhZ2VCdXMub24oJ2JlZm9yZS13YXJuaW5nLWFkZCcsIGhhbmRsZUJyb3dzZXJNYW5pcHVsYXRpb25XYXJuaW5nKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9leGVjdXRlQ29tbWFuZChkcml2ZXJNc2cpO1xuXG4gICAgICAgIG1lc3NhZ2VCdXMub2ZmKCdiZWZvcmUtd2FybmluZy1hZGQnLCBoYW5kbGVCcm93c2VyTWFuaXB1bGF0aW9uV2FybmluZyk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdXNoIChjb21tYW5kKSB7XG4gICAgICAgIHRoaXMuY29tbWFuZHMucHVzaChjb21tYW5kKTtcbiAgICB9XG5cbiAgICByZW1vdmVBbGxOb25TZXJ2aWNlTWFuaXB1bGF0aW9ucyAoKSB7XG4gICAgICAgIHRoaXMuY29tbWFuZHMgPSB0aGlzLmNvbW1hbmRzLmZpbHRlcihjb21tYW5kID0+IGlzU2VydmljZUNvbW1hbmQoY29tbWFuZCkpO1xuICAgIH1cbn1cbiJdfQ==