UNPKG

appium-xcuitest-driver-conan

Version:

Appium driver for iOS using XCUITest for backend

472 lines (370 loc) 24.8 kB
'use strict'; 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==