@nativescript-community/ui-pager 14.1.9 → 14.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,311 +0,0 @@
1
- import { Component, ContentChild, Directive, ElementRef, EmbeddedViewRef, EventEmitter, Host, Inject, InjectionToken, Input, IterableDiffers, Output, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core';
2
- import { Pager, PagerError, PagerItem, PagerLog } from '@nativescript-community/ui-pager';
3
- import { extractSingleViewRecursive, isInvisibleNode, isListLikeIterable, registerElement } from '@nativescript/angular';
4
- import { LayoutBase, Trace, View, isIOS } from '@nativescript/core';
5
- import { ObservableArray } from '@nativescript/core/data/observable-array';
6
- import { profile } from '@nativescript/core/profiling';
7
- import * as i0 from "@angular/core";
8
- const _c0 = ["loader"];
9
- registerElement('Pager', () => Pager);
10
- registerElement('PagerItem', () => PagerItem);
11
- const NG_VIEW = '_ngViewRef';
12
- export class ItemContext {
13
- constructor($implicit, item, index, even, odd) {
14
- this.$implicit = $implicit;
15
- this.item = item;
16
- this.index = index;
17
- this.even = even;
18
- this.odd = odd;
19
- }
20
- }
21
- export class TemplatedItemsComponent {
22
- constructor(_elementRef, _iterableDiffers) {
23
- this._iterableDiffers = _iterableDiffers;
24
- this.setupItemView = new EventEmitter();
25
- this.templatedItemsView = _elementRef.nativeElement;
26
- this.templatedItemsView.on('itemLoading', this.onItemLoading, this);
27
- this.templatedItemsView.on('itemDisposing', this.onItemDisposing, this);
28
- }
29
- get items() {
30
- return this._items;
31
- }
32
- set items(value) {
33
- this._items = value;
34
- let needDiffer = true;
35
- if (value instanceof ObservableArray) {
36
- needDiffer = false;
37
- }
38
- if (needDiffer && !this._differ && isListLikeIterable(value)) {
39
- this._differ = this._iterableDiffers.find(this._items).create((_index, item) => item);
40
- }
41
- this.templatedItemsView.items = this._items;
42
- }
43
- get selectedIndex() {
44
- return this._selectedIndex;
45
- }
46
- set selectedIndex(value) {
47
- this._selectedIndex = value;
48
- this.templatedItemsView.selectedIndex = this._selectedIndex;
49
- }
50
- ngAfterViewInit() {
51
- if (!!this._selectedIndex) {
52
- setTimeout(() => {
53
- if (isIOS) {
54
- this.templatedItemsView.scrollToIndexAnimated(this._selectedIndex, false);
55
- }
56
- this.templatedItemsView.selectedIndex = this._selectedIndex;
57
- });
58
- }
59
- }
60
- ngAfterContentInit() {
61
- if (Trace.isEnabled()) {
62
- PagerLog('TemplatedItemsView.ngAfterContentInit()');
63
- }
64
- this.setItemTemplates();
65
- }
66
- ngOnDestroy() {
67
- this.templatedItemsView.off('itemLoading', this.onItemLoading, this);
68
- this.templatedItemsView.off('itemDisposing', this.onItemDisposing, this);
69
- }
70
- setItemTemplates() {
71
- if (!this.items)
72
- return;
73
- // The itemTemplateQuery may be changed after list items are added that contain <template> inside,
74
- // so cache and use only the original template to avoid errors.
75
- this.itemTemplate = this.itemTemplateQuery;
76
- if (this._templateMap) {
77
- if (Trace.isEnabled()) {
78
- PagerLog('Setting templates');
79
- }
80
- const templates = [];
81
- this._templateMap.forEach((value) => {
82
- templates.push(value);
83
- });
84
- this.templatedItemsView.itemTemplates = templates;
85
- }
86
- }
87
- registerTemplate(key, template) {
88
- if (Trace.isEnabled()) {
89
- PagerLog(`registerTemplate for key: ${key}`);
90
- }
91
- if (!this._templateMap) {
92
- this._templateMap = new Map();
93
- }
94
- const keyedTemplate = {
95
- key,
96
- createView: this.getItemTemplateViewFactory(template)
97
- };
98
- this._templateMap.set(key, keyedTemplate);
99
- }
100
- onItemLoading(args) {
101
- if (!args.view && !this.itemTemplate) {
102
- return;
103
- }
104
- if (!this.items)
105
- return;
106
- const index = args.index;
107
- const items = args.object.items;
108
- const currentItem = typeof items.getItem === 'function' ? items.getItem(index) : items[index];
109
- let viewRef;
110
- if (args.view) {
111
- if (Trace.isEnabled()) {
112
- PagerLog(`onItemLoading: ${index} - Reusing existing view`);
113
- }
114
- viewRef = args.view[NG_VIEW];
115
- // Getting angular view from original element (in cases when ProxyViewContainer
116
- // is used NativeScript internally wraps it in a StackLayout)
117
- if (!viewRef && args.view instanceof LayoutBase && args.view.getChildrenCount() > 0) {
118
- viewRef = args.view.getChildAt(0)[NG_VIEW];
119
- }
120
- if (!viewRef && Trace.isEnabled()) {
121
- PagerError(`ViewReference not found for item ${index}. View recycling is not working`);
122
- }
123
- }
124
- if (!viewRef) {
125
- if (Trace.isEnabled()) {
126
- PagerLog(`onItemLoading: ${index} - Creating view from template`);
127
- }
128
- viewRef = this.loader.createEmbeddedView(this.itemTemplate, new ItemContext(), 0);
129
- args.view = getItemViewRoot(viewRef);
130
- args.view[NG_VIEW] = viewRef;
131
- }
132
- this.setupViewRef(viewRef, currentItem, index);
133
- this.detectChangesOnChild(viewRef, index);
134
- }
135
- onItemDisposing(args) {
136
- if (!args.view) {
137
- return;
138
- }
139
- let viewRef;
140
- if (args.view) {
141
- if (Trace.isEnabled()) {
142
- PagerLog(`onItemDisposing: ${args.index} - Removing angular view`);
143
- }
144
- viewRef = args.view[NG_VIEW];
145
- // Getting angular view from original element (in cases when ProxyViewContainer
146
- // is used NativeScript internally wraps it in a StackLayout)
147
- if (!viewRef && args.view instanceof LayoutBase && args.view.getChildrenCount() > 0) {
148
- viewRef = args.view.getChildAt(0)[NG_VIEW];
149
- }
150
- if (!viewRef && Trace.isEnabled()) {
151
- PagerError(`ViewReference not found for item ${args.index}. View disposing is not working`);
152
- }
153
- }
154
- if (viewRef) {
155
- if (Trace.isEnabled()) {
156
- PagerLog(`onItemDisposing: ${args.index} - Disposing view reference`);
157
- }
158
- viewRef.destroy();
159
- }
160
- }
161
- setupViewRef(viewRef, data, index) {
162
- const context = viewRef.context;
163
- context.$implicit = data;
164
- context.item = data;
165
- context.index = index;
166
- context.even = index % 2 === 0;
167
- context.odd = !context.even;
168
- this.setupItemView.next({
169
- view: viewRef,
170
- data,
171
- index,
172
- context
173
- });
174
- }
175
- getItemTemplateViewFactory(template) {
176
- return () => {
177
- const viewRef = this.loader.createEmbeddedView(template, new ItemContext(), 0);
178
- const resultView = getItemViewRoot(viewRef);
179
- resultView[NG_VIEW] = viewRef;
180
- return resultView;
181
- };
182
- }
183
- detectChangesOnChild(viewRef, index) {
184
- if (Trace.isEnabled()) {
185
- PagerLog(`Manually detect changes in child: ${index}`);
186
- }
187
- viewRef.markForCheck();
188
- viewRef.detectChanges();
189
- }
190
- ngDoCheck() {
191
- if (this._differ) {
192
- if (Trace.isEnabled()) {
193
- PagerLog('ngDoCheck() - execute differ');
194
- }
195
- const changes = this._differ.diff(this._items);
196
- if (changes) {
197
- if (Trace.isEnabled()) {
198
- PagerLog('ngDoCheck() - refresh');
199
- }
200
- this.templatedItemsView.refresh();
201
- }
202
- }
203
- }
204
- }
205
- TemplatedItemsComponent.ɵfac = function TemplatedItemsComponent_Factory(t) { return new (t || TemplatedItemsComponent)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.IterableDiffers)); };
206
- TemplatedItemsComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TemplatedItemsComponent, selectors: [["ng-component"]], contentQueries: function TemplatedItemsComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
207
- i0.ɵɵcontentQuery(dirIndex, TemplateRef, 5);
208
- } if (rf & 2) {
209
- let _t;
210
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.itemTemplateQuery = _t.first);
211
- } }, viewQuery: function TemplatedItemsComponent_Query(rf, ctx) { if (rf & 1) {
212
- i0.ɵɵviewQuery(_c0, 5, ViewContainerRef);
213
- } if (rf & 2) {
214
- let _t;
215
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.loader = _t.first);
216
- } }, inputs: { items: "items", selectedIndex: "selectedIndex" }, outputs: { setupItemView: "setupItemView" }, decls: 0, vars: 0, template: function TemplatedItemsComponent_Template(rf, ctx) { }, encapsulation: 2 });
217
- __decorate([
218
- profile
219
- ], TemplatedItemsComponent.prototype, "onItemLoading", null);
220
- __decorate([
221
- profile
222
- ], TemplatedItemsComponent.prototype, "onItemDisposing", null);
223
- __decorate([
224
- profile
225
- ], TemplatedItemsComponent.prototype, "detectChangesOnChild", null);
226
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TemplatedItemsComponent, [{
227
- type: Component,
228
- args: [{
229
- template: ''
230
- }]
231
- }], function () { return [{ type: i0.ElementRef }, { type: i0.IterableDiffers }]; }, { loader: [{
232
- type: ViewChild,
233
- args: ['loader', { read: ViewContainerRef, static: false }]
234
- }], setupItemView: [{
235
- type: Output
236
- }], itemTemplateQuery: [{
237
- type: ContentChild,
238
- args: [TemplateRef, { static: false }]
239
- }], items: [{
240
- type: Input
241
- }], selectedIndex: [{
242
- type: Input
243
- }], onItemLoading: [], onItemDisposing: [], detectChangesOnChild: [] }); })();
244
- export function getItemViewRoot(viewRef, rootLocator = extractSingleViewRecursive) {
245
- return rootLocator(viewRef.rootNodes, 0);
246
- }
247
- export const TEMPLATED_ITEMS_COMPONENT = new InjectionToken('TemplatedItemsComponent');
248
- export class PagerItemDirective {
249
- constructor(templateRef, owner, viewContainer) {
250
- this.templateRef = templateRef;
251
- this.owner = owner;
252
- this.viewContainer = viewContainer;
253
- }
254
- ensureItem() {
255
- if (!this.item) {
256
- this.item = new PagerItem();
257
- }
258
- }
259
- applyConfig() {
260
- this.ensureItem();
261
- }
262
- ngOnInit() {
263
- this.applyConfig();
264
- const viewRef = this.viewContainer.createEmbeddedView(this.templateRef);
265
- // Filter out text nodes and comments
266
- const realViews = viewRef.rootNodes.filter((node) => !isInvisibleNode(node));
267
- if (realViews.length > 0) {
268
- const view = realViews[0];
269
- this.item.addChild(view);
270
- this.owner.nativeElement._addChildFromBuilder('PagerItem', this.item);
271
- }
272
- }
273
- }
274
- PagerItemDirective.ɵfac = function PagerItemDirective_Factory(t) { return new (t || PagerItemDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(TEMPLATED_ITEMS_COMPONENT, 1), i0.ɵɵdirectiveInject(i0.ViewContainerRef)); };
275
- PagerItemDirective.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: PagerItemDirective, selectors: [["", "pagerItem", ""]] });
276
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PagerItemDirective, [{
277
- type: Directive,
278
- args: [{
279
- selector: '[pagerItem]'
280
- }]
281
- }], function () { return [{ type: i0.TemplateRef }, { type: TemplatedItemsComponent, decorators: [{
282
- type: Inject,
283
- args: [TEMPLATED_ITEMS_COMPONENT]
284
- }, {
285
- type: Host
286
- }] }, { type: i0.ViewContainerRef }]; }, null); })();
287
- export class TemplateKeyDirective {
288
- constructor(templateRef, comp) {
289
- this.templateRef = templateRef;
290
- this.comp = comp;
291
- }
292
- set pagerTemplateKey(value) {
293
- if (this.comp && this.templateRef) {
294
- this.comp.registerTemplate(value, this.templateRef);
295
- }
296
- }
297
- }
298
- TemplateKeyDirective.ɵfac = function TemplateKeyDirective_Factory(t) { return new (t || TemplateKeyDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(TEMPLATED_ITEMS_COMPONENT, 1)); };
299
- TemplateKeyDirective.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: TemplateKeyDirective, selectors: [["", "pagerTemplateKey", ""]], inputs: { pagerTemplateKey: "pagerTemplateKey" } });
300
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TemplateKeyDirective, [{
301
- type: Directive,
302
- args: [{ selector: '[pagerTemplateKey]' }]
303
- }], function () { return [{ type: i0.TemplateRef }, { type: TemplatedItemsComponent, decorators: [{
304
- type: Inject,
305
- args: [TEMPLATED_ITEMS_COMPONENT]
306
- }, {
307
- type: Host
308
- }] }]; }, { pagerTemplateKey: [{
309
- type: Input
310
- }] }); })();
311
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZXItaXRlbXMtY29tcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91aS1wYWdlci9hbmd1bGFyL3BhZ2VyLWl0ZW1zLWNvbXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxZQUFZLEVBQ1osU0FBUyxFQUVULFVBQVUsRUFDVixlQUFlLEVBQ2YsWUFBWSxFQUNaLElBQUksRUFDSixNQUFNLEVBQ04sY0FBYyxFQUNkLEtBQUssRUFFTCxlQUFlLEVBR2YsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ25CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pILE9BQU8sRUFBNEIsVUFBVSxFQUFZLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7O0FBR3ZELGVBQWUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEMsZUFBZSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUU5QyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUM7QUFjN0IsTUFBTSxPQUFPLFdBQVc7SUFDcEIsWUFBbUIsU0FBZSxFQUFTLElBQVUsRUFBUyxLQUFjLEVBQVMsSUFBYyxFQUFTLEdBQWE7UUFBdEcsY0FBUyxHQUFULFNBQVMsQ0FBTTtRQUFTLFNBQUks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QyxhQUFhLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6RTtJQUNMLENBQUM7O29GQWpDUSxrQkFBa0IsNkRBS2YseUJBQXlCO3FFQUw1QixrQkFBa0I7dUZBQWxCLGtCQUFrQjtjQUg5QixTQUFTO2VBQUM7Z0JBQ1AsUUFBUSxFQUFFLGFBQWE7YUFDMUI7O3NCQU1RLE1BQU07dUJBQUMseUJBQXlCOztzQkFDaEMsSUFBSTs7QUErQmIsTUFBTSxPQUFPLG9CQUFvQjtJQUM3QixZQUNZLFdBQTZCLEVBRzdCLElBQTZCO1FBSDdCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUc3QixTQUFJLEdBQUosSUFBSSxDQUF5QjtJQUN0QyxDQUFDO0lBRUosSUFDSSxnQkFBZ0IsQ0FBQyxLQUFVO1FBQzNCLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN2RDtJQUNMLENBQUM7O3dGQWJRLG9CQUFvQiw2REFHakIseUJBQXlCO3VFQUg1QixvQkFBb0I7dUZBQXBCLG9CQUFvQjtjQURoQyxTQUFTO2VBQUMsRUFBRSxRQUFRLEVBQUUsb0JBQW9CLEVBQUU7O3NCQUlwQyxNQUFNO3VCQUFDLHlCQUF5Qjs7c0JBQ2hDLElBQUk7d0JBS0wsZ0JBQWdCO2tCQURuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRGlyZWN0aXZlLFxuICAgIERvQ2hlY2ssXG4gICAgRWxlbWVudFJlZixcbiAgICBFbWJlZGRlZFZpZXdSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3QsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdGlvblRva2VuLFxuICAgIElucHV0LFxuICAgIEl0ZXJhYmxlRGlmZmVyLFxuICAgIEl0ZXJhYmxlRGlmZmVycyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBhZ2VyLCBQYWdlckVycm9yLCBQYWdlckl0ZW0sIFBhZ2VyTG9nIH0gZnJvbSAnQG5hdGl2ZXNjcmlwdC1jb21tdW5pdHkvdWktcGFnZXInO1xuaW1wb3J0IHsgZXh0cmFjdFNpbmdsZVZpZXdSZWN1cnNpdmUsIGlzSW52aXNpYmxlTm9kZSwgaXNMaXN0TGlrZUl0ZXJhYmxlLCByZWdpc3RlckVsZW1lbnQgfSBmcm9tICdAbmF0aXZlc2NyaXB0L2FuZ3VsYXInO1xuaW1wb3J0IHsgRXZlbnREYXRhLCBLZXllZFRlbXBsYXRlLCBMYXlvdXRCYXNlLCBUZW1wbGF0ZSwgVHJhY2UsIFZpZXcsIGlzSU9TIH0gZnJvbSAnQG5hdGl2ZXNjcmlwdC9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGVBcnJheSB9IGZyb20gJ0BuYXRpdmVzY3JpcHQvY29yZS9kYXRhL29ic2VydmFibGUtYXJyYXknO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJ0BuYXRpdmVzY3JpcHQvY29yZS9wcm9maWxpbmcnO1xuaW1wb3J0IHsgSXRlbUV2ZW50RGF0YSwgSXRlbXNTb3VyY2UgfSBmcm9tICdAbmF0aXZlc2NyaXB0L2NvcmUvdWkvbGlzdC12aWV3JztcblxucmVnaXN0ZXJFbGVtZW50KCdQYWdlcicsICgpID0+IFBhZ2VyKTtcbnJlZ2lzdGVyRWxlbWVudCgnUGFnZXJJdGVtJywgKCkgPT4gUGFnZXJJdGVtKTtcblxuY29uc3QgTkdfVklFVyA9ICdfbmdWaWV3UmVmJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWdlclRlbXBsYXRlZEl0ZW1zVmlldyB7XG4gICAgaXRlbXM6IGFueVtdIHwgSXRlbXNTb3VyY2U7XG4gICAgaXRlbVRlbXBsYXRlOiBzdHJpbmcgfCBUZW1wbGF0ZTtcbiAgICBpdGVtVGVtcGxhdGVzPzogc3RyaW5nIHwgS2V5ZWRUZW1wbGF0ZVtdO1xuXG4gICAgcmVmcmVzaCgpOiB2b2lkO1xuXG4gICAgb24oZXZlbnQ6ICdpdGVtRGlzcG9zaW5nJyB8ICdpdGVtTG9hZGluZycsIGNhbGxiYWNrOiAoYXJnczogSXRlbUV2ZW50RGF0YSkgPT4gdm9pZCwgdGhpc0FyZz86IGFueSk7XG5cbiAgICBvZmYoZXZlbnQ6ICdpdGVtTG9hZGluZycgfCAnaXRlbURpc3Bvc2luZycsIGNhbGxiYWNrOiAoYXJnczogRXZlbnREYXRhKSA9PiB2b2lkLCB0aGlzQXJnPzogYW55KTtcbn1cblxuZXhwb3J0IGNsYXNzIEl0ZW1Db250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgJGltcGxpY2l0PzogYW55LCBwdWJsaWMgaXRlbT86IGFueSwgcHVibGljIGluZGV4PzogbnVtYmVyLCBwdWJsaWMgZXZlbj86IGJvb2xlYW4sIHB1YmxpYyBvZGQ/OiBib29sZWFuKSB7fVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHVwSXRlbVZpZXdBcmdzIHtcbiAgICB2aWV3OiBFbWJlZGRlZFZpZXdSZWY8YW55PjtcbiAgICBkYXRhOiBhbnk7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBjb250ZXh0OiBJdGVtQ29udGV4dDtcbn1cbkBDb21wb25lbnQoe1xuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUZW1wbGF0ZWRJdGVtc0NvbXBvbmVudCBpbXBsZW1lbnRzIERvQ2hlY2ssIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gICAgcHVibGljIGFic3RyYWN0IGdldCBuYXRpdmVFbGVtZW50KCk6IFBhZ2VyO1xuXG4gICAgcHJvdGVjdGVkIHRlbXBsYXRlZEl0ZW1zVmlldzogUGFnZXI7XG4gICAgcHJvdGVjdGVkIF9pdGVtczogYW55O1xuICAgIHByb3RlY3RlZCBfZGlmZmVyOiBJdGVyYWJsZURpZmZlcjxLZXllZFRlbXBsYXRlPjtcbiAgICBwcm90ZWN0ZWQgX3RlbXBsYXRlTWFwOiBNYXA8c3RyaW5nLCBLZXllZFRlbXBsYXRlPjtcbiAgICBwcml2YXRlIF9zZWxlY3RlZEluZGV4OiBudW1iZXI7XG4gICAgQFZpZXdDaGlsZCgnbG9hZGVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IGZhbHNlIH0pIGxvYWRlcjogVmlld0NvbnRhaW5lclJlZjtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzZXR1cEl0ZW1WaWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxTZXR1cEl0ZW1WaWV3QXJncz4oKTtcblxuICAgIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYsIHsgc3RhdGljOiBmYWxzZSB9KSBpdGVtVGVtcGxhdGVRdWVyeTogVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+O1xuXG4gICAgaXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD47XG5cbiAgICBASW5wdXQoKVxuICAgIGdldCBpdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xuICAgIH1cblxuICAgIHNldCBpdGVtcyh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zID0gdmFsdWU7XG4gICAgICAgIGxldCBuZWVkRGlmZmVyID0gdHJ1ZTtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZUFycmF5KSB7XG4gICAgICAgICAgICBuZWVkRGlmZmVyID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lZWREaWZmZXIgJiYgIXRoaXMuX2RpZmZlciAmJiBpc0xpc3RMaWtlSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLl9kaWZmZXIgPSB0aGlzLl9pdGVyYWJsZURpZmZlcnMuZmluZCh0aGlzLl9pdGVtcykuY3JlYXRlKChfaW5kZXgsIGl0ZW0pID0+IGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50ZW1wbGF0ZWRJdGVtc1ZpZXcuaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIGdldCBzZWxlY3RlZEluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEluZGV4O1xuICAgIH1cblxuICAgIHNldCBzZWxlY3RlZEluZGV4KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXggPSB2YWx1ZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZWRJdGVtc1ZpZXcuc2VsZWN0ZWRJbmRleCA9IHRoaXMuX3NlbGVjdGVkSW5kZXg7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBpZiAoISF0aGlzLl9zZWxlY3RlZEluZGV4KSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNJT1MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZWRJdGVtc1ZpZXcuc2Nyb2xsVG9JbmRleEFuaW1hdGVkKHRoaXMuX3NlbGVjdGVkSW5kZXgsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZWRJdGVtc1ZpZXcuc2VsZWN0ZWRJbmRleCA9IHRoaXMuX3NlbGVjdGVkSW5kZXg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIF9pdGVyYWJsZURpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycykge1xuICAgICAgICB0aGlzLnRlbXBsYXRlZEl0ZW1zVmlldyA9IF9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgdGhpcy50ZW1wbGF0ZWRJdGVtc1ZpZXcub24oJ2l0ZW1Mb2FkaW5nJywgdGhpcy5vbkl0ZW1Mb2FkaW5nLCB0aGlzKTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZWRJdGVtc1ZpZXcub24oJ2l0ZW1EaXNwb3NpbmcnLCB0aGlzLm9uSXRlbURpc3Bvc2luZywgdGhpcyk7XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIFBhZ2VyTG9nKCdUZW1wbGF0ZWRJdGVtc1ZpZXcubmdBZnRlckNvbnRlbnRJbml0KCknKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEl0ZW1UZW1wbGF0ZXMoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZWRJdGVtc1ZpZXcub2ZmKCdpdGVtTG9hZGluZycsIHRoaXMub25JdGVtTG9hZGluZywgdGhpcyk7XG4gICAgICAgIHRoaXMudGVtcGxhdGVkSXRlbXNWaWV3Lm9mZignaXRlbURpc3Bvc2luZycsIHRoaXMub25JdGVtRGlzcG9zaW5nLCB0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEl0ZW1UZW1wbGF0ZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pdGVtcykgcmV0dXJuO1xuICAgICAgICAvLyBUaGUgaXRlbVRlbXBsYXRlUXVlcnkgbWF5IGJlIGNoYW5nZWQgYWZ0ZXIgbGlzdCBpdGVtcyBhcmUgYWRkZWQgdGhhdCBjb250YWluIDx0ZW1wbGF0ZT4gaW5zaWRlLFxuICAgICAgICAvLyBzbyBjYWNoZSBhbmQgdXNlIG9ubHkgdGhlIG9yaWdpbmFsIHRlbXBsYXRlIHRvIGF2b2lkIGVycm9ycy5cbiAgICAgICAgdGhpcy5pdGVtVGVtcGxhdGUgPSB0aGlzLml0ZW1UZW1wbGF0ZVF1ZXJ5O1xuXG4gICAgICAgIGlmICh0aGlzLl90ZW1wbGF0ZU1hcCkge1xuICAgICAgICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgUGFnZXJMb2coJ1NldHRpbmcgdGVtcGxhdGVzJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlczogS2V5ZWRUZW1wbGF0ZVtdID0gW107XG4gICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZU1hcC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZWRJdGVtc1ZpZXcuaXRlbVRlbXBsYXRlcyA9IHRlbXBsYXRlcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlclRlbXBsYXRlKGtleTogc3RyaW5nLCB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+KSB7XG4gICAgICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgUGFnZXJMb2coYHJlZ2lzdGVyVGVtcGxhdGUgZm9yIGtleTogJHtrZXl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3RlbXBsYXRlTWFwKSB7XG4gICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBLZXllZFRlbXBsYXRlPigpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5ZWRUZW1wbGF0ZSA9IHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGNyZWF0ZVZpZXc6IHRoaXMuZ2V0SXRlbVRlbXBsYXRlVmlld0ZhY3RvcnkodGVtcGxhdGUpXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fdGVtcGxhdGVNYXAuc2V0KGtleSwga2V5ZWRUZW1wbGF0ZSk7XG4gICAgfVxuXG4gICAgQHByb2ZpbGVcbiAgICBwdWJsaWMgb25JdGVtTG9hZGluZyhhcmdzOiBJdGVtRXZlbnREYXRhKSB7XG4gICAgICAgIGlmICghYXJncy52aWV3ICYmICF0aGlzLml0ZW1UZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLml0ZW1zKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBhcmdzLmluZGV4O1xuICAgICAgICBjb25zdCBpdGVtcyA9IChhcmdzLm9iamVjdCBhcyBhbnkpLml0ZW1zO1xuICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IHR5cGVvZiBpdGVtcy5nZXRJdGVtID09PSAnZnVuY3Rpb24nID8gaXRlbXMuZ2V0SXRlbShpbmRleCkgOiBpdGVtc1tpbmRleF07XG4gICAgICAgIGxldCB2aWV3UmVmOiBFbWJlZGRlZFZpZXdSZWY8SXRlbUNvbnRleHQ+O1xuXG4gICAgICAgIGlmIChhcmdzLnZpZXcpIHtcbiAgICAgICAgICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIFBhZ2VyTG9nKGBvbkl0ZW1Mb2FkaW5nOiAke2luZGV4fSAtIFJldXNpbmcgZXhpc3Rpbmcgdmlld2ApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2aWV3UmVmID0gYXJncy52aWV3W05HX1ZJRVddO1xuICAgICAgICAgICAgLy8gR2V0dGluZyBhbmd1bGFyIHZpZXcgZnJvbSBvcmlnaW5hbCBlbGVtZW50IChpbiBjYXNlcyB3aGVuIFByb3h5Vmlld0NvbnRhaW5lclxuICAgICAgICAgICAgLy8gaXMgdXNlZCBOYXRpdmVTY3JpcHQgaW50ZXJuYWxseSB3cmFwcyBpdCBpbiBhIFN0YWNrTGF5b3V0KVxuICAgICAgICAgICAgaWYgKCF2aWV3UmVmICYmIGFyZ3MudmlldyBpbnN0YW5jZW9mIExheW91dEJhc2UgJiYgYXJncy52aWV3LmdldENoaWxkcmVuQ291bnQoKSA+IDApIHtcbiAgICAgICAgICAgICAgICB2aWV3UmVmID0gYXJncy52aWV3LmdldENoaWxkQXQoMClbTkdfVklFV107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdmlld1JlZiAmJiBUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIFBhZ2VyRXJyb3IoYFZpZXdSZWZlcmVuY2Ugbm90IGZvdW5kIGZvciBpdGVtICR7aW5kZXh9LiBWaWV3IHJlY3ljbGluZyBpcyBub3Qgd29ya2luZ2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF2aWV3UmVmKSB7XG4gICAgICAgICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICBQYWdlckxvZyhgb25JdGVtTG9hZGluZzogJHtpbmRleH0gLSBDcmVhdGluZyB2aWV3IGZyb20gdGVtcGxhdGVgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmlld1JlZiA9IHRoaXMubG9hZGVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLml0ZW1UZW1wbGF0ZSwgbmV3IEl0ZW1Db250ZXh0KCksIDApO1xuICAgICAgICAgICAgYXJncy52aWV3ID0gZ2V0SXRlbVZpZXdSb290KHZpZXdSZWYpO1xuICAgICAgICAgICAgYXJncy52aWV3W05HX1ZJRVddID0gdmlld1JlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0dXBWaWV3UmVmKHZpZXdSZWYsIGN1cnJlbnRJdGVtLCBpbmRleCk7XG5cbiAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzT25DaGlsZCh2aWV3UmVmLCBpbmRleCk7XG4gICAgfVxuXG4gICAgQHByb2ZpbGVcbiAgICBwdWJsaWMgb25JdGVtRGlzcG9zaW5nKGFyZ3M6IEl0ZW1FdmVudERhdGEpIHtcbiAgICAgICAgaWYgKCFhcmdzLnZpZXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPEl0ZW1Db250ZXh0PjtcblxuICAgICAgICBpZiAoYXJncy52aWV3KSB7XG4gICAgICAgICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICBQYWdlckxvZyhgb25JdGVtRGlzcG9zaW5nOiAke2FyZ3MuaW5kZXh9IC0gUmVtb3ZpbmcgYW5ndWxhciB2aWV3YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZpZXdSZWYgPSBhcmdzLnZpZXdbTkdfVklFV107XG4gICAgICAgICAgICAvLyBHZXR0aW5nIGFuZ3VsYXIgdmlldyBmcm9tIG9yaWdpbmFsIGVsZW1lbnQgKGluIGNhc2VzIHdoZW4gUHJveHlWaWV3Q29udGFpbmVyXG4gICAgICAgICAgICAvLyBpcyB1c2VkIE5hdGl2ZVNjcmlwdCBpbnRlcm5hbGx5IHdyYXBzIGl0IGluIGEgU3RhY2tMYXlvdXQpXG4gICAgICAgICAgICBpZiAoIXZpZXdSZWYgJiYgYXJncy52aWV3IGluc3RhbmNlb2YgTGF5b3V0QmFzZSAmJiBhcmdzLnZpZXcuZ2V0Q2hpbGRyZW5Db3VudCgpID4gMCkge1xuICAgICAgICAgICAgICAgIHZpZXdSZWYgPSBhcmdzLnZpZXcuZ2V0Q2hpbGRBdCgwKVtOR19WSUVXXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF2aWV3UmVmICYmIFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgUGFnZXJFcnJvcihgVmlld1JlZmVyZW5jZSBub3QgZm91bmQgZm9yIGl0ZW0gJHthcmdzLmluZGV4fS4gVmlldyBkaXNwb3NpbmcgaXMgbm90IHdvcmtpbmdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2aWV3UmVmKSB7XG4gICAgICAgICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICBQYWdlckxvZyhgb25JdGVtRGlzcG9zaW5nOiAke2FyZ3MuaW5kZXh9IC0gRGlzcG9zaW5nIHZpZXcgcmVmZXJlbmNlYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZpZXdSZWYuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldHVwVmlld1JlZih2aWV3UmVmOiBFbWJlZGRlZFZpZXdSZWY8SXRlbUNvbnRleHQ+LCBkYXRhOiBhbnksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHZpZXdSZWYuY29udGV4dDtcbiAgICAgICAgY29udGV4dC4kaW1wbGljaXQgPSBkYXRhO1xuICAgICAgICBjb250ZXh0Lml0ZW0gPSBkYXRhO1xuICAgICAgICBjb250ZXh0LmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGNvbnRleHQuZXZlbiA9IGluZGV4ICUgMiA9PT0gMDtcbiAgICAgICAgY29udGV4dC5vZGQgPSAhY29udGV4dC5ldmVuO1xuXG4gICAgICAgIHRoaXMuc2V0dXBJdGVtVmlldy5uZXh0KHtcbiAgICAgICAgICAgIHZpZXc6IHZpZXdSZWYsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRJdGVtVGVtcGxhdGVWaWV3RmFjdG9yeSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+KTogKCkgPT4gVmlldyB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2aWV3UmVmID0gdGhpcy5sb2FkZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRlbXBsYXRlLCBuZXcgSXRlbUNvbnRleHQoKSwgMCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRWaWV3ID0gZ2V0SXRlbVZpZXdSb290KHZpZXdSZWYpO1xuICAgICAgICAgICAgcmVzdWx0Vmlld1tOR19WSUVXXSA9IHZpZXdSZWY7XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRWaWV3O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIEBwcm9maWxlXG4gICAgcHJpdmF0ZSBkZXRlY3RDaGFuZ2VzT25DaGlsZCh2aWV3UmVmOiBFbWJlZGRlZFZpZXdSZWY8SXRlbUNvbnRleHQ+LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgUGFnZXJMb2coYE1hbnVhbGx5IGRldGVjdCBjaGFuZ2VzIGluIGNoaWxkOiAke2luZGV4fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmlld1JlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdmlld1JlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgbmdEb0NoZWNrKCkge1xuICAgICAgICBpZiAodGhpcy5fZGlmZmVyKSB7XG4gICAgICAgICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICBQYWdlckxvZygnbmdEb0NoZWNrKCkgLSBleGVjdXRlIGRpZmZlcicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5fZGlmZmVyLmRpZmYodGhpcy5faXRlbXMpO1xuICAgICAgICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgUGFnZXJMb2coJ25nRG9DaGVjaygpIC0gcmVmcmVzaCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVkSXRlbXNWaWV3LnJlZnJlc2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRWaWV3IHtcbiAgICByb290Tm9kZXM6IGFueVtdO1xuXG4gICAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBSb290TG9jYXRvciA9IChub2RlczogYW55W10sIG5lc3RMZXZlbDogbnVtYmVyKSA9PiBWaWV3O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbVZpZXdSb290KHZpZXdSZWY6IENvbXBvbmVudFZpZXcsIHJvb3RMb2NhdG9yOiBSb290TG9jYXRvciA9IGV4dHJhY3RTaW5nbGVWaWV3UmVjdXJzaXZlIGFzIGFueSk6IFZpZXcge1xuICAgIHJldHVybiByb290TG9jYXRvcih2aWV3UmVmLnJvb3ROb2RlcywgMCk7XG59XG5cbmV4cG9ydCBjb25zdCBURU1QTEFURURfSVRFTVNfQ09NUE9ORU5UID0gbmV3IEluamVjdGlvblRva2VuPFRlbXBsYXRlZEl0ZW1zQ29tcG9uZW50PignVGVtcGxhdGVkSXRlbXNDb21wb25lbnQnKTtcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbcGFnZXJJdGVtXSdcbn0pXG5leHBvcnQgY2xhc3MgUGFnZXJJdGVtRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwcml2YXRlIGl0ZW06IFBhZ2VySXRlbTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LFxuICAgICAgICBASW5qZWN0KFRFTVBMQVRFRF9JVEVNU19DT01QT05FTlQpXG4gICAgICAgIEBIb3N0KClcbiAgICAgICAgcHJpdmF0ZSBvd25lcjogVGVtcGxhdGVkSXRlbXNDb21wb25lbnQsXG4gICAgICAgIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZlxuICAgICkge31cblxuICAgIHByaXZhdGUgZW5zdXJlSXRlbSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLml0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbSA9IG5ldyBQYWdlckl0ZW0oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlDb25maWcoKSB7XG4gICAgICAgIHRoaXMuZW5zdXJlSXRlbSgpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmFwcGx5Q29uZmlnKCk7XG5cbiAgICAgICAgY29uc3Qgdmlld1JlZiA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50ZW1wbGF0ZVJlZik7XG4gICAgICAgIC8vIEZpbHRlciBvdXQgdGV4dCBub2RlcyBhbmQgY29tbWVudHNcbiAgICAgICAgY29uc3QgcmVhbFZpZXdzID0gdmlld1JlZi5yb290Tm9kZXMuZmlsdGVyKChub2RlKSA9PiAhaXNJbnZpc2libGVOb2RlKG5vZGUpKTtcblxuICAgICAgICBpZiAocmVhbFZpZXdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSByZWFsVmlld3NbMF07XG4gICAgICAgICAgICB0aGlzLml0ZW0uYWRkQ2hpbGQodmlldyk7XG4gICAgICAgICAgICB0aGlzLm93bmVyLm5hdGl2ZUVsZW1lbnQuX2FkZENoaWxkRnJvbUJ1aWxkZXIoJ1BhZ2VySXRlbScsIHRoaXMuaXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1twYWdlclRlbXBsYXRlS2V5XScgfSlcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUtleURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgICAgIEBJbmplY3QoVEVNUExBVEVEX0lURU1TX0NPTVBPTkVOVClcbiAgICAgICAgQEhvc3QoKVxuICAgICAgICBwcml2YXRlIGNvbXA6IFRlbXBsYXRlZEl0ZW1zQ29tcG9uZW50XG4gICAgKSB7fVxuXG4gICAgQElucHV0KClcbiAgICBzZXQgcGFnZXJUZW1wbGF0ZUtleSh2YWx1ZTogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXAgJiYgdGhpcy50ZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgdGhpcy5jb21wLnJlZ2lzdGVyVGVtcGxhdGUodmFsdWUsIHRoaXMudGVtcGxhdGVSZWYpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19