webdriverio-automation
Version:
WebdriverIO-Automation android ios project
258 lines (186 loc) • 26.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _logger = _interopRequireDefault(require("./logger"));
var _remoteDebugger = require("./remote-debugger");
var _remoteMessages = _interopRequireDefault(require("./remote-messages"));
var _ws = _interopRequireDefault(require("ws"));
var _bluebird = _interopRequireDefault(require("bluebird"));
var _lodash = _interopRequireDefault(require("lodash"));
var _events = _interopRequireDefault(require("events"));
var _helpers = require("./helpers");
var _es6Error = _interopRequireDefault(require("es6-error"));
var _appiumSupport = require("appium-support");
const DATA_LOG_LENGTH = {
length: 200
};
class WebKitRpcClient extends _events.default.EventEmitter {
constructor(host, port = _remoteDebugger.REMOTE_DEBUGGER_PORT, responseTimeout = _remoteDebugger.RPC_RESPONSE_TIMEOUT_MS) {
super();
this.host = host || 'localhost';
this.port = port;
this.responseTimeout = responseTimeout;
this.curMsgId = 0;
this.dataHandlers = {};
this.dataMethods = {};
this.errorHandlers = {};
}
connect(pageId) {
var _this = this;
return (0, _asyncToGenerator2.default)(function* () {
return yield new _bluebird.default((resolve, reject) => {
let url = `ws://${_this.host}:${_this.port}/devtools/page/${pageId}`;
_this.pageIdKey = pageId;
_this.socket = new _ws.default(url);
_this.socket.on('open', () => {
_logger.default.debug(`WebKit debugger web socket connected to url: ${url}`);
_this.connected = true;
resolve();
});
_this.socket.on('close', () => {
_logger.default.debug('WebKit remote debugger socket disconnected');
_this.connected = false;
});
_this.socket.on('error', exception => {
if (_this.connected) {
_logger.default.debug(`WebKit debugger web socket error: ${exception.message}`);
_this.connected = false;
}
reject(exception);
});
_this.socket.on('message', _this.receive.bind(_this));
});
})();
}
disconnect() {
_logger.default.debug('Disconnecting from WebKit remote debugger');
if (this.isConnected()) {
this.socket.close(1001);
}
this.connected = false;
}
isConnected() {
return this.socket !== null && this.connected;
}
send(command, opts = {}) {
var _this2 = this;
return (0, _asyncToGenerator2.default)(function* () {
let data = (0, _remoteMessages.default)(command, _lodash.default.defaults({
connId: _this2.connId,
senderId: _this2.senderId
}, opts));
_logger.default.debug(`Sending WebKit data: ${_lodash.default.truncate(JSON.stringify(data), DATA_LOG_LENGTH)}`);
_logger.default.debug(`Webkit response timeout: ${_this2.responseTimeout}`);
_this2.curMsgId++;
data.id = _this2.curMsgId;
const id = _this2.curMsgId.toString();
return yield new _bluebird.default((resolve, reject) => {
_this2.dataHandlers[id] = resolve;
_this2.dataMethods[id] = data.method;
_this2.errorHandlers[id] = reject;
_this2.socket.send(JSON.stringify(data), function (error) {
if (_appiumSupport.util.hasValue(error)) {
_logger.default.debug(`WebKit socket error occurred: ${error}`);
reject(new Error(error));
}
});
}).catch(e => {
if (e.constructor.name !== WebKitRPCWarning.name) {
throw e;
}
_logger.default.warn(e.message);
return _bluebird.default.resolve(null);
}).finally(res => {
delete _this2.dataHandlers[id];
delete _this2.dataMethods[id];
delete _this2.errorHandlers[id];
return res;
}).timeout(_this2.responseTimeout);
})();
}
receive(data) {
_logger.default.debug(`Received WebKit data: '${_lodash.default.truncate(data, DATA_LOG_LENGTH)}'`);
data = _appiumSupport.util.safeJsonParse(data);
const rejectCall = error => {
if (data && this.errorHandlers[data.id]) {
return this.errorHandlers[data.id](error);
}
if (error.constructor.name === WebKitRPCWarning.name) {
_logger.default.warn(error.message);
} else {
_logger.default.errorAndThrow(error);
}
};
if (!_lodash.default.isPlainObject(data)) {
return rejectCall(new WebKitRPCWarning(`No parseable data found`));
}
if (data.wasThrown || data.result && data.result.wasThrown) {
const message = data.wasThrown ? data.result.value || data.result.description : data.result.result.value || data.result.result.description;
return rejectCall(new Error(message));
}
const msgId = data.id;
const method = this.dataMethods[msgId] || data.method;
if (!method) {
return rejectCall(new WebKitRPCWarning(`Did not find any handlers for ${msgId ? `'${msgId}'` : 'the recent'} message`));
}
_logger.default.debug(`Found method '${method}'${msgId ? ` for '${msgId}' message` : ''}`);
let isEventHandled = false;
switch (method) {
case 'Profiler.resetProfiles':
_logger.default.debug('Device is telling us to reset profiles. Should probably ' + 'do some kind of callback here');
isEventHandled = true;
break;
case 'Timeline.eventRecorded':
if (this.timelineEventHandler) {
this.timelineEventHandler(data.result);
isEventHandled = true;
}
break;
case 'Console.messageAdded':
if (this.consoleEventHandler) {
this.consoleEventHandler(data.params.message);
isEventHandled = true;
}
break;
case 'Page.navigate':
_logger.default.debug(`Received page navigated message: ${(0, _helpers.simpleStringify)(data)}`);
isEventHandled = true;
break;
case 'Network.dataReceived':
case 'Network.requestWillBeSent':
case 'Network.responseReceived':
case 'Network.loadingFinished':
case 'Network.loadingFailed':
if (_lodash.default.isFunction(this.networkEventHandler)) {
this.networkEventHandler(method, data.params);
return;
}
break;
}
if (!data.error && _lodash.default.has(this.dataHandlers, msgId)) {
return this.dataHandlers[msgId](data.result);
}
if (data.error && _lodash.default.has(this.errorHandlers, msgId)) {
return this.errorHandlers[msgId](data.error);
}
if (!isEventHandled) {
_logger.default.debug(`There is no handler scheduled for method '${method}' in ${msgId ? `'${msgId}'` : 'the recent'} message`);
}
}
setTimelineEventHandler(timelineEventHandler) {
this.timelineEventHandler = timelineEventHandler;
}
setConsoleLogEventHandler(consoleEventHandler) {
this.consoleEventHandler = consoleEventHandler;
}
setNetworkLogEventHandler(networkEventHandler) {
this.networkEventHandler = networkEventHandler;
}
}
exports.default = WebKitRpcClient;
class WebKitRPCWarning extends _es6Error.default {}require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi93ZWJraXQtcnBjLWNsaWVudC5qcyJdLCJuYW1lcyI6WyJEQVRBX0xPR19MRU5HVEgiLCJsZW5ndGgiLCJXZWJLaXRScGNDbGllbnQiLCJldmVudHMiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsImhvc3QiLCJwb3J0IiwiUkVNT1RFX0RFQlVHR0VSX1BPUlQiLCJyZXNwb25zZVRpbWVvdXQiLCJSUENfUkVTUE9OU0VfVElNRU9VVF9NUyIsImN1ck1zZ0lkIiwiZGF0YUhhbmRsZXJzIiwiZGF0YU1ldGhvZHMiLCJlcnJvckhhbmRsZXJzIiwiY29ubmVjdCIsInBhZ2VJZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwidXJsIiwicGFnZUlkS2V5Iiwic29ja2V0IiwiV2ViU29ja2V0Iiwib24iLCJsb2ciLCJkZWJ1ZyIsImNvbm5lY3RlZCIsImV4Y2VwdGlvbiIsIm1lc3NhZ2UiLCJyZWNlaXZlIiwiYmluZCIsImRpc2Nvbm5lY3QiLCJpc0Nvbm5lY3RlZCIsImNsb3NlIiwic2VuZCIsImNvbW1hbmQiLCJvcHRzIiwiZGF0YSIsIl8iLCJkZWZhdWx0cyIsImNvbm5JZCIsInNlbmRlcklkIiwidHJ1bmNhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiaWQiLCJ0b1N0cmluZyIsIm1ldGhvZCIsImVycm9yIiwidXRpbCIsImhhc1ZhbHVlIiwiRXJyb3IiLCJjYXRjaCIsImUiLCJuYW1lIiwiV2ViS2l0UlBDV2FybmluZyIsIndhcm4iLCJmaW5hbGx5IiwicmVzIiwidGltZW91dCIsInNhZmVKc29uUGFyc2UiLCJyZWplY3RDYWxsIiwiZXJyb3JBbmRUaHJvdyIsImlzUGxhaW5PYmplY3QiLCJ3YXNUaHJvd24iLCJyZXN1bHQiLCJ2YWx1ZSIsImRlc2NyaXB0aW9uIiwibXNnSWQiLCJpc0V2ZW50SGFuZGxlZCIsInRpbWVsaW5lRXZlbnRIYW5kbGVyIiwiY29uc29sZUV2ZW50SGFuZGxlciIsInBhcmFtcyIsImlzRnVuY3Rpb24iLCJuZXR3b3JrRXZlbnRIYW5kbGVyIiwiaGFzIiwic2V0VGltZWxpbmVFdmVudEhhbmRsZXIiLCJzZXRDb25zb2xlTG9nRXZlbnRIYW5kbGVyIiwic2V0TmV0d29ya0xvZ0V2ZW50SGFuZGxlciIsIkVTNkVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLGVBQWUsR0FBRztBQUFDQyxFQUFBQSxNQUFNLEVBQUU7QUFBVCxDQUF4Qjs7QUFFZSxNQUFNQyxlQUFOLFNBQThCQyxnQkFBT0MsWUFBckMsQ0FBa0Q7QUFDL0RDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBRixFQUFRQyxJQUFJLEdBQUdDLG9DQUFmLEVBQXFDQyxlQUFlLEdBQUdDLHVDQUF2RCxFQUFnRjtBQUN6RjtBQUVBLFNBQUtKLElBQUwsR0FBWUEsSUFBSSxJQUFJLFdBQXBCO0FBQ0EsU0FBS0MsSUFBTCxHQUFZQSxJQUFaO0FBRUEsU0FBS0UsZUFBTCxHQUF1QkEsZUFBdkI7QUFFQSxTQUFLRSxRQUFMLEdBQWdCLENBQWhCO0FBRUEsU0FBS0MsWUFBTCxHQUFvQixFQUFwQjtBQUNBLFNBQUtDLFdBQUwsR0FBbUIsRUFBbkI7QUFDQSxTQUFLQyxhQUFMLEdBQXFCLEVBQXJCO0FBQ0Q7O0FBRUtDLEVBQUFBLE9BQU4sQ0FBZUMsTUFBZixFQUF1QjtBQUFBOztBQUFBO0FBQ3JCLG1CQUFhLElBQUlDLGlCQUFKLENBQVksQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBRzVDLFlBQUlDLEdBQUcsR0FBSSxRQUFPLEtBQUksQ0FBQ2QsSUFBSyxJQUFHLEtBQUksQ0FBQ0MsSUFBSyxrQkFBaUJTLE1BQU8sRUFBakU7QUFDQSxRQUFBLEtBQUksQ0FBQ0ssU0FBTCxHQUFpQkwsTUFBakI7QUFHQSxRQUFBLEtBQUksQ0FBQ00sTUFBTCxHQUFjLElBQUlDLFdBQUosQ0FBY0gsR0FBZCxDQUFkOztBQUNBLFFBQUEsS0FBSSxDQUFD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LElBQUksQ0FBQ1csS0FBTixJQUFlVixnQkFBRXFDLEdBQUYsQ0FBTSxLQUFLaEUsWUFBWCxFQUF5QnlELEtBQXpCLENBQW5CLEVBQW9EO0FBQ2xELGFBQU8sS0FBS3pELFlBQUwsQ0FBa0J5RCxLQUFsQixFQUF5Qi9CLElBQUksQ0FBQzRCLE1BQTlCLENBQVA7QUFDRDs7QUFDRCxRQUFJNUIsSUFBSSxDQUFDVyxLQUFMLElBQWNWLGdCQUFFcUMsR0FBRixDQUFNLEtBQUs5RCxhQUFYLEVBQTBCdUQsS0FBMUIsQ0FBbEIsRUFBb0Q7QUFDbEQsYUFBTyxLQUFLdkQsYUFBTCxDQUFtQnVELEtBQW5CLEVBQTBCL0IsSUFBSSxDQUFDVyxLQUEvQixDQUFQO0FBQ0Q7O0FBQ0QsUUFBSSxDQUFDcUIsY0FBTCxFQUFxQjtBQUNuQjdDLHNCQUFJQyxLQUFKLENBQVcsNkNBQTRDc0IsTUFBTyxRQUFPcUIsS0FBSyxHQUFJLElBQUdBLEtBQU0sR0FBYixHQUFrQixZQUFhLFVBQXpHO0FBQ0Q7QUFDRjs7QUFFRFEsRUFBQUEsdUJBQXVCLENBQUVOLG9CQUFGLEVBQXdCO0FBQzdDLFNBQUtBLG9CQUFMLEdBQTRCQSxvQkFBNUI7QUFDRDs7QUFFRE8sRUFBQUEseUJBQXlCLENBQUVOLG1CQUFGLEVBQXVCO0FBQzlDLFNBQUtBLG1CQUFMLEdBQTJCQSxtQkFBM0I7QUFDRDs7QUFFRE8sRUFBQUEseUJBQXlCLENBQUVKLG1CQUFGLEVBQXVCO0FBQzlDLFNBQUtBLG1CQUFMLEdBQTJCQSxtQkFBM0I7QUFDRDs7QUFoTThEOzs7O0FBb01qRSxNQUFNbkIsZ0JBQU4sU0FBK0J3QixpQkFBL0IsQ0FBd0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IFJFTU9URV9ERUJVR0dFUl9QT1JULCBSUENfUkVTUE9OU0VfVElNRU9VVF9NUyB9IGZyb20gJy4vcmVtb3RlLWRlYnVnZ2VyJztcbmltcG9ydCBnZXRSZW1vdGVDb21tYW5kIGZyb20gJy4vcmVtb3RlLW1lc3NhZ2VzJztcbmltcG9ydCBXZWJTb2NrZXQgZnJvbSAnd3MnO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBldmVudHMgZnJvbSAnZXZlbnRzJztcbmltcG9ydCB7IHNpbXBsZVN0cmluZ2lmeSB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgRVM2RXJyb3IgZnJvbSAnZXM2LWVycm9yJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5cblxuY29uc3QgREFUQV9MT0dfTEVOR1RIID0ge2xlbmd0aDogMjAwfTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViS2l0UnBjQ2xpZW50IGV4dGVuZHMgZXZlbnRzLkV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yIChob3N0LCBwb3J0ID0gUkVNT1RFX0RFQlVHR0VSX1BPUlQsIHJlc3BvbnNlVGltZW91dCA9IFJQQ19SRVNQT05TRV9USU1FT1VUX01TKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuaG9zdCA9IGhvc3QgfHwgJ2xvY2FsaG9zdCc7XG4gICAgdGhpcy5wb3J0ID0gcG9ydDtcblxuICAgIHRoaXMucmVzcG9uc2VUaW1lb3V0ID0gcmVzcG9uc2VUaW1lb3V0O1xuXG4gICAgdGhpcy5jdXJNc2dJZCA9IDA7XG5cbiAgICB0aGlzLmRhdGFIYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuZGF0YU1ldGhvZHMgPSB7fTtcbiAgICB0aGlzLmVycm9ySGFuZGxlcnMgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIGNvbm5lY3QgKHBhZ2VJZCkge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyB3ZSB3aWxsIG9ubHkgcmVzb2x2ZSB0aGlzIGNhbGwgd2hlbiB0aGUgc29ja2V0IGlzIG9wZW5cbiAgICAgIC8vIFdlYktpdCB1cmxcbiAgICAgIGxldCB1cmwgPSBgd3M6Ly8ke3RoaXMuaG9zdH06JHt0aGlzLnBvcnR9L2RldnRvb2xzL3BhZ2UvJHtwYWdlSWR9YDtcbiAgICAgIHRoaXMucGFnZUlkS2V5ID0gcGFnZUlkO1xuXG4gICAgICAvLyBjcmVhdGUgYW5kIHNldCB1cCBzb2NrZXQgd2l0aCBhcHByb3ByaWF0ZSBldmVudCBoYW5kbGVyc1xuICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVybCk7XG4gICAgICB0aGlzLnNvY2tldC5vbignb3BlbicsICgpID0+IHtcbiAgICAgICAgbG9nLmRlYnVnKGBXZWJLaXQgZGVidWdnZXIgd2ViIHNvY2tldCBjb25uZWN0ZWQgdG8gdXJsOiAke3VybH1gKTtcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc29ja2V0Lm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgbG9nLmRlYnVnKCdXZWJLaXQgcmVtb3RlIGRlYnVnZ2VyIHNvY2tldCBkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zb2NrZXQub24oJ2Vycm9yJywgKGV4Y2VwdGlvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgICAgICBsb2cuZGVidWcoYFdlYktpdCBkZWJ1Z2dlciB3ZWIgc29ja2V0IGVycm9yOiAke2V4Y2VwdGlvbi5tZXNzYWdlfWApO1xuICAgICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZWplY3QoZXhjZXB0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zb2NrZXQub24oJ21lc3NhZ2UnLCB0aGlzLnJlY2VpdmUuYmluZCh0aGlzKSk7XG4gICAgfSk7XG4gIH1cblxuICBkaXNjb25uZWN0ICgpIHtcbiAgICBsb2cuZGVidWcoJ0Rpc2Nvbm5lY3RpbmcgZnJvbSBXZWJLaXQgcmVtb3RlIGRlYnVnZ2VyJyk7XG4gICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoMTAwMSk7XG4gICAgfVxuICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gIH1cblxuICBpc0Nvbm5lY3RlZCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLnNvY2tldCAhPT0gbnVsbCAmJiB0aGlzLmNvbm5lY3RlZCk7XG4gIH1cblxuICBhc3luYyBzZW5kIChjb21tYW5kLCBvcHRzID0ge30pIHtcbiAgICBsZXQgZGF0YSA9IGdldFJlbW90ZUNvbW1hbmQoY29tbWFuZCwgXy5kZWZhdWx0cyh7Y29ubklkOiB0aGlzLmNvbm5JZCwgc2VuZGVySWQ6IHRoaXMuc2VuZGVySWR9LCBvcHRzKSk7XG5cbiAgICBsb2cuZGVidWcoYFNlbmRpbmcgV2ViS2l0IGRhdGE6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShkYXRhKSwgREFUQV9MT0dfTEVOR1RIKX1gKTtcbiAgICBsb2cuZGVidWcoYFdlYmtpdCByZXNwb25zZSB0aW1lb3V0OiAke3RoaXMucmVzcG9uc2VUaW1lb3V0fWApO1xuXG4gICAgdGhpcy5jdXJNc2dJZCsrO1xuICAgIGRhdGEuaWQgPSB0aGlzLmN1ck1zZ0lkO1xuXG4gICAgY29uc3QgaWQgPSB0aGlzLmN1ck1zZ0lkLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIG9ubHkgcmVzb2x2ZSB0aGUgc2VuZCBjb21tYW5kIHdoZW4gV2ViS2l0IHJldHVybnMgYSByZXNwb25zZVxuICAgICAgLy8gc3RvcmUgdGhlIGhhbmRsZXIgYW5kIHRoZSBkYXRhIHNlbnRcbiAgICAgIHRoaXMuZGF0YUhhbmRsZXJzW2lkXSA9IHJlc29sdmU7XG4gICAgICB0aGlzLmRhdGFNZXRob2RzW2lkXSA9IGRhdGEubWV0aG9kO1xuICAgICAgdGhpcy5lcnJvckhhbmRsZXJzW2lkXSA9IHJlamVjdDtcblxuICAgICAgLy8gc2VuZCB0aGUgZGF0YVxuICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKGVycm9yKSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgV2ViS2l0IHNvY2tldCBlcnJvciBvY2N1cnJlZDogJHtlcnJvcn1gKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGVycm9yKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICBpZiAoZS5jb25zdHJ1Y3Rvci5uYW1lICE9PSBXZWJLaXRSUENXYXJuaW5nLm5hbWUpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGxvZy53YXJuKGUubWVzc2FnZSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIH0pLmZpbmFsbHkoKHJlcykgPT4ge1xuICAgICAgLy8gbm8gbmVlZCB0byBob2xkIG9udG8gYW55dGhpbmdcbiAgICAgIGRlbGV0ZSB0aGlzLmRhdGFIYW5kbGVyc1tpZF07XG4gICAgICBkZWxldGUgdGhpcy5kYXRhTWV0aG9kc1tpZF07XG4gICAgICBkZWxldGUgdGhpcy5lcnJvckhhbmRsZXJzW2lkXTtcblxuICAgICAgLy8gYW5kIHBhc3MgYWxvbmcgdGhlIHJlc3VsdFxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KS50aW1lb3V0KHRoaXMucmVzcG9uc2VUaW1lb3V0KTtcbiAgfVxuXG4gIHJlY2VpdmUgKGRhdGEpIHtcbiAgICBsb2cuZGVidWcoYFJlY2VpdmVkIFdlYktpdCBkYXRhOiAnJHtfLnRydW5jYXRlKGRhdGEsIERBVEFfTE9HX0xFTkdUSCl9J2ApO1xuICAgIGRhdGEgPSB1dGlsLnNhZmVKc29uUGFyc2UoZGF0YSk7XG5cbiAgICBjb25zdCByZWplY3RDYWxsID0gKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZGF0YSAmJiB0aGlzLmVycm9ySGFuZGxlcnNbZGF0YS5pZF0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyc1tkYXRhLmlkXShlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBXZWJLaXRSUENXYXJuaW5nLm5hbWUpIHtcbiAgICAgICAgbG9nLndhcm4oZXJyb3IubWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuZXJyb3JBbmRUaHJvdyhlcnJvcik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghXy5pc1BsYWluT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gcmVqZWN0Q2FsbChuZXcgV2ViS2l0UlBDV2FybmluZyhgTm8gcGFyc2VhYmxlIGRhdGEgZm91bmRgKSk7XG4gICAgfVxuXG4gICAgLy8gd2UgY2FuIGdldCBhbiBlcnJvciwgb3Igd2UgY2FuIGdldCBhIHJlc3BvbnNlIHRoYXQgaXMgYW4gZXJyb3JcbiAgICBpZiAoZGF0YS53YXNUaHJvd24gfHwgKGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0Lndhc1Rocm93bikpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkYXRhLndhc1Rocm93blxuICAgICAgICA/IGRhdGEucmVzdWx0LnZhbHVlIHx8IGRhdGEucmVzdWx0LmRlc2NyaXB0aW9uXG4gICAgICAgIDogZGF0YS5yZXN1bHQucmVzdWx0LnZhbHVlIHx8IGRhdGEucmVzdWx0LnJlc3VsdC5kZXNjcmlwdGlvbjtcbiAgICAgIHJldHVybiByZWplY3RDYWxsKG5ldyBFcnJvcihtZXNzYWdlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbXNnSWQgPSBkYXRhLmlkO1xuICAgIC8vIHdoZW4gc2VuZGluZyB3ZSBzZXQgYSBkYXRhIG1ldGhvZCBhbmQgYXNzb2NpYXRlZCBjYWxsYmFjay5cbiAgICAvLyBnZXQgdGhhdCwgb3IgdGhlIGdlbmVyaWMgKGF1dG9tYXRpY2FsbHkgc2VudCwgbm90IGFzc29jaWF0ZWRcbiAgICAvLyB3aXRoIGEgcGFydGljdWxhciByZXF1ZXN0KSBtZXRob2RcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmRhdGFNZXRob2RzW21zZ0lkXSB8fCBkYXRhLm1ldGhvZDtcbiAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgcmV0dXJuIHJlamVjdENhbGwoXG4gICAgICAgIG5ldyBXZWJLaXRSUENXYXJuaW5nKGBEaWQgbm90IGZpbmQgYW55IGhhbmRsZXJzIGZvciAke21zZ0lkID8gYCcke21zZ0lkfSdgIDogJ3RoZSByZWNlbnQnfSBtZXNzYWdlYCkpO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYEZvdW5kIG1ldGhvZCAnJHttZXRob2R9JyR7bXNnSWQgPyBgIGZvciAnJHttc2dJZH0nIG1lc3NhZ2VgIDogJyd9YCk7XG4gICAgbGV0IGlzRXZlbnRIYW5kbGVkID0gZmFsc2U7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ1Byb2ZpbGVyLnJlc2V0UHJvZmlsZXMnOlxuICAgICAgICBsb2cuZGVidWcoJ0RldmljZSBpcyB0ZWxsaW5nIHVzIHRvIHJlc2V0IHByb2ZpbGVzLiBTaG91bGQgcHJvYmFibHkgJyArXG4gICAgICAgICAgICAgICAgICAnZG8gc29tZSBraW5kIG9mIGNhbGxiYWNrIGhlcmUnKTtcbiAgICAgICAgaXNFdmVudEhhbmRsZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1RpbWVsaW5lLmV2ZW50UmVjb3JkZWQnOlxuICAgICAgICBpZiAodGhpcy50aW1lbGluZUV2ZW50SGFuZGxlcikge1xuICAgICAgICAgIHRoaXMudGltZWxpbmVFdmVudEhhbmRsZXIoZGF0YS5yZXN1bHQpO1xuICAgICAgICAgIGlzRXZlbnRIYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0NvbnNvbGUubWVzc2FnZUFkZGVkJzpcbiAgICAgICAgaWYgKHRoaXMuY29uc29sZUV2ZW50SGFuZGxlcikge1xuICAgICAgICAgIHRoaXMuY29uc29sZUV2ZW50SGFuZGxlcihkYXRhLnBhcmFtcy5tZXNzYWdlKTtcbiAgICAgICAgICBpc0V2ZW50SGFuZGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQYWdlLm5hdmlnYXRlJzpcbiAgICAgICAgbG9nLmRlYnVnKGBSZWNlaXZlZCBwYWdlIG5hdmlnYXRlZCBtZXNzYWdlOiAke3NpbXBsZVN0cmluZ2lmeShkYXRhKX1gKTtcbiAgICAgICAgaXNFdmVudEhhbmRsZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ05ldHdvcmsuZGF0YVJlY2VpdmVkJzpcbiAgICAgIGNhc2UgJ05ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnQnOlxuICAgICAgY2FzZSAnTmV0d29yay5yZXNwb25zZVJlY2VpdmVkJzpcbiAgICAgIGNhc2UgJ05ldHdvcmsubG9hZGluZ0ZpbmlzaGVkJzpcbiAgICAgIGNhc2UgJ05ldHdvcmsubG9hZGluZ0ZhaWxlZCc6XG4gICAgICAgIGlmIChfLmlzRnVuY3Rpb24odGhpcy5uZXR3b3JrRXZlbnRIYW5kbGVyKSkge1xuICAgICAgICAgIHRoaXMubmV0d29ya0V2ZW50SGFuZGxlcihtZXRob2QsIGRhdGEucGFyYW1zKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICghZGF0YS5lcnJvciAmJiBfLmhhcyh0aGlzLmRhdGFIYW5kbGVycywgbXNnSWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhSGFuZGxlcnNbbXNnSWRdKGRhdGEucmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKGRhdGEuZXJyb3IgJiYgXy5oYXModGhpcy5lcnJvckhhbmRsZXJzLCBtc2dJZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlcnNbbXNnSWRdKGRhdGEuZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoIWlzRXZlbnRIYW5kbGVkKSB7XG4gICAgICBsb2cuZGVidWcoYFRoZXJlIGlzIG5vIGhhbmRsZXIgc2NoZWR1bGVkIGZvciBtZXRob2QgJyR7bWV0aG9kfScgaW4gJHttc2dJZCA/IGAnJHttc2dJZH0nYCA6ICd0aGUgcmVjZW50J30gbWVzc2FnZWApO1xuICAgIH1cbiAgfVxuXG4gIHNldFRpbWVsaW5lRXZlbnRIYW5kbGVyICh0aW1lbGluZUV2ZW50SGFuZGxlcikge1xuICAgIHRoaXMudGltZWxpbmVFdmVudEhhbmRsZXIgPSB0aW1lbGluZUV2ZW50SGFuZGxlcjtcbiAgfVxuXG4gIHNldENvbnNvbGVMb2dFdmVudEhhbmRsZXIgKGNvbnNvbGVFdmVudEhhbmRsZXIpIHtcbiAgICB0aGlzLmNvbnNvbGVFdmVudEhhbmRsZXIgPSBjb25zb2xlRXZlbnRIYW5kbGVyO1xuICB9XG5cbiAgc2V0TmV0d29ya0xvZ0V2ZW50SGFuZGxlciAobmV0d29ya0V2ZW50SGFuZGxlcikge1xuICAgIHRoaXMubmV0d29ya0V2ZW50SGFuZGxlciA9IG5ldHdvcmtFdmVudEhhbmRsZXI7XG4gIH1cbn1cblxuXG5jbGFzcyBXZWJLaXRSUENXYXJuaW5nIGV4dGVuZHMgRVM2RXJyb3Ige31cbiJdLCJmaWxlIjoibGliL3dlYmtpdC1ycGMtY2xpZW50LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=