UNPKG

20.8 kBJavaScriptView Raw
1"use strict";
2var infinite_scroll_1 = require('./infinite-scroll');
3var core_1 = require('@angular/core');
4describe('Infinite Scroll Directive', function () {
5 // const zone = new NgZone({ enableLongStackTrace: false });
6 var isScrollingDown = true;
7 var zoneSpy, scrollResolverSpy, scrollRegisterSpy, positionResolverSpy;
8 var positionFactoryMock = {
9 create: function () { return positionResolverSpy; }
10 };
11 var createMockElement = function () {
12 var mockedElement = new core_1.ElementRef(document.createElement('div'));
13 return mockedElement;
14 };
15 var createInfiniteScroll = function (mockedElement) {
16 mockedElement = mockedElement || createMockElement();
17 return new infinite_scroll_1.InfiniteScroll(mockedElement, zoneSpy, positionFactoryMock, scrollRegisterSpy, scrollResolverSpy);
18 };
19 beforeEach(function () {
20 zoneSpy = jasmine.createSpyObj('zone', ['run']);
21 scrollResolverSpy = {
22 getScrollStats: function () {
23 return { shouldScroll: true, isScrollingDown: isScrollingDown };
24 }
25 };
26 scrollRegisterSpy = jasmine.createSpyObj('register', ['attachEvent']);
27 positionResolverSpy = jasmine.createSpyObj('pos', ['create', 'container']);
28 });
29 it('should create an instance of the directive', function () {
30 var actual = createInfiniteScroll();
31 expect(actual).toBeDefined();
32 });
33 it('should have default @Input properties values', function () {
34 var directive = createInfiniteScroll();
35 var expectedInputs = {
36 _distanceDown: 2,
37 _distanceUp: 1.5,
38 _throttle: 300,
39 scrollWindow: true,
40 _immediate: false,
41 _horizontal: false,
42 _alwaysCallback: false,
43 _disabled: false,
44 _container: null
45 };
46 Object.keys(expectedInputs).forEach(function (input) {
47 return expect(directive[input]).toEqual(expectedInputs[input]);
48 });
49 });
50 it('should trigger the onScrollDown event when scroll has passed _distancedDown', function () {
51 var directive = createInfiniteScroll();
52 var container = {
53 height: 0,
54 scrolledUntilNow: 0,
55 totalToScroll: 0,
56 };
57 spyOn(directive, 'onScrollDown');
58 directive.ngOnInit();
59 directive.handleOnScroll(container);
60 var actual = directive.onScrollDown;
61 expect(actual).toHaveBeenCalled();
62 });
63 it('should trigger the onScrollUp event when scroll has passed _distanceUp', function () {
64 var directive = createInfiniteScroll();
65 var container = {
66 height: 0,
67 scrolledUntilNow: 0,
68 totalToScroll: 0,
69 };
70 spyOn(directive, 'onScrollUp');
71 directive.ngOnInit();
72 isScrollingDown = false;
73 directive.handleOnScroll(container);
74 var actual = directive.onScrollUp;
75 expect(actual).toHaveBeenCalled();
76 });
77 it('should disable the scroller', function () {
78 var directive = createInfiniteScroll();
79 var container = {
80 height: 0,
81 scrolledUntilNow: 0,
82 totalToScroll: 0,
83 };
84 spyOn(directive, 'onScrollDown');
85 directive.ngOnInit();
86 directive._disabled = true;
87 directive.handleOnScroll(container);
88 var actual = directive.onScrollDown;
89 expect(actual).not.toHaveBeenCalled();
90 });
91 describe('resolving container', function () {
92 var directive;
93 var mockedElement;
94 var container = {
95 height: 0,
96 scrolledUntilNow: 0,
97 totalToScroll: 0,
98 };
99 beforeEach(function () {
100 mockedElement = createMockElement();
101 directive = createInfiniteScroll(mockedElement);
102 spyOn(positionFactoryMock, 'create').and.callThrough();
103 });
104 describe('when container input is defined', function () {
105 describe('when css selector is used', function () {
106 beforeEach(function () {
107 spyOn(document, 'querySelector').and.returnValue(container);
108 directive._container = '.test';
109 directive.ngOnInit();
110 });
111 it('should find element in DOM', function () {
112 expect(document.querySelector).toHaveBeenCalledWith('.test');
113 });
114 it('should return container', function () {
115 expect(positionFactoryMock.create)
116 .toHaveBeenCalledWith(jasmine.objectContaining({ windowElement: container }));
117 });
118 });
119 describe('when container is passed directly', function () {
120 beforeEach(function () {
121 directive._container = container;
122 directive.ngOnInit();
123 });
124 it('should return container', function () {
125 expect(positionFactoryMock.create)
126 .toHaveBeenCalledWith(jasmine.objectContaining({ windowElement: container }));
127 });
128 });
129 });
130 describe('when container input is not defined', function () {
131 describe('when scrollWindow is true', function () {
132 beforeEach(function () {
133 directive.scrollWindow = true;
134 directive.ngOnInit();
135 });
136 it('should return window', function () {
137 expect(positionFactoryMock.create)
138 .toHaveBeenCalledWith(jasmine.objectContaining({ windowElement: window }));
139 });
140 });
141 describe('when scrollWindow is false', function () {
142 beforeEach(function () {
143 directive.scrollWindow = false;
144 directive.ngOnInit();
145 });
146 it('should return current element', function () {
147 expect(positionFactoryMock.create)
148 .toHaveBeenCalledWith(jasmine.objectContaining({ windowElement: mockedElement }));
149 });
150 });
151 });
152 });
153});
154//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5maW5pdGUtc2Nyb2xsLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmZpbml0ZS1zY3JvbGwuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBSUEsZ0NBQStCLG1CQUFtQixDQUFDLENBQUE7QUFNbkQscUJBQWdFLGVBQWUsQ0FBQyxDQUFBO0FBRWhGLFFBQVEsQ0FBQywyQkFBMkIsRUFBRTtJQUNwQyw0REFBNEQ7SUFDNUQsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzNCLElBQUksT0FBWSxFQUFFLGlCQUFzQixFQUFFLGlCQUFzQixFQUFFLG1CQUF3QixDQUFDO0lBQzNGLElBQU0sbUJBQW1CLEdBQVM7UUFDaEMsTUFBTSxFQUFFLGNBQU0sT0FBQSxtQkFBbUIsRUFBbkIsQ0FBbUI7S0FDbEMsQ0FBQztJQUNGLElBQU0saUJBQWlCLEdBQUc7UUFDeEIsSUFBTSxhQUFhLEdBQWUsSUFBSSxpQkFBVSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRixNQUFNLENBQUMsYUFBYSxDQUFDO0lBQ3ZCLENBQUMsQ0FBQztJQUNGLElBQU0sb0JBQW9CLEdBQUcsVUFBQyxhQUFtQjtRQUMvQyxhQUFhLEdBQUcsYUFBYSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDckQsTUFBTSxDQUFDLElBQUksZ0NBQWMsQ0FDdkIsYUFBYSxFQUNiLE9BQU8sRUFDUCxtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGlCQUFpQixDQUNsQixDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUYsVUFBVSxDQUFDO1FBQ1QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRCxpQkFBaUIsR0FBRztZQUNsQixjQUFjLEVBQUU7Z0JBQ2QsTUFBTSxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxnQ0FBZSxFQUFFLENBQUM7WUFDakQs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QUMsQ0FBQztZQUVILFFBQVEsQ0FBQyw0QkFBNEIsRUFBRTtnQkFDckMsVUFBVSxDQUFDO29CQUNULFNBQVMsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO29CQUMvQixTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3ZCLENBQUMsQ0FBQyxDQUFDO2dCQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRTtvQkFDbEMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQzt5QkFDN0Isb0JBQW9CLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUMsYUFBYSxFQUFFLGFBQWEsRUFBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEYsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFzeW5jLFxuICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZS90ZXN0aW5nJztcbmltcG9ydCB7IEluZmluaXRlU2Nyb2xsIH0gZnJvbSAnLi9pbmZpbml0ZS1zY3JvbGwnO1xuaW1wb3J0IHsgQXhpc1Jlc29sdmVyRmFjdG9yeSB9IGZyb20gJy4vYXhpcy1yZXNvbHZlcic7XG5pbXBvcnQgeyBQb3NpdGlvblJlc29sdmVyRmFjdG9yeSB9IGZyb20gJy4vcG9zaXRpb24tcmVzb2x2ZXInO1xuaW1wb3J0IHsgU2Nyb2xsUmVnaXN0ZXIgfSBmcm9tICcuL3Njcm9sbC1yZWdpc3Rlcic7XG5pbXBvcnQgeyBTY3JvbGxSZXNvbHZlciB9IGZyb20gJy4vc2Nyb2xsLXJlc29sdmVyJztcblxuaW1wb3J0IHsgRWxlbWVudFJlZiwgTmdab25lLCBTaW1wbGVDaGFuZ2VzLCBTaW1wbGVDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZGVzY3JpYmUoJ0luZmluaXRlIFNjcm9sbCBEaXJlY3RpdmUnLCAoKSA9PiB7XG4gIC8vIGNvbnN0IHpvbmUgPSBuZXcgTmdab25lKHsgZW5hYmxlTG9uZ1N0YWNrVHJhY2U6IGZhbHNlIH0pO1xuICBsZXQgaXNTY3JvbGxpbmdEb3duID0gdHJ1ZTtcbiAgbGV0IHpvbmVTcHk6IGFueSwgc2Nyb2xsUmVzb2x2ZXJTcHk6IGFueSwgc2Nyb2xsUmVnaXN0ZXJTcHk6IGFueSwgcG9zaXRpb25SZXNvbHZlclNweTogYW55O1xuICBjb25zdCBwb3NpdGlvbkZhY3RvcnlNb2NrOiBhbnkgPSAge1xuICAgIGNyZWF0ZTogKCkgPT4gcG9zaXRpb25SZXNvbHZlclNweVxuICB9O1xuICBjb25zdCBjcmVhdGVNb2NrRWxlbWVudCA9ICgpID0+IHtcbiAgICBjb25zdCBtb2NrZWRFbGVtZW50OiBFbGVtZW50UmVmID0gbmV3IEVsZW1lbnRSZWYoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xuICAgIHJldHVybiBtb2NrZWRFbGVtZW50O1xuICB9O1xuICBjb25zdCBjcmVhdGVJbmZpbml0ZVNjcm9sbCA9IChtb2NrZWRFbGVtZW50PzogYW55KSA9PiB7XG4gICAgbW9ja2VkRWxlbWVudCA9IG1vY2tlZEVsZW1lbnQgfHwgY3JlYXRlTW9ja0VsZW1lbnQoKTtcbiAgICByZXR1cm4gbmV3IEluZmluaXRlU2Nyb2xsKFxuICAgICAgbW9ja2VkRWxlbWVudCxcbiAgICAgIHpvbmVTcHksXG4gICAgICBwb3NpdGlvbkZhY3RvcnlNb2NrLFxuICAgICAgc2Nyb2xsUmVnaXN0ZXJTcHksXG4gICAgICBzY3JvbGxSZXNvbHZlclNweVxuICAgICk7XG4gIH07XG5cbiAgYmVmb3JlRWFjaCgoKSA9PntcbiAgICB6b25lU3B5ID0gamFzbWluZS5jcmVhdGVTcHlPYmooJ3pvbmUnLCBbJ3J1biddKTtcbiAgICBzY3JvbGxSZXNvbHZlclNweSA9IHtcbiAgICAgIGdldFNjcm9sbFN0YXRzOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7IHNob3VsZFNjcm9sbDogdHJ1ZSwgaXNTY3JvbGxpbmdEb3duIH07XG4gICAgICB9XG4gICAgfTtcbiAgICBzY3JvbGxSZWdpc3RlclNweSA9IGphc21pbmUuY3JlYXRlU3B5T2JqKCdyZWdpc3RlcicsIFsnYXR0YWNoRXZlbnQnXSlcbiAgICBwb3NpdGlvblJlc29sdmVyU3B5ID0gamFzbWluZS5jcmVhdGVTcHlPYmooJ3BvcycsIFsnY3JlYXRlJywgJ2NvbnRhaW5lciddKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGRpcmVjdGl2ZScsICgpID0+IHtcbiAgICBjb25zdCBhY3R1YWwgPSBjcmVhdGVJbmZpbml0ZVNjcm9sbCgpO1xuICAgIGV4cGVjdChhY3R1YWwpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgaGF2ZSBkZWZhdWx0IEBJbnB1dCBwcm9wZXJ0aWVzIHZhbHVlcycsICgpID0+IHtcbiAgICBjb25zdCBkaXJlY3RpdmUgPSBjcmVhdGVJbmZpbml0ZVNjcm9sbCgpO1xuICAgIGNvbnN0IGV4cGVjdGVkSW5wdXRzOiBPYmplY3QgPSB7XG4gICAgICBfZGlzdGFuY2VEb3duOiAyLFxuICAgICAgX2Rpc3RhbmNlVXA6IDEuNSxcbiAgICAgIF90aHJvdHRsZTogMzAwLFxuICAgICAgc2Nyb2xsV2luZG93OiB0cnVlLFxuICAgICAgX2ltbWVkaWF0ZTogZmFsc2UsXG4gICAgICBfaG9yaXpvbnRhbDogZmFsc2UsXG4gICAgICBfYWx3YXlzQ2FsbGJhY2s6IGZhbHNlLFxuICAgICAgX2Rpc2FibGVkOiBmYWxzZSxcbiAgICAgIF9jb250YWluZXI6IG51bGxcbiAgICB9O1xuXG4gICAgT2JqZWN0LmtleXMoZXhwZWN0ZWRJbnB1dHMpLmZvckVhY2goaW5wdXQgPT5cbiAgICAgIGV4cGVjdChkaXJlY3RpdmVbaW5wdXRdKS50b0VxdWFsKGV4cGVjdGVkSW5wdXRzW2lucHV0XSkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRyaWdnZXIgdGhlIG9uU2Nyb2xsRG93biBldmVudCB3aGVuIHNjcm9sbCBoYXMgcGFzc2VkIF9kaXN0YW5jZWREb3duJywgKCkgPT4ge1xuICAgIGNvbnN0IGRpcmVjdGl2ZSA9IGNyZWF0ZUluZmluaXRlU2Nyb2xsKCk7XG4gICAgY29uc3QgY29udGFpbmVyID0ge1xuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgc2Nyb2xsZWRVbnRpbE5vdzogMCxcbiAgICAgIHRvdGFsVG9TY3JvbGw6IDAsXG4gICAgfVxuICAgIHNweU9uKGRpcmVjdGl2ZSwgJ29uU2Nyb2xsRG93bicpO1xuICAgIGRpcmVjdGl2ZS5uZ09uSW5pdCgpO1xuICAgIGRpcmVjdGl2ZS5oYW5kbGVPblNjcm9sbChjb250YWluZXIpXG4gICAgY29uc3QgYWN0dWFsID0gZGlyZWN0aXZlLm9uU2Nyb2xsRG93bjtcbiAgICBleHBlY3QoYWN0dWFsKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdHJpZ2dlciB0aGUgb25TY3JvbGxVcCBldmVudCB3aGVuIHNjcm9sbCBoYXMgcGFzc2VkIF9kaXN0YW5jZVVwJywgKCkgPT4ge1xuICAgIGNvbnN0IGRpcmVjdGl2ZSA9IGNyZWF0ZUluZmluaXRlU2Nyb2xsKCk7XG4gICAgY29uc3QgY29udGFpbmVyID0ge1xuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgc2Nyb2xsZWRVbnRpbE5vdzogMCxcbiAgICAgIHRvdGFsVG9TY3JvbGw6IDAsXG4gICAgfTtcbiAgICBzcHlPbihkaXJlY3RpdmUsICdvblNjcm9sbFVwJyk7XG4gICAgZGlyZWN0aXZlLm5nT25Jbml0KCk7XG4gICAgaXNTY3JvbGxpbmdEb3duID0gZmFsc2U7XG4gICAgZGlyZWN0aXZlLmhhbmRsZU9uU2Nyb2xsKGNvbnRhaW5lcik7XG4gICAgY29uc3QgYWN0dWFsID0gZGlyZWN0aXZlLm9uU2Nyb2xsVXA7XG4gICAgZXhwZWN0KGFjdHVhbCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRpc2FibGUgdGhlIHNjcm9sbGVyJywgKCkgPT4ge1xuICAgIGNvbnN0IGRpcmVjdGl2ZSA9IGNyZWF0ZUluZmluaXRlU2Nyb2xsKCk7XG4gICAgY29uc3QgY29udGFpbmVyID0ge1xuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgc2Nyb2xsZWRVbnRpbE5vdzogMCxcbiAgICAgIHRvdGFsVG9TY3JvbGw6IDAsXG4gICAgfVxuICAgIHNweU9uKGRpcmVjdGl2ZSwgJ29uU2Nyb2xsRG93bicpO1xuICAgIGRpcmVjdGl2ZS5uZ09uSW5pdCgpO1xuICAgIGRpcmVjdGl2ZS5fZGlzYWJsZWQgPSB0cnVlO1xuICAgIGRpcmVjdGl2ZS5oYW5kbGVPblNjcm9sbChjb250YWluZXIpO1xuICAgIGNvbnN0IGFjdHVhbCA9IGRpcmVjdGl2ZS5vblNjcm9sbERvd247XG4gICAgZXhwZWN0KGFjdHVhbCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Jlc29sdmluZyBjb250YWluZXInLCAoKSA9PiB7XG4gICAgbGV0IGRpcmVjdGl2ZTogSW5maW5pdGVTY3JvbGw7XG4gICAgbGV0IG1vY2tlZEVsZW1lbnQ6IEVsZW1lbnRSZWY7XG4gICAgY29uc3QgY29udGFpbmVyID0ge1xuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgc2Nyb2xsZWRVbnRpbE5vdzogMCxcbiAgICAgIHRvdGFsVG9TY3JvbGw6IDAsXG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgbW9ja2VkRWxlbWVudCA9IGNyZWF0ZU1vY2tFbGVtZW50KCk7XG4gICAgICBkaXJlY3RpdmUgPSBjcmVhdGVJbmZpbml0ZVNjcm9sbChtb2NrZWRFbGVtZW50KTtcbiAgICAgIHNweU9uKHBvc2l0aW9uRmFjdG9yeU1vY2ssICdjcmVhdGUnKS5hbmQuY2FsbFRocm91Z2goKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIGNvbnRhaW5lciBpbnB1dCBpcyBkZWZpbmVkJywgKCkgPT4ge1xuICAgICAgZGVzY3JpYmUoJ3doZW4gY3NzIHNlbGVjdG9yIGlzIHVzZWQnLCAoKSA9PiB7XG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgIHNweU9uKGRvY3VtZW50LCAncXVlcnlTZWxlY3RvcicpLmFuZC5yZXR1cm5WYWx1ZShjb250YWluZXIpO1xuICAgICAgICAgIGRpcmVjdGl2ZS5fY29udGFpbmVyID0gJy50ZXN0JztcbiAgICAgICAgICBkaXJlY3RpdmUubmdPbkluaXQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmaW5kIGVsZW1lbnQgaW4gRE9NJywgKCkgPT4ge1xuICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnLnRlc3QnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gY29udGFpbmVyJywgKCkgPT4ge1xuICAgICAgICAgIGV4cGVjdChwb3NpdGlvbkZhY3RvcnlNb2NrLmNyZWF0ZSlcbiAgICAgICAgICAgICAgLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGphc21pbmUub2JqZWN0Q29udGFpbmluZyh7d2luZG93RWxlbWVudDogY29udGFpbmVyfSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnd2hlbiBjb250YWluZXIgaXMgcGFzc2VkIGRpcmVjdGx5JywgKCkgPT4ge1xuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICBkaXJlY3RpdmUuX2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICAgICAgICBkaXJlY3RpdmUubmdPbkluaXQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gY29udGFpbmVyJywgKCkgPT4ge1xuICAgICAgICAgIGV4cGVjdChwb3NpdGlvbkZhY3RvcnlNb2NrLmNyZWF0ZSlcbiAgICAgICAgICAgICAgLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGphc21pbmUub2JqZWN0Q29udGFpbmluZyh7d2luZG93RWxlbWVudDogY29udGFpbmVyfSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3doZW4gY29udGFpbmVyIGlucHV0IGlzIG5vdCBkZWZpbmVkJywgKCkgPT4ge1xuICAgICAgZGVzY3JpYmUoJ3doZW4gc2Nyb2xsV2luZG93IGlzIHRydWUnLCAoKSA9PiB7XG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgIGRpcmVjdGl2ZS5zY3JvbGxXaW5kb3cgPSB0cnVlO1xuICAgICAgICAgIGRpcmVjdGl2ZS5uZ09uSW5pdCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiB3aW5kb3cnLCAoKSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHBvc2l0aW9uRmFjdG9yeU1vY2suY3JlYXRlKVxuICAgICAgICAgICAgICAudG9IYXZlQmVlbkNhbGxlZFdpdGgoamFzbWluZS5vYmplY3RDb250YWluaW5nKHt3aW5kb3dFbGVtZW50OiB3aW5kb3d9KSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aGVuIHNjcm9sbFdpbmRvdyBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgZGlyZWN0aXZlLnNjcm9sbFdpbmRvdyA9IGZhbHNlO1xuICAgICAgICAgIGRpcmVjdGl2ZS5uZ09uSW5pdCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBjdXJyZW50IGVsZW1lbnQnLCAoKSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHBvc2l0aW9uRmFjdG9yeU1vY2suY3JlYXRlKVxuICAgICAgICAgICAgICAudG9IYXZlQmVlbkNhbGxlZFdpdGgoamFzbWluZS5vYmplY3RDb250YWluaW5nKHt3aW5kb3dFbGVtZW50OiBtb2NrZWRFbGVtZW50fSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5pbnRlcmZhY2UgRGVjb3JhdG9ySW52b2NhdGlvbiB7XG4gIHR5cGU6IEZ1bmN0aW9uO1xuICBhcmdzPzogYW55W107XG59XG4iXX0=
\No newline at end of file