@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.
- package/angular/esm2022/index.mjs +56 -0
- package/angular/esm2022/pager-items-comp.mjs +331 -0
- package/angular/{fesm2020 → fesm2022}/nativescript-community-ui-pager-angular.mjs +62 -40
- package/angular/{fesm2020 → fesm2022}/nativescript-community-ui-pager-angular.mjs.map +1 -1
- package/angular/package.json +4 -10
- package/angular/pager-items-comp.d.ts +3 -3
- package/index.android.js +25 -21
- package/index.android.js.map +1 -1
- package/index.common.d.ts +3 -3
- package/index.common.js +1 -1
- package/index.common.js.map +1 -1
- package/index.ios.js +8 -13
- package/index.ios.js.map +1 -1
- package/package.json +2 -2
- package/react/index.d.ts +6 -6
- package/react/index.js +2 -4
- package/react/index.js.map +1 -1
- package/svelte/index.d.ts +1 -0
- package/svelte/index.js +11 -3
- package/svelte/index.js.map +1 -1
- package/transformers/Scale.android.js +3 -2
- package/transformers/Scale.android.js.map +1 -1
- package/transformers/ZoomInPageTransformer.js +3 -2
- package/transformers/ZoomInPageTransformer.js.map +1 -1
- package/vue/pager.js +5 -5
- package/vue/pager.js.map +1 -1
- package/angular/esm2020/index.mjs +0 -55
- package/angular/esm2020/pager-items-comp.mjs +0 -311
- package/angular/fesm2015/nativescript-community-ui-pager-angular.mjs +0 -390
- package/angular/fesm2015/nativescript-community-ui-pager-angular.mjs.map +0 -1
- /package/angular/{esm2020 → esm2022}/nativescript-community-ui-pager-angular.mjs +0 -0
@@ -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
|