webdriverio-automation
Version:
WebdriverIO-Automation android ios project
297 lines (261 loc) • 43.2 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
require("source-map-support/register");
var _lodash = _interopRequireDefault(require("lodash"));
var _chai = _interopRequireDefault(require("chai"));
var _chaiAsPromised = _interopRequireDefault(require("chai-as-promised"));
var _2 = _interopRequireWildcard(require("../.."));
var _imageElement = require("../../lib/basedriver/image-element");
var _protocol = require("../../lib/protocol/protocol");
var _sinon = _interopRequireDefault(require("sinon"));
_chai.default.should();
_chai.default.use(_chaiAsPromised.default);
const defRect = {
x: 100,
y: 110,
width: 50,
height: 25
};
const defTemplate = 'iVBORasdf';
describe('ImageElement', function () {
const driver = new _2.default();
describe('.size', function () {
it('should return the width and height of the image el', function () {
const el = new _2.ImageElement(defTemplate, defRect);
el.size.should.eql({
width: defRect.width,
height: defRect.height
});
});
});
describe('.location', function () {
it('should return the location of the image el', function () {
const el = new _2.ImageElement(defTemplate, defRect);
el.location.should.eql({
x: defRect.x,
y: defRect.y
});
});
});
describe('.center', function () {
it('should return the center location of the image el', function () {
const el = new _2.ImageElement(defTemplate, defRect);
el.center.should.eql({
x: defRect.x + defRect.width / 2,
y: defRect.y + defRect.height / 2
});
});
});
describe('.asElement', function () {
it('should get the webdriver object representation of the element', function () {
const el = new _2.ImageElement(defTemplate, defRect);
el.asElement('ELEMENT').ELEMENT.should.match(/^appium-image-el/);
});
});
describe('.equals', function () {
it('should say two image elements with same rect are equal', function () {
const el1 = new _2.ImageElement('foo', defRect);
const el2 = new _2.ImageElement('bar', defRect);
el1.equals(el2).should.be.true;
el2.equals(el1).should.be.true;
});
it('should say two image elements with different rect are not equal', function () {
const el1 = new _2.ImageElement(defTemplate, { ...defRect,
x: 0
});
const el2 = new _2.ImageElement(defTemplate, defRect);
el1.equals(el2).should.be.false;
el2.equals(el1).should.be.false;
});
});
describe('.click', function () {
it('should reject an invalid tap strategy', async function () {
const d = new _2.default();
const el = new _2.ImageElement(defTemplate, defRect);
await d.settings.update({
imageElementTapStrategy: 'bad'
});
await el.click(d).should.eventually.be.rejectedWith(/Incorrect imageElementTapStrategy/);
});
it('should try to check for image element staleness, and throw if stale', async function () {
const d = new _2.default();
_sinon.default.stub(d, 'findByImage').throws();
const el = new _2.ImageElement(defTemplate, defRect);
await d.settings.update({
checkForImageElementStaleness: true,
autoUpdateImageElementPosition: false
});
await el.click(d).should.eventually.be.rejectedWith(/no longer attached/);
await d.settings.update({
checkForImageElementStaleness: false,
autoUpdateImageElementPosition: true
});
await el.click(d).should.eventually.be.rejectedWith(/no longer attached/);
});
it('should auto-update element position if requested', async function () {
const d = new _2.default();
d.performActions = _lodash.default.noop;
_sinon.default.stub(d, 'performActions');
const el = new _2.ImageElement(defTemplate, defRect);
const newRect = { ...defRect,
x: defRect.x + 10,
y: defRect.y + 5
};
const elPos2 = new _2.ImageElement(defTemplate, newRect);
_sinon.default.stub(d, 'findByImage').returns(elPos2);
await d.settings.update({
autoUpdateImageElementPosition: true
});
el.rect.should.not.eql(newRect);
await el.click(d);
el.rect.should.eql(newRect);
});
it('should tap the center of an element using w3c actions by default', async function () {
const d = new _2.default();
d.performActions = _lodash.default.noop;
const actionStub = _sinon.default.stub(d, 'performActions');
const el = new _2.ImageElement(defTemplate, defRect);
await d.settings.update({
checkForImageElementStaleness: false
});
await el.click(d);
const pointerMoveAction = actionStub.args[0][0][0].actions[0];
pointerMoveAction.x.should.equal(el.center.x);
pointerMoveAction.y.should.equal(el.center.y);
});
it('should fall back to touchactions if w3c actions do not exist on driver', async function () {
const d = new _2.default();
d.performTouch = _lodash.default.noop;
const actionStub = _sinon.default.stub(d, 'performTouch');
const el = new _2.ImageElement(defTemplate, defRect);
await d.settings.update({
checkForImageElementStaleness: false
});
await el.click(d);
const action = actionStub.args[0][0][0].options;
action.x.should.equal(el.center.x);
action.y.should.equal(el.center.y);
});
it('should use touchactions if requested', async function () {
const d = new _2.default();
d.performActions = _lodash.default.noop;
const w3cStub = _sinon.default.stub(d, 'performActions');
d.performTouch = _lodash.default.noop;
const touchStub = _sinon.default.stub(d, 'performTouch');
const el = new _2.ImageElement(defTemplate, defRect);
await d.settings.update({
checkForImageElementStaleness: false,
imageElementTapStrategy: 'touchActions'
});
await el.click(d);
const action = touchStub.args[0][0][0].options;
action.x.should.equal(el.center.x);
action.y.should.equal(el.center.y);
w3cStub.callCount.should.eql(0);
});
it('should throw if driver does not implement any type of action', async function () {
const d = new _2.default();
const el = new _2.ImageElement(defTemplate, defRect);
await d.settings.update({
checkForImageElementStaleness: false
});
await el.click(d).should.eventually.be.rejectedWith(/did not implement/);
});
});
describe('#execute', function () {
const imgEl = new _2.ImageElement(defTemplate, defRect, 'aGFwcHkgdGVzdGluZw==');
const clickStub = _sinon.default.stub(imgEl, 'click');
before(function () {
driver._imgElCache.set(imgEl.id, imgEl);
clickStub.returns(true);
});
after(function () {
driver._imgElCache.reset();
clickStub.restore();
});
it('should reject executions on elements not in the cache', async function () {
await _2.ImageElement.execute(driver, 'click', 'appium-image-element-foo').should.eventually.be.rejectedWith(/element could not be located/);
});
it('should reject executions for unsupported commands', async function () {
await _2.ImageElement.execute(driver, 'foobar', imgEl.id).should.eventually.be.rejectedWith(/not yet been implemented/);
});
it('should get displayed status of element', async function () {
await _2.ImageElement.execute(driver, 'elementDisplayed', imgEl.id).should.eventually.be.true;
});
it('should get size of element', async function () {
await _2.ImageElement.execute(driver, 'getSize', imgEl.id).should.eventually.eql({
width: defRect.width,
height: defRect.height
});
});
it('should get location of element', async function () {
await _2.ImageElement.execute(driver, 'getLocation', imgEl.id).should.eventually.eql({
x: defRect.x,
y: defRect.y
});
});
it('should get location in view of element', async function () {
await _2.ImageElement.execute(driver, 'getLocation', imgEl.id).should.eventually.eql({
x: defRect.x,
y: defRect.y
});
});
it('should get rect of element', async function () {
await _2.ImageElement.execute(driver, 'getElementRect', imgEl.id).should.eventually.eql(defRect);
});
it('should get visual of element', async function () {
await _2.ImageElement.execute(driver, 'getAttribute', imgEl.id, 'visual').should.eventually.eql('aGFwcHkgdGVzdGluZw==');
});
it('should get null as visual of element by default', async function () {
const imgElement = new _2.ImageElement(defTemplate, defRect);
driver._imgElCache.set(imgElement.id, imgElement);
await _2.ImageElement.execute(driver, 'getAttribute', imgElement.id, 'visual').should.eventually.eql(null);
});
it('should not get other attribute', async function () {
await _2.ImageElement.execute(driver, 'getAttribute', imgEl.id, 'content-desc').should.eventually.rejectedWith('Method has not yet been implemented');
});
it('should click element', async function () {
await _2.ImageElement.execute(driver, 'click', imgEl.id).should.eventually.be.true;
});
});
});
describe('image element LRU cache', function () {
it('should accept and cache image elements', function () {
const el1 = new _2.ImageElement(defTemplate, defRect);
const el2 = new _2.ImageElement(defTemplate, defRect);
const cache = (0, _imageElement.makeImageElementCache)();
cache.set(el1.id, el1);
el1.equals(cache.get(el1.id)).should.be.true;
_lodash.default.isUndefined(cache.get(el2.id)).should.be.true;
cache.has(el1.id).should.be.true;
cache.has(el2.id).should.be.false;
});
it('once cache reaches max size, should eject image elements', function () {
const el1 = new _2.ImageElement(defTemplate, defRect);
const el2 = new _2.ImageElement(defTemplate, defRect);
const cache = (0, _imageElement.makeImageElementCache)(defTemplate.length + 1);
cache.set(el1.id, el1);
cache.has(el1.id).should.be.true;
cache.set(el2.id, el2);
cache.has(el2.id).should.be.true;
cache.has(el1.id).should.be.false;
});
});
describe('getImgElFromArgs', function () {
it('should return the image element id from json obj in args', function () {
const imgEl = `${_protocol.IMAGE_ELEMENT_PREFIX}foo`;
const args = [1, 'foo', imgEl];
(0, _imageElement.getImgElFromArgs)(args).should.eql(imgEl);
});
it('should not return anything if image element id not in args', function () {
const args = [1, 'foo'];
_lodash.default.isUndefined((0, _imageElement.getImgElFromArgs)(args)).should.be.true;
});
it('should not find image element id in anything but prefix', function () {
const notImgEl = `foo${_protocol.IMAGE_ELEMENT_PREFIX}`;
const args = [1, 'foo', notImgEl];
_lodash.default.isUndefined((0, _imageElement.getImgElFromArgs)(args)).should.be.true;
});
});require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYmFzZWRyaXZlci9pbWFnZS1lbGVtZW50LXNwZWNzLmpzIl0sIm5hbWVzIjpbImNoYWkiLCJzaG91bGQiLCJ1c2UiLCJjaGFpQXNQcm9taXNlZCIsImRlZlJlY3QiLCJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0IiwiZGVmVGVtcGxhdGUiLCJkZXNjcmliZSIsImRyaXZlciIsIkJhc2VEcml2ZXIiLCJpdCIsImVsIiwiSW1hZ2VFbGVtZW50Iiwic2l6ZSIsImVxbCIsImxvY2F0aW9uIiwiY2VudGVyIiwiYXNFbGVtZW50IiwiRUxFTUVOVCIsIm1hdGNoIiwiZWwxIiwiZWwyIiwiZXF1YWxzIiwiYmUiLCJ0cnVlIiwiZmFsc2UiLCJkIiwic2V0dGluZ3MiLCJ1cGRhdGUiLCJpbWFnZUVsZW1lbnRUYXBTdHJhdGVneSIsImNsaWNrIiwiZXZlbnR1YWxseSIsInJlamVjdGVkV2l0aCIsInNpbm9uIiwic3R1YiIsInRocm93cyIsImNoZWNrRm9ySW1hZ2VFbGVtZW50U3RhbGVuZXNzIiwiYXV0b1VwZGF0ZUltYWdlRWxlbWVudFBvc2l0aW9uIiwicGVyZm9ybUFjdGlvbnMiLCJfIiwibm9vcCIsIm5ld1JlY3QiLCJlbFBvczIiLCJyZXR1cm5zIiwicmVjdCIsIm5vdCIsImFjdGlvblN0dWIiLCJwb2ludGVyTW92ZUFjdGlvbiIsImFyZ3MiLCJhY3Rpb25zIiwiZXF1YWwiLCJwZXJmb3JtVG91Y2giLCJhY3Rpb24iLCJvcHRpb25zIiwidzNjU3R1YiIsInRvdWNoU3R1YiIsImNhbGxDb3VudCIsImltZ0VsIiwiY2xpY2tTdHViIiwiYmVmb3JlIiwiX2ltZ0VsQ2FjaGUiLCJzZXQiLCJpZCIsImFmdGVyIiwicmVzZXQiLCJyZXN0b3JlIiwiZXhlY3V0ZSIsImltZ0VsZW1lbnQiLCJjYWNoZSIsImdldCIsImlzVW5kZWZpbmVkIiwiaGFzIiwibGVuZ3RoIiwiSU1BR0VfRUxFTUVOVF9QUkVGSVgiLCJub3RJbWdFbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFB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SUFkLEVBQUFBLEVBQUUsQ0FBQyx5REFBRCxFQUE0RCxZQUFZO0FBQ3hFLFVBQU1nRSxRQUFRLEdBQUksTUFBS0QsOEJBQXFCLEVBQTVDO0FBQ0EsVUFBTXpCLElBQUksR0FBRyxDQUFDLENBQUQsRUFBSSxLQUFKLEVBQVcwQixRQUFYLENBQWI7QUFDQW5DLG9CQUFFK0IsV0FBRixDQUFjLG9DQUFpQnRCLElBQWpCLENBQWQsRUFBc0NsRCxNQUF0QyxDQUE2Q3lCLEVBQTdDLENBQWdEQyxJQUFoRDtBQUNELEdBSkMsQ0FBRjtBQUtELENBZk8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCBjaGFpQXNQcm9taXNlZCBmcm9tICdjaGFpLWFzLXByb21pc2VkJztcbmltcG9ydCBCYXNlRHJpdmVyLCB7IEltYWdlRWxlbWVudCB9IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IG1ha2VJbWFnZUVsZW1lbnRDYWNoZSwgZ2V0SW1nRWxGcm9tQXJncyB9IGZyb20gJy4uLy4uL2xpYi9iYXNlZHJpdmVyL2ltYWdlLWVsZW1lbnQnO1xuaW1wb3J0IHsgSU1BR0VfRUxFTUVOVF9QUkVGSVggfSBmcm9tICcuLi8uLi9saWIvcHJvdG9jb2wvcHJvdG9jb2wnO1xuaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcblxuXG5jaGFpLnNob3VsZCgpO1xuY2hhaS51c2UoY2hhaUFzUHJvbWlzZWQpO1xuXG5cbmNvbnN0IGRlZlJlY3QgPSB7eDogMTAwLCB5OiAxMTAsIHdpZHRoOiA1MCwgaGVpZ2h0OiAyNX07XG5jb25zdCBkZWZUZW1wbGF0ZSA9ICdpVkJPUmFzZGYnO1xuXG5kZXNjcmliZSgnSW1hZ2VFbGVtZW50JywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBkcml2ZXIgPSBuZXcgQmFzZURyaXZlcigpO1xuXG4gIGRlc2NyaWJlKCcuc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaW1hZ2UgZWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlbCA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgICAgZWwuc2l6ZS5zaG91bGQuZXFsKHt3aWR0aDogZGVmUmVjdC53aWR0aCwgaGVpZ2h0OiBkZWZSZWN0LmhlaWdodH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmxvY2F0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW1hZ2UgZWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlbCA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgICAgZWwubG9jYXRpb24uc2hvdWxkLmVxbCh7eDogZGVmUmVjdC54LCB5OiBkZWZSZWN0Lnl9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5jZW50ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNlbnRlciBsb2NhdGlvbiBvZiB0aGUgaW1hZ2UgZWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlbCA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgICAgZWwuY2VudGVyLnNob3VsZC5lcWwoe1xuICAgICAgICB4OiBkZWZSZWN0LnggKyBkZWZSZWN0LndpZHRoIC8gMixcbiAgICAgICAgeTogZGVmUmVjdC55ICsgZGVmUmVjdC5oZWlnaHQgLyAyXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5hc0VsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBnZXQgdGhlIHdlYmRyaXZlciBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlbCA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgICAgZWwuYXNFbGVtZW50KCdFTEVNRU5UJykuRUxFTUVOVC5zaG91bGQubWF0Y2goL15hcHBpdW0taW1hZ2UtZWwvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5lcXVhbHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzYXkgdHdvIGltYWdlIGVsZW1lbnRzIHdpdGggc2FtZSByZWN0IGFyZSBlcXVhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGVsMSA9IG5ldyBJbWFnZUVsZW1lbnQoJ2ZvbycsIGRlZlJlY3QpO1xuICAgICAgY29uc3QgZWwyID0gbmV3IEltYWdlRWxlbWVudCgnYmFyJywgZGVmUmVjdCk7XG4gICAgICBlbDEuZXF1YWxzKGVsMikuc2hvdWxkLmJlLnRydWU7XG4gICAgICBlbDIuZXF1YWxzKGVsMSkuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBzYXkgdHdvIGltYWdlIGVsZW1lbnRzIHdpdGggZGlmZmVyZW50IHJlY3QgYXJlIG5vdCBlcXVhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGVsMSA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIHsuLi5kZWZSZWN0LCB4OiAwfSk7XG4gICAgICBjb25zdCBlbDIgPSBuZXcgSW1hZ2VFbGVtZW50KGRlZlRlbXBsYXRlLCBkZWZSZWN0KTtcbiAgICAgIGVsMS5lcXVhbHMoZWwyKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgICBlbDIuZXF1YWxzKGVsMSkuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmNsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFuIGludmFsaWQgdGFwIHN0cmF0ZWd5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZCA9IG5ldyBCYXNlRHJpdmVyKCk7XG4gICAgICBjb25zdCBlbCA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgICAgYXdhaXQgZC5zZXR0aW5ncy51cGRhdGUoe2ltYWdlRWxlbWVudFRhcFN0cmF0ZWd5OiAnYmFkJ30pO1xuICAgICAgYXdhaXQgZWwuY2xpY2soZCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9JbmNvcnJlY3QgaW1hZ2VFbGVtZW50VGFwU3RyYXRlZ3kvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHRyeSB0byBjaGVjayBmb3IgaW1hZ2UgZWxlbWVudCBzdGFsZW5lc3MsIGFuZCB0aHJvdyBpZiBzdGFsZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgQmFzZURyaXZlcigpO1xuICAgICAgc2lub24uc3R1YihkLCAnZmluZEJ5SW1hZ2UnKS50aHJvd3MoKTtcbiAgICAgIGNvbnN0IGVsID0gbmV3IEltYWdlRWxlbWVudChkZWZUZW1wbGF0ZSwgZGVmUmVjdCk7XG4gICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGZvciBzdGFsZW5lc3MgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQgdG8gZG8gc29cbiAgICAgIGF3YWl0IGQuc2V0dGluZ3MudXBkYXRlKHtcbiAgICAgICAgY2hlY2tGb3JJbWFnZUVsZW1lbnRTdGFsZW5lc3M6IHRydWUsXG4gICAgICAgIGF1dG9VcGRhdGVJbWFnZUVsZW1lbnRQb3NpdGlvbjogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgZWwuY2xpY2soZCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9ubyBsb25nZXIgYXR0YWNoZWQvKTtcblxuICAgICAgLy8gYW5kIGFsc28gaWYgd2UgYXJlIHVwZGF0aW5nIHRoZSBlbGVtZW50IHBvc2l0aW9uXG4gICAgICBhd2FpdCBkLnNldHRpbmdzLnVwZGF0ZSh7XG4gICAgICAgIGNoZWNrRm9ySW1hZ2VFbGVtZW50U3RhbGVuZXNzOiBmYWxzZSxcbiAgICAgICAgYXV0b1VwZGF0ZUltYWdlRWxlbWVudFBvc2l0aW9uOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGVsLmNsaWNrKGQpLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgvbm8gbG9uZ2VyIGF0dGFjaGVkLyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBhdXRvLXVwZGF0ZSBlbGVtZW50IHBvc2l0aW9uIGlmIHJlcXVlc3RlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgQmFzZURyaXZlcigpO1xuICAgICAgZC5wZXJmb3JtQWN0aW9ucyA9IF8ubm9vcDtcbiAgICAgIHNpbm9uLnN0dWIoZCwgJ3BlcmZvcm1BY3Rpb25zJyk7XG4gICAgICBjb25zdCBlbCA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgICAgY29uc3QgbmV3UmVjdCA9IHsuLi5kZWZSZWN0LCB4OiBkZWZSZWN0LnggKyAxMCwgeTogZGVmUmVjdC55ICsgNX07XG4gICAgICBjb25zdCBlbFBvczIgPSBuZXcgSW1hZ2VFbGVtZW50KGRlZlRlbXBsYXRlLCBuZXdSZWN0KTtcbiAgICAgIHNpbm9uLnN0dWIoZCwgJ2ZpbmRCeUltYWdlJykucmV0dXJucyhlbFBvczIpO1xuICAgICAgYXdhaXQgZC5zZXR0aW5ncy51cGRhdGUoe1xuICAgICAgICBhdXRvVXBkYXRlSW1hZ2VFbGVtZW50UG9zaXRpb246IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGVsLnJlY3Quc2hvdWxkLm5vdC5lcWwobmV3UmVjdCk7XG4gICAgICBhd2FpdCBlbC5jbGljayhkKTtcbiAgICAgIGVsLnJlY3Quc2hvdWxkLmVxbChuZXdSZWN0KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHRhcCB0aGUgY2VudGVyIG9mIGFuIGVsZW1lbnQgdXNpbmcgdzNjIGFjdGlvbnMgYnkgZGVmYXVsdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgQmFzZURyaXZlcigpO1xuICAgICAgZC5wZXJmb3JtQWN0aW9ucyA9IF8ubm9vcDtcbiAgICAgIGNvbnN0IGFjdGlvblN0dWIgPSBzaW5vbi5zdHViKGQsICdwZXJmb3JtQWN0aW9ucycpO1xuICAgICAgY29uc3QgZWwgPSBuZXcgSW1hZ2VFbGVtZW50KGRlZlRlbXBsYXRlLCBkZWZSZWN0KTtcbiAgICAgIC8vIHNraXAgdGhlIHN0YWxlbmVzcyBjaGVjayBmb3IgdGhpcyB0ZXN0XG4gICAgICBhd2FpdCBkLnNldHRpbmdzLnVwZGF0ZSh7XG4gICAgICAgIGNoZWNrRm9ySW1hZ2VFbGVtZW50U3RhbGVuZXNzOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgZWwuY2xpY2soZCk7XG4gICAgICBjb25zdCBwb2ludGVyTW92ZUFjdGlvbiA9IGFjdGlvblN0dWIuYXJnc1swXVswXVswXS5hY3Rpb25zWzBdO1xuICAgICAgcG9pbnRlck1vdmVBY3Rpb24ueC5zaG91bGQuZXF1YWwoZWwuY2VudGVyLngpO1xuICAgICAgcG9pbnRlck1vdmVBY3Rpb24ueS5zaG91bGQuZXF1YWwoZWwuY2VudGVyLnkpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFsbCBiYWNrIHRvIHRvdWNoYWN0aW9ucyBpZiB3M2MgYWN0aW9ucyBkbyBub3QgZXhpc3Qgb24gZHJpdmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZCA9IG5ldyBCYXNlRHJpdmVyKCk7XG4gICAgICBkLnBlcmZvcm1Ub3VjaCA9IF8ubm9vcDtcbiAgICAgIGNvbnN0IGFjdGlvblN0dWIgPSBzaW5vbi5zdHViKGQsICdwZXJmb3JtVG91Y2gnKTtcbiAgICAgIGNvbnN0IGVsID0gbmV3IEltYWdlRWxlbWVudChkZWZUZW1wbGF0ZSwgZGVmUmVjdCk7XG4gICAgICAvLyBza2lwIHRoZSBzdGFsZW5lc3MgY2hlY2sgZm9yIHRoaXMgdGVzdFxuICAgICAgYXdhaXQgZC5zZXR0aW5ncy51cGRhdGUoe1xuICAgICAgICBjaGVja0ZvckltYWdlRWxlbWVudFN0YWxlbmVzczogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGVsLmNsaWNrKGQpO1xuICAgICAgY29uc3QgYWN0aW9uID0gYWN0aW9uU3R1Yi5hcmdzWzBdWzBdWzBdLm9wdGlvbnM7XG4gICAgICBhY3Rpb24ueC5zaG91bGQuZXF1YWwoZWwuY2VudGVyLngpO1xuICAgICAgYWN0aW9uLnkuc2hvdWxkLmVxdWFsKGVsLmNlbnRlci55KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHVzZSB0b3VjaGFjdGlvbnMgaWYgcmVxdWVzdGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZCA9IG5ldyBCYXNlRHJpdmVyKCk7XG4gICAgICBkLnBlcmZvcm1BY3Rpb25zID0gXy5ub29wO1xuICAgICAgY29uc3QgdzNjU3R1YiA9IHNpbm9uLnN0dWIoZCwgJ3BlcmZvcm1BY3Rpb25zJyk7XG4gICAgICBkLnBlcmZvcm1Ub3VjaCA9IF8ubm9vcDtcbiAgICAgIGNvbnN0IHRvdWNoU3R1YiA9IHNpbm9uLnN0dWIoZCwgJ3BlcmZvcm1Ub3VjaCcpO1xuICAgICAgY29uc3QgZWwgPSBuZXcgSW1hZ2VFbGVtZW50KGRlZlRlbXBsYXRlLCBkZWZSZWN0KTtcbiAgICAgIC8vIHNraXAgdGhlIHN0YWxlbmVzcyBjaGVjayBmb3IgdGhpcyB0ZXN0XG4gICAgICBhd2FpdCBkLnNldHRpbmdzLnVwZGF0ZSh7XG4gICAgICAgIGNoZWNrRm9ySW1hZ2VFbGVtZW50U3RhbGVuZXNzOiBmYWxzZSxcbiAgICAgICAgaW1hZ2VFbGVtZW50VGFwU3RyYXRlZ3k6ICd0b3VjaEFjdGlvbnMnLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBlbC5jbGljayhkKTtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHRvdWNoU3R1Yi5hcmdzWzBdWzBdWzBdLm9wdGlvbnM7XG4gICAgICBhY3Rpb24ueC5zaG91bGQuZXF1YWwoZWwuY2VudGVyLngpO1xuICAgICAgYWN0aW9uLnkuc2hvdWxkLmVxdWFsKGVsLmNlbnRlci55KTtcbiAgICAgIHczY1N0dWIuY2FsbENvdW50LnNob3VsZC5lcWwoMCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBkcml2ZXIgZG9lcyBub3QgaW1wbGVtZW50IGFueSB0eXBlIG9mIGFjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgQmFzZURyaXZlcigpO1xuICAgICAgY29uc3QgZWwgPSBuZXcgSW1hZ2VFbGVtZW50KGRlZlRlbXBsYXRlLCBkZWZSZWN0KTtcbiAgICAgIC8vIHNraXAgdGhlIHN0YWxlbmVzcyBjaGVjayBmb3IgdGhpcyB0ZXN0XG4gICAgICBhd2FpdCBkLnNldHRpbmdzLnVwZGF0ZSh7XG4gICAgICAgIGNoZWNrRm9ySW1hZ2VFbGVtZW50U3RhbGVuZXNzOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgZWwuY2xpY2soZCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9kaWQgbm90IGltcGxlbWVudC8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnI2V4ZWN1dGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gYUdGd2NIa2dkR1Z6ZEdsdVp3PT0gaXMgJ2hhcHB5IHRlc3RpbmcnXG4gICAgY29uc3QgaW1nRWwgPSBuZXcgSW1hZ2VFbGVtZW50KGRlZlRlbXBsYXRlLCBkZWZSZWN0LCAnYUdGd2NIa2dkR1Z6ZEdsdVp3PT0nKTtcbiAgICBjb25zdCBjbGlja1N0dWIgPSBzaW5vbi5zdHViKGltZ0VsLCAnY2xpY2snKTtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICBkcml2ZXIuX2ltZ0VsQ2FjaGUuc2V0KGltZ0VsLmlkLCBpbWdFbCk7XG4gICAgICBjbGlja1N0dWIucmV0dXJucyh0cnVlKTtcbiAgICB9KTtcblxuICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIGRyaXZlci5faW1nRWxDYWNoZS5yZXNldCgpO1xuICAgICAgY2xpY2tTdHViLnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGV4ZWN1dGlvbnMgb24gZWxlbWVudHMgbm90IGluIHRoZSBjYWNoZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IEltYWdlRWxlbWVudC5leGVjdXRlKGRyaXZlciwgJ2NsaWNrJywgJ2FwcGl1bS1pbWFnZS1lbGVtZW50LWZvbycpXG4gICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL2VsZW1lbnQgY291bGQgbm90IGJlIGxvY2F0ZWQvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBleGVjdXRpb25zIGZvciB1bnN1cHBvcnRlZCBjb21tYW5kcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IEltYWdlRWxlbWVudC5leGVjdXRlKGRyaXZlciwgJ2Zvb2JhcicsIGltZ0VsLmlkKVxuICAgICAgICAuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9ub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGdldCBkaXNwbGF5ZWQgc3RhdHVzIG9mIGVsZW1lbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBJbWFnZUVsZW1lbnQuZXhlY3V0ZShkcml2ZXIsICdlbGVtZW50RGlzcGxheWVkJywgaW1nRWwuaWQpXG4gICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS50cnVlO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZ2V0IHNpemUgb2YgZWxlbWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IEltYWdlRWxlbWVudC5leGVjdXRlKGRyaXZlciwgJ2dldFNpemUnLCBpbWdFbC5pZClcbiAgICAgICAgLnNob3VsZC5ldmVudHVhbGx5LmVxbCh7d2lkdGg6IGRlZlJlY3Qud2lkdGgsIGhlaWdodDogZGVmUmVjdC5oZWlnaHR9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGdldCBsb2NhdGlvbiBvZiBlbGVtZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgSW1hZ2VFbGVtZW50LmV4ZWN1dGUoZHJpdmVyLCAnZ2V0TG9jYXRpb24nLCBpbWdFbC5pZClcbiAgICAgICAgLnNob3VsZC5ldmVudHVhbGx5LmVxbCh7eDogZGVmUmVjdC54LCB5OiBkZWZSZWN0Lnl9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGdldCBsb2NhdGlvbiBpbiB2aWV3IG9mIGVsZW1lbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBJbWFnZUVsZW1lbnQuZXhlY3V0ZShkcml2ZXIsICdnZXRMb2NhdGlvbicsIGltZ0VsLmlkKVxuICAgICAgICAuc2hvdWxkLmV2ZW50dWFsbHkuZXFsKHt4OiBkZWZSZWN0LngsIHk6IGRlZlJlY3QueX0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZ2V0IHJlY3Qgb2YgZWxlbWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IEltYWdlRWxlbWVudC5leGVjdXRlKGRyaXZlciwgJ2dldEVsZW1lbnRSZWN0JywgaW1nRWwuaWQpXG4gICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5lcWwoZGVmUmVjdCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBnZXQgdmlzdWFsIG9mIGVsZW1lbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBJbWFnZUVsZW1lbnQuZXhlY3V0ZShkcml2ZXIsICdnZXRBdHRyaWJ1dGUnLCBpbWdFbC5pZCwgJ3Zpc3VhbCcpXG4gICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5lcWwoJ2FHRndjSGtnZEdWemRHbHVadz09Jyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBnZXQgbnVsbCBhcyB2aXN1YWwgb2YgZWxlbWVudCBieSBkZWZhdWx0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW1nRWxlbWVudCA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgICAgZHJpdmVyLl9pbWdFbENhY2hlLnNldChpbWdFbGVtZW50LmlkLCBpbWdFbGVtZW50KTtcbiAgICAgIGF3YWl0IEltYWdlRWxlbWVudC5leGVjdXRlKGRyaXZlciwgJ2dldEF0dHJpYnV0ZScsIGltZ0VsZW1lbnQuaWQsICd2aXN1YWwnKVxuICAgICAgICAuc2hvdWxkLmV2ZW50dWFsbHkuZXFsKG51bGwpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgbm90IGdldCBvdGhlciBhdHRyaWJ1dGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBJbWFnZUVsZW1lbnQuZXhlY3V0ZShkcml2ZXIsICdnZXRBdHRyaWJ1dGUnLCBpbWdFbC5pZCwgJ2NvbnRlbnQtZGVzYycpXG4gICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5yZWplY3RlZFdpdGgoJ01ldGhvZCBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBjbGljayBlbGVtZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgSW1hZ2VFbGVtZW50LmV4ZWN1dGUoZHJpdmVyLCAnY2xpY2snLCBpbWdFbC5pZClcbiAgICAgICAgLnNob3VsZC5ldmVudHVhbGx5LmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdpbWFnZSBlbGVtZW50IExSVSBjYWNoZScsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCBhY2NlcHQgYW5kIGNhY2hlIGltYWdlIGVsZW1lbnRzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGVsMSA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgIGNvbnN0IGVsMiA9IG5ldyBJbWFnZUVsZW1lbnQoZGVmVGVtcGxhdGUsIGRlZlJlY3QpO1xuICAgIGNvbnN0IGNhY2hlID0gbWFrZUltYWdlRWxlbWVudENhY2hlKCk7XG4gICAgY2FjaGUuc2V0KGVsMS5pZCwgZWwxKTtcbiAgICBlbDEuZXF1YWxzKGNhY2hlLmdldChlbDEuaWQpKS5zaG91bGQuYmUudHJ1ZTtcbiAgICBfLmlzVW5kZWZpbmVkKGNhY2hlLmdldChlbDIuaWQpKS5zaG91bGQuYmUudHJ1ZTtcbiAgICBjYWNoZS5oYXMoZWwxLmlkKS5zaG91bGQuYmUudHJ1ZTtcbiAgICBjYWNoZS5oYXMoZWwyLmlkKS5zaG91bGQuYmUuZmFsc2U7XG4gIH0pO1xuICBpdCgnb25jZSBjYWNoZSByZWFjaGVzIG1heCBzaXplLCBzaG91bGQgZWplY3QgaW1hZ2UgZWxlbWVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZWwxID0gbmV3IEltYWdlRWxlbWVudChkZWZUZW1wbGF0ZSwgZGVmUmVjdCk7XG4gICAgY29uc3QgZWwyID0gbmV3IEltYWdlRWxlbWVudChkZWZUZW1wbGF0ZSwgZGVmUmVjdCk7XG4gICAgY29uc3QgY2FjaGUgPSBtYWtlSW1hZ2VFbGVtZW50Q2FjaGUoZGVmVGVtcGxhdGUubGVuZ3RoICsgMSk7XG4gICAgY2FjaGUuc2V0KGVsMS5pZCwgZWwxKTtcbiAgICBjYWNoZS5oYXMoZWwxLmlkKS5zaG91bGQuYmUudHJ1ZTtcbiAgICBjYWNoZS5zZXQoZWwyLmlkLCBlbDIpO1xuICAgIGNhY2hlLmhhcyhlbDIuaWQpLnNob3VsZC5iZS50cnVlO1xuICAgIGNhY2hlLmhhcyhlbDEuaWQpLnNob3VsZC5iZS5mYWxzZTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2dldEltZ0VsRnJvbUFyZ3MnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBpbWFnZSBlbGVtZW50IGlkIGZyb20ganNvbiBvYmogaW4gYXJncycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpbWdFbCA9IGAke0lNQUdFX0VMRU1FTlRfUFJFRklYfWZvb2A7XG4gICAgY29uc3QgYXJncyA9IFsxLCAnZm9vJywgaW1nRWxdO1xuICAgIGdldEltZ0VsRnJvbUFyZ3MoYXJncykuc2hvdWxkLmVxbChpbWdFbCk7XG4gIH0pO1xuICBpdCgnc2hvdWxkIG5vdCByZXR1cm4gYW55dGhpbmcgaWYgaW1hZ2UgZWxlbWVudCBpZCBub3QgaW4gYXJncycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBhcmdzID0gWzEsICdmb28nXTtcbiAgICBfLmlzVW5kZWZpbmVkKGdldEltZ0VsRnJvbUFyZ3MoYXJncykpLnNob3VsZC5iZS50cnVlO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCBub3QgZmluZCBpbWFnZSBlbGVtZW50IGlkIGluIGFueXRoaW5nIGJ1dCBwcmVmaXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgbm90SW1nRWwgPSBgZm9vJHtJTUFHRV9FTEVNRU5UX1BSRUZJWH1gO1xuICAgIGNvbnN0IGFyZ3MgPSBbMSwgJ2ZvbycsIG5vdEltZ0VsXTtcbiAgICBfLmlzVW5kZWZpbmVkKGdldEltZ0VsRnJvbUFyZ3MoYXJncykpLnNob3VsZC5iZS50cnVlO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2Jhc2Vkcml2ZXIvaW1hZ2UtZWxlbWVudC1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9