appium-xcuitest-driver-conan
Version:
Appium driver for iOS using XCUITest for backend
472 lines (370 loc) • 24.8 kB
JavaScript
;
var _regeneratorRuntime = require('babel-runtime/regenerator')['default'];
var _Object$assign = require('babel-runtime/core-js/object/assign')['default'];
Object.defineProperty(exports, '__esModule', {
value: true
});
var _appiumBaseDriver = require('appium-base-driver');
var commands = {},
helpers = {},
extensions = {};
commands.getAlertText = function callee$0$0() {
var method, endpoint, _alert, text;
return _regeneratorRuntime.async(function callee$0$0$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
context$1$0.prev = 0;
method = 'GET';
endpoint = '/alert/text';
context$1$0.next = 5;
return _regeneratorRuntime.awrap(this.proxyCommand(endpoint, method));
case 5:
return context$1$0.abrupt('return', context$1$0.sent);
case 8:
context$1$0.prev = 8;
context$1$0.t0 = context$1$0['catch'](0);
if (this.isWebContext()) {
context$1$0.next = 12;
break;
}
throw context$1$0.t0;
case 12:
context$1$0.next = 14;
return _regeneratorRuntime.awrap(this.getAlert());
case 14:
_alert = context$1$0.sent;
context$1$0.next = 17;
return _regeneratorRuntime.awrap(_alert.getText());
case 17:
text = context$1$0.sent;
return context$1$0.abrupt('return', text);
case 19:
case 'end':
return context$1$0.stop();
}
}, null, this, [[0, 8]]);
};
// TODO: WDA does not currently support this natively
commands.setAlertText = function callee$0$0(text) {
var method, endpoint, _alert2;
return _regeneratorRuntime.async(function callee$0$0$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
if (!Array.isArray(text)) {
text = text.split('');
}
context$1$0.prev = 1;
method = 'POST';
endpoint = '/alert/text';
context$1$0.next = 6;
return _regeneratorRuntime.awrap(this.proxyCommand(endpoint, method, text));
case 6:
return context$1$0.abrupt('return', context$1$0.sent);
case 9:
context$1$0.prev = 9;
context$1$0.t0 = context$1$0['catch'](1);
if (this.isWebContext()) {
context$1$0.next = 13;
break;
}
throw context$1$0.t0;
case 13:
context$1$0.next = 15;
return _regeneratorRuntime.awrap(this.getAlert());
case 15:
_alert2 = context$1$0.sent;
context$1$0.next = 18;
return _regeneratorRuntime.awrap(_alert2.setText(text));
case 18:
return context$1$0.abrupt('return');
case 19:
case 'end':
return context$1$0.stop();
}
}, null, this, [[1, 9]]);
};
commands.postAcceptAlert = function callee$0$0() {
var method, endpoint, _alert3;
return _regeneratorRuntime.async(function callee$0$0$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
context$1$0.prev = 0;
method = 'POST';
endpoint = '/alert/accept';
context$1$0.next = 5;
return _regeneratorRuntime.awrap(this.proxyCommand(endpoint, method));
case 5:
return context$1$0.abrupt('return', context$1$0.sent);
case 8:
context$1$0.prev = 8;
context$1$0.t0 = context$1$0['catch'](0);
if (this.isWebContext()) {
context$1$0.next = 12;
break;
}
throw context$1$0.t0;
case 12:
context$1$0.next = 14;
return _regeneratorRuntime.awrap(this.getAlert());
case 14:
_alert3 = context$1$0.sent;
if (!_alert3.close) {
context$1$0.next = 20;
break;
}
context$1$0.next = 18;
return _regeneratorRuntime.awrap(_alert3.close());
case 18:
context$1$0.next = 22;
break;
case 20:
context$1$0.next = 22;
return _regeneratorRuntime.awrap(_alert3.ok());
case 22:
return context$1$0.abrupt('return');
case 23:
case 'end':
return context$1$0.stop();
}
}, null, this, [[0, 8]]);
};
commands.postDismissAlert = function callee$0$0() {
var method, endpoint, _alert4;
return _regeneratorRuntime.async(function callee$0$0$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
context$1$0.prev = 0;
method = 'POST';
endpoint = '/alert/dismiss';
context$1$0.next = 5;
return _regeneratorRuntime.awrap(this.proxyCommand(endpoint, method));
case 5:
return context$1$0.abrupt('return', context$1$0.sent);
case 8:
context$1$0.prev = 8;
context$1$0.t0 = context$1$0['catch'](0);
if (this.isWebContext()) {
context$1$0.next = 12;
break;
}
throw context$1$0.t0;
case 12:
context$1$0.next = 14;
return _regeneratorRuntime.awrap(this.getAlert());
case 14:
_alert4 = context$1$0.sent;
if (!_alert4.close) {
context$1$0.next = 20;
break;
}
context$1$0.next = 18;
return _regeneratorRuntime.awrap(_alert4.close());
case 18:
context$1$0.next = 22;
break;
case 20:
context$1$0.next = 22;
return _regeneratorRuntime.awrap(_alert4.cancel());
case 22:
return context$1$0.abrupt('return');
case 23:
case 'end':
return context$1$0.stop();
}
}, null, this, [[0, 8]]);
};
helpers.getAlert = function callee$0$0() {
var possibleAlert, possibleAlertButtons, assertButtonName, alert;
return _regeneratorRuntime.async(function callee$0$0$(context$1$0) {
var _this = this;
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
context$1$0.next = 2;
return _regeneratorRuntime.awrap(this.findNativeElementOrElements('class name', 'XCUIElementTypeScrollView', true));
case 2:
possibleAlert = context$1$0.sent;
if (!(possibleAlert.length !== 1)) {
context$1$0.next = 5;
break;
}
throw new _appiumBaseDriver.errors.NoAlertOpenError();
case 5:
context$1$0.next = 7;
return _regeneratorRuntime.awrap(this.findNativeElementOrElements('class name', 'XCUIElementTypeButton', true, possibleAlert[0].ELEMENT));
case 7:
possibleAlertButtons = context$1$0.sent;
if (!(possibleAlertButtons.length < 1 || possibleAlertButtons.length > 2)) {
context$1$0.next = 10;
break;
}
throw new _appiumBaseDriver.errors.NoAlertOpenError();
case 10:
assertButtonName = function assertButtonName(button, expectedName) {
var name;
return _regeneratorRuntime.async(function assertButtonName$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
button = button.ELEMENT ? button.ELEMENT : button;
context$2$0.next = 3;
return _regeneratorRuntime.awrap(this.proxyCommand('/element/' + button + '/attribute/name', 'GET'));
case 3:
name = context$2$0.sent;
if (!(name.toLowerCase() !== expectedName)) {
context$2$0.next = 6;
break;
}
throw new _appiumBaseDriver.errors.NoAlertOpenError();
case 6:
case 'end':
return context$2$0.stop();
}
}, null, _this);
};
alert = possibleAlert[0];
if (!(possibleAlertButtons.length === 1)) {
context$1$0.next = 17;
break;
}
context$1$0.next = 15;
return _regeneratorRuntime.awrap((function callee$1$0() {
var closeButton;
return _regeneratorRuntime.async(function callee$1$0$(context$2$0) {
var _this2 = this;
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
closeButton = possibleAlertButtons[0];
context$2$0.next = 3;
return _regeneratorRuntime.awrap(assertButtonName(closeButton, 'close'));
case 3:
alert.close = function callee$2$0() {
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.next = 2;
return _regeneratorRuntime.awrap(this.proxyCommand('/element/' + closeButton.ELEMENT + '/click', 'POST'));
case 2:
case 'end':
return context$3$0.stop();
}
}, null, _this2);
};
case 4:
case 'end':
return context$2$0.stop();
}
}, null, _this);
})());
case 15:
context$1$0.next = 19;
break;
case 17:
context$1$0.next = 19;
return _regeneratorRuntime.awrap((function callee$1$0() {
var cancelButton, okButton;
return _regeneratorRuntime.async(function callee$1$0$(context$2$0) {
var _this3 = this;
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
cancelButton = possibleAlertButtons[0];
context$2$0.next = 3;
return _regeneratorRuntime.awrap(assertButtonName(cancelButton, 'cancel'));
case 3:
okButton = possibleAlertButtons[1];
context$2$0.next = 6;
return _regeneratorRuntime.awrap(assertButtonName(okButton, 'ok'));
case 6:
alert.cancel = function callee$2$0() {
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.next = 2;
return _regeneratorRuntime.awrap(this.proxyCommand('/element/' + cancelButton.ELEMENT + '/click', 'POST'));
case 2:
case 'end':
return context$3$0.stop();
}
}, null, _this3);
};
alert.ok = function callee$2$0() {
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.next = 2;
return _regeneratorRuntime.awrap(this.proxyCommand('/element/' + okButton.ELEMENT + '/click', 'POST'));
case 2:
case 'end':
return context$3$0.stop();
}
}, null, _this3);
};
case 8:
case 'end':
return context$2$0.stop();
}
}, null, _this);
})());
case 19:
alert.getText = function callee$1$0() {
var textView;
return _regeneratorRuntime.async(function callee$1$0$(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.findNativeElementOrElements('class name', 'XCUIElementTypeTextView', false, alert.ELEMENT));
case 2:
textView = context$2$0.sent;
context$2$0.next = 5;
return _regeneratorRuntime.awrap(this.proxyCommand('/element/' + textView.ELEMENT + '/attribute/value', 'GET'));
case 5:
return context$2$0.abrupt('return', context$2$0.sent);
case 6:
case 'end':
return context$2$0.stop();
}
}, null, _this);
};
alert.setText = function callee$1$0(value) {
var textView;
return _regeneratorRuntime.async(function callee$1$0$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
context$2$0.prev = 0;
context$2$0.next = 3;
return _regeneratorRuntime.awrap(this.findNativeElementOrElements('class name', 'XCUIElementTypeTextField', false, alert.ELEMENT));
case 3:
textView = context$2$0.sent;
context$2$0.next = 6;
return _regeneratorRuntime.awrap(this.proxyCommand('/element/' + textView.ELEMENT + '/value ', 'POST', { value: value }));
case 6:
context$2$0.next = 13;
break;
case 8:
context$2$0.prev = 8;
context$2$0.t0 = context$2$0['catch'](0);
if (!(0, _appiumBaseDriver.isErrorType)(context$2$0.t0, _appiumBaseDriver.errors.NoSuchElementError)) {
context$2$0.next = 12;
break;
}
throw new Error('Tried to set text of an alert that was not a prompt');
case 12:
throw context$2$0.t0;
case 13:
case 'end':
return context$2$0.stop();
}
}, null, _this, [[0, 8]]);
};
return context$1$0.abrupt('return', alert);
case 22:
case 'end':
return context$1$0.stop();
}
}, null, this);
};
_Object$assign(extensions, commands, helpers);
exports.commands = commands;
exports.helpers = helpers;
exports['default'] = extensions;
// make sure the button is 'Close'
// ensure the buttons are 'Cancel' and 'OK'
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9hbGVydC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O2dDQUFvQyxvQkFBb0I7O0FBR3hELElBQUksUUFBUSxHQUFHLEVBQUU7SUFBRSxPQUFPLEdBQUcsRUFBRTtJQUFFLFVBQVUsR0FBRyxFQUFFLENBQUM7O0FBRWpELFFBQVEsQ0FBQyxZQUFZLEdBQUc7TUFFaEIsTUFBTSxFQUNOLFFBQVEsRUFPUixNQUFLLEVBQ0wsSUFBSTs7Ozs7O0FBVEosY0FBTSxHQUFHLEtBQUs7QUFDZCxnQkFBUTs7eUNBQ0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDOzs7Ozs7Ozs7WUFFM0MsSUFBSSxDQUFDLFlBQVksRUFBRTs7Ozs7Ozs7O3lDQUlOLElBQUksQ0FBQyxRQUFRLEVBQUU7OztBQUE3QixjQUFLOzt5Q0FDUSxNQUFLLENBQUMsT0FBTyxFQUFFOzs7QUFBNUIsWUFBSTs0Q0FDRCxJQUFJOzs7Ozs7O0NBRWQsQ0FBQzs7O0FBR0YsUUFBUSxDQUFDLFlBQVksR0FBRyxvQkFBZ0IsSUFBSTtNQUtwQyxNQUFNLEVBQ04sUUFBUSxFQU9SLE9BQUs7Ozs7O0FBWlgsWUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDeEIsY0FBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdkI7O0FBRUssY0FBTSxHQUFHLE1BQU07QUFDZixnQkFBUTs7eUNBQ0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQzs7Ozs7Ozs7O1lBRWpELElBQUksQ0FBQyxZQUFZLEVBQUU7Ozs7Ozs7Ozt5Q0FJTixJQUFJLENBQUMsUUFBUSxFQUFFOzs7QUFBN0IsZUFBSzs7eUNBQ0gsT0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Ozs7Ozs7Ozs7Q0FHNUIsQ0FBQzs7QUFFRixRQUFRLENBQUMsZUFBZSxHQUFH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RSxPQUFPLEdBQVAsT0FBTztxQkFDWCxVQUFVIiwiZmlsZSI6ImxpYi9jb21tYW5kcy9hbGVydC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVycm9ycywgaXNFcnJvclR5cGUgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuXG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29tbWFuZHMuZ2V0QWxlcnRUZXh0ID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIGxldCBtZXRob2QgPSAnR0VUJztcbiAgICBsZXQgZW5kcG9pbnQgPSBgL2FsZXJ0L3RleHRgO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChlbmRwb2ludCwgbWV0aG9kKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgbGV0IGFsZXJ0ID0gYXdhaXQgdGhpcy5nZXRBbGVydCgpO1xuICAgIGxldCB0ZXh0ID0gYXdhaXQgYWxlcnQuZ2V0VGV4dCgpO1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG59O1xuXG4vLyBUT0RPOiBXREEgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBuYXRpdmVseVxuY29tbWFuZHMuc2V0QWxlcnRUZXh0ID0gYXN5bmMgZnVuY3Rpb24gKHRleHQpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHRleHQpKSB7XG4gICAgdGV4dCA9IHRleHQuc3BsaXQoJycpO1xuICB9XG4gIHRyeSB7XG4gICAgbGV0IG1ldGhvZCA9ICdQT1NUJztcbiAgICBsZXQgZW5kcG9pbnQgPSBgL2FsZXJ0L3RleHRgO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChlbmRwb2ludCwgbWV0aG9kLCB0ZXh0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgbGV0IGFsZXJ0ID0gYXdhaXQgdGhpcy5nZXRBbGVydCgpO1xuICAgIGF3YWl0IGFsZXJ0LnNldFRleHQodGV4dCk7XG4gICAgcmV0dXJuO1xuICB9XG59O1xuXG5jb21tYW5kcy5wb3N0QWNjZXB0QWxlcnQgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgbGV0IG1ldGhvZCA9ICdQT1NUJztcbiAgICBsZXQgZW5kcG9pbnQgPSBgL2FsZXJ0L2FjY2VwdGA7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGVuZHBvaW50LCBtZXRob2QpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBsZXQgYWxlcnQgPSBhd2FpdCB0aGlzLmdldEFsZXJ0KCk7XG4gICAgaWYgKGFsZXJ0LmNsb3NlKSB7XG4gICAgICBhd2FpdCBhbGVydC5jbG9zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBhbGVydC5vaygpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbn07XG5cbmNvbW1hbmRzLnBvc3REaXNtaXNzQWxlcnQgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgbGV0IG1ldGhvZCA9ICdQT1NUJztcbiAgICBsZXQgZW5kcG9pbnQgPSBgL2FsZXJ0L2Rpc21pc3NgO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChlbmRwb2ludCwgbWV0aG9kKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgbGV0IGFsZXJ0ID0gYXdhaXQgdGhpcy5nZXRBbGVydCgpO1xuICAgIGlmIChhbGVydC5jbG9zZSkge1xuICAgICAgYXdhaXQgYWxlcnQuY2xvc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgYWxlcnQuY2FuY2VsKCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxufTtcblxuaGVscGVycy5nZXRBbGVydCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHBvc3NpYmxlQWxlcnQgPSBhd2FpdCB0aGlzLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cygnY2xhc3MgbmFtZScsICdYQ1VJRWxlbWVudFR5cGVTY3JvbGxWaWV3JywgdHJ1ZSk7XG4gIGlmIChwb3NzaWJsZUFsZXJ0Lmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm9BbGVydE9wZW5FcnJvcigpO1xuICB9XG5cbiAgbGV0IHBvc3NpYmxlQWxlcnRCdXR0b25zID0gYXdhaXQgdGhpcy5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2NsYXNzIG5hbWUnLCAnWENVSUVsZW1lbnRUeXBlQnV0dG9uJywgdHJ1ZSwgcG9zc2libGVBbGVydFswXS5FTEVNRU5UKTtcbiAgaWYgKHBvc3NpYmxlQWxlcnRCdXR0b25zLmxlbmd0aCAgPCAxIHx8IHBvc3NpYmxlQWxlcnRCdXR0b25zLmxlbmd0aCA+IDIpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vQWxlcnRPcGVuRXJyb3IoKTtcbiAgfVxuXG4gIGxldCBhc3NlcnRCdXR0b25OYW1lID0gYXN5bmMgKGJ1dHRvbiwgZXhwZWN0ZWROYW1lKSA9PiB7XG4gICAgYnV0dG9uID0gYnV0dG9uLkVMRU1FTlQgPyBidXR0b24uRUxFTUVOVCA6IGJ1dHRvbjtcbiAgICBsZXQgbmFtZSA9IGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke2J1dHRvbn0vYXR0cmlidXRlL25hbWVgLCAnR0VUJyk7XG4gICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKSAhPT0gZXhwZWN0ZWROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vQWxlcnRPcGVuRXJyb3IoKTtcbiAgICB9XG4gIH07XG5cbiAgbGV0IGFsZXJ0ID0gcG9zc2libGVBbGVydFswXTtcbiAgaWYgKHBvc3NpYmxlQWxlcnRCdXR0b25zLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIG1ha2Ugc3VyZSB0aGUgYnV0dG9uIGlzICdDbG9zZSdcbiAgICBsZXQgY2xvc2VCdXR0b24gPSBwb3NzaWJsZUFsZXJ0QnV0dG9uc1swXTtcbiAgICBhd2FpdCBhc3NlcnRCdXR0b25OYW1lKGNsb3NlQnV0dG9uLCAnY2xvc2UnKTtcblxuICAgIGFsZXJ0LmNsb3NlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7Y2xvc2VCdXR0b24uRUxFTUVOVH0vY2xpY2tgLCAnUE9TVCcpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gZW5zdXJlIHRoZSBidXR0b25zIGFyZSAnQ2FuY2VsJyBhbmQgJ09LJ1xuICAgIGxldCBjYW5jZWxCdXR0b24gPSBwb3NzaWJsZUFsZXJ0QnV0dG9uc1swXTtcbiAgICBhd2FpdCBhc3NlcnRCdXR0b25OYW1lKGNhbmNlbEJ1dHRvbiwgJ2NhbmNlbCcpO1xuICAgIGxldCBva0J1dHRvbiA9IHBvc3NpYmxlQWxlcnRCdXR0b25zWzFdO1xuICAgIGF3YWl0IGFzc2VydEJ1dHRvbk5hbWUob2tCdXR0b24sICdvaycpO1xuXG4gICAgYWxlcnQuY2FuY2VsID0gYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7Y2FuY2VsQnV0dG9uLkVMRU1FTlR9L2NsaWNrYCwgJ1BPU1QnKTtcbiAgICB9O1xuICAgIGFsZXJ0Lm9rID0gYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7b2tCdXR0b24uRUxFTUVOVH0vY2xpY2tgLCAnUE9TVCcpO1xuICAgIH07XG4gIH1cblxuICBhbGVydC5nZXRUZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGxldCB0ZXh0VmlldyA9IGF3YWl0IHRoaXMuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKCdjbGFzcyBuYW1lJywgJ1hDVUlFbGVtZW50VHlwZVRleHRWaWV3JywgZmFsc2UsIGFsZXJ0LkVMRU1FTlQpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHt0ZXh0Vmlldy5FTEVNRU5UfS9hdHRyaWJ1dGUvdmFsdWVgLCAnR0VUJyk7XG4gIH07XG4gIGFsZXJ0LnNldFRleHQgPSBhc3luYyAodmFsdWUpID0+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IHRleHRWaWV3ID0gYXdhaXQgdGhpcy5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2NsYXNzIG5hbWUnLCAnWENVSUVsZW1lbnRUeXBlVGV4dEZpZWxkJywgZmFsc2UsIGFsZXJ0LkVMRU1FTlQpO1xuICAgICAgYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7dGV4dFZpZXcuRUxFTUVOVH0vdmFsdWUgYCwgJ1BPU1QnLCB7dmFsdWV9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Ob1N1Y2hFbGVtZW50RXJyb3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHJpZWQgdG8gc2V0IHRleHQgb2YgYW4gYWxlcnQgdGhhdCB3YXMgbm90IGEgcHJvbXB0Jyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBhbGVydDtcbn07XG5cblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQgeyBjb21tYW5kcywgaGVscGVycyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==