appium-doctor
Version:
Test environment for fitness to run Appium
368 lines (286 loc) • 18.2 kB
JavaScript
;
var _createClass = require('babel-runtime/helpers/create-class')['default'];
var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
var _regeneratorRuntime = require('babel-runtime/regenerator')['default'];
var _getIterator = require('babel-runtime/core-js/get-iterator')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
Object.defineProperty(exports, '__esModule', {
value: true
});
var _appiumSupport = require('appium-support');
var _teen_process = require('teen_process');
var _logger = require('./logger');
var _logger2 = _interopRequireDefault(_logger);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var NODE_COMMON_PATHS = [process.env.NODE_BIN, '/usr/local/bin/node', '/opt/local/bin/node'];
// Look for node
var NodeDetector = (function () {
function NodeDetector() {
_classCallCheck(this, NodeDetector);
}
_createClass(NodeDetector, null, [{
key: 'retrieveInCommonPlaces',
value: function retrieveInCommonPlaces() {
var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, p;
return _regeneratorRuntime.async(function retrieveInCommonPlaces$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
context$2$0.prev = 3;
_iterator = _getIterator(NODE_COMMON_PATHS);
case 5:
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
context$2$0.next = 18;
break;
}
p = _step.value;
context$2$0.t0 = p;
if (!context$2$0.t0) {
context$2$0.next = 12;
break;
}
context$2$0.next = 11;
return _regeneratorRuntime.awrap(_appiumSupport.fs.exists(p));
case 11:
context$2$0.t0 = context$2$0.sent;
case 12:
if (!context$2$0.t0) {
context$2$0.next = 15;
break;
}
_logger2['default'].debug('Node binary found at common place: ' + p);
return context$2$0.abrupt('return', p);
case 15:
_iteratorNormalCompletion = true;
context$2$0.next = 5;
break;
case 18:
context$2$0.next = 24;
break;
case 20:
context$2$0.prev = 20;
context$2$0.t1 = context$2$0['catch'](3);
_didIteratorError = true;
_iteratorError = context$2$0.t1;
case 24:
context$2$0.prev = 24;
context$2$0.prev = 25;
if (!_iteratorNormalCompletion && _iterator['return']) {
_iterator['return']();
}
case 27:
context$2$0.prev = 27;
if (!_didIteratorError) {
context$2$0.next = 30;
break;
}
throw _iteratorError;
case 30:
return context$2$0.finish(27);
case 31:
return context$2$0.finish(24);
case 32:
_logger2['default'].debug('Node binary wasn\'t found at common places.');
return context$2$0.abrupt('return', null);
case 34:
case 'end':
return context$2$0.stop();
}
}, null, this, [[3, 20, 24, 32], [25,, 27, 31]]);
}
}, {
key: 'retrieveUsingWhichCommand',
value: function retrieveUsingWhichCommand() {
var stdout, nodePath;
return _regeneratorRuntime.async(function retrieveUsingWhichCommand$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
stdout = undefined;
context$2$0.prev = 1;
context$2$0.next = 4;
return _regeneratorRuntime.awrap((0, _teen_process.exec)('which', ['node']));
case 4:
stdout = context$2$0.sent.stdout;
context$2$0.next = 9;
break;
case 7:
context$2$0.prev = 7;
context$2$0.t0 = context$2$0['catch'](1);
case 9:
nodePath = stdout.replace("\n", "");
context$2$0.next = 12;
return _regeneratorRuntime.awrap(_appiumSupport.fs.exists(nodePath));
case 12:
if (!context$2$0.sent) {
context$2$0.next = 17;
break;
}
_logger2['default'].debug("Node binary found using which command at: " + nodePath);
return context$2$0.abrupt('return', nodePath);
case 17:
_logger2['default'].debug('Node binary not found using the which command.');
return context$2$0.abrupt('return', null);
case 19:
case 'end':
return context$2$0.stop();
}
}, null, this, [[1, 7]]);
}
}, {
key: 'retrieveUsingAppleScript',
value: function retrieveUsingAppleScript() {
var appScript, stdout, nodePath;
return _regeneratorRuntime.async(function retrieveUsingAppleScript$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
appScript = ['try', ' set appiumIsRunning to false', ' tell application "System Events"', ' set appiumIsRunning to name of every process contains "Appium"', ' end tell', ' if appiumIsRunning then', ' tell application "Appium" to return node path', ' end if', 'end try', 'return "NULL"'].join("\n");
stdout = undefined;
context$2$0.prev = 2;
context$2$0.next = 5;
return _regeneratorRuntime.awrap((0, _teen_process.exec)('osascript', ['-e', appScript]));
case 5:
stdout = context$2$0.sent.stdout;
context$2$0.next = 10;
break;
case 8:
context$2$0.prev = 8;
context$2$0.t0 = context$2$0['catch'](2);
case 10:
nodePath = stdout.replace("\n", "");
context$2$0.next = 13;
return _regeneratorRuntime.awrap(_appiumSupport.fs.exists(nodePath));
case 13:
if (!context$2$0.sent) {
context$2$0.next = 18;
break;
}
_logger2['default'].debug('Node binary found using AppleScript at: ' + nodePath);
return context$2$0.abrupt('return', nodePath);
case 18:
_logger2['default'].debug('Node binary not found using AppleScript.');
return context$2$0.abrupt('return', null);
case 20:
case 'end':
return context$2$0.stop();
}
}, null, this, [[2, 8]]);
}
}, {
key: 'retrieveUsingAppiumConfigFile',
value: function retrieveUsingAppiumConfigFile() {
var jsonobj, appiumConfigPath;
return _regeneratorRuntime.async(function retrieveUsingAppiumConfigFile$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
jsonobj = undefined;
context$2$0.prev = 1;
appiumConfigPath = _path2['default'].resolve(__dirname, '../..', '.appiumconfig.json');
context$2$0.next = 5;
return _regeneratorRuntime.awrap(_appiumSupport.fs.exists(appiumConfigPath));
case 5:
if (!context$2$0.sent) {
context$2$0.next = 11;
break;
}
context$2$0.t0 = JSON;
context$2$0.next = 9;
return _regeneratorRuntime.awrap(_appiumSupport.fs.readFile(appiumConfigPath, 'utf8'));
case 9:
context$2$0.t1 = context$2$0.sent;
jsonobj = context$2$0.t0.parse.call(context$2$0.t0, context$2$0.t1);
case 11:
context$2$0.next = 15;
break;
case 13:
context$2$0.prev = 13;
context$2$0.t2 = context$2$0['catch'](1);
case 15:
context$2$0.t3 = jsonobj && jsonobj.node_bin;
if (!context$2$0.t3) {
context$2$0.next = 20;
break;
}
context$2$0.next = 19;
return _regeneratorRuntime.awrap(_appiumSupport.fs.exists(jsonobj.node_bin));
case 19:
context$2$0.t3 = context$2$0.sent;
case 20:
if (!context$2$0.t3) {
context$2$0.next = 25;
break;
}
_logger2['default'].debug('Node binary found using .appiumconfig.json at: ' + jsonobj.node_bin);
return context$2$0.abrupt('return', jsonobj.node_bin);
case 25:
_logger2['default'].debug('Node binary not found in the .appiumconfig.json file.');
return context$2$0.abrupt('return', null);
case 27:
case 'end':
return context$2$0.stop();
}
}, null, this, [[1, 13]]);
}
}, {
key: 'detect',
value: function detect() {
var nodePath;
return _regeneratorRuntime.async(function detect$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
context$2$0.next = 2;
return _regeneratorRuntime.awrap(this.retrieveInCommonPlaces());
case 2:
context$2$0.t2 = context$2$0.sent;
if (context$2$0.t2) {
context$2$0.next = 7;
break;
}
context$2$0.next = 6;
return _regeneratorRuntime.awrap(NodeDetector.retrieveUsingWhichCommand());
case 6:
context$2$0.t2 = context$2$0.sent;
case 7:
context$2$0.t1 = context$2$0.t2;
if (context$2$0.t1) {
context$2$0.next = 12;
break;
}
context$2$0.next = 11;
return _regeneratorRuntime.awrap(NodeDetector.retrieveUsingAppleScript());
case 11:
context$2$0.t1 = context$2$0.sent;
case 12:
context$2$0.t0 = context$2$0.t1;
if (context$2$0.t0) {
context$2$0.next = 17;
break;
}
context$2$0.next = 16;
return _regeneratorRuntime.awrap(NodeDetector.retrieveUsingAppiumConfigFile());
case 16:
context$2$0.t0 = context$2$0.sent;
case 17:
nodePath = context$2$0.t0;
if (!nodePath) {
context$2$0.next = 22;
break;
}
return context$2$0.abrupt('return', nodePath);
case 22:
_logger2['default'].warn('The node binary could not be found.');
return context$2$0.abrupt('return', null);
case 24:
case 'end':
return context$2$0.stop();
}
}, null, this);
}
}]);
return NodeDetector;
})();
exports['default'] = NodeDetector;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9ub2RlLWRldGVjdG9yLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7NkJBQW1CLGdCQUFnQjs7NEJBQ2QsY0FBYzs7c0JBQ25CLFVBQVU7Ozs7b0JBQ1QsTUFBTTs7OztBQUV2QixJQUFNLGlCQUFpQixHQUFHLENBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUNwQixxQkFBcUIsRUFDckIscUJBQXFCLENBQ3RCLENBQUM7Ozs7SUFHSSxZQUFZO1dBQVosWUFBWTswQkFBWixZQUFZOzs7ZUFBWixZQUFZOztXQUNvQjswRkFDekIsQ0FBQzs7Ozs7Ozs7O3FDQUFJLGlCQUFpQjs7Ozs7Ozs7QUFBdEIsYUFBQzs2QkFDSixDQUFDOzs7Ozs7Ozs2Q0FBVSxrQkFBRyxNQUFNLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztBQUN6QixnQ0FBSSxLQUFLLHlDQUF1QyxDQUFDLENBQUcsQ0FBQztnREFDOUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR1osZ0NBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7Z0RBQ2xELElBQUk7Ozs7Ozs7S0FDWjs7O1dBRXNDO1VBQ2pDLE1BQU0sRUFJTixRQUFROzs7O0FBSlIsa0JBQU07Ozs2Q0FFUSx3QkFBSyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7O0FBQXZDLGtCQUFNLG9CQUFtQyxNQUFNOzs7Ozs7Ozs7QUFFN0Msb0JBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7OzZDQUM3QixrQkFBRyxNQUFNLENBQUMsUUFBUSxDQUFDOzs7Ozs7OztBQUMzQixnQ0FBSSxLQUFLLENBQUMsNENBQTRDLEdBQUcsUUFBUSxDQUFDLENBQUM7Z0RBQzVELFFBQVE7OztBQUVmLGdDQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2dEQUNyRCxJQUFJOzs7Ozs7O0tBRWQ7OztXQUVxQztVQUNoQyxTQUFTLEVBWVQsTUFBTSxFQUlOLFFBQVE7Ozs7QUFoQlIscUJBQVMsR0FBRyxDQUNkLEtBQUssRUFDSCxnQ0FBZ0MsRUFDaEMsb0NBQW9DLEVBQ3BDLG9FQUFvRSxFQUNwRSxZQUFZLEVBQ1osMkJBQTJCLEVBQzNCLG1EQUFtRCxFQUNuRCxVQUFVLEVBQ1YsU0FBUyxFQUNULGVBQWUsQ0FDbEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ1Isa0JBQU07Ozs2Q0FFUSx3QkFBSyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFFLENBQUM7OztBQUFyRCxrQkFBTSxvQkFBaUQsTUFBTTs7Ozs7Ozs7O0FBRTNELG9CQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDOzs2Q0FDN0Isa0JBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7Ozs7Ozs7QUFDM0IsZ0NBQUksS0FBSyw4Q0FBNEMsUUFBUSxDQUFHLENBQUM7Z0RBQzFELFFBQVE7OztBQUVmLGdDQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2dEQUMvQyxJQUFJOzs7Ozs7O0tBRWQ7OztXQUUwQztVQUNyQyxPQUFPLEVBRUwsZ0JBQWdCOzs7O0FBRmxCLG1CQUFPOztBQUVMLDRCQUFnQixHQUFHLGtCQUFLLE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixDQUFDOzs2Q0FDbkUsa0JBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDOzs7Ozs7Ozs2QkFDekIsSUFBSTs7NkNBQWEsa0JBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQzs7OztBQUFoRSxtQkFBTyxrQkFBUSxLQUFLOzs7Ozs7Ozs7Ozs2QkFHcEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFROzs7Ozs7Ozs2Q0FBVSxrQkFBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7QUFDbEUsZ0NBQUksS0FBSyxxREFBbUQsT0FBTyxDQUFDLFFBQVEsQ0FBRyxDQUFDO2dEQUN6RSxPQUFPLENBQUMsUUFBUTs7O0FBRXZCLGdDQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO2dEQUM1RCxJQUFJOzs7Ozs7O0tBRWQ7OztXQUVtQjtVQUNkLFFBQVE7Ozs7OzZDQUFTLElBQUksQ0FBQyxzQkFBc0IsRUFBRTs7Ozs7Ozs7Ozs7NkNBQzFDLFlBQVksQ0FBQyx5QkFBeUIsRUFBRTs7Ozs7Ozs7Ozs7Ozs7NkNBQ3hDLFlBQVksQ0FBQyx3QkFBd0IsRUFBRTs7Ozs7Ozs7Ozs7Ozs7NkNBQ3ZDLFlBQVksQ0FBQyw2QkFBNkIsRUFBRTs7Ozs7O0FBSGhELG9CQUFROztpQkFJUixRQUFROzs7OztnREFDSCxRQUFROzs7QUFFZixnQ0FBSSxJQUFJLENBQUMscUNBQXFDLENBQUMsQ0FBQztnREFDekMsSUFBSTs7Ozs7OztLQUVkOzs7U0FsRkcsWUFBWTs7O3FCQXFGSCxZQUFZIiwiZmlsZSI6ImxpYi9ub2RlLWRldGVjdG9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnMgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmNvbnN0IE5PREVfQ09NTU9OX1BBVEhTID0gW1xuICBwcm9jZXNzLmVudi5OT0RFX0JJTixcbiAgJy91c3IvbG9jYWwvYmluL25vZGUnLFxuICAnL29wdC9sb2NhbC9iaW4vbm9kZScsXG5dO1xuXG4vLyBMb29rIGZvciBub2RlXG5jbGFzcyBOb2RlRGV0ZWN0b3Ige1xuICBzdGF0aWMgYXN5bmMgcmV0cmlldmVJbkNvbW1vblBsYWNlcyAoKSB7XG4gICAgZm9yIChsZXQgcCBvZiBOT0RFX0NPTU1PTl9QQVRIUykge1xuICAgICAgaWYgKHAgJiYgYXdhaXQgZnMuZXhpc3RzKHApKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgTm9kZSBiaW5hcnkgZm91bmQgYXQgY29tbW9uIHBsYWNlOiAke3B9YCk7XG4gICAgICAgIHJldHVybiBwO1xuICAgICAgfVxuICAgIH1cbiAgICBsb2cuZGVidWcoJ05vZGUgYmluYXJ5IHdhc25cXCd0IGZvdW5kIGF0IGNvbW1vbiBwbGFjZXMuJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcmV0cmlldmVVc2luZ1doaWNoQ29tbWFuZCAoKSB7XG4gICAgbGV0IHN0ZG91dDtcbiAgICB0cnkge1xuICAgICAgc3Rkb3V0ID0gKGF3YWl0IGV4ZWMoJ3doaWNoJywgWydub2RlJ10pKS5zdGRvdXQ7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIGxldCBub2RlUGF0aCA9IHN0ZG91dC5yZXBsYWNlKFwiXFxuXCIsIFwiXCIpO1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobm9kZVBhdGgpKSB7XG4gICAgICBsb2cuZGVidWcoXCJOb2RlIGJpbmFyeSBmb3VuZCB1c2luZyB3aGljaCBjb21tYW5kIGF0OiBcIiArIG5vZGVQYXRoKTtcbiAgICAgIHJldHVybiBub2RlUGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKCdOb2RlIGJpbmFyeSBub3QgZm91bmQgdXNpbmcgdGhlIHdoaWNoIGNvbW1hbmQuJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcmV0cmlldmVVc2luZ0FwcGxlU2NyaXB0ICgpIHtcbiAgICB2YXIgYXBwU2NyaXB0ID0gW1xuICAgICAgJ3RyeSdcbiAgICAgICwgJyAgc2V0IGFwcGl1bUlzUnVubmluZyB0byBmYWxzZSdcbiAgICAgICwgJyAgdGVsbCBhcHBsaWNhdGlvbiBcIlN5c3RlbSBFdmVudHNcIidcbiAgICAgICwgJyAgICBzZXQgYXBwaXVtSXNSdW5uaW5nIHRvIG5hbWUgb2YgZXZlcnkgcHJvY2VzcyBjb250YWlucyBcIkFwcGl1bVwiJ1xuICAgICAgLCAnICBlbmQgdGVsbCdcbiAgICAgICwgJyAgaWYgYXBwaXVtSXNSdW5uaW5nIHRoZW4nXG4gICAgICAsICcgICAgdGVsbCBhcHBsaWNhdGlvbiBcIkFwcGl1bVwiIHRvIHJldHVybiBub2RlIHBhdGgnXG4gICAgICAsICcgIGVuZCBpZidcbiAgICAgICwgJ2VuZCB0cnknXG4gICAgICAsICdyZXR1cm4gXCJOVUxMXCInXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIGxldCBzdGRvdXQ7XG4gICAgdHJ5IHtcbiAgICAgIHN0ZG91dCA9IChhd2FpdCBleGVjKCdvc2FzY3JpcHQnLCBbJy1lJywgYXBwU2NyaXB0IF0pKS5zdGRvdXQ7XG4gICAgfSBjYXRjaChpZ24pIHt9XG4gICAgbGV0IG5vZGVQYXRoID0gc3Rkb3V0LnJlcGxhY2UoXCJcXG5cIiwgXCJcIik7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhub2RlUGF0aCkpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgTm9kZSBiaW5hcnkgZm91bmQgdXNpbmcgQXBwbGVTY3JpcHQgYXQ6ICR7bm9kZVBhdGh9YCk7XG4gICAgICByZXR1cm4gbm9kZVBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZygnTm9kZSBiaW5hcnkgbm90IGZvdW5kIHVzaW5nIEFwcGxlU2NyaXB0LicpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIHJldHJpZXZlVXNpbmdBcHBpdW1Db25maWdGaWxlICgpIHtcbiAgICBsZXQganNvbm9iajtcbiAgICB0cnkge1xuICAgICAgdmFyIGFwcGl1bUNvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4vLi4nLCAnLmFwcGl1bWNvbmZpZy5qc29uJyk7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGFwcGl1bUNvbmZpZ1BhdGgpKSB7XG4gICAgICAgIGpzb25vYmogPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKGFwcGl1bUNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICBpZiAoanNvbm9iaiAmJiBqc29ub2JqLm5vZGVfYmluICYmIGF3YWl0IGZzLmV4aXN0cyhqc29ub2JqLm5vZGVfYmluKSApIHtcbiAgICAgIGxvZy5kZWJ1ZyhgTm9kZSBiaW5hcnkgZm91bmQgdXNpbmcgLmFwcGl1bWNvbmZpZy5qc29uIGF0OiAke2pzb25vYmoubm9kZV9iaW59YCk7XG4gICAgICByZXR1cm4ganNvbm9iai5ub2RlX2JpbjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKCdOb2RlIGJpbmFyeSBub3QgZm91bmQgaW4gdGhlIC5hcHBpdW1jb25maWcuanNvbiBmaWxlLicpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGRldGVjdCAoKSB7XG4gICAgbGV0IG5vZGVQYXRoID0gYXdhaXQgdGhpcy5yZXRyaWV2ZUluQ29tbW9uUGxhY2VzKCkgfHxcbiAgICAgIGF3YWl0IE5vZGVEZXRlY3Rvci5yZXRyaWV2ZVVzaW5nV2hpY2hDb21tYW5kKCkgfHxcbiAgICAgIGF3YWl0IE5vZGVEZXRlY3Rvci5yZXRyaWV2ZVVzaW5nQXBwbGVTY3JpcHQoKSB8fFxuICAgICAgYXdhaXQgTm9kZURldGVjdG9yLnJldHJpZXZlVXNpbmdBcHBpdW1Db25maWdGaWxlKCk7XG4gICAgaWYgKG5vZGVQYXRoKSB7XG4gICAgICByZXR1cm4gbm9kZVBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKCdUaGUgbm9kZSBiaW5hcnkgY291bGQgbm90IGJlIGZvdW5kLicpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE5vZGVEZXRlY3RvcjtcbiJdfQ==