@nstudio/ui-collectionview 4.0.70

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.
Files changed (50) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +396 -0
  3. package/angular/collectionview.component.d.ts +82 -0
  4. package/angular/esm2020/collectionview.component.mjs +394 -0
  5. package/angular/esm2020/index.mjs +19 -0
  6. package/angular/esm2020/nstudio-ui-collectionview-angular.mjs +5 -0
  7. package/angular/fesm2015/nstudio-ui-collectionview-angular.mjs +421 -0
  8. package/angular/fesm2015/nstudio-ui-collectionview-angular.mjs.map +1 -0
  9. package/angular/fesm2020/nstudio-ui-collectionview-angular.mjs +416 -0
  10. package/angular/fesm2020/nstudio-ui-collectionview-angular.mjs.map +1 -0
  11. package/angular/index.d.ts +8 -0
  12. package/angular/package.json +26 -0
  13. package/common.d.ts +191 -0
  14. package/common.js +610 -0
  15. package/common.js.map +1 -0
  16. package/index.android.d.ts +117 -0
  17. package/index.android.js +1097 -0
  18. package/index.android.js.map +1 -0
  19. package/index.d.ts +16 -0
  20. package/index.ios.d.ts +118 -0
  21. package/index.ios.js +1123 -0
  22. package/index.ios.js.map +1 -0
  23. package/package.json +57 -0
  24. package/platforms/android/AndroidManifest.xml +3 -0
  25. package/platforms/android/include.gradle +7 -0
  26. package/platforms/android/java/com/nativescript/collectionview/Adapter.java +66 -0
  27. package/platforms/android/java/com/nativescript/collectionview/AdapterInterface.java +19 -0
  28. package/platforms/android/java/com/nativescript/collectionview/CollectionViewCellHolder.java +12 -0
  29. package/platforms/android/java/com/nativescript/collectionview/GridLayoutManager.java +72 -0
  30. package/platforms/android/java/com/nativescript/collectionview/OnScrollListener.java +35 -0
  31. package/platforms/android/java/com/nativescript/collectionview/PreCachingGridLayoutManager.java +51 -0
  32. package/platforms/android/java/com/nativescript/collectionview/RecycledViewPool.java +85 -0
  33. package/platforms/android/java/com/nativescript/collectionview/RecyclerView.java +46 -0
  34. package/platforms/android/java/com/nativescript/collectionview/SizeChangedListener.java +6 -0
  35. package/platforms/android/java/com/nativescript/collectionview/SpanSizeLookup.java +26 -0
  36. package/platforms/android/native-api-usage.json +29 -0
  37. package/platforms/android/res/layout/collectionview.xml +5 -0
  38. package/platforms/android/ui_collectionview.aar +0 -0
  39. package/react/index.d.ts +119 -0
  40. package/react/index.js +148 -0
  41. package/react/index.js.map +1 -0
  42. package/svelte/index.d.ts +21 -0
  43. package/svelte/index.js +143 -0
  44. package/svelte/index.js.map +1 -0
  45. package/vue/component.d.ts +38 -0
  46. package/vue/component.js +104 -0
  47. package/vue/component.js.map +1 -0
  48. package/vue/index.d.ts +4 -0
  49. package/vue/index.js +12 -0
  50. package/vue/index.js.map +1 -0
@@ -0,0 +1,394 @@
1
+ import { ChangeDetectionStrategy, Component, ContentChild, Directive, ElementRef, EventEmitter, Host, HostListener, Inject, Input, IterableDiffers, NgZone, Output, TemplateRef, ViewChild, ViewContainerRef, } from '@angular/core';
2
+ import { CLog, CLogTypes, CollectionView, ListViewViewTypes } from '@nstudio/ui-collectionview';
3
+ import { DetachedLoader, NativeScriptRendererFactory, extractSingleViewRecursive, registerElement } from '@nativescript/angular';
4
+ import { LayoutBase, ObservableArray, Trace } from '@nativescript/core';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@nativescript/angular";
7
+ registerElement('CollectionView', () => CollectionView);
8
+ const NG_VIEW = '_ngViewRef';
9
+ export class ItemContext {
10
+ constructor($implicit, item, index, even, odd) {
11
+ this.$implicit = $implicit;
12
+ this.item = item;
13
+ this.index = index;
14
+ this.even = even;
15
+ this.odd = odd;
16
+ }
17
+ }
18
+ function isListLikeIterable(obj) {
19
+ if (!isJsObject(obj))
20
+ return false;
21
+ return (Array.isArray(obj) ||
22
+ (!(obj instanceof Map) && // JS Map are iterables but return entries as [k, v]
23
+ Symbol.iterator in obj)); // JS Iterable have a Symbol.iterator prop
24
+ }
25
+ function isJsObject(o) {
26
+ return o !== null && (typeof o === 'function' || typeof o === 'object');
27
+ }
28
+ export class CollectionViewComponent {
29
+ constructor(_elementRef, _iterableDiffers, _renderer, _ngZone) {
30
+ this._elementRef = _elementRef;
31
+ this._iterableDiffers = _iterableDiffers;
32
+ this._renderer = _renderer;
33
+ this._ngZone = _ngZone;
34
+ this.setupItemView = new EventEmitter();
35
+ this.autoReuseViews = false;
36
+ this.itemViewLoader = (viewType) => this._ngZone.run(() => {
37
+ switch (viewType) {
38
+ case ListViewViewTypes.ItemView:
39
+ if (this._itemTemplate && this.loader) {
40
+ const typedView = this.getOrCreate(this._itemTemplate);
41
+ return typedView;
42
+ }
43
+ break;
44
+ }
45
+ return null;
46
+ });
47
+ this.viewPool = new Map();
48
+ this.viewToTemplate = new WeakMap();
49
+ this.viewToLoader = new WeakMap();
50
+ this._collectionView = _elementRef.nativeElement;
51
+ this._collectionView.on(CollectionView.itemLoadingEvent, this.onItemLoading, this);
52
+ this._collectionView.itemViewLoader = this.itemViewLoader;
53
+ this._loaders = [];
54
+ }
55
+ get nativeElement() {
56
+ return this._collectionView;
57
+ }
58
+ get listView() {
59
+ return this._collectionView;
60
+ }
61
+ detachedLoaderFactory() {
62
+ const ref = this.loader.createComponent(DetachedLoader, {
63
+ index: 0
64
+ });
65
+ this.loader.detach(0);
66
+ this._loaders.push(ref);
67
+ return ref;
68
+ }
69
+ get itemTemplate() {
70
+ return this._itemTemplate;
71
+ }
72
+ set itemTemplate(value) {
73
+ this._itemTemplate = value;
74
+ this._collectionView.refresh();
75
+ }
76
+ get items() {
77
+ return this._items;
78
+ }
79
+ set items(value) {
80
+ this._items = value;
81
+ let needDiffer = true;
82
+ if (value instanceof ObservableArray) {
83
+ needDiffer = false;
84
+ }
85
+ if (needDiffer && !this._differ && isListLikeIterable(value)) {
86
+ this._differ = this._iterableDiffers.find(this._items).create((_index, item) => item);
87
+ }
88
+ this._collectionView.items = this._items;
89
+ }
90
+ ngAfterContentInit() {
91
+ if (Trace.isEnabled()) {
92
+ CLog(CLogTypes.info, 'CollectionView.ngAfterContentInit()');
93
+ }
94
+ this.setItemTemplates();
95
+ }
96
+ ngOnDestroy() {
97
+ this._collectionView.off(CollectionView.itemLoadingEvent, this.onItemLoading, this);
98
+ this._collectionView = null;
99
+ this._loaders.forEach((l) => l.destroy());
100
+ this._loaders = null;
101
+ this.viewToLoader = null;
102
+ this.viewToTemplate = null;
103
+ this.viewPool = null;
104
+ this._items = null;
105
+ this._differ = null;
106
+ this._itemTemplate = null;
107
+ if (this._templateMap) {
108
+ this._templateMap.clear();
109
+ }
110
+ this._templateMap = null;
111
+ }
112
+ ngDoCheck() {
113
+ if (Trace.isEnabled()) {
114
+ CLog(CLogTypes.info, 'ngDoCheck() - execute differ? ' + this._differ);
115
+ }
116
+ if (this._differ) {
117
+ if (Trace.isEnabled()) {
118
+ CLog(CLogTypes.info, 'ngDoCheck() - execute differ');
119
+ }
120
+ const changes = this._differ.diff(this._items);
121
+ if (changes) {
122
+ if (Trace.isEnabled()) {
123
+ CLog(CLogTypes.info, 'ngDoCheck() - refresh');
124
+ }
125
+ this.refresh();
126
+ }
127
+ }
128
+ }
129
+ registerTemplate(key, template) {
130
+ if (Trace.isEnabled()) {
131
+ CLog(CLogTypes.info, 'registerTemplate for key: ' + key);
132
+ }
133
+ if (!this._templateMap) {
134
+ this._templateMap = new Map();
135
+ }
136
+ const keyedTemplate = {
137
+ key,
138
+ createView: this.getItemTemplateViewFactory(template)
139
+ };
140
+ this._templateMap.set(key, keyedTemplate);
141
+ }
142
+ onItemLoading(args) {
143
+ if (!args.view && !this.itemTemplate) {
144
+ return;
145
+ }
146
+ if (!this.items)
147
+ return;
148
+ const index = args.index;
149
+ const items = args.object.items;
150
+ const currentItem = typeof items.getItem === 'function' ? items.getItem(index) : items[index];
151
+ let viewRef;
152
+ if (Trace.isEnabled()) {
153
+ CLog(CLogTypes.info, `onItemLoading: ${index} - Reusing existing view`);
154
+ }
155
+ viewRef = args.view[NG_VIEW];
156
+ // Getting angular view from original element (in cases when ProxyViewContainer
157
+ // is used NativeScript internally wraps it in a StackLayout)
158
+ if (!viewRef && args.view instanceof LayoutBase && args.view.getChildrenCount() > 0) {
159
+ viewRef = args.view.getChildAt(0)[NG_VIEW];
160
+ }
161
+ if (!viewRef && Trace.isEnabled()) {
162
+ if (Trace.isEnabled()) {
163
+ CLog(CLogTypes.info, `ViewReference not found for item ${index}. View recycling is not working`);
164
+ }
165
+ }
166
+ if (!viewRef) {
167
+ if (Trace.isEnabled()) {
168
+ CLog(CLogTypes.info, `onItemLoading: ${index} - Creating view from template`);
169
+ }
170
+ viewRef = this.loader.createEmbeddedView(this.itemTemplate, new ItemContext(), 0);
171
+ args.view = getItemViewRoot(viewRef);
172
+ args.view[NG_VIEW] = viewRef;
173
+ }
174
+ this.setupViewRef(viewRef, currentItem, index);
175
+ this.detectChangesOnChild(viewRef, index);
176
+ }
177
+ onItemRecyclingInternal(args) {
178
+ if (!args.view) {
179
+ return;
180
+ }
181
+ let ngView = args.view[NG_VIEW];
182
+ // Getting angular view from original element (in cases when ProxyViewContainer
183
+ // is used NativeScript internally wraps it in a StackLayout)
184
+ if (!ngView && args.view instanceof LayoutBase && args.view.getChildrenCount() > 0) {
185
+ ngView = args.view.getChildAt(0)[NG_VIEW];
186
+ }
187
+ // console.log('recycling', args.view);
188
+ if (ngView) {
189
+ ngView.detach();
190
+ }
191
+ }
192
+ onItemDisposingInternal(args) {
193
+ if (!args.view) {
194
+ return;
195
+ }
196
+ let ngView = args.view[NG_VIEW];
197
+ // Getting angular view from original element (in cases when ProxyViewContainer
198
+ // is used NativeScript internally wraps it in a StackLayout)
199
+ if (!ngView && args.view instanceof LayoutBase && args.view.getChildrenCount() > 0) {
200
+ ngView = args.view.getChildAt(0)[NG_VIEW];
201
+ }
202
+ if (ngView) {
203
+ ngView.detach();
204
+ this.storeViewRef(ngView);
205
+ }
206
+ }
207
+ setupViewRef(view, data, index) {
208
+ const context = view.context;
209
+ context.$implicit = data;
210
+ context.item = data;
211
+ context.index = index;
212
+ context.even = index % 2 === 0;
213
+ context.odd = !context.even;
214
+ this.setupItemView.next({
215
+ context,
216
+ data,
217
+ index,
218
+ view
219
+ });
220
+ }
221
+ getItemTemplateViewFactory(template) {
222
+ return () => {
223
+ const viewRef = this.loader.createEmbeddedView(template, new ItemContext(), 0);
224
+ const resultView = getItemViewRoot(viewRef);
225
+ resultView[NG_VIEW] = viewRef;
226
+ return resultView;
227
+ };
228
+ }
229
+ storeViewRef(viewRef) {
230
+ const templateRef = this.viewToTemplate.get(viewRef);
231
+ if (templateRef) {
232
+ const scrap = this.viewPool.get(templateRef);
233
+ if (scrap) {
234
+ if (scrap.scrapHead.size >= scrap.scrapSize) {
235
+ viewRef.destroy();
236
+ this.viewToLoader.get(viewRef)?.destroy();
237
+ }
238
+ else {
239
+ scrap.scrapHead.add(viewRef);
240
+ }
241
+ }
242
+ }
243
+ }
244
+ getOrCreate(templateRef) {
245
+ return this._ngZone.run(() => {
246
+ let viewRef = this.getView(templateRef);
247
+ if (!viewRef) {
248
+ const loader = this.detachedLoaderFactory();
249
+ // viewRef = this.loader.createEmbeddedView(templateRef, new ItemContext(), 0);
250
+ viewRef = loader.instance.vc.createEmbeddedView(templateRef, new ItemContext(), 0);
251
+ this.viewToLoader.set(viewRef, loader);
252
+ this.viewToTemplate.set(viewRef, templateRef);
253
+ }
254
+ viewRef.detach();
255
+ const resultView = getItemViewRoot(viewRef);
256
+ resultView[NG_VIEW] = viewRef;
257
+ resultView.reusable = this.autoReuseViews;
258
+ return resultView;
259
+ });
260
+ }
261
+ getView(templateRef) {
262
+ const pool = this.getViewPool(templateRef);
263
+ while (pool.scrapHead.size > 0) {
264
+ const viewRef = pool.scrapHead.values().next().value;
265
+ pool.scrapHead.delete(viewRef);
266
+ if (!viewRef.destroyed) {
267
+ return viewRef;
268
+ }
269
+ }
270
+ return null;
271
+ }
272
+ getViewPool(templateRef) {
273
+ if (!this.viewPool.has(templateRef)) {
274
+ this.viewPool.set(templateRef, {
275
+ scrapSize: this.autoReuseViews ? Infinity : 0,
276
+ scrapHead: new Set()
277
+ });
278
+ }
279
+ return this.viewPool.get(templateRef);
280
+ }
281
+ setItemTemplates() {
282
+ // The itemTemplateQuery may be changed after list items are added that contain <template> inside,
283
+ // so cache and use only the original template to avoid errors.
284
+ this.itemTemplate = this.itemTemplateQuery;
285
+ if (this._templateMap) {
286
+ if (Trace.isEnabled()) {
287
+ CLog(CLogTypes.info, 'Setting templates');
288
+ }
289
+ const templates = [];
290
+ this._templateMap.forEach((value) => {
291
+ templates.push(value);
292
+ });
293
+ this._collectionView.itemTemplates = templates;
294
+ }
295
+ else {
296
+ // If the map was not initialized this means that there are no named templates, so we register the default one.
297
+ this._collectionView.itemTemplate = this.getItemTemplateViewFactory(this.itemTemplate);
298
+ }
299
+ }
300
+ detectChangesOnChild(viewRef, index) {
301
+ if (Trace.isEnabled()) {
302
+ CLog(CLogTypes.info, 'Manually detect changes in child: ' + index);
303
+ }
304
+ viewRef.markForCheck();
305
+ viewRef.detectChanges();
306
+ }
307
+ refresh() {
308
+ if (this._collectionView) {
309
+ this._collectionView.refresh();
310
+ }
311
+ }
312
+ }
313
+ CollectionViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: CollectionViewComponent, deps: [{ token: ElementRef }, { token: IterableDiffers }, { token: NativeScriptRendererFactory }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Component });
314
+ CollectionViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: CollectionViewComponent, selector: "CollectionView", inputs: { autoReuseViews: "autoReuseViews", itemTemplate: "itemTemplate", items: "items" }, outputs: { setupItemView: "setupItemView" }, host: { listeners: { "itemLoading": "onItemLoading($event)", "itemRecycling": "onItemRecyclingInternal($event)", "itemDisposing": "onItemDisposingInternal($event)" } }, queries: [{ propertyName: "itemTemplateQuery", first: true, predicate: TemplateRef, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "loader", first: true, predicate: ["loader"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: `
315
+ <DetachedContainer>
316
+ <Placeholder #loader></Placeholder>
317
+ </DetachedContainer>
318
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
319
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: CollectionViewComponent, decorators: [{
320
+ type: Component,
321
+ args: [{
322
+ selector: 'CollectionView',
323
+ template: `
324
+ <DetachedContainer>
325
+ <Placeholder #loader></Placeholder>
326
+ </DetachedContainer>
327
+ `,
328
+ changeDetection: ChangeDetectionStrategy.OnPush
329
+ }]
330
+ }], ctorParameters: function () { return [{ type: i0.ElementRef, decorators: [{
331
+ type: Inject,
332
+ args: [ElementRef]
333
+ }] }, { type: i0.IterableDiffers, decorators: [{
334
+ type: Inject,
335
+ args: [IterableDiffers]
336
+ }] }, { type: i1.NativeScriptRendererFactory, decorators: [{
337
+ type: Inject,
338
+ args: [NativeScriptRendererFactory]
339
+ }] }, { type: i0.NgZone, decorators: [{
340
+ type: Inject,
341
+ args: [NgZone]
342
+ }] }]; }, propDecorators: { loader: [{
343
+ type: ViewChild,
344
+ args: ['loader', { read: ViewContainerRef, static: true }]
345
+ }], setupItemView: [{
346
+ type: Output
347
+ }], itemTemplateQuery: [{
348
+ type: ContentChild,
349
+ args: [TemplateRef, { read: TemplateRef, static: true }]
350
+ }], autoReuseViews: [{
351
+ type: Input
352
+ }], itemTemplate: [{
353
+ type: Input
354
+ }], items: [{
355
+ type: Input
356
+ }], onItemLoading: [{
357
+ type: HostListener,
358
+ args: ['itemLoading', ['$event']]
359
+ }], onItemRecyclingInternal: [{
360
+ type: HostListener,
361
+ args: ['itemRecycling', ['$event']]
362
+ }], onItemDisposingInternal: [{
363
+ type: HostListener,
364
+ args: ['itemDisposing', ['$event']]
365
+ }] } });
366
+ export function getItemViewRoot(viewRef, rootLocator = extractSingleViewRecursive) {
367
+ const rootView = rootLocator(viewRef.rootNodes, 0);
368
+ return rootView;
369
+ }
370
+ export class TemplateKeyDirective {
371
+ constructor(templateRef, collectionView) {
372
+ this.templateRef = templateRef;
373
+ this.collectionView = collectionView;
374
+ }
375
+ set cvTemplateKey(value) {
376
+ if (Trace.isEnabled()) {
377
+ CLog(CLogTypes.info, 'cvTemplateKey: ' + value);
378
+ }
379
+ if (this.collectionView && this.templateRef) {
380
+ this.collectionView.registerTemplate(value.toLowerCase(), this.templateRef);
381
+ }
382
+ }
383
+ }
384
+ TemplateKeyDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: TemplateKeyDirective, deps: [{ token: i0.TemplateRef }, { token: CollectionViewComponent, host: true }], target: i0.ɵɵFactoryTarget.Directive });
385
+ TemplateKeyDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: TemplateKeyDirective, selector: "[cvTemplateKey]", inputs: { cvTemplateKey: "cvTemplateKey" }, ngImport: i0 });
386
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: TemplateKeyDirective, decorators: [{
387
+ type: Directive,
388
+ args: [{ selector: '[cvTemplateKey]' }]
389
+ }], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: CollectionViewComponent, decorators: [{
390
+ type: Host
391
+ }] }]; }, propDecorators: { cvTemplateKey: [{
392
+ type: Input
393
+ }] } });
394
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbnZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdWktY29sbGVjdGlvbnZpZXcvYW5ndWxhci9jb2xsZWN0aW9udmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLFNBQVMsRUFFVCxVQUFVLEVBRVYsWUFBWSxFQUNaLElBQUksRUFDSixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxlQUFlLEVBQ2YsTUFBTSxFQUVOLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxFQUNULGdCQUFnQixHQUNuQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQStCLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0gsT0FBTyxFQUFFLGNBQWMsRUFBRSwyQkFBMkIsRUFBRSwwQkFBMEIsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqSSxPQUFPLEVBQWlCLFVBQVUsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFRLE1BQU0sb0JBQW9CLENBQUM7OztBQUU3RixlQUFlLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFeEQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO0FBRTdCLE1BQU0sT0FBTyxXQUFXO0lBQ3BCLFlBQW1CLFNBQWUsRUFBUyxJQUFVLEVBQVMsS0FBYyxFQUFTLElBQWMsRUFBUyxHQUFhO1FBQXRHLGNBQVMsR0FBVCxTQUFTLENBQU07UUFBUyxTQUFJLEdBQUosSUFBSSxDQUFNO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUFTLFNBQUksR0FBSixJQUFJLENBQVU7UUFBUyxRQUFHLEdBQUgsR0FBRyxDQUFVO0lBQUcsQ0FBQztDQUNoSTtBQVNELFNBQVMsa0JBQWtCLENBQUMsR0FBUTtJQUNuQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ25DLE9BQU8sQ0FDTixLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksR0FBRyxDQUFDLElBQUksb0RBQW9EO1lBQzdFLE1BQU0sQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDLENBQ3hCLENBQUMsQ0FBQywwQ0FBMEM7QUFDOUMsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLENBQU07SUFDekIsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssVUFBVSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFXRCxNQUFNLE9BQU8sdUJBQXVCO0lBdURoQyxZQUNnQyxXQUF1QixFQUNsQixnQkFBaUMsRUFDckIsU0FBc0MsRUFDM0QsT0FBZTtRQUhYLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFDckIsY0FBUyxHQUFULFNBQVMsQ0FBNkI7UUFDM0QsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQWxEMUIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztRQUc5RCxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQXdEeEIsbUJBQWMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNsQixRQUFRLFFBQVEsRUFBRTtnQkFDZCxLQUFLLGlCQUFpQixDQUFDLFFBQVE7b0JBQzNCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO3dCQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDdkQsT0FBTyxTQUFTLENBQUM7cUJBQ3BCO29CQUNELE1BQU07YUFDYjtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBc0tQLGFBQVEsR0FBRyxJQUFJLEdBQUcsRUFNZixDQUFDO1FBZUosbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBMEMsQ0FBQztRQUN2RSxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFzRCxDQUFDO1FBOU03RSxJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFFakQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMxRCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBakVELElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUNoQyxDQUFDO0lBUUQscUJBQXFCO1FBQ2pCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRTtZQUNwRCxLQUFLLEVBQUUsQ0FBQztTQUNYLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQ1csWUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQVcsWUFBWSxDQUFDLEtBQVU7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsSUFDVyxLQUFLO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxJQUFXLEtBQUssQ0FBQyxLQUFVO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLEtBQUssWUFBWSxlQUFlLEVBQUU7WUFDbEMsVUFBVSxHQUFHLEtBQUssQ0FBQztTQUN0QjtRQUNELElBQUksVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMxRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pGO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUM3QyxDQUFDO0lBbUNNLGtCQUFrQjtRQUNyQixJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFFckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDN0I7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRU0sU0FBUztRQUNaLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLGdDQUFnQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN6RTtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO2FBQ3hEO1lBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9DLElBQUksT0FBTyxFQUFFO2dCQUNULElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFO29CQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO2lCQUNqRDtnQkFDRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDbEI7U0FDSjtJQUNMLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsUUFBa0M7UUFDbkUsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsNEJBQTRCLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDNUQ7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1NBQ3hEO1FBRUQsTUFBTSxhQUFhLEdBQUc7WUFDbEIsR0FBRztZQUNILFVBQVUsRUFBRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsUUFBUSxDQUFDO1NBQ3hELENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUdNLGFBQWEsQ0FBQyxJQUFpQztRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbEMsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUN4QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3pCLE1BQU0sS0FBSyxHQUFJLElBQUksQ0FBQyxNQUFjLENBQUMsS0FBSyxDQUFDO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLE9BQU8sS0FBSyxDQUFDLE9BQU8sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RixJQUFJLE9BQXFDLENBQUM7UUFFMUMsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEtBQUssMEJBQTBCLENBQUMsQ0FBQztTQUMzRTtRQUVELE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLCtFQUErRTtRQUMvRSw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxZQUFZLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ2pGLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QztRQUVELElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQy9CLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxvQ0FBb0MsS0FBSyxpQ0FBaUMsQ0FBQyxDQUFDO2FBQ3BHO1NBQ0o7UUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1YsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLGtCQUFrQixLQUFLLGdDQUFnQyxDQUFDLENBQUM7YUFDakY7WUFFRCxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEYsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUM7U0FDaEM7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFL0MsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU0sdUJBQXVCLENBQUMsSUFBUztRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNaLE9BQU87U0FDVjtRQUNELElBQUksTUFBTSxHQUF5QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXRELCtFQUErRTtRQUMvRSw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxZQUFZLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ2hGLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM3QztRQUNELHVDQUF1QztRQUV2QyxJQUFJLE1BQU0sRUFBRTtZQUNSLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNuQjtJQUNMLENBQUM7SUFHTSx1QkFBdUIsQ0FBQyxJQUFTO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1osT0FBTztTQUNWO1FBQ0QsSUFBSSxNQUFNLEdBQXlCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEQsK0VBQStFO1FBQy9FLDZEQUE2RDtRQUM3RCxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLFlBQVksVUFBVSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDaEYsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdDO1FBRUQsSUFBSSxNQUFNLEVBQUU7WUFDUixNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM3QjtJQUNMLENBQUM7SUFFTSxZQUFZLENBQUMsSUFBa0MsRUFBRSxJQUFTLEVBQUUsS0FBYTtRQUM1RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFFNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDcEIsT0FBTztZQUNQLElBQUk7WUFDSixLQUFLO1lBQ0wsSUFBSTtTQUNQLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFUywwQkFBMEIsQ0FBQyxRQUFrQztRQUNuRSxPQUFPLEdBQUcsRUFBRTtZQUNSLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLElBQUksV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0UsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUM7WUFFOUIsT0FBTyxVQUFVLENBQUM7UUFDdEIsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQVFPLFlBQVksQ0FBQyxPQUE2QjtRQUM5QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRCxJQUFJLFdBQVcsRUFBRTtZQUNiLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdDLElBQUksS0FBSyxFQUFFO2dCQUNQLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRTtvQkFDekMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQztpQkFDN0M7cUJBQU07b0JBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ2hDO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFJTyxXQUFXLENBQUMsV0FBcUM7UUFDckQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDekIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNWLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUM1QywrRUFBK0U7Z0JBQy9FLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkYsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7YUFDakQ7WUFDRCxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDOUIsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQzFDLE9BQU8sVUFBVSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNPLE9BQU8sQ0FBQyxXQUFxQztRQUNqRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQzVCLE1BQU0sT0FBTyxHQUFpQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuRixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtnQkFDcEIsT0FBTyxPQUFPLENBQUM7YUFDbEI7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxXQUFXLENBQUMsV0FBcUM7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRTtnQkFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsU0FBUyxFQUFFLElBQUksR0FBRyxFQUFnQzthQUNyRCxDQUFDLENBQUM7U0FDTjtRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixrR0FBa0c7UUFDbEcsK0RBQStEO1FBQy9ELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBRTNDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQzthQUM3QztZQUVELE1BQU0sU0FBUyxHQUFvQixFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDaEMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztTQUNsRDthQUFNO1lBQ0gsK0dBQStHO1lBQy9HLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDMUY7SUFDTCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsT0FBcUMsRUFBRSxLQUFhO1FBQzdFLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLG9DQUFvQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1NBQ3RFO1FBQ0QsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU8sT0FBTztRQUNYLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2xDO0lBQ0wsQ0FBQzs7b0hBclZRLHVCQUF1QixrQkF3RHBCLFVBQVUsYUFDVixlQUFlLGFBQ2YsMkJBQTJCLGFBQzNCLE1BQU07d0dBM0RULHVCQUF1Qix1WkFVbEIsV0FBVywyQkFBVSxXQUFXLHdIQUZqQixnQkFBZ0IsMkNBZm5DOzs7O0tBSVQ7MkZBR1EsdUJBQXVCO2tCQVRuQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFFBQVEsRUFBRTs7OztLQUlUO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNsRDs7MEJBeURRLE1BQU07MkJBQUMsVUFBVTs7MEJBQ2pCLE1BQU07MkJBQUMsZUFBZTs7MEJBQ3RCLE1BQU07MkJBQUMsMkJBQTJCOzswQkFDbEMsTUFBTTsyQkFBQyxNQUFNOzRDQW5Eb0QsTUFBTTtzQkFBM0UsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDNUMsYUFBYTtzQkFBN0IsTUFBTTtnQkFDZ0UsaUJBQWlCO3NCQUF2RixZQUFZO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFckQsY0FBYztzQkFBdEIsS0FBSztnQkFZSyxZQUFZO3NCQUR0QixLQUFLO2dCQVNLLEtBQUs7c0JBRGYsS0FBSztnQkE4R0MsYUFBYTtzQkFEbkIsWUFBWTt1QkFBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBMkNoQyx1QkFBdUI7c0JBRDdCLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQW9CbEMsdUJBQXVCO3NCQUQ3QixZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7QUFzSjdDLE1BQU0sVUFBVSxlQUFlLENBQUMsT0FBc0IsRUFBRSxjQUEyQiwwQkFBMEI7SUFDekcsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkQsT0FBTyxRQUFRLENBQUM7QUFDcEIsQ0FBQztBQUdELE1BQU0sT0FBTyxvQkFBb0I7SUFDN0IsWUFBb0IsV0FBNkIsRUFBa0IsY0FBdUM7UUFBdEYsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQWtCLG1CQUFjLEdBQWQsY0FBYyxDQUF5QjtJQUFHLENBQUM7SUFFOUcsSUFDSSxhQUFhLENBQUMsS0FBVTtRQUN4QixJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUMvRTtJQUNMLENBQUM7O2lIQVhRLG9CQUFvQjtxR0FBcEIsb0JBQW9COzJGQUFwQixvQkFBb0I7a0JBRGhDLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUU7OzBCQUVjLElBQUk7NENBR3BELGFBQWE7c0JBRGhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIENvbXBvbmVudFJlZixcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRGlyZWN0aXZlLFxuICAgIERvQ2hlY2ssXG4gICAgRWxlbWVudFJlZixcbiAgICBFbWJlZGRlZFZpZXdSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3QsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBJdGVyYWJsZURpZmZlcixcbiAgICBJdGVyYWJsZURpZmZlcnMsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ0xvZywgQ0xvZ1R5cGVzLCBDb2xsZWN0aW9uVmlldywgQ29sbGVjdGlvblZpZXdJdGVtRXZlbnREYXRhLCBMaXN0Vmlld1ZpZXdUeXBlcyB9IGZyb20gJ0Buc3R1ZGlvL3VpLWNvbGxlY3Rpb252aWV3JztcbmltcG9ydCB7IERldGFjaGVkTG9hZGVyLCBOYXRpdmVTY3JpcHRSZW5kZXJlckZhY3RvcnksIGV4dHJhY3RTaW5nbGVWaWV3UmVjdXJzaXZlLCByZWdpc3RlckVsZW1lbnQgfSBmcm9tICdAbmF0aXZlc2NyaXB0L2FuZ3VsYXInO1xuaW1wb3J0IHsgS2V5ZWRUZW1wbGF0ZSwgTGF5b3V0QmFzZSwgT2JzZXJ2YWJsZUFycmF5LCBUcmFjZSwgVmlldyB9IGZyb20gJ0BuYXRpdmVzY3JpcHQvY29yZSc7XG5cbnJlZ2lzdGVyRWxlbWVudCgnQ29sbGVjdGlvblZpZXcnLCAoKSA9PiBDb2xsZWN0aW9uVmlldyk7XG5cbmNvbnN0IE5HX1ZJRVcgPSAnX25nVmlld1JlZic7XG5cbmV4cG9ydCBjbGFzcyBJdGVtQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IocHVibGljICRpbXBsaWNpdD86IGFueSwgcHVibGljIGl0ZW0/OiBhbnksIHB1YmxpYyBpbmRleD86IG51bWJlciwgcHVibGljIGV2ZW4/OiBib29sZWFuLCBwdWJsaWMgb2RkPzogYm9vbGVhbikge31cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXR1cEl0ZW1WaWV3QXJncyB7XG4gICAgdmlldzogRW1iZWRkZWRWaWV3UmVmPGFueT47XG4gICAgZGF0YTogYW55O1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgY29udGV4dDogSXRlbUNvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIGlzTGlzdExpa2VJdGVyYWJsZShvYmo6IGFueSk6IGJvb2xlYW4ge1xuXHRpZiAoIWlzSnNPYmplY3Qob2JqKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gKFxuXHRcdEFycmF5LmlzQXJyYXkob2JqKSB8fFxuXHRcdCghKG9iaiBpbnN0YW5jZW9mIE1hcCkgJiYgLy8gSlMgTWFwIGFyZSBpdGVyYWJsZXMgYnV0IHJldHVybiBlbnRyaWVzIGFzIFtrLCB2XVxuXHRcdFx0U3ltYm9sLml0ZXJhdG9yIGluIG9iailcblx0KTsgLy8gSlMgSXRlcmFibGUgaGF2ZSBhIFN5bWJvbC5pdGVyYXRvciBwcm9wXG59XG5cbmZ1bmN0aW9uIGlzSnNPYmplY3QobzogYW55KTogYm9vbGVhbiB7XG5cdHJldHVybiBvICE9PSBudWxsICYmICh0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgbyA9PT0gJ29iamVjdCcpO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ0NvbGxlY3Rpb25WaWV3JyxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8RGV0YWNoZWRDb250YWluZXI+XG4gICAgICAgICAgICA8UGxhY2Vob2xkZXIgI2xvYWRlcj48L1BsYWNlaG9sZGVyPlxuICAgICAgICA8L0RldGFjaGVkQ29udGFpbmVyPlxuICAgIGAsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvblZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBEb0NoZWNrLCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQge1xuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvblZpZXc7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbGlzdFZpZXcoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb25WaWV3O1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ2xvYWRlcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBsb2FkZXI6IFZpZXdDb250YWluZXJSZWY7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBzZXR1cEl0ZW1WaWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxTZXR1cEl0ZW1WaWV3QXJncz4oKTtcbiAgICBAQ29udGVudENoaWxkKFRlbXBsYXRlUmVmLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSkgcHVibGljIGl0ZW1UZW1wbGF0ZVF1ZXJ5OiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD47XG5cbiAgICBASW5wdXQoKSBhdXRvUmV1c2VWaWV3cyA9IGZhbHNlO1xuXG4gICAgZGV0YWNoZWRMb2FkZXJGYWN0b3J5KCkge1xuICAgICAgICBjb25zdCByZWYgPSB0aGlzLmxvYWRlci5jcmVhdGVDb21wb25lbnQoRGV0YWNoZWRMb2FkZXIsIHtcbiAgICAgICAgICAgIGluZGV4OiAwXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmxvYWRlci5kZXRhY2goMCk7XG4gICAgICAgIHRoaXMuX2xvYWRlcnMucHVzaChyZWYpO1xuICAgICAgICByZXR1cm4gcmVmO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBpdGVtVGVtcGxhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtVGVtcGxhdGU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgaXRlbVRlbXBsYXRlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5faXRlbVRlbXBsYXRlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3LnJlZnJlc2goKTtcbiAgICB9XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGl0ZW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgaXRlbXModmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9pdGVtcyA9IHZhbHVlO1xuICAgICAgICBsZXQgbmVlZERpZmZlciA9IHRydWU7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9ic2VydmFibGVBcnJheSkge1xuICAgICAgICAgICAgbmVlZERpZmZlciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZWVkRGlmZmVyICYmICF0aGlzLl9kaWZmZXIgJiYgaXNMaXN0TGlrZUl0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5fZGlmZmVyID0gdGhpcy5faXRlcmFibGVEaWZmZXJzLmZpbmQodGhpcy5faXRlbXMpLmNyZWF0ZSgoX2luZGV4LCBpdGVtKSA9PiBpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3Lml0ZW1zID0gdGhpcy5faXRlbXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY29sbGVjdGlvblZpZXc6IENvbGxlY3Rpb25WaWV3O1xuICAgIHByaXZhdGUgX2l0ZW1zOiBhbnk7XG4gICAgcHJpdmF0ZSBfZGlmZmVyOiBJdGVyYWJsZURpZmZlcjxLZXllZFRlbXBsYXRlPjtcbiAgICBwcml2YXRlIF9pdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPEl0ZW1Db250ZXh0PjtcbiAgICBwcml2YXRlIF90ZW1wbGF0ZU1hcDogTWFwPHN0cmluZywgS2V5ZWRUZW1wbGF0ZT47XG4gICAgcHJpdmF0ZSBfbG9hZGVyczogQ29tcG9uZW50UmVmPERldGFjaGVkTG9hZGVyPltdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoRWxlbWVudFJlZikgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgQEluamVjdChJdGVyYWJsZURpZmZlcnMpIHByaXZhdGUgX2l0ZXJhYmxlRGlmZmVyczogSXRlcmFibGVEaWZmZXJzLFxuICAgICAgICBASW5qZWN0KE5hdGl2ZVNjcmlwdFJlbmRlcmVyRmFjdG9yeSkgcHJpdmF0ZSBfcmVuZGVyZXI6IE5hdGl2ZVNjcmlwdFJlbmRlcmVyRmFjdG9yeSxcbiAgICAgICAgQEluamVjdChOZ1pvbmUpIHByaXZhdGUgX25nWm9uZTogTmdab25lXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3ID0gX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgICAgICB0aGlzLl9jb2xsZWN0aW9uVmlldy5vbihDb2xsZWN0aW9uVmlldy5pdGVtTG9hZGluZ0V2ZW50LCB0aGlzLm9uSXRlbUxvYWRpbmcsIHRoaXMpO1xuICAgICAgICB0aGlzLl9jb2xsZWN0aW9uVmlldy5pdGVtVmlld0xvYWRlciA9IHRoaXMuaXRlbVZpZXdMb2FkZXI7XG4gICAgICAgIHRoaXMuX2xvYWRlcnMgPSBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGl0ZW1WaWV3TG9hZGVyID0gKHZpZXdUeXBlKSA9PlxuICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAodmlld1R5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIExpc3RWaWV3Vmlld1R5cGVzLkl0ZW1WaWV3OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faXRlbVRlbXBsYXRlICYmIHRoaXMubG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFZpZXcgPSB0aGlzLmdldE9yQ3JlYXRlKHRoaXMuX2l0ZW1UZW1wbGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZWRWaWV3O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBDTG9nKENMb2dUeXBlcy5pbmZvLCAnQ29sbGVjdGlvblZpZXcubmdBZnRlckNvbnRlbnRJbml0KCknKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEl0ZW1UZW1wbGF0ZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3Lm9mZihDb2xsZWN0aW9uVmlldy5pdGVtTG9hZGluZ0V2ZW50LCB0aGlzLm9uSXRlbUxvYWRpbmcsIHRoaXMpO1xuICAgICAgICB0aGlzLl9jb2xsZWN0aW9uVmlldyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2xvYWRlcnMuZm9yRWFjaCgobCkgPT4gbC5kZXN0cm95KCkpO1xuICAgICAgICB0aGlzLl9sb2FkZXJzID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3VG9Mb2FkZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZXdUb1RlbXBsYXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3UG9vbCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5faXRlbXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9kaWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLl9pdGVtVGVtcGxhdGUgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGVNYXApIHtcbiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlTWFwLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVtcGxhdGVNYXAgPSBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgQ0xvZyhDTG9nVHlwZXMuaW5mbywgJ25nRG9DaGVjaygpIC0gZXhlY3V0ZSBkaWZmZXI/ICcgKyB0aGlzLl9kaWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kaWZmZXIpIHtcbiAgICAgICAgICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIENMb2coQ0xvZ1R5cGVzLmluZm8sICduZ0RvQ2hlY2soKSAtIGV4ZWN1dGUgZGlmZmVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5fZGlmZmVyLmRpZmYodGhpcy5faXRlbXMpO1xuICAgICAgICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgQ0xvZyhDTG9nVHlwZXMuaW5mbywgJ25nRG9DaGVjaygpIC0gcmVmcmVzaCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlclRlbXBsYXRlKGtleTogc3RyaW5nLCB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+KSB7XG4gICAgICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgQ0xvZyhDTG9nVHlwZXMuaW5mbywgJ3JlZ2lzdGVyVGVtcGxhdGUgZm9yIGtleTogJyArIGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl90ZW1wbGF0ZU1hcCkge1xuICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGVNYXAgPSBuZXcgTWFwPHN0cmluZywgS2V5ZWRUZW1wbGF0ZT4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGtleWVkVGVtcGxhdGUgPSB7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBjcmVhdGVWaWV3OiB0aGlzLmdldEl0ZW1UZW1wbGF0ZVZpZXdGYWN0b3J5KHRlbXBsYXRlKVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX3RlbXBsYXRlTWFwLnNldChrZXksIGtleWVkVGVtcGxhdGUpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2l0ZW1Mb2FkaW5nJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25JdGVtTG9hZGluZyhhcmdzOiBDb2xsZWN0aW9uVmlld0l0ZW1FdmVudERhdGEpIHtcbiAgICAgICAgaWYgKCFhcmdzLnZpZXcgJiYgIXRoaXMuaXRlbVRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLml0ZW1zKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGluZGV4ID0gYXJncy5pbmRleDtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAoYXJncy5vYmplY3QgYXMgYW55KS5pdGVtcztcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZW0gPSB0eXBlb2YgaXRlbXMuZ2V0SXRlbSA9PT0gJ2Z1bmN0aW9uJyA/IGl0ZW1zLmdldEl0ZW0oaW5kZXgpIDogaXRlbXNbaW5kZXhdO1xuICAgICAgICBsZXQgdmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPEl0ZW1Db250ZXh0PjtcblxuICAgICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIENMb2coQ0xvZ1R5cGVzLmluZm8sIGBvbkl0ZW1Mb2FkaW5nOiAke2luZGV4fSAtIFJldXNpbmcgZXhpc3Rpbmcgdmlld2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmlld1JlZiA9IGFyZ3Mudmlld1tOR19WSUVXXTtcbiAgICAgICAgLy8gR2V0dGluZyBhbmd1bGFyIHZpZXcgZnJvbSBvcmlnaW5hbCBlbGVtZW50IChpbiBjYXNlcyB3aGVuIFByb3h5Vmlld0NvbnRhaW5lclxuICAgICAgICAvLyBpcyB1c2VkIE5hdGl2ZVNjcmlwdCBpbnRlcm5hbGx5IHdyYXBzIGl0IGluIGEgU3RhY2tMYXlvdXQpXG4gICAgICAgIGlmICghdmlld1JlZiAmJiBhcmdzLnZpZXcgaW5zdGFuY2VvZiBMYXlvdXRCYXNlICYmIGFyZ3Mudmlldy5nZXRDaGlsZHJlbkNvdW50KCkgPiAwKSB7XG4gICAgICAgICAgICB2aWV3UmVmID0gYXJncy52aWV3LmdldENoaWxkQXQoMClbTkdfVklFV107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXZpZXdSZWYgJiYgVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIENMb2coQ0xvZ1R5cGVzLmluZm8sIGBWaWV3UmVmZXJlbmNlIG5vdCBmb3VuZCBmb3IgaXRlbSAke2luZGV4fS4gVmlldyByZWN5Y2xpbmcgaXMgbm90IHdvcmtpbmdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmlld1JlZikge1xuICAgICAgICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgQ0xvZyhDTG9nVHlwZXMuaW5mbywgYG9uSXRlbUxvYWRpbmc6ICR7aW5kZXh9IC0gQ3JlYXRpbmcgdmlldyBmcm9tIHRlbXBsYXRlYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZpZXdSZWYgPSB0aGlzLmxvYWRlci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5pdGVtVGVtcGxhdGUsIG5ldyBJdGVtQ29udGV4dCgpLCAwKTtcbiAgICAgICAgICAgIGFyZ3MudmlldyA9IGdldEl0ZW1WaWV3Um9vdCh2aWV3UmVmKTtcbiAgICAgICAgICAgIGFyZ3Mudmlld1tOR19WSUVXXSA9IHZpZXdSZWY7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldHVwVmlld1JlZih2aWV3UmVmLCBjdXJyZW50SXRlbSwgaW5kZXgpO1xuXG4gICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlc09uQ2hpbGQodmlld1JlZiwgaW5kZXgpO1xuICAgIH1cbiAgICBASG9zdExpc3RlbmVyKCdpdGVtUmVjeWNsaW5nJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25JdGVtUmVjeWNsaW5nSW50ZXJuYWwoYXJnczogYW55KSB7XG4gICAgICAgIGlmICghYXJncy52aWV3KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5nVmlldzogRW1iZWRkZWRWaWV3UmVmPGFueT4gPSBhcmdzLnZpZXdbTkdfVklFV107XG5cbiAgICAgICAgLy8gR2V0dGluZyBhbmd1bGFyIHZpZXcgZnJvbSBvcmlnaW5hbCBlbGVtZW50IChpbiBjYXNlcyB3aGVuIFByb3h5Vmlld0NvbnRhaW5lclxuICAgICAgICAvLyBpcyB1c2VkIE5hdGl2ZVNjcmlwdCBpbnRlcm5hbGx5IHdyYXBzIGl0IGluIGEgU3RhY2tMYXlvdXQpXG4gICAgICAgIGlmICghbmdWaWV3ICYmIGFyZ3MudmlldyBpbnN0YW5jZW9mIExheW91dEJhc2UgJiYgYXJncy52aWV3LmdldENoaWxkcmVuQ291bnQoKSA+IDApIHtcbiAgICAgICAgICAgIG5nVmlldyA9IGFyZ3Mudmlldy5nZXRDaGlsZEF0KDApW05HX1ZJRVddO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdyZWN5Y2xpbmcnLCBhcmdzLnZpZXcpO1xuXG4gICAgICAgIGlmIChuZ1ZpZXcpIHtcbiAgICAgICAgICAgIG5nVmlldy5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2l0ZW1EaXNwb3NpbmcnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkl0ZW1EaXNwb3NpbmdJbnRlcm5hbChhcmdzOiBhbnkpIHtcbiAgICAgICAgaWYgKCFhcmdzLnZpZXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmdWaWV3OiBFbWJlZGRlZFZpZXdSZWY8YW55PiA9IGFyZ3Mudmlld1tOR19WSUVXXTtcblxuICAgICAgICAvLyBHZXR0aW5nIGFuZ3VsYXIgdmlldyBmcm9tIG9yaWdpbmFsIGVsZW1lbnQgKGluIGNhc2VzIHdoZW4gUHJveHlWaWV3Q29udGFpbmVyXG4gICAgICAgIC8vIGlzIHVzZWQgTmF0aXZlU2NyaXB0IGludGVybmFsbHkgd3JhcHMgaXQgaW4gYSBTdGFja0xheW91dClcbiAgICAgICAgaWYgKCFuZ1ZpZXcgJiYgYXJncy52aWV3IGluc3RhbmNlb2YgTGF5b3V0QmFzZSAmJiBhcmdzLnZpZXcuZ2V0Q2hpbGRyZW5Db3VudCgpID4gMCkge1xuICAgICAgICAgICAgbmdWaWV3ID0gYXJncy52aWV3LmdldENoaWxkQXQoMClbTkdfVklFV107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmdWaWV3KSB7XG4gICAgICAgICAgICBuZ1ZpZXcuZGV0YWNoKCk7XG4gICAgICAgICAgICB0aGlzLnN0b3JlVmlld1JlZihuZ1ZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldHVwVmlld1JlZih2aWV3OiBFbWJlZGRlZFZpZXdSZWY8SXRlbUNvbnRleHQ+LCBkYXRhOiBhbnksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHZpZXcuY29udGV4dDtcbiAgICAgICAgY29udGV4dC4kaW1wbGljaXQgPSBkYXRhO1xuICAgICAgICBjb250ZXh0Lml0ZW0gPSBkYXRhO1xuICAgICAgICBjb250ZXh0LmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGNvbnRleHQuZXZlbiA9IGluZGV4ICUgMiA9PT0gMDtcbiAgICAgICAgY29udGV4dC5vZGQgPSAhY29udGV4dC5ldmVuO1xuXG4gICAgICAgIHRoaXMuc2V0dXBJdGVtVmlldy5uZXh0KHtcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICB2aWV3XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRJdGVtVGVtcGxhdGVWaWV3RmFjdG9yeSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+KTogKCkgPT4gVmlldyB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2aWV3UmVmID0gdGhpcy5sb2FkZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRlbXBsYXRlLCBuZXcgSXRlbUNvbnRleHQoKSwgMCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRWaWV3ID0gZ2V0SXRlbVZpZXdSb290KHZpZXdSZWYpO1xuICAgICAgICAgICAgcmVzdWx0Vmlld1tOR19WSUVXXSA9IHZpZXdSZWY7XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRWaWV3O1xuICAgICAgICB9O1xuICAgIH1cbiAgICB2aWV3UG9vbCA9IG5ldyBNYXA8XG4gICAgICAgIFRlbXBsYXRlUmVmPEl0ZW1Db250ZXh0PixcbiAgICAgICAge1xuICAgICAgICAgICAgc2NyYXBTaXplOiBudW1iZXI7XG4gICAgICAgICAgICBzY3JhcEhlYWQ6IFNldDxFbWJlZGRlZFZpZXdSZWY8SXRlbUNvbnRleHQ+PjtcbiAgICAgICAgfVxuICAgID4oKTtcbiAgICBwcml2YXRlIHN0b3JlVmlld1JlZih2aWV3UmVmOiBFbWJlZGRlZFZpZXdSZWY8YW55Pikge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZVJlZiA9IHRoaXMudmlld1RvVGVtcGxhdGUuZ2V0KHZpZXdSZWYpO1xuICAgICAgICBpZiAodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcmFwID0gdGhpcy52aWV3UG9vbC5nZXQodGVtcGxhdGVSZWYpO1xuICAgICAgICAgICAgaWYgKHNjcmFwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcmFwLnNjcmFwSGVhZC5zaXplID49IHNjcmFwLnNjcmFwU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICB2aWV3UmVmLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3VG9Mb2FkZXIuZ2V0KHZpZXdSZWYpPy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2NyYXAuc2NyYXBIZWFkLmFkZCh2aWV3UmVmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlld1RvVGVtcGxhdGUgPSBuZXcgV2Vha01hcDxFbWJlZGRlZFZpZXdSZWY8YW55PiwgVGVtcGxhdGVSZWY8YW55Pj4oKTtcbiAgICB2aWV3VG9Mb2FkZXIgPSBuZXcgV2Vha01hcDxFbWJlZGRlZFZpZXdSZWY8YW55PiwgQ29tcG9uZW50UmVmPERldGFjaGVkTG9hZGVyPj4oKTtcblxuICAgIHByaXZhdGUgZ2V0T3JDcmVhdGUodGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPEl0ZW1Db250ZXh0Pikge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmlld1JlZiA9IHRoaXMuZ2V0Vmlldyh0ZW1wbGF0ZVJlZik7XG4gICAgICAgICAgICBpZiAoIXZpZXdSZWYpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2FkZXIgPSB0aGlzLmRldGFjaGVkTG9hZGVyRmFjdG9yeSgpO1xuICAgICAgICAgICAgICAgIC8vIHZpZXdSZWYgPSB0aGlzLmxvYWRlci5jcmVhdGVFbWJlZGRlZFZpZXcodGVtcGxhdGVSZWYsIG5ldyBJdGVtQ29udGV4dCgpLCAwKTtcbiAgICAgICAgICAgICAgICB2aWV3UmVmID0gbG9hZGVyLmluc3RhbmNlLnZjLmNyZWF0ZUVtYmVkZGVkVmlldyh0ZW1wbGF0ZVJlZiwgbmV3IEl0ZW1Db250ZXh0KCksIDApO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld1RvTG9hZGVyLnNldCh2aWV3UmVmLCBsb2FkZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld1RvVGVtcGxhdGUuc2V0KHZpZXdSZWYsIHRlbXBsYXRlUmVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXdSZWYuZGV0YWNoKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRWaWV3ID0gZ2V0SXRlbVZpZXdSb290KHZpZXdSZWYpO1xuICAgICAgICAgICAgcmVzdWx0Vmlld1tOR19WSUVXXSA9IHZpZXdSZWY7XG4gICAgICAgICAgICByZXN1bHRWaWV3LnJldXNhYmxlID0gdGhpcy5hdXRvUmV1c2VWaWV3cztcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRWaWV3O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRWaWV3KHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD4pIHtcbiAgICAgICAgY29uc3QgcG9vbCA9IHRoaXMuZ2V0Vmlld1Bvb2wodGVtcGxhdGVSZWYpO1xuICAgICAgICB3aGlsZSAocG9vbC5zY3JhcEhlYWQuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdSZWY6IEVtYmVkZGVkVmlld1JlZjxJdGVtQ29udGV4dD4gPSBwb29sLnNjcmFwSGVhZC52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgICAgICBwb29sLnNjcmFwSGVhZC5kZWxldGUodmlld1JlZik7XG4gICAgICAgICAgICBpZiAoIXZpZXdSZWYuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZpZXdSZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRWaWV3UG9vbCh0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+KSB7XG4gICAgICAgIGlmICghdGhpcy52aWV3UG9vbC5oYXModGVtcGxhdGVSZWYpKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdQb29sLnNldCh0ZW1wbGF0ZVJlZiwge1xuICAgICAgICAgICAgICAgIHNjcmFwU2l6ZTogdGhpcy5hdXRvUmV1c2VWaWV3cyA/IEluZmluaXR5IDogMCxcbiAgICAgICAgICAgICAgICBzY3JhcEhlYWQ6IG5ldyBTZXQ8RW1iZWRkZWRWaWV3UmVmPEl0ZW1Db250ZXh0Pj4oKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1Bvb2wuZ2V0KHRlbXBsYXRlUmVmKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEl0ZW1UZW1wbGF0ZXMoKSB7XG4gICAgICAgIC8vIFRoZSBpdGVtVGVtcGxhdGVRdWVyeSBtYXkgYmUgY2hhbmdlZCBhZnRlciBsaXN0IGl0ZW1zIGFyZSBhZGRlZCB0aGF0IGNvbnRhaW4gPHRlbXBsYXRlPiBpbnNpZGUsXG4gICAgICAgIC8vIHNvIGNhY2hlIGFuZCB1c2Ugb25seSB0aGUgb3JpZ2luYWwgdGVtcGxhdGUgdG8gYXZvaWQgZXJyb3JzLlxuICAgICAgICB0aGlzLml0ZW1UZW1wbGF0ZSA9IHRoaXMuaXRlbVRlbXBsYXRlUXVlcnk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3RlbXBsYXRlTWFwKSB7XG4gICAgICAgICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICBDTG9nKENMb2dUeXBlcy5pbmZvLCAnU2V0dGluZyB0ZW1wbGF0ZXMnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVzOiBLZXllZFRlbXBsYXRlW10gPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlTWFwLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9jb2xsZWN0aW9uVmlldy5pdGVtVGVtcGxhdGVzID0gdGVtcGxhdGVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlIG1hcCB3YXMgbm90IGluaXRpYWxpemVkIHRoaXMgbWVhbnMgdGhhdCB0aGVyZSBhcmUgbm8gbmFtZWQgdGVtcGxhdGVzLCBzbyB3ZSByZWdpc3RlciB0aGUgZGVmYXVsdCBvbmUuXG4gICAgICAgICAgICB0aGlzLl9jb2xsZWN0aW9uVmlldy5pdGVtVGVtcGxhdGUgPSB0aGlzLmdldEl0ZW1UZW1wbGF0ZVZpZXdGYWN0b3J5KHRoaXMuaXRlbVRlbXBsYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGV0ZWN0Q2hhbmdlc09uQ2hpbGQodmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPEl0ZW1Db250ZXh0PiwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIENMb2coQ0xvZ1R5cGVzLmluZm8sICdNYW51YWxseSBkZXRlY3QgY2hhbmdlcyBpbiBjaGlsZDogJyArIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICB2aWV3UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB2aWV3UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZnJlc2goKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb2xsZWN0aW9uVmlldykge1xuICAgICAgICAgICAgdGhpcy5fY29sbGVjdGlvblZpZXcucmVmcmVzaCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudFZpZXcge1xuICAgIHJvb3ROb2RlczogYW55W107XG4gICAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBSb290TG9jYXRvciA9IChub2RlczogYW55W10sIG5lc3RMZXZlbDogbnVtYmVyKSA9PiBWaWV3O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbVZpZXdSb290KHZpZXdSZWY6IENvbXBvbmVudFZpZXcsIHJvb3RMb2NhdG9yOiBSb290TG9jYXRvciA9IGV4dHJhY3RTaW5nbGVWaWV3UmVjdXJzaXZlKTogVmlldyB7XG4gICAgY29uc3Qgcm9vdFZpZXcgPSByb290TG9jYXRvcih2aWV3UmVmLnJvb3ROb2RlcywgMCk7XG4gICAgcmV0dXJuIHJvb3RWaWV3O1xufVxuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbY3ZUZW1wbGF0ZUtleV0nIH0pXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVLZXlEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sIEBIb3N0KCkgcHJpdmF0ZSBjb2xsZWN0aW9uVmlldzogQ29sbGVjdGlvblZpZXdDb21wb25lbnQpIHt9XG5cbiAgICBASW5wdXQoKVxuICAgIHNldCBjdlRlbXBsYXRlS2V5KHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBDTG9nKENMb2dUeXBlcy5pbmZvLCAnY3ZUZW1wbGF0ZUtleTogJyArIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb2xsZWN0aW9uVmlldyAmJiB0aGlzLnRlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25WaWV3LnJlZ2lzdGVyVGVtcGxhdGUodmFsdWUudG9Mb3dlckNhc2UoKSwgdGhpcy50ZW1wbGF0ZVJlZik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,19 @@
1
+ // External
2
+ import { NO_ERRORS_SCHEMA, NgModule } from '@angular/core';
3
+ import { CollectionViewComponent, TemplateKeyDirective } from './collectionview.component';
4
+ import * as i0 from "@angular/core";
5
+ export { CollectionViewComponent, TemplateKeyDirective } from './collectionview.component';
6
+ export class CollectionViewModule {
7
+ }
8
+ CollectionViewModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: CollectionViewModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
9
+ CollectionViewModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: CollectionViewModule, declarations: [CollectionViewComponent, TemplateKeyDirective], exports: [CollectionViewComponent, TemplateKeyDirective] });
10
+ CollectionViewModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: CollectionViewModule });
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: CollectionViewModule, decorators: [{
12
+ type: NgModule,
13
+ args: [{
14
+ declarations: [CollectionViewComponent, TemplateKeyDirective],
15
+ exports: [CollectionViewComponent, TemplateKeyDirective],
16
+ schemas: [NO_ERRORS_SCHEMA]
17
+ }]
18
+ }] });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy91aS1jb2xsZWN0aW9udmlldy9hbmd1bGFyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFdBQVc7QUFDWCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUMzRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU8zRixNQUFNLE9BQU8sb0JBQW9COztpSEFBcEIsb0JBQW9CO2tIQUFwQixvQkFBb0IsaUJBSmQsdUJBQXVCLEVBQUUsb0JBQW9CLGFBQ2xELHVCQUF1QixFQUFFLG9CQUFvQjtrSEFHOUMsb0JBQW9COzJGQUFwQixvQkFBb0I7a0JBTGhDLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFLENBQUMsdUJBQXVCLEVBQUUsb0JBQW9CLENBQUM7b0JBQzdELE9BQU8sRUFBRSxDQUFDLHVCQUF1QixFQUFFLG9CQUFvQixDQUFDO29CQUN4RCxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDOUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBFeHRlcm5hbFxuaW1wb3J0IHsgTk9fRVJST1JTX1NDSEVNQSwgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29sbGVjdGlvblZpZXdDb21wb25lbnQsIFRlbXBsYXRlS2V5RGlyZWN0aXZlIH0gZnJvbSAnLi9jb2xsZWN0aW9udmlldy5jb21wb25lbnQnO1xuZXhwb3J0IHsgQ29sbGVjdGlvblZpZXdDb21wb25lbnQsIFRlbXBsYXRlS2V5RGlyZWN0aXZlIH0gZnJvbSAnLi9jb2xsZWN0aW9udmlldy5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW0NvbGxlY3Rpb25WaWV3Q29tcG9uZW50LCBUZW1wbGF0ZUtleURpcmVjdGl2ZV0sXG4gICAgZXhwb3J0czogW0NvbGxlY3Rpb25WaWV3Q29tcG9uZW50LCBUZW1wbGF0ZUtleURpcmVjdGl2ZV0sXG4gICAgc2NoZW1hczogW05PX0VSUk9SU19TQ0hFTUFdXG59KVxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25WaWV3TW9kdWxlIHt9XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnN0dWRpby11aS1jb2xsZWN0aW9udmlldy1hbmd1bGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdWktY29sbGVjdGlvbnZpZXcvYW5ndWxhci9uc3R1ZGlvLXVpLWNvbGxlY3Rpb252aWV3LWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=