videogular2
Version:
Videogular is a video application framework for desktop and mobile powered by Angular
252 lines • 38.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var vg_api_1 = require("./vg-api");
var vg_states_1 = require("../states/vg-states");
describe('Videogular Player', function () {
var api;
beforeEach(function () {
api = new vg_api_1.VgAPI();
});
it('Should get the default media', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary' }
};
expect(api.getDefaultMedia()).toEqual({ id: 'main' });
});
describe('getMasterMedia', function () {
it('Should get the master media', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary', vgMaster: true }
};
expect(api.getMasterMedia()).toEqual({ id: 'secondary', vgMaster: true });
});
it('Should get the default media when no master is defined', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary' }
};
expect(api.getMasterMedia()).toEqual(api.getDefaultMedia());
});
});
it('Should get the api if we do not pass an id', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary' }
};
expect(api.getMediaById()).toEqual(api);
});
it('Should get the api if we pass an *', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary' }
};
expect(api.getMediaById('*')).toEqual(api);
});
it('Should get a media object if we pass an id', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary' }
};
expect(api.getMediaById('main')).toEqual({ id: 'main' });
});
it('Should play all medias', function () {
api.medias = {
main: { id: 'main', play: function () { } },
secondary: { id: 'secondary', play: function () { } }
};
spyOn(api.medias.main, 'play').and.callThrough();
spyOn(api.medias.secondary, 'play').and.callThrough();
api.play();
expect(api.medias.main.play).toHaveBeenCalled();
expect(api.medias.secondary.play).toHaveBeenCalled();
});
it('Should pause all medias', function () {
api.medias = {
main: { id: 'main', pause: function () { } },
secondary: { id: 'secondary', pause: function () { } }
};
spyOn(api.medias.main, 'pause').and.callThrough();
spyOn(api.medias.secondary, 'pause').and.callThrough();
api.pause();
expect(api.medias.main.pause).toHaveBeenCalled();
expect(api.medias.secondary.pause).toHaveBeenCalled();
});
it('Should get duration', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
// @ts-ignore
var duration = api.duration;
expect(api.$$getAllProperties).toHaveBeenCalledWith('duration');
});
it('Should set a state', function () {
spyOn(api, '$$setAllProperties').and.callFake(function () { });
api.state = 'pause';
expect(api.$$setAllProperties).toHaveBeenCalledWith('state', 'pause');
});
it('Should get state', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
// @ts-ignore
var state = api.state;
expect(api.$$getAllProperties).toHaveBeenCalledWith('state');
});
it('Should set a currentTime', function () {
spyOn(api, '$$setAllProperties').and.callFake(function () { });
api.currentTime = 50;
expect(api.$$setAllProperties).toHaveBeenCalledWith('currentTime', 50);
});
it('Should get currentTime', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
// @ts-ignore
var currentTime = api.currentTime;
expect(api.$$getAllProperties).toHaveBeenCalledWith('currentTime');
});
it('Should set a volume', function () {
spyOn(api, '$$setAllProperties').and.callFake(function () { });
api.volume = 0.5;
expect(api.$$setAllProperties).toHaveBeenCalledWith('volume', 0.5);
});
it('Should get volume', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
// @ts-ignore
var volume = api.volume;
expect(api.$$getAllProperties).toHaveBeenCalledWith('volume');
});
it('Should set a playback rate', function () {
spyOn(api, '$$setAllProperties').and.callFake(function () { });
api.playbackRate = 0.5;
expect(api.$$setAllProperties).toHaveBeenCalledWith('playbackRate', 0.5);
});
it('Should get playbackRate', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
// @ts-ignore
var playbackRate = api.playbackRate;
expect(api.$$getAllProperties).toHaveBeenCalledWith('playbackRate');
});
it('Should get canPlay', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
// @ts-ignore
var canPlay = api.canPlay;
expect(api.$$getAllProperties).toHaveBeenCalledWith('canPlay');
});
it('Should get canPlayThrough', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
// @ts-ignore
var canPlayThrough = api.canPlayThrough;
expect(api.$$getAllProperties).toHaveBeenCalledWith('canPlayThrough');
});
it('Should get isMetadataLoaded', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
// @ts-ignore
var isMetadataLoaded = api.isMetadataLoaded;
expect(api.$$getAllProperties).toHaveBeenCalledWith('isMetadataLoaded');
});
it('Should get isWaiting', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
// @ts-ignore
var isWaiting = api.isWaiting;
expect(api.$$getAllProperties).toHaveBeenCalledWith('isWaiting');
});
it('Should get isCompleted', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
// @ts-ignore
var isCompleted = api.isCompleted;
expect(api.$$getAllProperties).toHaveBeenCalledWith('isCompleted');
});
it('Should get time', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
// @ts-ignore
var time = api.time;
expect(api.$$getAllProperties).toHaveBeenCalledWith('time');
});
it('Should get buffer', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
// @ts-ignore
var time = api.buffer;
expect(api.$$getAllProperties).toHaveBeenCalledWith('buffer');
});
it('Should get buffered', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
// @ts-ignore
var buffered = api.buffered;
expect(api.$$getAllProperties).toHaveBeenCalledWith('buffered');
});
it('Should get subscriptions', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
// @ts-ignore
var subscriptions = api.subscriptions;
expect(api.$$getAllProperties).toHaveBeenCalledWith('subscriptions');
});
it('Should seek to a specified time by second', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary' }
};
spyOn(api, '$$seek').and.callFake(function () { });
api.seekTime(10);
expect(api.$$seek).toHaveBeenCalledWith({ id: 'main' }, 10, false);
expect(api.$$seek).toHaveBeenCalledWith({ id: 'secondary' }, 10, false);
});
it('Should seek to a specified time by percentage', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary' }
};
spyOn(api, '$$seek').and.callFake(function () { });
api.seekTime(10, true);
expect(api.$$seek).toHaveBeenCalledWith({ id: 'main' }, 10, true);
expect(api.$$seek).toHaveBeenCalledWith({ id: 'secondary' }, 10, true);
});
it('Should seek media files to a specified time by second', function () {
var media = {
currentTime: 0
};
api.$$seek(media, 10);
expect(media.currentTime).toBe(10);
});
it('Should seek media files to a specified time by percentage', function () {
var media = {
duration: 200,
currentTime: 0,
subscriptions: {}
};
api.$$seek(media, 10, true);
expect(media.currentTime).toBe(20);
});
it('Should get a property from all media objects and return an object', function () {
api.medias = {
main: { id: 'main', state: vg_states_1.VgStates.VG_PLAYING },
secondary: { id: 'secondary', state: vg_states_1.VgStates.VG_PAUSED }
};
var states = api.$$getAllProperties('state');
expect(states).toEqual(vg_states_1.VgStates.VG_PLAYING);
});
it('Should get a property from all media objects and return a plain value if there is only one media object', function () {
api.medias = {
main: { id: 'main', state: vg_states_1.VgStates.VG_PLAYING }
};
var states = api.$$getAllProperties('state');
expect(states).toEqual(vg_states_1.VgStates.VG_PLAYING);
});
it('Should set a property to all media objects', function () {
api.medias = {
main: { id: 'main', state: 'stop' },
secondary: { id: 'secondary', state: 'stop' }
};
api.$$setAllProperties('state', vg_states_1.VgStates.VG_PLAYING);
expect(api.medias.main.state).toBe(vg_states_1.VgStates.VG_PLAYING);
expect(api.medias.secondary.state).toBe(vg_states_1.VgStates.VG_PLAYING);
});
it('Should register a new media object', function () {
var media = { id: 'main' };
api.registerMedia(media);
expect(api.medias['main']).toBe(media);
});
it('Should register a new media object', function () {
var media = { id: 'main' };
api['main'] = {};
api.unregisterMedia(media);
expect(api.medias['main']).toBe(undefined);
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmctYXBpLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS9zZXJ2aWNlcy92Zy1hcGkuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1DQUErQjtBQUUvQixpREFBNkM7QUFFN0MsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzFCLElBQUksR0FBUyxDQUFDO0lBRWQsVUFBVSxDQUFDO1FBQ1AsR0FBRyxHQUFHLElBQUksY0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUU7UUFDL0IsR0FBRyxDQUFDLE1BQU0sR0FBRztZQUNULElBQUksRUFBRSxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUM7WUFDbEIsU0FBUyxFQUFFLEVBQUMsRUFBRSxFQUFFLFdBQVcsRUFBQztTQUMvQixDQUFDO1FBRUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBWSxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1FBQ3ZCLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtZQUM5QixHQUFHLENBQUMsTUFBTSxHQUFHO2dCQUNULElBQUksRUFBRSxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUM7Z0JBQ2xCLFNBQVMsRUFBRSxFQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBQzthQUMvQyxDQUFDO1lBRUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBTSxFQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUFDakYsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsd0RBQXdELEVBQUU7WUFDekQsR0FB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TyxFQUFFLG9CQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFckQsTUFBTSxDQUFPLEdBQUcsQ0FBQyxNQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sQ0FBTyxHQUFHLENBQUMsTUFBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN4RSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRTtRQUNyQyxJQUFJLEtBQUssR0FBRyxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUMsQ0FBQztRQUV6QixHQUFHLENBQUMsYUFBYSxDQUFZLEtBQUssQ0FBQyxDQUFDO1FBRXBDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1FBQ3JDLElBQUksS0FBSyxHQUFHLEVBQUMsRUFBRSxFQUFFLE1BQU0sRUFBQyxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFakIsR0FBRyxDQUFDLGVBQWUsQ0FBWSxLQUFLLENBQUMsQ0FBQztRQUV0QyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtWZ0FQSX0gZnJvbSBcIi4vdmctYXBpXCI7XG5pbXBvcnQge0lQbGF5YWJsZX0gZnJvbSBcIi4uL3ZnLW1lZGlhL2ktcGxheWFibGVcIjtcbmltcG9ydCB7VmdTdGF0ZXN9IGZyb20gXCIuLi9zdGF0ZXMvdmctc3RhdGVzXCI7XG5cbmRlc2NyaWJlKCdWaWRlb2d1bGFyIFBsYXllcicsICgpID0+IHtcbiAgICBsZXQgYXBpOlZnQVBJO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIGFwaSA9IG5ldyBWZ0FQSSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgdGhlIGRlZmF1bHQgbWVkaWEnLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJ30sXG4gICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeSd9XG4gICAgICAgIH07XG5cbiAgICAgICAgZXhwZWN0KGFwaS5nZXREZWZhdWx0TWVkaWEoKSkudG9FcXVhbCg8SVBsYXlhYmxlPntpZDogJ21haW4nfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2V0TWFzdGVyTWVkaWEnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdTaG91bGQgZ2V0IHRoZSBtYXN0ZXIgbWVkaWEnLCAoKSA9PiB7XG4gICAgICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgICAgIG1haW46IHtpZDogJ21haW4nfSxcbiAgICAgICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeScsIHZnTWFzdGVyOiB0cnVlfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZXhwZWN0KGFwaS5nZXRNYXN0ZXJNZWRpYSgpKS50b0VxdWFsKDxhbnk+e2lkOiAnc2Vjb25kYXJ5JywgdmdNYXN0ZXI6IHRydWV9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdTaG91bGQgZ2V0IHRoZSBkZWZhdWx0IG1lZGlhIHdoZW4gbm8gbWFzdGVyIGlzIGRlZmluZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgICAgIG1haW46IHtpZDogJ21haW4nfSxcbiAgICAgICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeSd9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBleHBlY3QoYXBpLmdldE1hc3Rlck1lZGlhKCkpLnRvRXF1YWwoYXBpLmdldERlZmF1bHRNZWRpYSgpKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCB0aGUgYXBpIGlmIHdlIGRvIG5vdCBwYXNzIGFuIGlkJywgKCkgPT4ge1xuICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgbWFpbjoge2lkOiAnbWFpbid9LFxuICAgICAgICAgICAgc2Vjb25kYXJ5OiB7aWQ6ICdzZWNvbmRhcnknfVxuICAgICAgICB9O1xuXG4gICAgICAgIGV4cGVjdChhcGkuZ2V0TWVkaWFCeUlkKCkpLnRvRXF1YWwoPGFueT5hcGkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgdGhlIGFwaSBpZiB3ZSBwYXNzIGFuIConLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJ30sXG4gICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeSd9XG4gICAgICAgIH07XG5cbiAgICAgICAgZXhwZWN0KGFwaS5nZXRNZWRpYUJ5SWQoJyonKSkudG9FcXVhbCg8YW55PmFwaSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCBhIG1lZGlhIG9iamVjdCBpZiB3ZSBwYXNzIGFuIGlkJywgKCkgPT4ge1xuICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgbWFpbjoge2lkOiAnbWFpbid9LFxuICAgICAgICAgICAgc2Vjb25kYXJ5OiB7aWQ6ICdzZWNvbmRhcnknfVxuICAgICAgICB9O1xuXG4gICAgICAgIGV4cGVjdChhcGkuZ2V0TWVkaWFCeUlkKCdtYWluJykpLnRvRXF1YWwoPElQbGF5YWJsZT57aWQ6ICdtYWluJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBwbGF5IGFsbCBtZWRpYXMnLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJywgcGxheTogKCkgPT4ge319LFxuICAgICAgICAgICAgc2Vjb25kYXJ5OiB7aWQ6ICdzZWNvbmRhcnknLCBwbGF5OiAoKSA9PiB7fX1cbiAgICAgICAgfTtcblxuICAgICAgICBzcHlPbigoPGFueT5hcGkubWVkaWFzKS5tYWluLCAncGxheScpLmFuZC5jYWxsVGhyb3VnaCgpO1xuICAgICAgICBzcHlPbigoPGFueT5hcGkubWVkaWFzKS5zZWNvbmRhcnksICdwbGF5JykuYW5kLmNhbGxUaHJvdWdoKCk7XG5cbiAgICAgICAgYXBpLnBsYXkoKTtcblxuICAgICAgICBleHBlY3QoKDxhbnk+YXBpLm1lZGlhcykubWFpbi5wbGF5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIGV4cGVjdCgoPGFueT5hcGkubWVkaWFzKS5zZWNvbmRhcnkucGxheSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBwYXVzZSBhbGwgbWVkaWFzJywgKCkgPT4ge1xuICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgbWFpbjoge2lkOiAnbWFpbicsIHBhdXNlOiAoKSA9PiB7fX0sXG4gICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeScsIHBhdXNlOiAoKSA9PiB7fX1cbiAgICAgICAgfTtcblxuICAgICAgICBzcHlPbigoPGFueT5hcGkubWVkaWFzKS5tYWluLCAncGF1c2UnKS5hbmQuY2FsbFRocm91Z2goKTtcbiAgICAgICAgc3B5T24oKDxhbnk+YXBpLm1lZGlhcykuc2Vjb25kYXJ5LCAncGF1c2UnKS5hbmQuY2FsbFRocm91Z2goKTtcblxuICAgICAgICBhcGkucGF1c2UoKTtcblxuICAgICAgICBleHBlY3QoKDxhbnk+YXBpLm1lZGlhcykubWFpbi5wYXVzZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICBleHBlY3QoKDxhbnk+YXBpLm1lZGlhcykuc2Vjb25kYXJ5LnBhdXNlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCBkdXJhdGlvbicsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBsZXQgZHVyYXRpb24gPSBhcGkuZHVyYXRpb247XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJGdldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdkdXJhdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBzZXQgYSBzdGF0ZScsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRzZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcblxuICAgICAgICBhcGkuc3RhdGUgPSAncGF1c2UnO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRzZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnc3RhdGUnLCAncGF1c2UnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IHN0YXRlJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJGdldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGxldCBzdGF0ZSA9IGFwaS5zdGF0ZTtcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3N0YXRlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHNldCBhIGN1cnJlbnRUaW1lJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJHNldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuXG4gICAgICAgIGFwaS5jdXJyZW50VGltZSA9IDUwO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRzZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY3VycmVudFRpbWUnLCA1MCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCBjdXJyZW50VGltZScsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBsZXQgY3VycmVudFRpbWUgPSBhcGkuY3VycmVudFRpbWU7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJGdldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjdXJyZW50VGltZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBzZXQgYSB2b2x1bWUnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkc2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG5cbiAgICAgICAgYXBpLnZvbHVtZSA9IDAuNTtcblxuICAgICAgICBleHBlY3QoYXBpLiQkc2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3ZvbHVtZScsIDAuNSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCB2b2x1bWUnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkZ2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbGV0IHZvbHVtZSA9IGFwaS52b2x1bWU7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJGdldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCd2b2x1bWUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgc2V0IGEgcGxheWJhY2sgcmF0ZScsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRzZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcblxuICAgICAgICBhcGkucGxheWJhY2tSYXRlID0gMC41O1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRzZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgncGxheWJhY2tSYXRlJywgMC41KTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IHBsYXliYWNrUmF0ZScsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBsZXQgcGxheWJhY2tSYXRlID0gYXBpLnBsYXliYWNrUmF0ZTtcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3BsYXliYWNrUmF0ZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgY2FuUGxheScsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBsZXQgY2FuUGxheSA9IGFwaS5jYW5QbGF5O1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRnZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY2FuUGxheScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgY2FuUGxheVRocm91Z2gnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkZ2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbGV0IGNhblBsYXlUaHJvdWdoID0gYXBpLmNhblBsYXlUaHJvdWdoO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRnZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY2FuUGxheVRocm91Z2gnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IGlzTWV0YWRhdGFMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkZ2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbGV0IGlzTWV0YWRhdGFMb2FkZWQgPSBhcGkuaXNNZXRhZGF0YUxvYWRlZDtcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2lzTWV0YWRhdGFMb2FkZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IGlzV2FpdGluZycsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBsZXQgaXNXYWl0aW5nID0gYXBpLmlzV2FpdGluZztcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2lzV2FpdGluZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgaXNDb21wbGV0ZWQnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkZ2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbGV0IGlzQ29tcGxldGVkID0gYXBpLmlzQ29tcGxldGVkO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRnZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnaXNDb21wbGV0ZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IHRpbWUnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkZ2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbGV0IHRpbWUgPSBhcGkudGltZTtcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3RpbWUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IGJ1ZmZlcicsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBsZXQgdGltZSA9IGFwaS5idWZmZXI7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJGdldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdidWZmZXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IGJ1ZmZlcmVkJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJGdldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGxldCBidWZmZXJlZCA9IGFwaS5idWZmZXJlZDtcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2J1ZmZlcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCBzdWJzY3JpcHRpb25zJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJGdldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gYXBpLnN1YnNjcmlwdGlvbnM7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJGdldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdWJzY3JpcHRpb25zJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHNlZWsgdG8gYSBzcGVjaWZpZWQgdGltZSBieSBzZWNvbmQnLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJ30sXG4gICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeSd9XG4gICAgICAgIH07XG5cbiAgICAgICAgc3B5T24oYXBpLCAnJCRzZWVrJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcblxuICAgICAgICBhcGkuc2Vla1RpbWUoMTApO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRzZWVrKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCg8SVBsYXlhYmxlPntpZDogJ21haW4nfSwgMTAsIGZhbHNlKTtcbiAgICAgICAgZXhwZWN0KGFwaS4kJHNlZWspLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDxJUGxheWFibGU+e2lkOiAnc2Vjb25kYXJ5J30sIDEwLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHNlZWsgdG8gYSBzcGVjaWZpZWQgdGltZSBieSBwZXJjZW50YWdlJywgKCkgPT4ge1xuICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgbWFpbjoge2lkOiAnbWFpbid9LFxuICAgICAgICAgICAgc2Vjb25kYXJ5OiB7aWQ6ICdzZWNvbmRhcnknfVxuICAgICAgICB9O1xuXG4gICAgICAgIHNweU9uKGFwaSwgJyQkc2VlaycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG5cbiAgICAgICAgYXBpLnNlZWtUaW1lKDEwLCB0cnVlKTtcblxuICAgICAgICBleHBlY3QoYXBpLiQkc2VlaykudG9IYXZlQmVlbkNhbGxlZFdpdGgoPElQbGF5YWJsZT57aWQ6ICdtYWluJ30sIDEwLCB0cnVlKTtcbiAgICAgICAgZXhwZWN0KGFwaS4kJHNlZWspLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDxJUGxheWFibGU+e2lkOiAnc2Vjb25kYXJ5J30sIDEwLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgc2VlayBtZWRpYSBmaWxlcyB0byBhIHNwZWNpZmllZCB0aW1lIGJ5IHNlY29uZCcsICgpID0+IHtcbiAgICAgICAgbGV0IG1lZGlhID0ge1xuICAgICAgICAgICAgY3VycmVudFRpbWU6IDBcbiAgICAgICAgfTtcblxuICAgICAgICBhcGkuJCRzZWVrKDxJUGxheWFibGU+bWVkaWEsIDEwKTtcblxuICAgICAgICBleHBlY3QobWVkaWEuY3VycmVudFRpbWUpLnRvQmUoMTApO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBzZWVrIG1lZGlhIGZpbGVzIHRvIGEgc3BlY2lmaWVkIHRpbWUgYnkgcGVyY2VudGFnZScsICgpID0+IHtcbiAgICAgICAgbGV0IG1lZGlhID0ge1xuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcbiAgICAgICAgICAgIGN1cnJlbnRUaW1lOiAwLFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uczoge31cbiAgICAgICAgfTtcblxuICAgICAgICBhcGkuJCRzZWVrKDxhbnk+bWVkaWEsIDEwLCB0cnVlKTtcblxuICAgICAgICBleHBlY3QobWVkaWEuY3VycmVudFRpbWUpLnRvQmUoMjApO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgYSBwcm9wZXJ0eSBmcm9tIGFsbCBtZWRpYSBvYmplY3RzIGFuZCByZXR1cm4gYW4gb2JqZWN0JywgKCkgPT4ge1xuICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgbWFpbjoge2lkOiAnbWFpbicsIHN0YXRlOiBWZ1N0YXRlcy5WR19QTEFZSU5HfSxcbiAgICAgICAgICAgIHNlY29uZGFyeToge2lkOiAnc2Vjb25kYXJ5Jywgc3RhdGU6IFZnU3RhdGVzLlZHX1BBVVNFRH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgc3RhdGVzID0gYXBpLiQkZ2V0QWxsUHJvcGVydGllcygnc3RhdGUnKTtcblxuICAgICAgICBleHBlY3Qoc3RhdGVzKS50b0VxdWFsKFZnU3RhdGVzLlZHX1BMQVlJTkcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgYSBwcm9wZXJ0eSBmcm9tIGFsbCBtZWRpYSBvYmplY3RzIGFuZCByZXR1cm4gYSBwbGFpbiB2YWx1ZSBpZiB0aGVyZSBpcyBvbmx5IG9uZSBtZWRpYSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJywgc3RhdGU6IFZnU3RhdGVzLlZHX1BMQVlJTkd9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHN0YXRlcyA9IGFwaS4kJGdldEFsbFByb3BlcnRpZXMoJ3N0YXRlJyk7XG5cbiAgICAgICAgZXhwZWN0KHN0YXRlcykudG9FcXVhbChWZ1N0YXRlcy5WR19QTEFZSU5HKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgc2V0IGEgcHJvcGVydHkgdG8gYWxsIG1lZGlhIG9iamVjdHMnLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJywgc3RhdGU6ICdzdG9wJ30sXG4gICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeScsIHN0YXRlOiAnc3RvcCd9XG4gICAgICAgIH07XG5cbiAgICAgICAgYXBpLiQkc2V0QWxsUHJvcGVydGllcygnc3RhdGUnLCBWZ1N0YXRlcy5WR19QTEFZSU5HKTtcblxuICAgICAgICBleHBlY3QoKDxhbnk+YXBpLm1lZGlhcykubWFpbi5zdGF0ZSkudG9CZShWZ1N0YXRlcy5WR19QTEFZSU5HKTtcbiAgICAgICAgZXhwZWN0KCg8YW55PmFwaS5tZWRpYXMpLnNlY29uZGFyeS5zdGF0ZSkudG9CZShWZ1N0YXRlcy5WR19QTEFZSU5HKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgcmVnaXN0ZXIgYSBuZXcgbWVkaWEgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgICBsZXQgbWVkaWEgPSB7aWQ6ICdtYWluJ307XG5cbiAgICAgICAgYXBpLnJlZ2lzdGVyTWVkaWEoPElQbGF5YWJsZT5tZWRpYSk7XG5cbiAgICAgICAgZXhwZWN0KGFwaS5tZWRpYXNbJ21haW4nXSkudG9CZShtZWRpYSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHJlZ2lzdGVyIGEgbmV3IG1lZGlhIG9iamVjdCcsICgpID0+IHtcbiAgICAgICAgbGV0IG1lZGlhID0ge2lkOiAnbWFpbid9O1xuICAgICAgICBhcGlbJ21haW4nXSA9IHt9O1xuXG4gICAgICAgIGFwaS51bnJlZ2lzdGVyTWVkaWEoPElQbGF5YWJsZT5tZWRpYSk7XG5cbiAgICAgICAgZXhwZWN0KGFwaS5tZWRpYXNbJ21haW4nXSkudG9CZSh1bmRlZmluZWQpO1xuICAgIH0pO1xufSk7XG4iXX0=