@wizishop/img-manager 15.2.40 → 15.2.41

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,7 +1,7 @@
1
1
  import { Component, Input, ViewChild, ElementRef, Output, EventEmitter, ChangeDetectorRef } from '@angular/core';
2
2
  import { ImgManagerService } from '../../services/img-manager.service';
3
- import { Subject } from 'rxjs';
4
- import { debounceTime, take } from 'rxjs/operators';
3
+ import { Subject, combineLatest } from 'rxjs';
4
+ import { filter, map, take } from 'rxjs/operators';
5
5
  import { ImgEventService } from '../../services/img-event.service';
6
6
  import { ImgSelectionService } from '../../services/img-selection.service';
7
7
  import { UserSettingsService } from '../../services/user-settings.service';
@@ -35,15 +35,6 @@ export class ImagesViewComponent {
35
35
  this.listDisplayed = false; // Display format list or mosaic
36
36
  this.multipleImgMode = false;
37
37
  this.switchDisplayWindow = new EventEmitter();
38
- // Data filters
39
- this.tableFilters = {
40
- sort: undefined,
41
- order: undefined,
42
- searchValue: '',
43
- totalItems: 0,
44
- itemsPerPage: 0,
45
- currentPage: 1
46
- };
47
38
  this.widthLargeCard = 219; // Default value of a card width 199 + margin 20
48
39
  this.widthSmallCard = 160; // Default value of a card width 140 + margin 20
49
40
  this.nbFakeImg = 0;
@@ -114,46 +105,58 @@ export class ImagesViewComponent {
114
105
  smallImgWidthFactor: 0.125
115
106
  }
116
107
  ];
117
- this.searchQueryChanged = new Subject();
118
- this.filtersChanged = new Subject();
119
- this.picturesList = [];
120
- this.savePictureList = [];
121
108
  this.nbImgToDelSelected = 0;
122
109
  this.disable = false; // Use to disable action during server request
123
- this.isLoading = true;
124
- this.isTotalRetrieved = false;
125
110
  this.delListImgLoader = false;
126
111
  this.initComponent = true;
127
112
  this.failLoaded = false;
128
- this.displayPexelsResults = false; // Use when no img find by name, display img from Pexels
129
113
  this.confirmImgSup = false;
130
- // Paginator Params
131
- this.pageIndex = 0;
132
- this.length = 0;
133
- this.pageSize = 30; // Default value
134
- this.pageSizeOptions = [25, 50, 100, 250];
135
114
  this.errorGetAllImg = 'ImgManager.ImgLib.errorGetAllImg';
136
115
  this.errorGetTotalImg = 'ImgManager.ImgLib.errorGetTotalImg';
137
116
  this.errorGetImg = 'ImgManager.ImgLib.errorGetCanvaImg';
138
- this.msgNoImgFound = 'ImgManager.ImgLib.noImgFound';
139
117
  this.errorRemoveImg = 'ImgManager.ImgList.errorRemoveImg';
118
+ this.destroy$ = new Subject();
119
+ this.vm$ = combineLatest({
120
+ imageSelection: this.imgSelectionService.imgSelection$,
121
+ imageListData: this.imgManager.imageList$,
122
+ isLoading: this.imgManager.isLoading$,
123
+ searchImagesParameters: this.imgManager.searchImagesParameters$,
124
+ }).pipe(map(({ imageSelection, imageListData: { imageList, imageTotal }, isLoading, searchImagesParameters }) => {
125
+ this.initVariables(true);
126
+ this.calculateNbImgFake(imageList.data.length);
127
+ const picturesList = this.setSelectedProperty(imageSelection, imageList.data);
128
+ this.renamePictureService.setPicturesList(picturesList);
129
+ const tableFilters = this.getTableFilters(searchImagesParameters, imageTotal);
130
+ const keepImagesDisplayed = (this.tabDisplayed === 'img-upload' && searchImagesParameters.page === '1') || (this.tabDisplayed === 'images-view' && imageList.data.length && searchImagesParameters.page === '1');
131
+ const skipSetImagesToDisplay = !!picturesList?.length && this.tabDisplayed === 'img-upload' && searchImagesParameters.page === '1';
132
+ const hideUntilFetchedFirstPageImagesForTabUpload = this.tabDisplayed === 'img-upload' && (searchImagesParameters.page !== '1' || imageList?.page !== 1);
133
+ return {
134
+ isLoading: hideUntilFetchedFirstPageImagesForTabUpload || !keepImagesDisplayed && isLoading,
135
+ displayPexelsResults: !isLoading && imageTotal === 0,
136
+ picturesList,
137
+ imageTotal,
138
+ tableFilters,
139
+ skipSetImagesToDisplay
140
+ };
141
+ }));
140
142
  }
141
- ngOnInit() {
142
- /* if (this.maxLengthCardShow) {
143
- this.reducePictureListMaxLength();
144
- } */
145
- this.setEvents();
146
- this.imgSelectedList = this.imgSelectionService.getImgSelection();
143
+ get searchImagesParameters$() {
144
+ return this.imgManager.searchImagesParameters$;
147
145
  }
148
- ngAfterViewInit() {
149
- this.setNbImgToDisplay();
150
- this._getImgList();
151
- if (!this.savePictureList) {
152
- this.savePictureList = this.picturesList;
153
- }
146
+ getTableFilters(searchImagesParameters, imageTotal) {
147
+ return {
148
+ sort: undefined,
149
+ order: undefined,
150
+ searchValue: searchImagesParameters.search,
151
+ totalItems: imageTotal,
152
+ itemsPerPage: parseInt(searchImagesParameters.limit),
153
+ currentPage: parseInt(searchImagesParameters.page)
154
+ };
154
155
  }
155
- getImgList() {
156
- this.filtersChanged.next();
156
+ ngAfterViewInit() {
157
+ this.vm$.pipe(take(1), filter(({ skipSetImagesToDisplay }) => !skipSetImagesToDisplay)).subscribe(({ tableFilters }) => {
158
+ this.setNbImgToDisplay(tableFilters);
159
+ });
157
160
  }
158
161
  /**
159
162
  * true : go to list display
@@ -168,19 +171,14 @@ export class ImagesViewComponent {
168
171
  /**
169
172
  * Calcul the number of img selected for masse deletion
170
173
  */
171
- onImgSelected() {
172
- this.setNbImgToDelSelected();
173
- }
174
- onShowImgUploaded() {
175
- this.searchText = null;
176
- this.searchedValue = null;
177
- this.getImgList();
174
+ onImgSelected(picturesList) {
175
+ this.setNbImgToDelSelected(picturesList);
178
176
  }
179
177
  onRenamePicture(pictureRenamed) {
180
178
  console.log('onRenamePicture pictureRenamed', pictureRenamed);
181
179
  this.renamePictureService.renamePicture(pictureRenamed);
182
180
  }
183
- removeListImg() {
181
+ removeListImg(picturesList) {
184
182
  if (this.disable) {
185
183
  return;
186
184
  }
@@ -190,26 +188,28 @@ export class ImagesViewComponent {
190
188
  // Get the id of the img to remove
191
189
  // And add deleted property
192
190
  const idImgToRemove = [];
193
- this.picturesList.forEach(img => {
191
+ picturesList.forEach(img => {
194
192
  if (img.delSelected) {
195
193
  img.deleted = true;
196
194
  idImgToRemove.push(img.id_file);
197
195
  }
198
196
  });
199
- this.imgManager.removeMultipleImg(idImgToRemove).subscribe(() => {
200
- this.getImgList();
201
- this.imgSelectionService.removeImgSelectionByIds(idImgToRemove);
202
- }, error => {
203
- this.getImgList();
204
- this.alertService.openAlert(this.errorRemoveImg);
197
+ this.imgManager.removeMultipleImg(idImgToRemove).subscribe({
198
+ next: () => {
199
+ this.imgSelectionService.removeImgSelectionByIds(idImgToRemove);
200
+ },
201
+ error: error => {
202
+ this.imgManager.refreshImageList$.next();
203
+ this.alertService.openAlert(this.errorRemoveImg);
204
+ }
205
205
  });
206
206
  }
207
- selectImgChosen() {
207
+ selectImgChosen(picturesList) {
208
208
  if (this.disable) {
209
209
  return;
210
210
  }
211
211
  const picturesListSelected = [];
212
- this.picturesList.map(img => {
212
+ picturesList.map(img => {
213
213
  if (img.delSelected) {
214
214
  img.delSelected = false;
215
215
  img.selected = true;
@@ -218,7 +218,7 @@ export class ImagesViewComponent {
218
218
  picturesListSelected.push(img);
219
219
  }
220
220
  });
221
- this.setNbImgToDelSelected();
221
+ this.setNbImgToDelSelected(picturesList);
222
222
  this.imgSelectionService.setImgSelection(picturesListSelected);
223
223
  }
224
224
  displayConfirmImgSup() {
@@ -233,17 +233,14 @@ export class ImagesViewComponent {
233
233
  /**
234
234
  * Event emit when a img selected in order to delete
235
235
  */
236
- onPicturesListChange() {
237
- this.setNbImgToDelSelected();
238
- }
239
- onFiltersChange() {
240
- this.getImgList();
236
+ onPicturesListChange(picturesList) {
237
+ this.setNbImgToDelSelected(picturesList);
241
238
  }
242
239
  /**
243
240
  * Set default number of img per page to display at the initialisation
244
241
  * This number is between 30 and 50
245
242
  */
246
- setNbImgToDisplay() {
243
+ setNbImgToDisplay(tableFilters) {
247
244
  const containerWidth = this.imgLibContainer.nativeElement.offsetWidth + 30; // + 30px -> left + right margin
248
245
  const scrollWidth = window.innerWidth - document.body.offsetWidth;
249
246
  const [maxImgWidthFactor, minImgWidthFactor] = this.getImgWidthFactors();
@@ -251,7 +248,11 @@ export class ImagesViewComponent {
251
248
  const maxImgWidth = Math.ceil((containerWidth + scrollWidth) * maxImgWidthFactor);
252
249
  this.nbMaxImgPerLine = Math.floor(containerWidth / minImgWidth);
253
250
  this.nbMinImgPerLine = Math.floor((containerWidth + scrollWidth) / maxImgWidth);
254
- this.pageSize = this.getTotalImgPerPage();
251
+ this.searchImagesParameters$.next(this.getParams({
252
+ ...tableFilters,
253
+ itemsPerPage: this.getTotalImgPerPage(),
254
+ currentPage: 1
255
+ }));
255
256
  }
256
257
  getImgWidthFactors() {
257
258
  const screenWidth = window.innerWidth;
@@ -282,40 +283,30 @@ export class ImagesViewComponent {
282
283
  }
283
284
  return total;
284
285
  }
285
- setParams() {
286
- this.params = {
287
- limit: this.maxLengthCardShow?.toString() || (this.tableFilters.itemsPerPage ? this.tableFilters.itemsPerPage.toString() : this.pageSize.toString()),
288
- page: this.tableFilters.currentPage.toString()
286
+ getParams(tableFilters) {
287
+ return {
288
+ limit: tableFilters.itemsPerPage.toString(),
289
+ page: tableFilters.currentPage.toString(),
290
+ ...(tableFilters.searchValue && { search: tableFilters.searchValue.toString() }),
289
291
  };
290
- if (this.tableFilters.searchValue) {
291
- this.params.search = this.tableFilters.searchValue.toString();
292
- }
293
292
  }
294
293
  initVariables(loadingSuccess) {
295
294
  this.nbImgToDelSelected = 0;
296
295
  this.disable = false;
297
- this.isLoading = false;
298
296
  this.delListImgLoader = false;
299
297
  this.initComponent = false;
300
- this.displayPexelsResults = false;
301
298
  this.failLoaded = !loadingSuccess;
302
299
  this.nbFakeImg = 0;
303
300
  }
304
- selectImgSelected() {
305
- if (!this.imgSelectedList || !this.imgSelectedList.length) {
306
- return;
307
- }
308
- const idImgSlectedList = [];
309
- this.imgSelectedList.forEach(img => idImgSlectedList.push(img.id_file));
310
- this.picturesList.forEach(picture => {
311
- if (idImgSlectedList.indexOf(picture.id_file) !== -1) {
312
- picture.selected = true;
301
+ setSelectedProperty(imgSelectedList, picturesList) {
302
+ const picturesListSelected = JSON.parse(JSON.stringify(picturesList));
303
+ imgSelectedList.forEach(img => {
304
+ const selectedImg = picturesListSelected.find(picture => picture.id_file === img.id_file);
305
+ if (selectedImg) {
306
+ selectedImg.selected = true;
313
307
  }
314
308
  });
315
- }
316
- displayPexelsLib() {
317
- this.displayPexelsResults = true;
318
- this.alertService.openAlert(this.msgNoImgFound);
309
+ return picturesListSelected;
319
310
  }
320
311
  /**
321
312
  * Set a img list in order to fill properly all the line of images displayed in mosaic.
@@ -323,137 +314,32 @@ export class ImagesViewComponent {
323
314
  */
324
315
  calculateNbImgFake(nbImgDisplayed) {
325
316
  const nbImgPerLine = this.stateDisplayed === 'small' || this.tabDisplayed === 'img-upload' ? this.nbMaxImgPerLine : this.nbMinImgPerLine;
326
- if (nbImgDisplayed % nbImgPerLine !== 0) {
327
- this.nbFakeImg = nbImgPerLine - nbImgDisplayed % nbImgPerLine;
317
+ if (isNaN(nbImgDisplayed % nbImgPerLine)) {
318
+ this.nbFakeImg = 0;
319
+ return;
328
320
  }
329
- }
330
- getImg(id_file) {
331
- this.imgManager.getShopImg(id_file).pipe(take(1)).subscribe({
332
- next: (picture) => {
333
- if (!this.imgAlreadyExist(picture.id_file)) {
334
- // check the img is not already present
335
- this.picturesList.unshift(picture);
336
- this.length += 1;
337
- }
338
- },
339
- error: () => {
340
- this.alertService.openAlert(this.errorGetImg);
341
- }
342
- });
343
- }
344
- imgAlreadyExist(id_file) {
345
- for (const img of this.picturesList) {
346
- if (img.id_file === id_file) {
347
- return true;
348
- }
321
+ if (nbImgDisplayed % nbImgPerLine !== 0) {
322
+ setTimeout(() => {
323
+ this.nbFakeImg = nbImgPerLine - nbImgDisplayed % nbImgPerLine;
324
+ }, 0);
349
325
  }
350
- return false;
351
326
  }
352
- setNbImgToDelSelected() {
353
- this.nbImgToDelSelected = this.picturesList.filter(img => img.delSelected).length;
327
+ setNbImgToDelSelected(picturesList) {
328
+ this.nbImgToDelSelected = picturesList.filter(img => img.delSelected).length;
354
329
  if (!this.nbImgToDelSelected) {
355
330
  this.confirmImgSup = false;
356
331
  }
357
332
  }
358
- setEvents() {
359
- // Add a timer to retrieve img when the search bar or the paginator are used
360
- this.searchQueryChanged
361
- .pipe(debounceTime(400)) // wait 0.5 sec after the last event before emitting last event
362
- .subscribe(data => {
363
- this.getImgList();
364
- });
365
- this.filtersChanged
366
- .pipe(debounceTime(800)) // wait 0.8 sec after the last event before emitting last event
367
- .subscribe(data => {
368
- this._getImgList();
369
- });
370
- // Reload img when img is/are removed
371
- this.imgRemovedEvent = this.imgEventService.imgRemoved$.subscribe(id_file => {
372
- this.getImgList();
373
- });
374
- // Create img from Canva
375
- this.imgAddedEvent = this.imgEventService.getImgAddedEventListner().subscribe(id_file => {
376
- if (id_file && !this.imgAlreadyExist(id_file)) {
377
- this.getImg(id_file);
378
- }
379
- });
380
- this.imgSelectionChange = this.imgSelectionService.imgSelection$.subscribe(imgSelection => {
381
- if (this.listDisplayed) {
382
- return;
383
- }
384
- const idFileList = [];
385
- imgSelection.map(img => idFileList.push(img.id_file));
386
- for (const picture of this.picturesList) {
387
- if (idFileList.indexOf(picture.id_file) === -1) {
388
- picture.selected = false;
389
- }
390
- }
391
- });
392
- }
393
- _getImgList() {
394
- this.isLoading = true;
395
- this.displayPexelsResults = false;
396
- this.setParams();
397
- this.refreshTotalImgList();
398
- const forceToUpdate = this.isLastImgRemovedInList();
399
- this.imgManager.getShopImgList(this.params, forceToUpdate).pipe(take(1)).subscribe({
400
- next: (data) => {
401
- this.initVariables(true);
402
- const nbImgDisplayed = data.data.length;
403
- this.calculateNbImgFake(nbImgDisplayed);
404
- this.picturesList = data.data;
405
- this.renamePictureService.setPicturesList(this.picturesList);
406
- this.selectImgSelected();
407
- this.length = this.isTotalRetrieved ? this.length : data.totalRecords;
408
- this.tableFilters.totalItems = this.isTotalRetrieved ? this.tableFilters.totalItems : data.totalRecords;
409
- this.tableFilters.itemsPerPage = this.tableFilters.itemsPerPage ? this.tableFilters.itemsPerPage : this.pageSize;
410
- // Display Pexels if no result
411
- if (data.totalRecords === 0) {
412
- this.displayPexelsLib();
413
- }
414
- this.changeDetectorRef.markForCheck(); // In wizi-admin, the change detection is not working properly
415
- },
416
- error: error => {
417
- this.alertService.openAlert(this.errorGetAllImg);
418
- this.initVariables(false);
419
- }
420
- });
421
- }
422
- refreshTotalImgList() {
423
- const searchValue = this.tableFilters.searchValue;
424
- if (this.isTotalRetrieved && searchValue === this.previousSearchValue) {
425
- // Keep current total result
426
- return;
427
- }
428
- this.isTotalRetrieved = false;
429
- this.imgManager.getShopTotalImgList(this.params).pipe(take(1)).subscribe({
430
- next: total => {
431
- this.previousSearchValue = searchValue;
432
- this.isTotalRetrieved = true;
433
- this.length = total;
434
- this.tableFilters.totalItems = total;
435
- },
436
- error: error => {
437
- //this.alertService.openAlert(this.errorGetTotalImg);
438
- this.initVariables(false);
439
- }
440
- });
441
- }
442
333
  switchDisplayWindowMosaic() {
443
334
  this.switchDisplayWindow.emit(true);
444
335
  }
445
- isLastImgRemovedInList() {
446
- return this.picturesList.some(picture => picture.id_file === this.imgEventService.imgRemoved$.getValue());
447
- }
448
336
  ngOnDestroy() {
449
- this.searchQueryChanged.unsubscribe();
450
- this.imgRemovedEvent.unsubscribe();
451
- this.imgAddedEvent.unsubscribe();
452
- this.imgSelectionChange.unsubscribe();
337
+ this.destroy$.next();
338
+ this.destroy$.complete();
453
339
  }
454
340
  }
455
341
  ImagesViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ImagesViewComponent, deps: [{ token: i1.ImgManagerService }, { token: i2.ImgEventService }, { token: i3.ImgSelectionService }, { token: i4.AlertService }, { token: i5.UserSettingsService }, { token: i6.RenamePictureService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
456
- ImagesViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: ImagesViewComponent, selector: "images-view", inputs: { stateDisplayed: "stateDisplayed", tabDisplayed: "tabDisplayed", fullSize: "fullSize", maxLengthCardShow: "maxLengthCardShow", nbRowToShow: "nbRowToShow", listDisplayed: "listDisplayed", multipleImgMode: "multipleImgMode" }, outputs: { switchDisplayWindow: "switchDisplayWindow" }, viewQueries: [{ propertyName: "imgLibContainer", first: true, predicate: ["imgLibContainer"], descendants: true }], ngImport: i0, template: "<div class=\"images-view\" [ngClass]=\"{'fullSize': fullSize, 'small': stateDisplayed === 'small'}\" [@easeInOut]=\"'in'\">\n <!-- Subheader : Img number and actions btn (sup img list, switch forma display) -->\n <div\n *ngIf=\"(stateDisplayed !== 'small' || tabDisplayed === 'img-upload')\"\n class=\"images-view__container\"\n [ngClass]=\"{'images-view__container--uploadTab': tabDisplayed === 'img-upload', 'images-view__container--window': stateDisplayed === 'window'}\"\n >\n\n <div *ngIf=\"tabDisplayed !== 'img-upload'\">\n <p class=\"mainColor\" [ngClass]=\"{'images-view__container__total--hide': displayPexelsResults}\">{{ 'ImgManager.ImgLib.nbImg' | translate }} : {{length}}</p>\n </div>\n <div *ngIf=\"tabDisplayed === 'img-upload'\">\n <p class=\"mainColor\">{{ 'ImgManager.ImgLib.lastImgs' | translate }}</p>\n </div>\n\n <div class=\"field has-addons subHeaderActions\" *ngIf=\"tabDisplayed !== 'img-upload'\">\n\n <!-- For listforma : Display btn del multiple img & Confirm action -->\n <div class=\"images-view__container__boxAction\">\n\n\n <!-- Select -->\n <button\n class=\"button success images-view__container__boxAction__import\"\n @insertRemoveAnnim\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup && !delListImgLoader && multipleImgMode\"\n (click)=\"selectImgChosen()\"\n type=\"button\"\n >\n <i class=\"fal fa-check\"></i>\n {{ 'ImgManager.ImgLib.select' | translate }} ({{nbImgToDelSelected}})\n </button>\n\n <!-- Display btn del multiple img -->\n <button\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup\"\n (click)=\"displayConfirmImgSup()\"\n class=\"button images-view__container__boxAction__delBtn danger\"\n @insertRemoveAnnim\n type=\"button\"\n >\n <i class=\"fal fa-times\"></i>{{ 'ImgManager.ImgLib.delMlt' | translate }} ({{nbImgToDelSelected}})\n <span btnLoadingAnim *ngIf=\"delListImgLoader\" class=\"btnLoadingAnnimation\"></span>\n </button>\n\n <!-- Confirm action -->\n <div\n class=\"images-view__container__boxAction__confirmSup\"\n [ngClass]=\"{'images-view__container__boxAction__confirmSup--visible': confirmImgSup}\">\n <p *ngIf=\"nbImgToDelSelected > 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestions' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <p *ngIf=\"nbImgToDelSelected === 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestion' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <div>\n <button\n class=\"button images-view__container__boxAction__confirmSup__cancel\"\n (click)=\"cancelSup()\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.cancel' | translate }}\n </button>\n <button\n (click)=\"removeListImg()\"\n class=\"button images-view__container__delBtn danger\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.confirm' | translate }}\n </button>\n </div>\n </div>\n\n </div>\n\n\n <!-- Swith mosaic/list forma -->\n <div class=\"field has-addons images-view__container__buttonBox\">\n <div class=\"control\">\n <div\n class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': !listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(false)\"\n >\n <span class=\"icon is-small\">\n <i class=\"far fa-th\"></i>\n </span>\n </div>\n </div>\n\n <div class=\"control\">\n <div class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(true)\"\n >\n <span class=\"icon is-small\">\n <i class=\"fas fa-bars\"></i>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n\n <!-- Images section -->\n<ng-scrollbar\n class=\"images-view__scroll\"\n [ngClass]=\"{\n 'images-view__scroll--hide--mosaic': displayPexelsResults && !listDisplayed,\n 'images-view__scroll--hide--table': displayPexelsResults && listDisplayed,\n 'images-view__scroll--full': stateDisplayed === 'full',\n 'images-view__scroll--smallDisplay' : stateDisplayed === 'small' && tabDisplayed !== 'img-upload',\n 'images-view__scroll--smallUploadDisplay' : stateDisplayed === 'small' && tabDisplayed === 'img-upload',\n 'images-view__scroll--window': stateDisplayed === 'window'\n}\"\n>\n <div #imgLibContainer class=\"images-view__wrapper\">\n <div *ngIf=\"!listDisplayed || stateDisplayed === 'small'\" [@easeInOut]=\"'in'\">\n <mosaic-view\n [picturesList]=\"picturesList\"\n (picturesListChange)=\"onPicturesListChange()\"\n [tableFilters]=\"tableFilters\"\n (filtersChange)=\"onFiltersChange()\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n (switchDisplayWindow)=\"switchDisplayWindowMosaic()\"\n [nbFakeImg]=\"nbFakeImg\"\n [stateDisplayed]=\"stateDisplayed\"\n [tabDisplayed]=\"tabDisplayed\"\n [displayPexelsResults]=\"displayPexelsResults\"\n [isLoading]=\"isLoading\"\n [fullSize]=\"fullSize\"\n >\n </mosaic-view>\n </div>\n\n <div *ngIf=\"listDisplayed && stateDisplayed !== 'small'\" [@easeInOut]=\"'in'\">\n <table-view\n [picturesList]=\"picturesList\"\n (picturesListChange)=\"onPicturesListChange()\"\n [tableFilters]=\"tableFilters\"\n (filtersChange)=\"onFiltersChange()\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n [displayPexelsResults]=\"displayPexelsResults\"\n [stateDisplayed]=\"stateDisplayed\"\n [isLoading]=\"isLoading\"\n >\n </table-view>\n </div>\n\n </div>\n</ng-scrollbar>\n\n<!-- Pexels Section - When no img found -->\n<div\n *ngIf=\"displayPexelsResults\"\n class=\"images-view--pexels\"\n [@easeInOut]=\"'in'\">\n <pexels-lib\n [searchValue]=\"tableFilters.searchValue\"\n (showImgUploaded)=\"onShowImgUploaded()\"\n [disableSearch]=\"true\"\n >\n </pexels-lib>\n</div>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.NgScrollbar, selector: "ng-scrollbar", inputs: ["disabled", "sensorDisabled", "pointerEventsDisabled", "viewportPropagateMouseMove", "autoHeightDisabled", "autoWidthDisabled", "viewClass", "trackClass", "thumbClass", "minThumbSize", "trackClickScrollDuration", "pointerEventsMethod", "track", "visibility", "appearance", "position", "sensorDebounce", "scrollAuditTime"], outputs: ["updated"], exportAs: ["ngScrollbar"] }, { kind: "component", type: i9.PexelLibComponent, selector: "pexels-lib", inputs: ["stateDisplayed", "searchValue", "disableSearch"], outputs: ["showImgUploaded"] }, { kind: "component", type: i10.MosaicViewComponent, selector: "mosaic-view", inputs: ["tabDisplayed", "fullSize", "nbFakeImg"], outputs: ["switchDisplayWindow"] }, { kind: "component", type: i11.TableViewComponent, selector: "table-view" }, { kind: "directive", type: i12.LoadingDirective, selector: "[btnLoadingAnim]" }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }], animations: [
342
+ ImagesViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: ImagesViewComponent, selector: "images-view", inputs: { stateDisplayed: "stateDisplayed", tabDisplayed: "tabDisplayed", fullSize: "fullSize", nbRowToShow: "nbRowToShow", listDisplayed: "listDisplayed", multipleImgMode: "multipleImgMode" }, outputs: { switchDisplayWindow: "switchDisplayWindow" }, viewQueries: [{ propertyName: "imgLibContainer", first: true, predicate: ["imgLibContainer"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"vm$ | async as vm\">\n\n <div class=\"images-view\" [ngClass]=\"{'fullSize': fullSize, 'small': stateDisplayed === 'small'}\" [@easeInOut]=\"'in'\">\n <!-- Subheader : Img number and actions btn (sup img list, switch forma display) -->\n <div\n *ngIf=\"(stateDisplayed !== 'small' || tabDisplayed === 'img-upload')\"\n class=\"images-view__container\"\n [ngClass]=\"{'images-view__container--uploadTab': tabDisplayed === 'img-upload', 'images-view__container--window': stateDisplayed === 'window'}\"\n >\n\n <div *ngIf=\"tabDisplayed !== 'img-upload'\">\n <p class=\"mainColor\" [ngClass]=\"{'images-view__container__total--hide': vm.displayPexelsResults}\">{{ 'ImgManager.ImgLib.nbImg' | translate }} : {{vm.imageTotal}}</p>\n </div>\n <div *ngIf=\"tabDisplayed === 'img-upload'\">\n <p class=\"mainColor\">{{ 'ImgManager.ImgLib.lastImgs' | translate }}</p>\n </div>\n\n <div class=\"field has-addons subHeaderActions\" *ngIf=\"tabDisplayed !== 'img-upload'\">\n\n <!-- For listforma : Display btn del multiple img & Confirm action -->\n <div class=\"images-view__container__boxAction\">\n\n\n <!-- Select -->\n <button\n class=\"button success images-view__container__boxAction__import\"\n @insertRemoveAnnim\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup && !delListImgLoader && multipleImgMode\"\n (click)=\"selectImgChosen(vm.picturesList)\"\n type=\"button\"\n >\n <i class=\"fal fa-check\"></i>\n {{ 'ImgManager.ImgLib.select' | translate }} ({{nbImgToDelSelected}})\n </button>\n\n <!-- Display btn del multiple img -->\n <button\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup\"\n (click)=\"displayConfirmImgSup()\"\n class=\"button images-view__container__boxAction__delBtn danger\"\n @insertRemoveAnnim\n type=\"button\"\n >\n <i class=\"fal fa-times\"></i>{{ 'ImgManager.ImgLib.delMlt' | translate }} ({{nbImgToDelSelected}})\n <span btnLoadingAnim *ngIf=\"delListImgLoader\" class=\"btnLoadingAnnimation\"></span>\n </button>\n\n <!-- Confirm action -->\n <div\n class=\"images-view__container__boxAction__confirmSup\"\n [ngClass]=\"{'images-view__container__boxAction__confirmSup--visible': confirmImgSup}\">\n <p *ngIf=\"nbImgToDelSelected > 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestions' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <p *ngIf=\"nbImgToDelSelected === 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestion' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <div>\n <button\n class=\"button images-view__container__boxAction__confirmSup__cancel\"\n (click)=\"cancelSup()\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.cancel' | translate }}\n </button>\n <button\n (click)=\"removeListImg(vm.picturesList)\"\n class=\"button images-view__container__delBtn danger\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.confirm' | translate }}\n </button>\n </div>\n </div>\n\n </div>\n\n\n <!-- Swith mosaic/list forma -->\n <div class=\"field has-addons images-view__container__buttonBox\">\n <div class=\"control\">\n <div\n class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': !listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(false)\"\n >\n <span class=\"icon is-small\">\n <i class=\"far fa-th\"></i>\n </span>\n </div>\n </div>\n\n <div class=\"control\">\n <div class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(true)\"\n >\n <span class=\"icon is-small\">\n <i class=\"fas fa-bars\"></i>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n\n <!-- Images section -->\n <ng-scrollbar\n class=\"images-view__scroll\"\n [ngClass]=\"{\n 'images-view__scroll--hide--mosaic': vm.displayPexelsResults && !listDisplayed,\n 'images-view__scroll--hide--table': vm.displayPexelsResults && listDisplayed,\n 'images-view__scroll--full': stateDisplayed === 'full',\n 'images-view__scroll--smallDisplay' : stateDisplayed === 'small' && tabDisplayed !== 'img-upload',\n 'images-view__scroll--smallUploadDisplay' : stateDisplayed === 'small' && tabDisplayed === 'img-upload',\n 'images-view__scroll--window': stateDisplayed === 'window'\n }\"\n >\n <div #imgLibContainer class=\"images-view__wrapper\">\n\n <div *ngIf=\"!listDisplayed || stateDisplayed === 'small'\" [@easeInOut]=\"'in'\">\n <mosaic-view\n [picturesList]=\"vm.picturesList\"\n (picturesListChange)=\"onPicturesListChange(vm.picturesList)\"\n [tableFilters]=\"vm.tableFilters\"\n (filtersChange)=\"searchImagesParameters$.next(getParams(vm.tableFilters));\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n (switchDisplayWindow)=\"switchDisplayWindowMosaic()\"\n [nbFakeImg]=\"nbFakeImg\"\n [stateDisplayed]=\"stateDisplayed\"\n [tabDisplayed]=\"tabDisplayed\"\n [displayPexelsResults]=\"vm.displayPexelsResults\"\n [isLoading]=\"vm.isLoading\"\n [fullSize]=\"fullSize\"\n >\n </mosaic-view>\n </div>\n\n <div *ngIf=\"listDisplayed && stateDisplayed !== 'small'\" [@easeInOut]=\"'in'\">\n <table-view\n [picturesList]=\"vm.picturesList\"\n (picturesListChange)=\"onPicturesListChange(vm.picturesList)\"\n [tableFilters]=\"vm.tableFilters\"\n (filtersChange)=\"searchImagesParameters$.next(getParams(vm.tableFilters));\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n [displayPexelsResults]=\"vm.displayPexelsResults\"\n [stateDisplayed]=\"stateDisplayed\"\n [isLoading]=\"vm.isLoading\"\n >\n </table-view>\n </div>\n </div>\n </ng-scrollbar>\n\n <!-- Pexels Section - When no img found -->\n <div\n *ngIf=\"vm.displayPexelsResults\"\n class=\"images-view--pexels\"\n [@easeInOut]=\"'in'\">\n <pexels-lib\n [searchValue]=\"vm.tableFilters.searchValue\"\n [disableSearch]=\"true\"\n >\n </pexels-lib>\n </div>\n</ng-container>", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.NgScrollbar, selector: "ng-scrollbar", inputs: ["disabled", "sensorDisabled", "pointerEventsDisabled", "viewportPropagateMouseMove", "autoHeightDisabled", "autoWidthDisabled", "viewClass", "trackClass", "thumbClass", "minThumbSize", "trackClickScrollDuration", "pointerEventsMethod", "track", "visibility", "appearance", "position", "sensorDebounce", "scrollAuditTime"], outputs: ["updated"], exportAs: ["ngScrollbar"] }, { kind: "component", type: i9.PexelLibComponent, selector: "pexels-lib", inputs: ["stateDisplayed", "searchValue", "disableSearch"] }, { kind: "component", type: i10.MosaicViewComponent, selector: "mosaic-view", inputs: ["tabDisplayed", "fullSize", "nbFakeImg"], outputs: ["switchDisplayWindow"] }, { kind: "component", type: i11.TableViewComponent, selector: "table-view" }, { kind: "directive", type: i12.LoadingDirective, selector: "[btnLoadingAnim]" }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }], animations: [
457
343
  easeInOut,
458
344
  insertRemove
459
345
  ] });
@@ -462,15 +348,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
462
348
  args: [{ selector: 'images-view', animations: [
463
349
  easeInOut,
464
350
  insertRemove
465
- ], template: "<div class=\"images-view\" [ngClass]=\"{'fullSize': fullSize, 'small': stateDisplayed === 'small'}\" [@easeInOut]=\"'in'\">\n <!-- Subheader : Img number and actions btn (sup img list, switch forma display) -->\n <div\n *ngIf=\"(stateDisplayed !== 'small' || tabDisplayed === 'img-upload')\"\n class=\"images-view__container\"\n [ngClass]=\"{'images-view__container--uploadTab': tabDisplayed === 'img-upload', 'images-view__container--window': stateDisplayed === 'window'}\"\n >\n\n <div *ngIf=\"tabDisplayed !== 'img-upload'\">\n <p class=\"mainColor\" [ngClass]=\"{'images-view__container__total--hide': displayPexelsResults}\">{{ 'ImgManager.ImgLib.nbImg' | translate }} : {{length}}</p>\n </div>\n <div *ngIf=\"tabDisplayed === 'img-upload'\">\n <p class=\"mainColor\">{{ 'ImgManager.ImgLib.lastImgs' | translate }}</p>\n </div>\n\n <div class=\"field has-addons subHeaderActions\" *ngIf=\"tabDisplayed !== 'img-upload'\">\n\n <!-- For listforma : Display btn del multiple img & Confirm action -->\n <div class=\"images-view__container__boxAction\">\n\n\n <!-- Select -->\n <button\n class=\"button success images-view__container__boxAction__import\"\n @insertRemoveAnnim\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup && !delListImgLoader && multipleImgMode\"\n (click)=\"selectImgChosen()\"\n type=\"button\"\n >\n <i class=\"fal fa-check\"></i>\n {{ 'ImgManager.ImgLib.select' | translate }} ({{nbImgToDelSelected}})\n </button>\n\n <!-- Display btn del multiple img -->\n <button\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup\"\n (click)=\"displayConfirmImgSup()\"\n class=\"button images-view__container__boxAction__delBtn danger\"\n @insertRemoveAnnim\n type=\"button\"\n >\n <i class=\"fal fa-times\"></i>{{ 'ImgManager.ImgLib.delMlt' | translate }} ({{nbImgToDelSelected}})\n <span btnLoadingAnim *ngIf=\"delListImgLoader\" class=\"btnLoadingAnnimation\"></span>\n </button>\n\n <!-- Confirm action -->\n <div\n class=\"images-view__container__boxAction__confirmSup\"\n [ngClass]=\"{'images-view__container__boxAction__confirmSup--visible': confirmImgSup}\">\n <p *ngIf=\"nbImgToDelSelected > 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestions' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <p *ngIf=\"nbImgToDelSelected === 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestion' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <div>\n <button\n class=\"button images-view__container__boxAction__confirmSup__cancel\"\n (click)=\"cancelSup()\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.cancel' | translate }}\n </button>\n <button\n (click)=\"removeListImg()\"\n class=\"button images-view__container__delBtn danger\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.confirm' | translate }}\n </button>\n </div>\n </div>\n\n </div>\n\n\n <!-- Swith mosaic/list forma -->\n <div class=\"field has-addons images-view__container__buttonBox\">\n <div class=\"control\">\n <div\n class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': !listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(false)\"\n >\n <span class=\"icon is-small\">\n <i class=\"far fa-th\"></i>\n </span>\n </div>\n </div>\n\n <div class=\"control\">\n <div class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(true)\"\n >\n <span class=\"icon is-small\">\n <i class=\"fas fa-bars\"></i>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n\n <!-- Images section -->\n<ng-scrollbar\n class=\"images-view__scroll\"\n [ngClass]=\"{\n 'images-view__scroll--hide--mosaic': displayPexelsResults && !listDisplayed,\n 'images-view__scroll--hide--table': displayPexelsResults && listDisplayed,\n 'images-view__scroll--full': stateDisplayed === 'full',\n 'images-view__scroll--smallDisplay' : stateDisplayed === 'small' && tabDisplayed !== 'img-upload',\n 'images-view__scroll--smallUploadDisplay' : stateDisplayed === 'small' && tabDisplayed === 'img-upload',\n 'images-view__scroll--window': stateDisplayed === 'window'\n}\"\n>\n <div #imgLibContainer class=\"images-view__wrapper\">\n <div *ngIf=\"!listDisplayed || stateDisplayed === 'small'\" [@easeInOut]=\"'in'\">\n <mosaic-view\n [picturesList]=\"picturesList\"\n (picturesListChange)=\"onPicturesListChange()\"\n [tableFilters]=\"tableFilters\"\n (filtersChange)=\"onFiltersChange()\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n (switchDisplayWindow)=\"switchDisplayWindowMosaic()\"\n [nbFakeImg]=\"nbFakeImg\"\n [stateDisplayed]=\"stateDisplayed\"\n [tabDisplayed]=\"tabDisplayed\"\n [displayPexelsResults]=\"displayPexelsResults\"\n [isLoading]=\"isLoading\"\n [fullSize]=\"fullSize\"\n >\n </mosaic-view>\n </div>\n\n <div *ngIf=\"listDisplayed && stateDisplayed !== 'small'\" [@easeInOut]=\"'in'\">\n <table-view\n [picturesList]=\"picturesList\"\n (picturesListChange)=\"onPicturesListChange()\"\n [tableFilters]=\"tableFilters\"\n (filtersChange)=\"onFiltersChange()\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n [displayPexelsResults]=\"displayPexelsResults\"\n [stateDisplayed]=\"stateDisplayed\"\n [isLoading]=\"isLoading\"\n >\n </table-view>\n </div>\n\n </div>\n</ng-scrollbar>\n\n<!-- Pexels Section - When no img found -->\n<div\n *ngIf=\"displayPexelsResults\"\n class=\"images-view--pexels\"\n [@easeInOut]=\"'in'\">\n <pexels-lib\n [searchValue]=\"tableFilters.searchValue\"\n (showImgUploaded)=\"onShowImgUploaded()\"\n [disableSearch]=\"true\"\n >\n </pexels-lib>\n</div>\n" }]
351
+ ], template: "<ng-container *ngIf=\"vm$ | async as vm\">\n\n <div class=\"images-view\" [ngClass]=\"{'fullSize': fullSize, 'small': stateDisplayed === 'small'}\" [@easeInOut]=\"'in'\">\n <!-- Subheader : Img number and actions btn (sup img list, switch forma display) -->\n <div\n *ngIf=\"(stateDisplayed !== 'small' || tabDisplayed === 'img-upload')\"\n class=\"images-view__container\"\n [ngClass]=\"{'images-view__container--uploadTab': tabDisplayed === 'img-upload', 'images-view__container--window': stateDisplayed === 'window'}\"\n >\n\n <div *ngIf=\"tabDisplayed !== 'img-upload'\">\n <p class=\"mainColor\" [ngClass]=\"{'images-view__container__total--hide': vm.displayPexelsResults}\">{{ 'ImgManager.ImgLib.nbImg' | translate }} : {{vm.imageTotal}}</p>\n </div>\n <div *ngIf=\"tabDisplayed === 'img-upload'\">\n <p class=\"mainColor\">{{ 'ImgManager.ImgLib.lastImgs' | translate }}</p>\n </div>\n\n <div class=\"field has-addons subHeaderActions\" *ngIf=\"tabDisplayed !== 'img-upload'\">\n\n <!-- For listforma : Display btn del multiple img & Confirm action -->\n <div class=\"images-view__container__boxAction\">\n\n\n <!-- Select -->\n <button\n class=\"button success images-view__container__boxAction__import\"\n @insertRemoveAnnim\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup && !delListImgLoader && multipleImgMode\"\n (click)=\"selectImgChosen(vm.picturesList)\"\n type=\"button\"\n >\n <i class=\"fal fa-check\"></i>\n {{ 'ImgManager.ImgLib.select' | translate }} ({{nbImgToDelSelected}})\n </button>\n\n <!-- Display btn del multiple img -->\n <button\n *ngIf=\"listDisplayed && nbImgToDelSelected && !confirmImgSup\"\n (click)=\"displayConfirmImgSup()\"\n class=\"button images-view__container__boxAction__delBtn danger\"\n @insertRemoveAnnim\n type=\"button\"\n >\n <i class=\"fal fa-times\"></i>{{ 'ImgManager.ImgLib.delMlt' | translate }} ({{nbImgToDelSelected}})\n <span btnLoadingAnim *ngIf=\"delListImgLoader\" class=\"btnLoadingAnnimation\"></span>\n </button>\n\n <!-- Confirm action -->\n <div\n class=\"images-view__container__boxAction__confirmSup\"\n [ngClass]=\"{'images-view__container__boxAction__confirmSup--visible': confirmImgSup}\">\n <p *ngIf=\"nbImgToDelSelected > 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestions' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <p *ngIf=\"nbImgToDelSelected === 1\" class=\"images-view__container__boxAction__confirmSup__text\">{{ 'ImgManager.ImgLib.confirmSupQuestion' | translate:{nbImage: nbImgToDelSelected} }}</p>\n <div>\n <button\n class=\"button images-view__container__boxAction__confirmSup__cancel\"\n (click)=\"cancelSup()\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.cancel' | translate }}\n </button>\n <button\n (click)=\"removeListImg(vm.picturesList)\"\n class=\"button images-view__container__delBtn danger\"\n type=\"button\"\n >\n {{ 'ImgManager.ImgLib.confirm' | translate }}\n </button>\n </div>\n </div>\n\n </div>\n\n\n <!-- Swith mosaic/list forma -->\n <div class=\"field has-addons images-view__container__buttonBox\">\n <div class=\"control\">\n <div\n class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': !listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(false)\"\n >\n <span class=\"icon is-small\">\n <i class=\"far fa-th\"></i>\n </span>\n </div>\n </div>\n\n <div class=\"control\">\n <div class=\"button is-lighted images-view__container__buttonBox__btn\"\n [ngClass]=\"{'actifDisplayed': listDisplayed}\"\n (click)=\"onSwitchFormatDisplayed(true)\"\n >\n <span class=\"icon is-small\">\n <i class=\"fas fa-bars\"></i>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n\n <!-- Images section -->\n <ng-scrollbar\n class=\"images-view__scroll\"\n [ngClass]=\"{\n 'images-view__scroll--hide--mosaic': vm.displayPexelsResults && !listDisplayed,\n 'images-view__scroll--hide--table': vm.displayPexelsResults && listDisplayed,\n 'images-view__scroll--full': stateDisplayed === 'full',\n 'images-view__scroll--smallDisplay' : stateDisplayed === 'small' && tabDisplayed !== 'img-upload',\n 'images-view__scroll--smallUploadDisplay' : stateDisplayed === 'small' && tabDisplayed === 'img-upload',\n 'images-view__scroll--window': stateDisplayed === 'window'\n }\"\n >\n <div #imgLibContainer class=\"images-view__wrapper\">\n\n <div *ngIf=\"!listDisplayed || stateDisplayed === 'small'\" [@easeInOut]=\"'in'\">\n <mosaic-view\n [picturesList]=\"vm.picturesList\"\n (picturesListChange)=\"onPicturesListChange(vm.picturesList)\"\n [tableFilters]=\"vm.tableFilters\"\n (filtersChange)=\"searchImagesParameters$.next(getParams(vm.tableFilters));\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n (switchDisplayWindow)=\"switchDisplayWindowMosaic()\"\n [nbFakeImg]=\"nbFakeImg\"\n [stateDisplayed]=\"stateDisplayed\"\n [tabDisplayed]=\"tabDisplayed\"\n [displayPexelsResults]=\"vm.displayPexelsResults\"\n [isLoading]=\"vm.isLoading\"\n [fullSize]=\"fullSize\"\n >\n </mosaic-view>\n </div>\n\n <div *ngIf=\"listDisplayed && stateDisplayed !== 'small'\" [@easeInOut]=\"'in'\">\n <table-view\n [picturesList]=\"vm.picturesList\"\n (picturesListChange)=\"onPicturesListChange(vm.picturesList)\"\n [tableFilters]=\"vm.tableFilters\"\n (filtersChange)=\"searchImagesParameters$.next(getParams(vm.tableFilters));\"\n [(disable)]=\"disable\"\n (pictureNameChange)=\"onRenamePicture($event)\"\n [displayPexelsResults]=\"vm.displayPexelsResults\"\n [stateDisplayed]=\"stateDisplayed\"\n [isLoading]=\"vm.isLoading\"\n >\n </table-view>\n </div>\n </div>\n </ng-scrollbar>\n\n <!-- Pexels Section - When no img found -->\n <div\n *ngIf=\"vm.displayPexelsResults\"\n class=\"images-view--pexels\"\n [@easeInOut]=\"'in'\">\n <pexels-lib\n [searchValue]=\"vm.tableFilters.searchValue\"\n [disableSearch]=\"true\"\n >\n </pexels-lib>\n </div>\n</ng-container>" }]
466
352
  }], ctorParameters: function () { return [{ type: i1.ImgManagerService }, { type: i2.ImgEventService }, { type: i3.ImgSelectionService }, { type: i4.AlertService }, { type: i5.UserSettingsService }, { type: i6.RenamePictureService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { stateDisplayed: [{
467
353
  type: Input
468
354
  }], tabDisplayed: [{
469
355
  type: Input
470
356
  }], fullSize: [{
471
357
  type: Input
472
- }], maxLengthCardShow: [{
473
- type: Input
474
358
  }], nbRowToShow: [{
475
359
  type: Input
476
360
  }], listDisplayed: [{
@@ -483,4 +367,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
483
367
  type: ViewChild,
484
368
  args: ['imgLibContainer']
485
369
  }] } });
486
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2VzLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd3otaW1nLW1hbmFnZXIvc3JjL2xpYi9jb21wb25lbnRzL2ltYWdlcy12aWV3L2ltYWdlcy12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3d6LWltZy1tYW5hZ2VyL3NyYy9saWIvY29tcG9uZW50cy9pbWFnZXMtdmlldy9pbWFnZXMtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFVLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFpQixNQUFNLEVBQUUsWUFBWSxFQUFtQyxpQkFBaUIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV2SyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQWdCLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUczRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBRXJGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBVTVELE1BQU0sT0FBTyxtQkFBbUI7SUF3STlC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QUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFTixtQkFBbUI7c0JBRGxCLE1BQU07Z0JBYXVCLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIGluamVjdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEltZ1BpY3R1cmVEVE8sIEltZ1BpY3R1cmVzRFRPLCBQYXJhbXNJbWdNYW5hZ2VyRFRPIH0gZnJvbSAnLi4vLi4vZHRvL2ltZy1tYW5hZ2VyLmR0byc7XG5pbXBvcnQgeyBJbWdNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ltZy1tYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEltZ0V2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ltZy1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEltZ1NlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbWctc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VzZXItc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZUZpbHRlcnMgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YWJsZS9maWx0ZXJzLXRhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGljdHVyZU5hbWVVcGRhdGUgfSBmcm9tICcuLi8uLi9kdG8vcGljdHVyZS1uYW1lLXVwZGF0ZS5kdG8nO1xuaW1wb3J0IHsgZWFzZUluT3V0IH0gZnJvbSAnLi4vLi4vYW5pbWF0aW9ucy9lYXNlSW5PdXQvZWFzZS1pbi1vdXQuYW5pbWF0aW9uJztcbmltcG9ydCB7IGluc2VydFJlbW92ZSB9IGZyb20gJy4uLy4uL2FuaW1hdGlvbnMvaW5zZXJ0UmVtb3ZlL2luc2VydC1yZW1vdmUuYW5pbWF0aW9uJztcbmltcG9ydCB7IHN0YXRlRGlzcGxheWVkLCB0YWJEaXNwbGF5ZWQgfSBmcm9tICcuLi8uLi9kdG8vZXhwb3J0LWR0b3MuYXBpJztcbmltcG9ydCB7IFJlbmFtZVBpY3R1cmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVuYW1lLXBpY3R1cmUuc2VydmljZSc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hbGVydC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaW1hZ2VzLXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2VzLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBhbmltYXRpb25zOiBbXG4gICAgZWFzZUluT3V0LFxuICAgIGluc2VydFJlbW92ZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlc1ZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuXG4gIEBJbnB1dCgpIHN0YXRlRGlzcGxheWVkOiBzdGF0ZURpc3BsYXllZDtcbiAgQElucHV0KCkgdGFiRGlzcGxheWVkOiB0YWJEaXNwbGF5ZWQ7XG4gIEBJbnB1dCgpIGZ1bGxTaXplOiBib29sZWFuO1xuICBASW5wdXQoKSBtYXhMZW5ndGhDYXJkU2hvdzogbnVtYmVyO1xuICBASW5wdXQoKSBuYlJvd1RvU2hvdzogbnVtYmVyO1xuICBASW5wdXQoKSBsaXN0RGlzcGxheWVkID0gZmFsc2U7IC8vIERpc3BsYXkgZm9ybWF0IGxpc3Qgb3IgbW9zYWljXG4gIEBJbnB1dCgpIG11bHRpcGxlSW1nTW9kZSA9IGZhbHNlO1xuICBAT3V0cHV0KClcbiAgc3dpdGNoRGlzcGxheVdpbmRvdzogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIERhdGEgZmlsdGVyc1xuICB0YWJsZUZpbHRlcnM6IFRhYmxlRmlsdGVycyA9IHtcbiAgICBzb3J0OiB1bmRlZmluZWQsXG4gICAgb3JkZXI6IHVuZGVmaW5lZCxcbiAgICBzZWFyY2hWYWx1ZTogJycsXG4gICAgdG90YWxJdGVtczogMCxcbiAgICBpdGVtc1BlclBhZ2U6IDAsXG4gICAgY3VycmVudFBhZ2U6IDFcbiAgfTtcblxuICBAVmlld0NoaWxkKCdpbWdMaWJDb250YWluZXInKSBpbWdMaWJDb250YWluZXIgOiBFbGVtZW50UmVmO1xuICB3aWR0aExhcmdlQ2FyZDogbnVtYmVyID0gMjE5OyAvLyBEZWZhdWx0IHZhbHVlIG9mIGEgY2FyZCB3aWR0aCAxOTkgKyBtYXJnaW4gMjBcbiAgd2lkdGhTbWFsbENhcmQ6IG51bWJlciA9IDE2MDsgLy8gRGVmYXVsdCB2YWx1ZSBvZiBhIGNhcmQgd2lkdGggMTQwICsgbWFyZ2luIDIwXG4gIG5iTWluSW1nUGVyTGluZTogbnVtYmVyO1xuICBuYk1heEltZ1BlckxpbmU6IG51bWJlcjtcbiAgbmJGYWtlSW1nOiBudW1iZXIgPSAwO1xuXG4gIGltZ0Z1bGxXaWR0aENvbmZpZzphbnkgPSBbXG4gICAge1xuICAgICAgbWF4OiA0MTksXG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMSxcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjVcbiAgICB9LFxuICAgIHtcbiAgICAgIG1heDogNDk5LFxuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDEsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC41XG4gICAgfSxcbiAgICB7XG4gICAgICBtYXg6IDcxOSwgLy8gdGFibGV0XG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMC41LFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMzMzM1xuICAgIH0sXG4gICAge1xuICAgICAgbWF4OiAxMDIzLCAvLyBkZXNrb3BcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjMzMzMsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC4yXG4gICAgfSxcbiAgICB7XG4gICAgICBtYXg6IDEzOTksXG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMC4yNSxcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjEyNVxuICAgIH0sXG4gICAge1xuICAgICAgbWF4OiAxNTk5LFxuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMixcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjExMTFcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjE2NjYsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC4xXG4gICAgfVxuICBdO1xuXG4gIGltZ1dpZHRoQ29uZmlnOmFueSA9IFtcbiAgICB7XG4gICAgICBtYXg6IDEwMjQsXG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMC4yNSxcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjEyNVxuICAgIH0sXG4gICAge1xuICAgICAgbWF4OiAxMTk5LFxuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMzMzMyxcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjJcbiAgICB9LFxuICAgIHtcbiAgICAgIG1heDogMTI5OSxcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjMzMzMsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC4xNjY2XG4gICAgfSxcbiAgICB7XG4gICAgICBtYXg6IDEzOTksXG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMC4yNSxcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjE2NjZcbiAgICB9LFxuICAgIHtcbiAgICAgIG1heDogMTU5OSxcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjI1LFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMTRcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjI1LFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMTI1XG4gICAgfVxuICBdO1xuXG4gIGltZ1N1YnNjcmliZTogU3Vic2NyaXB0aW9uO1xuICBpbWdSZW1vdmVkRXZlbnQ6IFN1YnNjcmlwdGlvbjtcbiAgaW1nQWRkZWRFdmVudDogU3Vic2NyaXB0aW9uO1xuICBpbWdTZWxlY3Rpb25DaGFuZ2U6IFN1YnNjcmlwdGlvbjtcbiAgc2VhcmNoUXVlcnlDaGFuZ2VkOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIGZpbHRlcnNDaGFuZ2VkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwaWN0dXJlc0xpc3Q6IEltZ1BpY3R1cmVEVE9bXSA9IFtdO1xuICBzYXZlUGljdHVyZUxpc3Q6IEltZ1BpY3R1cmVEVE9bXSA9IFtdO1xuICBpbWdTZWxlY3RlZExpc3Q6IEltZ1BpY3R1cmVEVE9bXTtcbiAgc2VhcmNoZWRWYWx1ZTogc3RyaW5nOyAvLyBWYWx1ZSBmcm9tIHRoZSBzZWFyY2ggYmFyIG9yIGltZyBhZGRlZCBieSBjYW52YVxuICBuYkltZ1RvRGVsU2VsZWN0ZWQ6IG51bWJlciA9IDA7XG4gIGRpc2FibGU6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVXNlIHRvIGRpc2FibGUgYWN0aW9uIGR1cmluZyBzZXJ2ZXIgcmVxdWVzdFxuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBpc1RvdGFsUmV0cmlldmVkOiBib29sZWFuID0gZmFsc2U7XG4gIGRlbExpc3RJbWdMb2FkZXIgPSBmYWxzZTtcbiAgaW5pdENvbXBvbmVudDogYm9vbGVhbiA9IHRydWU7XG4gIGZhaWxMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGlzcGxheVBleGVsc1Jlc3VsdHM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVXNlIHdoZW4gbm8gaW1nIGZpbmQgYnkgbmFtZSwgZGlzcGxheSBpbWcgZnJvbSBQZXhlbHNcbiAgc2VhcmNoVGV4dDogc3RyaW5nO1xuICBjb25maXJtSW1nU3VwOmJvb2xlYW4gPSBmYWxzZTtcbiAgcHJldmlvdXNTZWFyY2hWYWx1ZTogc3RyaW5nO1xuXG4gIC8vIFBhZ2luYXRvciBQYXJhbXNcbiAgcGFnZUluZGV4OiBudW1iZXIgPTA7XG4gIGxlbmd0aDogbnVtYmVyID0gMDtcbiAgcGFnZVNpemU6IG51bWJlciA9IDMwOyAvLyBEZWZhdWx0IHZhbHVlXG4gIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBbMjUsIDUwLCAxMDAsIDI1MF07XG5cbiAgLy8gQXBpIEltZyBtYW5hZ2VyIFBhcmFtc1xuICBwYXJhbXM6UGFyYW1zSW1nTWFuYWdlckRUTztcblxuICBwcml2YXRlIGVycm9yR2V0QWxsSW1nID0gJ0ltZ01hbmFnZXIuSW1nTGliLmVycm9yR2V0QWxsSW1nJztcbiAgcHJpdmF0ZSBlcnJvckdldFRvdGFsSW1nID0gJ0ltZ01hbmFnZXIuSW1nTGliLmVycm9yR2V0VG90YWxJbWcnO1xuICBwcml2YXRlIGVycm9yR2V0SW1nID0gJ0ltZ01hbmFnZXIuSW1nTGliLmVycm9yR2V0Q2FudmFJbWcnO1xuICBwcml2YXRlIG1zZ05vSW1nRm91bmQgPSAnSW1nTWFuYWdlci5JbWdMaWIubm9JbWdGb3VuZCc7XG4gIHByaXZhdGUgZXJyb3JSZW1vdmVJbWcgPSAnSW1nTWFuYWdlci5JbWdMaXN0LmVycm9yUmVtb3ZlSW1nJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGltZ01hbmFnZXI6IEltZ01hbmFnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW1nRXZlbnRTZXJ2aWNlOiBJbWdFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbWdTZWxlY3Rpb25TZXJ2aWNlOiBJbWdTZWxlY3Rpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyU2V0dGluZ3NTZXJ2aWNlOiBVc2VyU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVuYW1lUGljdHVyZVNlcnZpY2U6IFJlbmFtZVBpY3R1cmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvKiBpZiAodGhpcy5tYXhMZW5ndGhDYXJkU2hvdykge1xuICAgICAgdGhpcy5yZWR1Y2VQaWN0dXJlTGlzdE1heExlbmd0aCgpO1xuICAgIH0gKi9cbiAgICB0aGlzLnNldEV2ZW50cygpO1xuICAgIHRoaXMuaW1nU2VsZWN0ZWRMaXN0ID0gdGhpcy5pbWdTZWxlY3Rpb25TZXJ2aWNlLmdldEltZ1NlbGVjdGlvbigpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuc2V0TmJJbWdUb0Rpc3BsYXkoKTtcbiAgICB0aGlzLl9nZXRJbWdMaXN0KCk7XG4gICAgaWYgKCF0aGlzLnNhdmVQaWN0dXJlTGlzdCkge1xuICAgICAgdGhpcy5zYXZlUGljdHVyZUxpc3QgPSB0aGlzLnBpY3R1cmVzTGlzdDtcbiAgICB9XG4gIH1cblxuICBnZXRJbWdMaXN0KCkge1xuICAgIHRoaXMuZmlsdGVyc0NoYW5nZWQubmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRydWUgOiBnbyB0byBsaXN0IGRpc3BsYXlcbiAgICogZmFsc2UgOiBnbyB0byBtb3NhaWMgZGlzcGxheVxuICAgKiBAcGFyYW0gYWN0aXZhdGVcbiAgICovXG4gIG9uU3dpdGNoRm9ybWF0RGlzcGxheWVkKGFjdGl2YXRlOiBib29sZWFuKSB7XG4gICAgdGhpcy5saXN0RGlzcGxheWVkID0gYWN0aXZhdGU7XG4gICAgdGhpcy51c2VyU2V0dGluZ3NTZXJ2aWNlLnNldFVzZXJEaXNwbGF5UHJlZmVyZW5jZShhY3RpdmF0ZSk7XG4gICAgdGhpcy5pbWdFdmVudFNlcnZpY2UuZW1pdGxpc3REaXNwbGF5ZWRDaGFuZ2UoYWN0aXZhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bCB0aGUgbnVtYmVyIG9mIGltZyBzZWxlY3RlZCBmb3IgbWFzc2UgZGVsZXRpb25cbiAgICovXG4gIG9uSW1nU2VsZWN0ZWQoKSB7XG4gICAgdGhpcy5zZXROYkltZ1RvRGVsU2VsZWN0ZWQoKTtcbiAgfVxuXG4gIG9uU2hvd0ltZ1VwbG9hZGVkKCkge1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9IG51bGw7XG4gICAgdGhpcy5zZWFyY2hlZFZhbHVlID0gbnVsbDtcbiAgICB0aGlzLmdldEltZ0xpc3QoKTtcbiAgfVxuXG4gIG9uUmVuYW1lUGljdHVyZShwaWN0dXJlUmVuYW1lZDogUGljdHVyZU5hbWVVcGRhdGUpIHtcbiAgICBjb25zb2xlLmxvZygnb25SZW5hbWVQaWN0dXJlIHBpY3R1cmVSZW5hbWVkJywgcGljdHVyZVJlbmFtZWQpO1xuICAgIHRoaXMucmVuYW1lUGljdHVyZVNlcnZpY2UucmVuYW1lUGljdHVyZShwaWN0dXJlUmVuYW1lZCk7XG4gIH1cblxuICByZW1vdmVMaXN0SW1nKCkge1xuICAgIGlmICh0aGlzLmRpc2FibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kaXNhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmRlbExpc3RJbWdMb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMuY29uZmlybUltZ1N1cCA9IGZhbHNlO1xuXG4gICAgLy8gR2V0IHRoZSBpZCBvZiB0aGUgaW1nIHRvIHJlbW92ZVxuICAgIC8vIEFuZCBhZGQgZGVsZXRlZCBwcm9wZXJ0eVxuICAgIGNvbnN0IGlkSW1nVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XG4gICAgdGhpcy5waWN0dXJlc0xpc3QuZm9yRWFjaCggaW1nID0+IHtcbiAgICAgIGlmIChpbWcuZGVsU2VsZWN0ZWQpIHtcbiAgICAgICAgaW1nLmRlbGV0ZWQgPSB0cnVlO1xuICAgICAgICBpZEltZ1RvUmVtb3ZlLnB1c2goaW1nLmlkX2ZpbGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5pbWdNYW5hZ2VyLnJlbW92ZU11bHRpcGxlSW1nKGlkSW1nVG9SZW1vdmUpLnN1YnNjcmliZShcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRJbWdMaXN0KCk7XG4gICAgICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5yZW1vdmVJbWdTZWxlY3Rpb25CeUlkcyhpZEltZ1RvUmVtb3ZlKTtcbiAgICAgIH0sXG4gICAgICBlcnJvciA9PiB7XG4gICAgICAgIHRoaXMuZ2V0SW1nTGlzdCgpO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5vcGVuQWxlcnQodGhpcy5lcnJvclJlbW92ZUltZyk7XG4gICAgICB9XG4gICAgKTtcblxuXG4gIH1cblxuICBzZWxlY3RJbWdDaG9zZW4oKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwaWN0dXJlc0xpc3RTZWxlY3RlZDogSW1nUGljdHVyZURUT1tdID0gW107XG4gICAgdGhpcy5waWN0dXJlc0xpc3QubWFwKGltZyA9PiB7XG4gICAgICBpZihpbWcuZGVsU2VsZWN0ZWQpIHtcbiAgICAgICAgaW1nLmRlbFNlbGVjdGVkID1mYWxzZTtcbiAgICAgICAgaW1nLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpbWcuc2VsZWN0ZWQpIHtcbiAgICAgICAgcGljdHVyZXNMaXN0U2VsZWN0ZWQucHVzaChpbWcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc2V0TmJJbWdUb0RlbFNlbGVjdGVkKCk7XG4gICAgdGhpcy5pbWdTZWxlY3Rpb25TZXJ2aWNlLnNldEltZ1NlbGVjdGlvbihwaWN0dXJlc0xpc3RTZWxlY3RlZCk7XG4gIH1cblxuICBkaXNwbGF5Q29uZmlybUltZ1N1cCgpe1xuICAgIGlmICh0aGlzLmRpc2FibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb25maXJtSW1nU3VwID0gdHJ1ZTtcbiAgfVxuXG4gIGNhbmNlbFN1cCgpIHtcbiAgICB0aGlzLmNvbmZpcm1JbWdTdXAgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0IHdoZW4gYSBpbWcgc2VsZWN0ZWQgaW4gb3JkZXIgdG8gZGVsZXRlXG4gICAqL1xuICBvblBpY3R1cmVzTGlzdENoYW5nZSgpIHtcbiAgICB0aGlzLnNldE5iSW1nVG9EZWxTZWxlY3RlZCgpO1xuICB9XG5cbiAgb25GaWx0ZXJzQ2hhbmdlKCkge1xuICAgIHRoaXMuZ2V0SW1nTGlzdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWZhdWx0IG51bWJlciBvZiBpbWcgcGVyIHBhZ2UgdG8gZGlzcGxheSBhdCB0aGUgaW5pdGlhbGlzYXRpb25cbiAgICogVGhpcyBudW1iZXIgaXMgYmV0d2VlbiAzMCBhbmQgNTBcbiAgICovXG4gIHByaXZhdGUgc2V0TmJJbWdUb0Rpc3BsYXkoKSB7XG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSB0aGlzLmltZ0xpYkNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICsgMzA7IC8vICsgMzBweCAtPiBsZWZ0ICsgcmlnaHQgbWFyZ2luXG4gICAgY29uc3Qgc2Nyb2xsV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGg7XG5cbiAgICBjb25zdCBbbWF4SW1nV2lkdGhGYWN0b3IsIG1pbkltZ1dpZHRoRmFjdG9yXSA9IHRoaXMuZ2V0SW1nV2lkdGhGYWN0b3JzKCk7XG5cbiAgICBjb25zdCBtaW5JbWdXaWR0aCA9IE1hdGguZmxvb3IoY29udGFpbmVyV2lkdGggKiBtaW5JbWdXaWR0aEZhY3Rvcik7XG4gICAgY29uc3QgbWF4SW1nV2lkdGggPSBNYXRoLmNlaWwoKGNvbnRhaW5lcldpZHRoICsgc2Nyb2xsV2lkdGggKSAqIG1heEltZ1dpZHRoRmFjdG9yKTtcblxuICAgIHRoaXMubmJNYXhJbWdQZXJMaW5lID0gTWF0aC5mbG9vcihjb250YWluZXJXaWR0aCAvIG1pbkltZ1dpZHRoKTtcbiAgICB0aGlzLm5iTWluSW1nUGVyTGluZSA9IE1hdGguZmxvb3IoIChjb250YWluZXJXaWR0aCArIHNjcm9sbFdpZHRoICkgLyBtYXhJbWdXaWR0aCk7XG5cbiAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5nZXRUb3RhbEltZ1BlclBhZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW1nV2lkdGhGYWN0b3JzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBzY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIGxldCBtaW5XaWR0aDpudW1iZXIgPSAwO1xuICAgIGxldCBpbWdTaXplc0NvbmZpZzogbnVtYmVyW10gPSBbXTtcblxuICAgIGNvbnN0IGN1cnJlbnRJbWdXaWR0aENvbmZpZyA9IHRoaXMuZnVsbFNpemUgPyB0aGlzLmltZ0Z1bGxXaWR0aENvbmZpZyA6IHRoaXMuaW1nV2lkdGhDb25maWc7XG5cbiAgICBmb3IgKGNvbnN0IHdpZHRoQ29uZmlnIG9mIGN1cnJlbnRJbWdXaWR0aENvbmZpZykge1xuICAgICAgICBpZiAoIXdpZHRoQ29uZmlnLm1heCkge1xuICAgICAgICAgIGltZ1NpemVzQ29uZmlnID0gW3dpZHRoQ29uZmlnLmxhcmdlSW1nV2lkdGhGYWN0b3IsIHdpZHRoQ29uZmlnLnNtYWxsSW1nV2lkdGhGYWN0b3JdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaW5XaWR0aCA8IHNjcmVlbldpZHRoICYmIHNjcmVlbldpZHRoIDw9IHdpZHRoQ29uZmlnLm1heCkge1xuICAgICAgICAgIGltZ1NpemVzQ29uZmlnID0gW3dpZHRoQ29uZmlnLmxhcmdlSW1nV2lkdGhGYWN0b3IsIHdpZHRoQ29uZmlnLnNtYWxsSW1nV2lkdGhGYWN0b3JdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG1pbldpZHRoID0gd2lkdGhDb25maWcubWF4O1xuICAgIH1cbiAgICByZXR1cm4gaW1nU2l6ZXNDb25maWc7XG4gIH1cblxuICBwcml2YXRlIGdldFRvdGFsSW1nUGVyUGFnZSgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLm5iUm93VG9TaG93KSB7XG4gICAgICBjb25zdCBuYkltZ1BlckxpbmUgPSB0aGlzLnN0YXRlRGlzcGxheWVkID09PSAnZnVsbCcgPyB0aGlzLm5iTWluSW1nUGVyTGluZSA6IHRoaXMubmJNYXhJbWdQZXJMaW5lO1xuICAgICAgcmV0dXJuIG5iSW1nUGVyTGluZSAqIHRoaXMubmJSb3dUb1Nob3c7XG4gICAgfVxuXG4gICAgbGV0IHRvdGFsID0gdGhpcy5uYk1pbkltZ1BlckxpbmU7XG5cbiAgICB3aGlsZSAodG90YWwgPCAzMCB8fCB0b3RhbCAlIHRoaXMubmJNYXhJbWdQZXJMaW5lICE9PSAwIHx8ICB0b3RhbCAlIHRoaXMubmJNaW5JbWdQZXJMaW5lICE9PSAwKSB7XG4gICAgICB0b3RhbCArPSB0aGlzLm5iTWluSW1nUGVyTGluZTtcbiAgICB9XG4gICAgcmV0dXJuIHRvdGFsO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQYXJhbXMoKSB7XG4gICAgdGhpcy5wYXJhbXMgPSB7XG4gICAgICBsaW1pdDogdGhpcy5tYXhMZW5ndGhDYXJkU2hvdz8udG9TdHJpbmcoKSB8fCAodGhpcy50YWJsZUZpbHRlcnMuaXRlbXNQZXJQYWdlID8gdGhpcy50YWJsZUZpbHRlcnMuaXRlbXNQZXJQYWdlLnRvU3RyaW5nKCkgOiB0aGlzLnBhZ2VTaXplLnRvU3RyaW5nKCkpLFxuICAgICAgcGFnZTogdGhpcy50YWJsZUZpbHRlcnMuY3VycmVudFBhZ2UudG9TdHJpbmcoKVxuICAgIH07XG4gICAgaWYgKHRoaXMudGFibGVGaWx0ZXJzLnNlYXJjaFZhbHVlKSB7XG4gICAgICB0aGlzLnBhcmFtcy5zZWFyY2ggPSB0aGlzLnRhYmxlRmlsdGVycy5zZWFyY2hWYWx1ZS50b1N0cmluZygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdFZhcmlhYmxlcyhsb2FkaW5nU3VjY2VzczogYm9vbGVhbikge1xuICAgIHRoaXMubmJJbWdUb0RlbFNlbGVjdGVkID0gMDtcbiAgICB0aGlzLmRpc2FibGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZGVsTGlzdEltZ0xvYWRlciA9IGZhbHNlO1xuICAgIHRoaXMuaW5pdENvbXBvbmVudCA9IGZhbHNlO1xuICAgIHRoaXMuZGlzcGxheVBleGVsc1Jlc3VsdHMgPSBmYWxzZTtcbiAgICB0aGlzLmZhaWxMb2FkZWQgPSAhbG9hZGluZ1N1Y2Nlc3M7XG4gICAgdGhpcy5uYkZha2VJbWcgPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RJbWdTZWxlY3RlZCAoKSB7XG4gICAgaWYgKCF0aGlzLmltZ1NlbGVjdGVkTGlzdCB8fCAhdGhpcy5pbWdTZWxlY3RlZExpc3QubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaWRJbWdTbGVjdGVkTGlzdDogc3RyaW5nW10gPSBbXTtcblxuICAgIHRoaXMuaW1nU2VsZWN0ZWRMaXN0LmZvckVhY2goaW1nID0+XG4gICAgICBpZEltZ1NsZWN0ZWRMaXN0LnB1c2goaW1nLmlkX2ZpbGUpXG4gICAgKTtcblxuICAgIHRoaXMucGljdHVyZXNMaXN0LmZvckVhY2gocGljdHVyZSA9PiB7XG4gICAgICBpZiAoaWRJbWdTbGVjdGVkTGlzdC5pbmRleE9mKHBpY3R1cmUuaWRfZmlsZSkgIT09IC0xKSB7XG4gICAgICAgIHBpY3R1cmUuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwbGF5UGV4ZWxzTGliICgpIHtcbiAgICB0aGlzLmRpc3BsYXlQZXhlbHNSZXN1bHRzID0gdHJ1ZTtcbiAgICB0aGlzLmFsZXJ0U2VydmljZS5vcGVuQWxlcnQodGhpcy5tc2dOb0ltZ0ZvdW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBpbWcgbGlzdCBpbiBvcmRlciB0byBmaWxsIHByb3Blcmx5IGFsbCB0aGUgbGluZSBvZiBpbWFnZXMgZGlzcGxheWVkIGluIG1vc2FpYy5cbiAgICogT3RoZXJ3aXNlLCB0aGUgc3BhY2UtYmV0d2VlbiBjc3Mgd2lsbCBkbyBhIGJhZCBkaXNwbGF5XG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZU5iSW1nRmFrZShuYkltZ0Rpc3BsYXllZDogbnVtYmVyKSB7XG4gICAgY29uc3QgbmJJbWdQZXJMaW5lID0gdGhpcy5zdGF0ZURpc3BsYXllZCA9PT0gJ3NtYWxsJyB8fCB0aGlzLnRhYkRpc3BsYXllZCA9PT0gJ2ltZy11cGxvYWQnID8gdGhpcy5uYk1heEltZ1BlckxpbmUgOiB0aGlzLm5iTWluSW1nUGVyTGluZTtcblxuICAgIGlmIChuYkltZ0Rpc3BsYXllZCAlIG5iSW1nUGVyTGluZSAhPT0gMCkge1xuICAgICAgdGhpcy5uYkZha2VJbWcgPSBuYkltZ1BlckxpbmUgLSBuYkltZ0Rpc3BsYXllZCAlIG5iSW1nUGVyTGluZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEltZyAoaWRfZmlsZTogc3RyaW5nKSB7XG4gICAgdGhpcy5pbWdNYW5hZ2VyLmdldFNob3BJbWcoaWRfZmlsZSkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHBpY3R1cmUpID0+IHtcblxuICAgICAgICBpZiAoIXRoaXMuaW1nQWxyZWFkeUV4aXN0KHBpY3R1cmUuaWRfZmlsZSkpIHtcbiAgICAgICAgICAvLyBjaGVjayB0aGUgaW1nIGlzIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICAgICAgICB0aGlzLnBpY3R1cmVzTGlzdC51bnNoaWZ0KHBpY3R1cmUpO1xuICAgICAgICAgIHRoaXMubGVuZ3RoICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5vcGVuQWxlcnQodGhpcy5lcnJvckdldEltZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGltZ0FscmVhZHlFeGlzdCAoaWRfZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbWcgb2YgdGhpcy5waWN0dXJlc0xpc3QpIHtcbiAgICAgIGlmIChpbWcuaWRfZmlsZSA9PT0gaWRfZmlsZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXROYkltZ1RvRGVsU2VsZWN0ZWQgKCkge1xuICAgIHRoaXMubmJJbWdUb0RlbFNlbGVjdGVkID0gdGhpcy5waWN0dXJlc0xpc3QuZmlsdGVyKGltZyA9PlxuICAgICAgaW1nLmRlbFNlbGVjdGVkKS5sZW5ndGg7XG5cbiAgICBpZiAoIXRoaXMubmJJbWdUb0RlbFNlbGVjdGVkKSB7XG4gICAgICB0aGlzLmNvbmZpcm1JbWdTdXAgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEV2ZW50cygpIHtcbiAgICAvLyBBZGQgYSB0aW1lciB0byByZXRyaWV2ZSBpbWcgd2hlbiB0aGUgc2VhcmNoIGJhciBvciB0aGUgcGFnaW5hdG9yIGFyZSB1c2VkXG4gICAgdGhpcy5zZWFyY2hRdWVyeUNoYW5nZWRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg0MDApKSAvLyB3YWl0IDAuNSBzZWMgYWZ0ZXIgdGhlIGxhc3QgZXZlbnQgYmVmb3JlIGVtaXR0aW5nIGxhc3QgZXZlbnRcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgdGhpcy5nZXRJbWdMaXN0KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmZpbHRlcnNDaGFuZ2VkXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoODAwKSkgLy8gd2FpdCAwLjggc2VjIGFmdGVyIHRoZSBsYXN0IGV2ZW50IGJlZm9yZSBlbWl0dGluZyBsYXN0IGV2ZW50XG4gICAgICAuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMuX2dldEltZ0xpc3QoKTtcbiAgICB9KTtcblxuICAgIC8vIFJlbG9hZCBpbWcgd2hlbiBpbWcgaXMvYXJlIHJlbW92ZWRcbiAgICB0aGlzLmltZ1JlbW92ZWRFdmVudCA9IHRoaXMuaW1nRXZlbnRTZXJ2aWNlLmltZ1JlbW92ZWQkLnN1YnNjcmliZShpZF9maWxlID0+e1xuICAgICAgdGhpcy5nZXRJbWdMaXN0KCk7XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgaW1nIGZyb20gQ2FudmFcbiAgICB0aGlzLmltZ0FkZGVkRXZlbnQgPSB0aGlzLmltZ0V2ZW50U2VydmljZS5nZXRJbWdBZGRlZEV2ZW50TGlzdG5lcigpLnN1YnNjcmliZShpZF9maWxlID0+e1xuICAgICAgaWYgKGlkX2ZpbGUgJiYgIXRoaXMuaW1nQWxyZWFkeUV4aXN0KGlkX2ZpbGUpKSB7XG4gICAgICAgIHRoaXMuZ2V0SW1nKGlkX2ZpbGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5pbWdTZWxlY3Rpb25DaGFuZ2UgPSB0aGlzLmltZ1NlbGVjdGlvblNlcnZpY2UuaW1nU2VsZWN0aW9uJC5zdWJzY3JpYmUoaW1nU2VsZWN0aW9uID0+e1xuICAgICAgaWYgKHRoaXMubGlzdERpc3BsYXllZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpZEZpbGVMaXN0ID0gW107XG4gICAgICBpbWdTZWxlY3Rpb24ubWFwKGltZyA9PiBpZEZpbGVMaXN0LnB1c2goaW1nLmlkX2ZpbGUpKTtcbiAgICAgIGZvciAoY29uc3QgcGljdHVyZSBvZiB0aGlzLnBpY3R1cmVzTGlzdCkge1xuICAgICAgICBpZiAoaWRGaWxlTGlzdC5pbmRleE9mKHBpY3R1cmUuaWRfZmlsZSkgPT09IC0xKSB7XG4gICAgICAgICAgcGljdHVyZS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRJbWdMaXN0KCkge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmRpc3BsYXlQZXhlbHNSZXN1bHRzID0gZmFsc2U7XG4gICAgdGhpcy5zZXRQYXJhbXMoKTtcblxuICAgIHRoaXMucmVmcmVzaFRvdGFsSW1nTGlzdCgpO1xuXG4gICAgY29uc3QgZm9yY2VUb1VwZGF0ZSA9IHRoaXMuaXNMYXN0SW1nUmVtb3ZlZEluTGlzdCgpO1xuICAgIHRoaXMuaW1nTWFuYWdlci5nZXRTaG9wSW1nTGlzdCh0aGlzLnBhcmFtcywgZm9yY2VUb1VwZGF0ZSkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5pbml0VmFyaWFibGVzKHRydWUpO1xuICAgICAgICBjb25zdCBuYkltZ0Rpc3BsYXllZCA9IGRhdGEuZGF0YS5sZW5ndGg7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlTmJJbWdGYWtlKG5iSW1nRGlzcGxheWVkKTtcbiAgICAgICAgdGhpcy5waWN0dXJlc0xpc3QgPSBkYXRhLmRhdGE7XG4gICAgICAgIHRoaXMucmVuYW1lUGljdHVyZVNlcnZpY2Uuc2V0UGljdHVyZXNMaXN0KHRoaXMucGljdHVyZXNMaXN0KTtcbiAgICAgICAgdGhpcy5zZWxlY3RJbWdTZWxlY3RlZCgpO1xuXG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5pc1RvdGFsUmV0cmlldmVkID8gdGhpcy5sZW5ndGggOiBkYXRhLnRvdGFsUmVjb3JkcztcbiAgICAgICAgdGhpcy50YWJsZUZpbHRlcnMudG90YWxJdGVtcyA9IHRoaXMuaXNUb3RhbFJldHJpZXZlZCA/IHRoaXMudGFibGVGaWx0ZXJzLnRvdGFsSXRlbXMgOiBkYXRhLnRvdGFsUmVjb3JkcztcbiAgICAgICAgdGhpcy50YWJsZUZpbHRlcnMuaXRlbXNQZXJQYWdlID0gIHRoaXMudGFibGVGaWx0ZXJzLml0ZW1zUGVyUGFnZSA/ICB0aGlzLnRhYmxlRmlsdGVycy5pdGVtc1BlclBhZ2UgOiB0aGlzLnBhZ2VTaXplO1xuXG4gICAgICAgIC8vIERpc3BsYXkgUGV4ZWxzIGlmIG5vIHJlc3VsdFxuICAgICAgICBpZiAoZGF0YS50b3RhbFJlY29yZHMgPT09IDApIHtcbiAgICAgICAgICB0aGlzLmRpc3BsYXlQZXhlbHNMaWIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7IC8vIEluIHdpemktYWRtaW4sIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIGlzIG5vdCB3b3JraW5nIHByb3Blcmx5XG5cbiAgICB9LFxuICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5vcGVuQWxlcnQodGhpcy5lcnJvckdldEFsbEltZyk7XG4gICAgICB0aGlzLmluaXRWYXJpYWJsZXMoZmFsc2UpO1xuICAgIH19KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFRvdGFsSW1nTGlzdCgpIHtcbiAgICBjb25zdCBzZWFyY2hWYWx1ZSA9IHRoaXMudGFibGVGaWx0ZXJzLnNlYXJjaFZhbHVlO1xuXG4gICAgaWYgKHRoaXMuaXNUb3RhbFJldHJpZXZlZCAmJiBzZWFyY2hWYWx1ZSA9PT0gdGhpcy5wcmV2aW91c1NlYXJjaFZhbHVlKSB7XG4gICAgICAvLyBLZWVwIGN1cnJlbnQgdG90YWwgcmVzdWx0XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1RvdGFsUmV0cmlldmVkID0gZmFsc2U7XG5cbiAgICB0aGlzLmltZ01hbmFnZXIuZ2V0U2hvcFRvdGFsSW1nTGlzdCh0aGlzLnBhcmFtcykucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogdG90YWwgPT4ge1xuICAgICAgICB0aGlzLnByZXZpb3VzU2VhcmNoVmFsdWUgPSBzZWFyY2hWYWx1ZTtcbiAgICAgICAgdGhpcy5pc1RvdGFsUmV0cmlldmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0b3RhbDtcbiAgICAgICAgdGhpcy50YWJsZUZpbHRlcnMudG90YWxJdGVtcyA9IHRvdGFsO1xuICAgICAgfSxcblxuICAgICAgZXJyb3I6IGVycm9yID0+IHtcbiAgICAgICAgLy90aGlzLmFsZXJ0U2VydmljZS5vcGVuQWxlcnQodGhpcy5lcnJvckdldFRvdGFsSW1nKTtcbiAgICAgICAgdGhpcy5pbml0VmFyaWFibGVzKGZhbHNlKTtcbiAgICB9fSk7XG4gIH1cblxuICBzd2l0Y2hEaXNwbGF5V2luZG93TW9zYWljKCkge1xuICAgIHRoaXMuc3dpdGNoRGlzcGxheVdpbmRvdy5lbWl0KHRydWUpO1xuICB9XG5cbiAgaXNMYXN0SW1nUmVtb3ZlZEluTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5waWN0dXJlc0xpc3Quc29tZShwaWN0dXJlID0+IHBpY3R1cmUuaWRfZmlsZSA9PT0gdGhpcy5pbWdFdmVudFNlcnZpY2UuaW1nUmVtb3ZlZCQuZ2V0VmFsdWUoKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFF1ZXJ5Q2hhbmdlZC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaW1nUmVtb3ZlZEV2ZW50LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5pbWdBZGRlZEV2ZW50LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5pbWdTZWxlY3Rpb25DaGFuZ2UudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImltYWdlcy12aWV3XCIgW25nQ2xhc3NdPVwieydmdWxsU2l6ZSc6IGZ1bGxTaXplLCAnc21hbGwnOiBzdGF0ZURpc3BsYXllZCA9PT0gJ3NtYWxsJ31cIiBbQGVhc2VJbk91dF09XCInaW4nXCI+XG4gIDwhLS0gU3ViaGVhZGVyIDogSW1nIG51bWJlciBhbmQgYWN0aW9ucyBidG4gKHN1cCBpbWcgbGlzdCwgc3dpdGNoIGZvcm1hIGRpc3BsYXkpIC0tPlxuICA8ZGl2XG4gICpuZ0lmPVwiKHN0YXRlRGlzcGxheWVkICE9PSAnc21hbGwnIHx8IHRhYkRpc3BsYXllZCA9PT0gJ2ltZy11cGxvYWQnKVwiXG4gIGNsYXNzPVwiaW1hZ2VzLXZpZXdfX2NvbnRhaW5lclwiXG4gIFtuZ0NsYXNzXT1cInsnaW1hZ2VzLXZpZXdfX2NvbnRhaW5lci0tdXBsb2FkVGFiJzogdGFiRGlzcGxheWVkID09PSAnaW1nLXVwbG9hZCcsICdpbWFnZXMtdmlld19fY29udGFpbmVyLS13aW5kb3cnOiBzdGF0ZURpc3BsYXllZCA9PT0gJ3dpbmRvdyd9XCJcbiAgPlxuXG4gICAgPGRpdiAqbmdJZj1cInRhYkRpc3BsYXllZCAhPT0gJ2ltZy11cGxvYWQnXCI+XG4gICAgICAgIDxwIGNsYXNzPVwibWFpbkNvbG9yXCIgW25nQ2xhc3NdPVwieydpbWFnZXMtdmlld19fY29udGFpbmVyX190b3RhbC0taGlkZSc6IGRpc3BsYXlQZXhlbHNSZXN1bHRzfVwiPnt7ICdJbWdNYW5hZ2VyLkltZ0xpYi5uYkltZycgfCB0cmFuc2xhdGUgfX0gOiB7e2xlbmd0aH19PC9wPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJ0YWJEaXNwbGF5ZWQgPT09ICdpbWctdXBsb2FkJ1wiPlxuICAgICAgICA8cCBjbGFzcz1cIm1haW5Db2xvclwiPnt7ICdJbWdNYW5hZ2VyLkltZ0xpYi5sYXN0SW1ncycgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaGFzLWFkZG9ucyBzdWJIZWFkZXJBY3Rpb25zXCIgKm5nSWY9XCJ0YWJEaXNwbGF5ZWQgIT09ICdpbWctdXBsb2FkJ1wiPlxuXG4gICAgICAgIDwhLS0gRm9yIGxpc3Rmb3JtYSA6IERpc3BsYXkgYnRuIGRlbCBtdWx0aXBsZSBpbWcgJiBDb25maXJtIGFjdGlvbiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlcy12aWV3X19jb250YWluZXJfX2JveEFjdGlvblwiPlxuXG5cbiAgICAgICAgICAgIDwhLS0gU2VsZWN0IC0tPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBzdWNjZXNzIGltYWdlcy12aWV3X19jb250YWluZXJfX2JveEFjdGlvbl9faW1wb3J0XCJcbiAgICAgICAgICAgICAgQGluc2VydFJlbW92ZUFubmltXG4gICAgICAgICAgICAgICpuZ0lmPVwibGlzdERpc3BsYXllZCAmJiBuYkltZ1RvRGVsU2VsZWN0ZWQgJiYgIWNvbmZpcm1JbWdTdXAgJiYgIWRlbExpc3RJbWdMb2FkZXIgJiYgbXVsdGlwbGVJbWdNb2RlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEltZ0Nob3NlbigpXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhbCBmYS1jaGVja1wiPjwvaT5cbiAgICAgICAgICAgICAgICB7eyAnSW1nTWFuYWdlci5JbWdMaWIuc2VsZWN0JyB8IHRyYW5zbGF0ZSB9fSAoe3tuYkltZ1RvRGVsU2VsZWN0ZWR9fSlcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8IS0tIERpc3BsYXkgYnRuIGRlbCBtdWx0aXBsZSBpbWcgLS0+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwibGlzdERpc3BsYXllZCAmJiBuYkltZ1RvRGVsU2VsZWN0ZWQgJiYgIWNvbmZpcm1JbWdTdXBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGlzcGxheUNvbmZpcm1JbWdTdXAoKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGltYWdlcy12aWV3X19jb250YWluZXJfX2JveEFjdGlvbl9fZGVsQnRuIGRhbmdlclwiXG4gICAgICAgICAgICAgIEBpbnNlcnRSZW1vdmVBbm5pbVxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhbCBmYS10aW1lc1wiPjwvaT57eyAnSW1nTWFuYWdlci5JbWdMaWIuZGVsTWx0JyB8IHRyYW5zbGF0ZSB9fSAoe3tuYkltZ1RvRGVsU2VsZWN0ZWR9fSlcbiAgICAgICAgICAgICAgICA8c3BhbiBidG5Mb2FkaW5nQW5pbSAqbmdJZj1cImRlbExpc3RJbWdMb2FkZXJcIiBjbGFzcz1cImJ0bkxvYWRpbmdBbm5pbWF0aW9uXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDwhLS0gQ29uZmlybSBhY3Rpb24gLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fYm94QWN0aW9uX19jb25maXJtU3VwXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpbWFnZXMtdmlld19fY29udGFpbmVyX19ib3hBY3Rpb25fX2NvbmZpcm1TdXAtLXZpc2libGUnOiBjb25maXJtSW1nU3VwfVwiPlxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwibmJJbWdUb0RlbFNlbGVjdGVkID4gMVwiIGNsYXNzPVwiaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fYm94QWN0aW9uX19jb25maXJtU3VwX190ZXh0XCI+e3sgJ0ltZ01hbmFnZXIuSW1nTGliLmNvbmZpcm1TdXBRdWVzdGlvbnMnIHwgdHJhbnNsYXRlOntuYkltYWdlOiBuYkltZ1RvRGVsU2VsZWN0ZWR9IH19PC9wPlxuICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwibmJJbWdUb0RlbFNlbGVjdGVkID09PSAxXCIgY2xhc3M9XCJpbWFnZXMtdmlld19fY29udGFpbmVyX19ib3hBY3Rpb25fX2NvbmZpcm1TdXBfX3RleHRcIj57eyAnSW1nTWFuYWdlci5JbWdMaWIuY29uZmlybVN1cFF1ZXN0aW9uJyB8IHRyYW5zbGF0ZTp7bmJJbWFnZTogbmJJbWdUb0RlbFNlbGVjdGVkfSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24gaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fYm94QWN0aW9uX19jb25maXJtU3VwX19jYW5jZWxcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWxTdXAoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAnSW1nTWFuYWdlci5JbWdMaWIuY2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVMaXN0SW1nKClcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGltYWdlcy12aWV3X19jb250YWluZXJfX2RlbEJ0biBkYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgJ0ltZ01hbmFnZXIuSW1nTGliLmNvbmZpcm0nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgPCEtLSBTd2l0aCBtb3NhaWMvbGlzdCBmb3JtYSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnMgaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fYnV0dG9uQm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGlzLWxpZ2h0ZWQgaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fYnV0dG9uQm94X19idG5cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpZkRpc3BsYXllZCc6ICFsaXN0RGlzcGxheWVkfVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Td2l0Y2hGb3JtYXREaXNwbGF5ZWQoZmFsc2UpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpcy1zbWFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtdGhcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24gaXMtbGlnaHRlZCBpbWFnZXMtdmlld19fY29udGFpbmVyX19idXR0b25Cb3hfX2J0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGlmRGlzcGxheWVkJzogbGlzdERpc3BsYXllZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU3dpdGNoRm9ybWF0RGlzcGxheWVkKHRydWUpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24gaXMtc21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1iYXJzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuXG4gIDwhLS0gSW1hZ2VzIHNlY3Rpb24gLS0+XG48bmctc2Nyb2xsYmFyXG4gIGNsYXNzPVwiaW1hZ2VzLXZpZXdfX3Njcm9sbFwiXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAnaW1hZ2VzLXZpZXdfX3Njcm9sbC0taGlkZS0tbW9zYWljJzogZGlzcGxheVBleGVsc1Jlc3VsdHMgJiYgIWxpc3REaXNwbGF5ZWQsXG4gICAgJ2ltYWdlcy12aWV3X19zY3JvbGwtLWhpZGUtLXRhYmxlJzogZGlzcGxheVBleGVsc1Jlc3VsdHMgJiYgbGlzdERpc3BsYXllZCxcbiAgICAnaW1hZ2VzLXZpZXdfX3Njcm9sbC0tZnVsbCc6IHN0YXRlRGlzcGxheWVkID09PSAnZnVsbCcsXG4gICAgJ2ltYWdlcy12aWV3X19zY3JvbGwtLXNtYWxsRGlzcGxheScgOiBzdGF0ZURpc3BsYXllZCA9PT0gJ3NtYWxsJyAmJiB0YWJEaXNwbGF5ZWQgIT09ICdpbWctdXBsb2FkJyxcbiAgICAnaW1hZ2VzLXZpZXdfX3Njcm9sbC0tc21hbGxVcGxvYWREaXNwbGF5JyA6IHN0YXRlRGlzcGxheWVkID09PSAnc21hbGwnICYmIHRhYkRpc3BsYXllZCA9PT0gJ2ltZy11cGxvYWQnLFxuICAgICdpbWFnZXMtdmlld19fc2Nyb2xsLS13aW5kb3cnOiBzdGF0ZURpc3BsYXllZCA9PT0gJ3dpbmRvdydcbn1cIlxuPlxuICA8ZGl2ICNpbWdMaWJDb250YWluZXIgY2xhc3M9XCJpbWFnZXMtdmlld19fd3JhcHBlclwiPlxuICAgIDxkaXYgKm5nSWY9XCIhbGlzdERpc3BsYXllZCB8fCBzdGF0ZURpc3BsYXllZCA9PT0gJ3NtYWxsJ1wiIFtAZWFzZUluT3V0XT1cIidpbidcIj5cbiAgICAgIDxtb3NhaWMtdmlld1xuICAgICAgICBbcGljdHVyZXNMaXN0XT1cInBpY3R1cmVzTGlzdFwiXG4gICAgICAgIChwaWN0dXJlc0xpc3RDaGFuZ2UpPVwib25QaWN0dXJlc0xpc3RDaGFuZ2UoKVwiXG4gICAgICAgIFt0YWJsZUZpbHRlcnNdPVwidGFibGVGaWx0ZXJzXCJcbiAgICAgICAgKGZpbHRlcnNDaGFuZ2UpPVwib25GaWx0ZXJzQ2hhbmdlKClcIlxuICAgICAgICBbKGRpc2FibGUpXT1cImRpc2FibGVcIlxuICAgICAgICAocGljdHVyZU5hbWVDaGFuZ2UpPVwib25SZW5hbWVQaWN0dXJlKCRldmVudClcIlxuICAgICAgICAoc3dpdGNoRGlzcGxheVdpbmRvdyk9XCJzd2l0Y2hEaXNwbGF5V2luZG93TW9zYWljKClcIlxuICAgICAgICBbbmJGYWtlSW1nXT1cIm5iRmFrZUltZ1wiXG4gICAgICAgIFtzdGF0ZURpc3BsYXllZF09XCJzdGF0ZURpc3BsYXllZFwiXG4gICAgICAgIFt0YWJEaXNwbGF5ZWRdPVwidGFiRGlzcGxheWVkXCJcbiAgICAgICAgW2Rpc3BsYXlQZXhlbHNSZXN1bHRzXT1cImRpc3BsYXlQZXhlbHNSZXN1bHRzXCJcbiAgICAgICAgW2lzTG9hZGluZ109XCJpc0xvYWRpbmdcIlxuICAgICAgICBbZnVsbFNpemVdPVwiZnVsbFNpemVcIlxuICAgICAgPlxuICAgICAgPC9tb3NhaWMtdmlldz5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJsaXN0RGlzcGxheWVkICYmIHN0YXRlRGlzcGxheWVkICE9PSAnc21hbGwnXCIgW0BlYXNlSW5PdXRdPVwiJ2luJ1wiPlxuICAgICAgPHRhYmxlLXZpZXdcbiAgICAgICAgW3BpY3R1cmVzTGlzdF09XCJwaWN0dXJlc0xpc3RcIlxuICAgICAgICAocGljdHVyZXNMaXN0Q2hhbmdlKT1cIm9uUGljdHVyZXNMaXN0Q2hhbmdlKClcIlxuICAgICAgICBbdGFibGVGaWx0ZXJzXT1cInRhYmxlRmlsdGVyc1wiXG4gICAgICAgIChmaWx0ZXJzQ2hhbmdlKT1cIm9uRmlsdGVyc0NoYW5nZSgpXCJcbiAgICAgICAgWyhkaXNhYmxlKV09XCJkaXNhYmxlXCJcbiAgICAgICAgKHBpY3R1cmVOYW1lQ2hhbmdlKT1cIm9uUmVuYW1lUGljdHVyZSgkZXZlbnQpXCJcbiAgICAgICAgW2Rpc3BsYXlQZXhlbHNSZXN1bHRzXT1cImRpc3BsYXlQZXhlbHNSZXN1bHRzXCJcbiAgICAgICAgW3N0YXRlRGlzcGxheWVkXT1cInN0YXRlRGlzcGxheWVkXCJcbiAgICAgICAgW2lzTG9hZGluZ109XCJpc0xvYWRpbmdcIlxuICAgICAgICA+XG4gICAgICA8L3RhYmxlLXZpZXc+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG48L25nLXNjcm9sbGJhcj5cblxuPCEtLSBQZXhlbHMgU2VjdGlvbiAtIFdoZW4gbm8gaW1nIGZvdW5kIC0tPlxuPGRpdlxuICAqbmdJZj1cImRpc3BsYXlQZXhlbHNSZXN1bHRzXCJcbiAgY2xhc3M9XCJpbWFnZXMtdmlldy0tcGV4ZWxzXCJcbiAgW0BlYXNlSW5PdXRdPVwiJ2luJ1wiPlxuICA8cGV4ZWxzLWxpYlxuICAgIFtzZWFyY2hWYWx1ZV09XCJ0YWJsZUZpbHRlcnMuc2VhcmNoVmFsdWVcIlxuICAgIChzaG93SW1nVXBsb2FkZWQpPVwib25TaG93SW1nVXBsb2FkZWQoKVwiXG4gICAgW2Rpc2FibGVTZWFyY2hdPVwidHJ1ZVwiXG4gID5cbiAgPC9wZXhlbHMtbGliPlxuPC9kaXY+XG4iXX0=
370
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2VzLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd3otaW1nLW1hbmFnZXIvc3JjL2xpYi9jb21wb25lbnRzL2ltYWdlcy12aWV3L2ltYWdlcy12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3d6LWltZy1tYW5hZ2VyL3NyYy9saWIvY29tcG9uZW50cy9pbWFnZXMtdmlldy9pbWFnZXMtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFpQixNQUFNLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTlILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUczRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBRXJGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBVTVELE1BQU0s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LENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7O2dIQXhYVSxtQkFBbUI7b0dBQW5CLG1CQUFtQixrYUN4QmhDLGc3T0FxS2UsZ3VDRGxKRDtRQUNWLFNBQVM7UUFDVCxZQUFZO0tBQ2I7MkZBRVUsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLGFBQWEsY0FFWDt3QkFDVixTQUFTO3dCQUNULFlBQVk7cUJBQ2I7d1NBSVEsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRU4sbUJBQW1CO3NCQURsQixNQUFNO2dCQUd1QixlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0b3JSZWZ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW1nUGljdHVyZURUTywgUGFyYW1zSW1nTWFuYWdlckRUTyB9IGZyb20gJy4uLy4uL2R0by9pbWctbWFuYWdlci5kdG8nO1xuaW1wb3J0IHsgSW1nTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbWctbWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YmplY3QsIGNvbWJpbmVMYXRlc3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHRha2UsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEltZ0V2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ltZy1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEltZ1NlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbWctc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VzZXItc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZUZpbHRlcnMgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YWJsZS9maWx0ZXJzLXRhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGljdHVyZU5hbWVVcGRhdGUgfSBmcm9tICcuLi8uLi9kdG8vcGljdHVyZS1uYW1lLXVwZGF0ZS5kdG8nO1xuaW1wb3J0IHsgZWFzZUluT3V0IH0gZnJvbSAnLi4vLi4vYW5pbWF0aW9ucy9lYXNlSW5PdXQvZWFzZS1pbi1vdXQuYW5pbWF0aW9uJztcbmltcG9ydCB7IGluc2VydFJlbW92ZSB9IGZyb20gJy4uLy4uL2FuaW1hdGlvbnMvaW5zZXJ0UmVtb3ZlL2luc2VydC1yZW1vdmUuYW5pbWF0aW9uJztcbmltcG9ydCB7IHN0YXRlRGlzcGxheWVkLCB0YWJEaXNwbGF5ZWQgfSBmcm9tICcuLi8uLi9kdG8vZXhwb3J0LWR0b3MuYXBpJztcbmltcG9ydCB7IFJlbmFtZVBpY3R1cmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVuYW1lLXBpY3R1cmUuc2VydmljZSc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hbGVydC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaW1hZ2VzLXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2VzLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBhbmltYXRpb25zOiBbXG4gICAgZWFzZUluT3V0LFxuICAgIGluc2VydFJlbW92ZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlc1ZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcblxuICBASW5wdXQoKSBzdGF0ZURpc3BsYXllZDogc3RhdGVEaXNwbGF5ZWQ7XG4gIEBJbnB1dCgpIHRhYkRpc3BsYXllZDogdGFiRGlzcGxheWVkO1xuICBASW5wdXQoKSBmdWxsU2l6ZTogYm9vbGVhbjtcbiAgQElucHV0KCkgbmJSb3dUb1Nob3c6IG51bWJlcjtcbiAgQElucHV0KCkgbGlzdERpc3BsYXllZCA9IGZhbHNlOyAvLyBEaXNwbGF5IGZvcm1hdCBsaXN0IG9yIG1vc2FpY1xuICBASW5wdXQoKSBtdWx0aXBsZUltZ01vZGUgPSBmYWxzZTtcbiAgQE91dHB1dCgpXG4gIHN3aXRjaERpc3BsYXlXaW5kb3c6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKCdpbWdMaWJDb250YWluZXInKSBpbWdMaWJDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gIHdpZHRoTGFyZ2VDYXJkOiBudW1iZXIgPSAyMTk7IC8vIERlZmF1bHQgdmFsdWUgb2YgYSBjYXJkIHdpZHRoIDE5OSArIG1hcmdpbiAyMFxuICB3aWR0aFNtYWxsQ2FyZDogbnVtYmVyID0gMTYwOyAvLyBEZWZhdWx0IHZhbHVlIG9mIGEgY2FyZCB3aWR0aCAxNDAgKyBtYXJnaW4gMjBcbiAgbmJNaW5JbWdQZXJMaW5lOiBudW1iZXI7XG4gIG5iTWF4SW1nUGVyTGluZTogbnVtYmVyO1xuICBuYkZha2VJbWc6IG51bWJlciA9IDA7XG5cbiAgaW1nRnVsbFdpZHRoQ29uZmlnOmFueSA9IFtcbiAgICB7XG4gICAgICBtYXg6IDQxOSxcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAxLFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuNVxuICAgIH0sXG4gICAge1xuICAgICAgbWF4OiA0OTksXG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMSxcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjVcbiAgICB9LFxuICAgIHtcbiAgICAgIG1heDogNzE5LCAvLyB0YWJsZXRcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjUsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC4zMzMzXG4gICAgfSxcbiAgICB7XG4gICAgICBtYXg6IDEwMjMsIC8vIGRlc2tvcFxuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMzMzMyxcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjJcbiAgICB9LFxuICAgIHtcbiAgICAgIG1heDogMTM5OSxcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjI1LFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMTI1XG4gICAgfSxcbiAgICB7XG4gICAgICBtYXg6IDE1OTksXG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMC4yLFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMTExMVxuICAgIH0sXG4gICAge1xuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMTY2NixcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjFcbiAgICB9XG4gIF07XG5cbiAgaW1nV2lkdGhDb25maWc6YW55ID0gW1xuICAgIHtcbiAgICAgIG1heDogMTAyNCxcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjI1LFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMTI1XG4gICAgfSxcbiAgICB7XG4gICAgICBtYXg6IDExOTksXG4gICAgICBsYXJnZUltZ1dpZHRoRmFjdG9yIDogMC4zMzMzLFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMlxuICAgIH0sXG4gICAge1xuICAgICAgbWF4OiAxMjk5LFxuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMzMzMyxcbiAgICAgIHNtYWxsSW1nV2lkdGhGYWN0b3IgOiAwLjE2NjZcbiAgICB9LFxuICAgIHtcbiAgICAgIG1heDogMTM5OSxcbiAgICAgIGxhcmdlSW1nV2lkdGhGYWN0b3IgOiAwLjI1LFxuICAgICAgc21hbGxJbWdXaWR0aEZhY3RvciA6IDAuMTY2NlxuICAgIH0sXG4gICAge1xuICAgICAgbWF4OiAxNTk5LFxuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMjUsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC4xNFxuICAgIH0sXG4gICAge1xuICAgICAgbGFyZ2VJbWdXaWR0aEZhY3RvciA6IDAuMjUsXG4gICAgICBzbWFsbEltZ1dpZHRoRmFjdG9yIDogMC4xMjVcbiAgICB9XG4gIF07XG5cbiAgbmJJbWdUb0RlbFNlbGVjdGVkOiBudW1iZXIgPSAwO1xuICBkaXNhYmxlOiBib29sZWFuID0gZmFsc2U7IC8vIFVzZSB0byBkaXNhYmxlIGFjdGlvbiBkdXJpbmcgc2VydmVyIHJlcXVlc3RcbiAgZGVsTGlzdEltZ0xvYWRlciA9IGZhbHNlO1xuICBpbml0Q29tcG9uZW50OiBib29sZWFuID0gdHJ1ZTtcbiAgZmFpbExvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBjb25maXJtSW1nU3VwOmJvb2xlYW4gPSBmYWxzZTtcbiAgcHJldmlvdXNTZWFyY2hWYWx1ZTogc3RyaW5nO1xuXG4gIGdldCBzZWFyY2hJbWFnZXNQYXJhbWV0ZXJzJCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbWdNYW5hZ2VyLnNlYXJjaEltYWdlc1BhcmFtZXRlcnMkO1xuICB9XG5cbiAgLy8gQXBpIEltZyBtYW5hZ2VyIFBhcmFtc1xuICBwYXJhbXM6UGFyYW1zSW1nTWFuYWdlckRUTztcblxuICBwcml2YXRlIGVycm9yR2V0QWxsSW1nID0gJ0ltZ01hbmFnZXIuSW1nTGliLmVycm9yR2V0QWxsSW1nJztcbiAgcHJpdmF0ZSBlcnJvckdldFRvdGFsSW1nID0gJ0ltZ01hbmFnZXIuSW1nTGliLmVycm9yR2V0VG90YWxJbWcnO1xuICBwcml2YXRlIGVycm9yR2V0SW1nID0gJ0ltZ01hbmFnZXIuSW1nTGliLmVycm9yR2V0Q2FudmFJbWcnO1xuICBwcml2YXRlIGVycm9yUmVtb3ZlSW1nID0gJ0ltZ01hbmFnZXIuSW1nTGlzdC5lcnJvclJlbW92ZUltZyc7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgdm0kID0gY29tYmluZUxhdGVzdCh7XG4gICAgaW1hZ2VTZWxlY3Rpb246IHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5pbWdTZWxlY3Rpb24kLFxuICAgIGltYWdlTGlzdERhdGE6IHRoaXMuaW1nTWFuYWdlci5pbWFnZUxpc3QkLFxuICAgIGlzTG9hZGluZzogdGhpcy5pbWdNYW5hZ2VyLmlzTG9hZGluZyQsXG4gICAgc2VhcmNoSW1hZ2VzUGFyYW1ldGVyczogdGhpcy5pbWdNYW5hZ2VyLnNlYXJjaEltYWdlc1BhcmFtZXRlcnMkLFxuICB9KS5waXBlKFxuICAgIG1hcCgoe2ltYWdlU2VsZWN0aW9uLCBpbWFnZUxpc3REYXRhOiB7aW1hZ2VMaXN0LCBpbWFnZVRvdGFsfSwgaXNMb2FkaW5nLCBzZWFyY2hJbWFnZXNQYXJhbWV0ZXJzfSkgPT4ge1xuICAgICAgdGhpcy5pbml0VmFyaWFibGVzKHRydWUpO1xuICAgICAgdGhpcy5jYWxjdWxhdGVOYkltZ0Zha2UoaW1hZ2VMaXN0LmRhdGEubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHBpY3R1cmVzTGlzdCA9IHRoaXMuc2V0U2VsZWN0ZWRQcm9wZXJ0eShpbWFnZVNlbGVjdGlvbiwgaW1hZ2VMaXN0LmRhdGEpO1xuICAgICAgdGhpcy5yZW5hbWVQaWN0dXJlU2VydmljZS5zZXRQaWN0dXJlc0xpc3QocGljdHVyZXNMaXN0KTtcblxuICAgICAgY29uc3QgdGFibGVGaWx0ZXJzIDogVGFibGVGaWx0ZXJzID0gdGhpcy5nZXRUYWJsZUZpbHRlcnMoc2VhcmNoSW1hZ2VzUGFyYW1ldGVycywgaW1hZ2VUb3RhbCk7XG4gICAgICBjb25zdCBrZWVwSW1hZ2VzRGlzcGxheWVkID0gKHRoaXMudGFiRGlzcGxheWVkID09PSAnaW1nLXVwbG9hZCcgJiYgc2VhcmNoSW1hZ2VzUGFyYW1ldGVycy5wYWdlID09PSAnMScpIHx8ICh0aGlzLnRhYkRpc3BsYXllZCA9PT0gJ2ltYWdlcy12aWV3JyAmJiBpbWFnZUxpc3QuZGF0YS5sZW5ndGggJiYgc2VhcmNoSW1hZ2VzUGFyYW1ldGVycy5wYWdlID09PSAnMScpO1xuXG4gICAgICBjb25zdCBza2lwU2V0SW1hZ2VzVG9EaXNwbGF5ID0gISFwaWN0dXJlc0xpc3Q/Lmxlbmd0aCAmJiB0aGlzLnRhYkRpc3BsYXllZCA9PT0gJ2ltZy11cGxvYWQnICYmIHNlYXJjaEltYWdlc1BhcmFtZXRlcnMucGFnZSA9PT0gJzEnO1xuICAgICAgY29uc3QgaGlkZVVudGlsRmV0Y2hlZEZpcnN0UGFnZUltYWdlc0ZvclRhYlVwbG9hZCA9IHRoaXMudGFiRGlzcGxheWVkID09PSAnaW1nLXVwbG9hZCcgJiYgKHNlYXJjaEltYWdlc1BhcmFtZXRlcnMucGFnZSAhPT0gJzEnIHx8IGltYWdlTGlzdD8ucGFnZSAhPT0gMSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzTG9hZGluZzogaGlkZVVudGlsRmV0Y2hlZEZpcnN0UGFnZUltYWdlc0ZvclRhYlVwbG9hZCB8fCAha2VlcEltYWdlc0Rpc3BsYXllZCAmJiBpc0xvYWRpbmcsXG4gICAgICAgIGRpc3BsYXlQZXhlbHNSZXN1bHRzOiAhaXNMb2FkaW5nICYmIGltYWdlVG90YWwgPT09IDAsXG4gICAgICAgIHBpY3R1cmVzTGlzdCxcbiAgICAgICAgaW1hZ2VUb3RhbCxcbiAgICAgICAgdGFibGVGaWx0ZXJzLFxuICAgICAgICBza2lwU2V0SW1hZ2VzVG9EaXNwbGF5XG4gICAgICB9XG4gICAgfSlcbiAgKVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW1nTWFuYWdlcjogSW1nTWFuYWdlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbWdFdmVudFNlcnZpY2U6IEltZ0V2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGltZ1NlbGVjdGlvblNlcnZpY2U6IEltZ1NlbGVjdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJTZXR0aW5nc1NlcnZpY2U6IFVzZXJTZXR0aW5nc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5hbWVQaWN0dXJlU2VydmljZTogUmVuYW1lUGljdHVyZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxuXG4gIHByaXZhdGUgZ2V0VGFibGVGaWx0ZXJzKHNlYXJjaEltYWdlc1BhcmFtZXRlcnM6IGFueSwgaW1hZ2VUb3RhbDogYW55KTogVGFibGVGaWx0ZXJzIHtcbiAgICByZXR1cm4ge1xuICAgICAgc29ydDogdW5kZWZpbmVkLFxuICAgICAgb3JkZXI6IHVuZGVmaW5lZCxcbiAgICAgIHNlYXJjaFZhbHVlOiBzZWFyY2hJbWFnZXNQYXJhbWV0ZXJzLnNlYXJjaCxcbiAgICAgIHRvdGFsSXRlbXM6IGltYWdlVG90YWwsXG4gICAgICBpdGVtc1BlclBhZ2U6IHBhcnNlSW50KHNlYXJjaEltYWdlc1BhcmFtZXRlcnMubGltaXQpLFxuICAgICAgY3VycmVudFBhZ2U6IHBhcnNlSW50KHNlYXJjaEltYWdlc1BhcmFtZXRlcnMucGFnZSlcbiAgICB9O1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMudm0kLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgZmlsdGVyKCh7c2tpcFNldEltYWdlc1RvRGlzcGxheX0pID0+ICFza2lwU2V0SW1hZ2VzVG9EaXNwbGF5KVxuICAgICAgKS5zdWJzY3JpYmUoKHt0YWJsZUZpbHRlcnN9KSA9PntcbiAgICAgICAgIHRoaXMuc2V0TmJJbWdUb0Rpc3BsYXkodGFibGVGaWx0ZXJzKVxuICAgICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cnVlIDogZ28gdG8gbGlzdCBkaXNwbGF5XG4gICAqIGZhbHNlIDogZ28gdG8gbW9zYWljIGRpc3BsYXlcbiAgICogQHBhcmFtIGFjdGl2YXRlXG4gICAqL1xuICBvblN3aXRjaEZvcm1hdERpc3BsYXllZChhY3RpdmF0ZTogYm9vbGVhbikge1xuICAgIHRoaXMubGlzdERpc3BsYXllZCA9IGFjdGl2YXRlO1xuICAgIHRoaXMudXNlclNldHRpbmdzU2VydmljZS5zZXRVc2VyRGlzcGxheVByZWZlcmVuY2UoYWN0aXZhdGUpO1xuICAgIHRoaXMuaW1nRXZlbnRTZXJ2aWNlLmVtaXRsaXN0RGlzcGxheWVkQ2hhbmdlKGFjdGl2YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWwgdGhlIG51bWJlciBvZiBpbWcgc2VsZWN0ZWQgZm9yIG1hc3NlIGRlbGV0aW9uXG4gICAqL1xuICBvbkltZ1NlbGVjdGVkKHBpY3R1cmVzTGlzdDogSW1nUGljdHVyZURUT1tdKSB7XG4gICAgdGhpcy5zZXROYkltZ1RvRGVsU2VsZWN0ZWQocGljdHVyZXNMaXN0KTtcbiAgfVxuXG4gIG9uUmVuYW1lUGljdHVyZShwaWN0dXJlUmVuYW1lZDogUGljdHVyZU5hbWVVcGRhdGUpIHtcbiAgICBjb25zb2xlLmxvZygnb25SZW5hbWVQaWN0dXJlIHBpY3R1cmVSZW5hbWVkJywgcGljdHVyZVJlbmFtZWQpO1xuICAgIHRoaXMucmVuYW1lUGljdHVyZVNlcnZpY2UucmVuYW1lUGljdHVyZShwaWN0dXJlUmVuYW1lZCk7XG4gIH1cblxuICByZW1vdmVMaXN0SW1nKHBpY3R1cmVzTGlzdDogSW1nUGljdHVyZURUT1tdKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGUgPSB0cnVlO1xuICAgIHRoaXMuZGVsTGlzdEltZ0xvYWRlciA9IHRydWU7XG4gICAgdGhpcy5jb25maXJtSW1nU3VwID0gZmFsc2U7XG5cbiAgICAvLyBHZXQgdGhlIGlkIG9mIHRoZSBpbWcgdG8gcmVtb3ZlXG4gICAgLy8gQW5kIGFkZCBkZWxldGVkIHByb3BlcnR5XG4gICAgY29uc3QgaWRJbWdUb1JlbW92ZTogc3RyaW5nW10gPSBbXTtcbiAgICBwaWN0dXJlc0xpc3QuZm9yRWFjaCggaW1nID0+IHtcbiAgICAgIGlmIChpbWcuZGVsU2VsZWN0ZWQpIHtcbiAgICAgICAgaW1nLmRlbGV0ZWQgPSB0cnVlO1xuICAgICAgICBpZEltZ1RvUmVtb3ZlLnB1c2goaW1nLmlkX2ZpbGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5pbWdNYW5hZ2VyLnJlbW92ZU11bHRpcGxlSW1nKGlkSW1nVG9SZW1vdmUpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5yZW1vdmVJbWdTZWxlY3Rpb25CeUlkcyhpZEltZ1RvUmVtb3ZlKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLmltZ01hbmFnZXIucmVmcmVzaEltYWdlTGlzdCQubmV4dCgpO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5vcGVuQWxlcnQodGhpcy5lcnJvclJlbW92ZUltZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RJbWdDaG9zZW4ocGljdHVyZXNMaXN0OiBJbWdQaWN0dXJlRFRPW10pIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBpY3R1cmVzTGlzdFNlbGVjdGVkOiBJbWdQaWN0dXJlRFRPW10gPSBbXTtcbiAgICBwaWN0dXJlc0xpc3QubWFwKGltZyA9PiB7XG4gICAgICBpZihpbWcuZGVsU2VsZWN0ZWQpIHtcbiAgICAgICAgaW1nLmRlbFNlbGVjdGVkID1mYWxzZTtcbiAgICAgICAgaW1nLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpbWcuc2VsZWN0ZWQpIHtcbiAgICAgICAgcGljdHVyZXNMaXN0U2VsZWN0ZWQucHVzaChpbWcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc2V0TmJJbWdUb0RlbFNlbGVjdGVkKHBpY3R1cmVzTGlzdCk7XG4gICAgdGhpcy5pbWdTZWxlY3Rpb25TZXJ2aWNlLnNldEltZ1NlbGVjdGlvbihwaWN0dXJlc0xpc3RTZWxlY3RlZCk7XG4gIH1cblxuICBkaXNwbGF5Q29uZmlybUltZ1N1cCgpe1xuICAgIGlmICh0aGlzLmRpc2FibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb25maXJtSW1nU3VwID0gdHJ1ZTtcbiAgfVxuXG4gIGNhbmNlbFN1cCgpIHtcbiAgICB0aGlzLmNvbmZpcm1JbWdTdXAgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0IHdoZW4gYSBpbWcgc2VsZWN0ZWQgaW4gb3JkZXIgdG8gZGVsZXRlXG4gICAqL1xuICBvblBpY3R1cmVzTGlzdENoYW5nZShwaWN0dXJlc0xpc3Q6IEltZ1BpY3R1cmVEVE9bXSkge1xuICAgIHRoaXMuc2V0TmJJbWdUb0RlbFNlbGVjdGVkKHBpY3R1cmVzTGlzdCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGRlZmF1bHQgbnVtYmVyIG9mIGltZyBwZXIgcGFnZSB0byBkaXNwbGF5IGF0IHRoZSBpbml0aWFsaXNhdGlvblxuICAgKiBUaGlzIG51bWJlciBpcyBiZXR3ZWVuIDMwIGFuZCA1MFxuICAgKi9cbiAgcHJpdmF0ZSBzZXROYkltZ1RvRGlzcGxheSh0YWJsZUZpbHRlcnM6IFRhYmxlRmlsdGVycykge1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5pbWdMaWJDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArIDMwOyAvLyArIDMwcHggLT4gbGVmdCArIHJpZ2h0IG1hcmdpblxuICAgIGNvbnN0IHNjcm9sbFdpZHRoID0gd2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoO1xuXG4gICAgY29uc3QgW21heEltZ1dpZHRoRmFjdG9yLCBtaW5JbWdXaWR0aEZhY3Rvcl0gPSB0aGlzLmdldEltZ1dpZHRoRmFjdG9ycygpO1xuXG4gICAgY29uc3QgbWluSW1nV2lkdGggPSBNYXRoLmZsb29yKGNvbnRhaW5lcldpZHRoICogbWluSW1nV2lkdGhGYWN0b3IpO1xuICAgIGNvbnN0IG1heEltZ1dpZHRoID0gTWF0aC5jZWlsKChjb250YWluZXJXaWR0aCArIHNjcm9sbFdpZHRoICkgKiBtYXhJbWdXaWR0aEZhY3Rvcik7XG5cbiAgICB0aGlzLm5iTWF4SW1nUGVyTGluZSA9IE1hdGguZmxvb3IoY29udGFpbmVyV2lkdGggLyBtaW5JbWdXaWR0aCk7XG4gICAgdGhpcy5uYk1pbkltZ1BlckxpbmUgPSBNYXRoLmZsb29yKCAoY29udGFpbmVyV2lkdGggKyBzY3JvbGxXaWR0aCApIC8gbWF4SW1nV2lkdGgpO1xuXG4gICAgdGhpcy5zZWFyY2hJbWFnZXNQYXJhbWV0ZXJzJC5uZXh0KHRoaXMuZ2V0UGFyYW1zKHtcbiAgICAgIC4uLnRhYmxlRmlsdGVycyxcbiAgICAgIGl0ZW1zUGVyUGFnZTogdGhpcy5nZXRUb3RhbEltZ1BlclBhZ2UoKSxcbiAgICAgIGN1cnJlbnRQYWdlOiAxXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbWdXaWR0aEZhY3RvcnMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgbGV0IG1pbldpZHRoOm51bWJlciA9IDA7XG4gICAgbGV0IGltZ1NpemVzQ29uZmlnOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgY29uc3QgY3VycmVudEltZ1dpZHRoQ29uZmlnID0gdGhpcy5mdWxsU2l6ZSA/IHRoaXMuaW1nRnVsbFdpZHRoQ29uZmlnIDogdGhpcy5pbWdXaWR0aENvbmZpZztcblxuICAgIGZvciAoY29uc3Qgd2lkdGhDb25maWcgb2YgY3VycmVudEltZ1dpZHRoQ29uZmlnKSB7XG4gICAgICAgIGlmICghd2lkdGhDb25maWcubWF4KSB7XG4gICAgICAgICAgaW1nU2l6ZXNDb25maWcgPSBbd2lkdGhDb25maWcubGFyZ2VJbWdXaWR0aEZhY3Rvciwgd2lkdGhDb25maWcuc21hbGxJbWdXaWR0aEZhY3Rvcl07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pbldpZHRoIDwgc2NyZWVuV2lkdGggJiYgc2NyZWVuV2lkdGggPD0gd2lkdGhDb25maWcubWF4KSB7XG4gICAgICAgICAgaW1nU2l6ZXNDb25maWcgPSBbd2lkdGhDb25maWcubGFyZ2VJbWdXaWR0aEZhY3Rvciwgd2lkdGhDb25maWcuc21hbGxJbWdXaWR0aEZhY3Rvcl07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbWluV2lkdGggPSB3aWR0aENvbmZpZy5tYXg7XG4gICAgfVxuICAgIHJldHVybiBpbWdTaXplc0NvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG90YWxJbWdQZXJQYWdlKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMubmJSb3dUb1Nob3cpIHtcbiAgICAgIGNvbnN0IG5iSW1nUGVyTGluZSA9IHRoaXMuc3RhdGVEaXNwbGF5ZWQgPT09ICdmdWxsJyA/IHRoaXMubmJNaW5JbWdQZXJMaW5lIDogdGhpcy5uYk1heEltZ1BlckxpbmU7XG4gICAgICByZXR1cm4gbmJJbWdQZXJMaW5lICogdGhpcy5uYlJvd1RvU2hvdztcbiAgICB9XG5cbiAgICBsZXQgdG90YWwgPSB0aGlzLm5iTWluSW1nUGVyTGluZTtcblxuICAgIHdoaWxlICh0b3RhbCA8IDMwIHx8IHRvdGFsICUgdGhpcy5uYk1heEltZ1BlckxpbmUgIT09IDAgfHwgIHRvdGFsICUgdGhpcy5uYk1pbkltZ1BlckxpbmUgIT09IDApIHtcbiAgICAgIHRvdGFsICs9IHRoaXMubmJNaW5JbWdQZXJMaW5lO1xuICAgIH1cblxuICAgIHJldHVybiB0b3RhbDtcbiAgfVxuXG4gIGdldFBhcmFtcyh0YWJsZUZpbHRlcnM6IFRhYmxlRmlsdGVycykge1xuICAgIHJldHVybiB7XG4gICAgICBsaW1pdDogdGFibGVGaWx0ZXJzLml0ZW1zUGVyUGFnZS50b1N0cmluZygpLFxuICAgICAgcGFnZTogdGFibGVGaWx0ZXJzLmN1cnJlbnRQYWdlLnRvU3RyaW5nKCksXG4gICAgICAgLi4uKHRhYmxlRmlsdGVycy5zZWFyY2hWYWx1ZSAmJiB7IHNlYXJjaDogdGFibGVGaWx0ZXJzLnNlYXJjaFZhbHVlLnRvU3RyaW5nKCkgfSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFZhcmlhYmxlcyhsb2FkaW5nU3VjY2VzczogYm9vbGVhbikge1xuICAgIHRoaXMubmJJbWdUb0RlbFNlbGVjdGVkID0gMDtcbiAgICB0aGlzLmRpc2FibGUgPSBmYWxzZTtcbiAgICB0aGlzLmRlbExpc3RJbWdMb2FkZXIgPSBmYWxzZTtcbiAgICB0aGlzLmluaXRDb21wb25lbnQgPSBmYWxzZTtcbiAgICB0aGlzLmZhaWxMb2FkZWQgPSAhbG9hZGluZ1N1Y2Nlc3M7XG4gICAgdGhpcy5uYkZha2VJbWcgPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTZWxlY3RlZFByb3BlcnR5KGltZ1NlbGVjdGVkTGlzdDogSW1nUGljdHVyZURUT1tdLCBwaWN0dXJlc0xpc3Q6IEltZ1BpY3R1cmVEVE9bXSkge1xuICAgIGNvbnN0IHBpY3R1cmVzTGlzdFNlbGVjdGVkOiBJbWdQaWN0dXJlRFRPW10gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBpY3R1cmVzTGlzdCkpO1xuICAgIGltZ1NlbGVjdGVkTGlzdC5mb3JFYWNoKGltZyA9PiB7XG4gICAgICBjb25zdCBzZWxlY3RlZEltZyA9IHBpY3R1cmVzTGlzdFNlbGVjdGVkLmZpbmQocGljdHVyZSA9PiBwaWN0dXJlLmlkX2ZpbGUgPT09IGltZy5pZF9maWxlKTtcbiAgICAgIGlmIChzZWxlY3RlZEltZykge1xuICAgICAgICBzZWxlY3RlZEltZy5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHBpY3R1cmVzTGlzdFNlbGVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGltZyBsaXN0IGluIG9yZGVyIHRvIGZpbGwgcHJvcGVybHkgYWxsIHRoZSBsaW5lIG9mIGltYWdlcyBkaXNwbGF5ZWQgaW4gbW9zYWljLlxuICAgKiBPdGhlcndpc2UsIHRoZSBzcGFjZS1iZXR3ZWVuIGNzcyB3aWxsIGRvIGEgYmFkIGRpc3BsYXlcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlTmJJbWdGYWtlKG5iSW1nRGlzcGxheWVkOiBudW1iZXIpIHtcbiAgICBjb25zdCBuYkltZ1BlckxpbmUgPSB0aGlzLnN0YXRlRGlzcGxheWVkID09PSAnc21hbGwnIHx8IHRoaXMudGFiRGlzcGxheWVkID09PSAnaW1nLXVwbG9hZCcgPyB0aGlzLm5iTWF4SW1nUGVyTGluZSA6IHRoaXMubmJNaW5JbWdQZXJMaW5lO1xuXG4gICAgaWYgKGlzTmFOKG5iSW1nRGlzcGxheWVkICUgbmJJbWdQZXJMaW5lKSkge1xuICAgICAgdGhpcy5uYkZha2VJbWcgPSAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChuYkltZ0Rpc3BsYXllZCAlIG5iSW1nUGVyTGluZSAhPT0gMCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMubmJGYWtlSW1nID0gbmJJbWdQZXJMaW5lIC0gbmJJbWdEaXNwbGF5ZWQgJSBuYkltZ1BlckxpbmU7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldE5iSW1nVG9EZWxTZWxlY3RlZCAocGljdHVyZXNMaXN0OiBJbWdQaWN0dXJlRFRPW10pIHtcbiAgICB0aGlzLm5iSW1nVG9EZWxTZWxlY3RlZCA9IHBpY3R1cmVzTGlzdC5maWx0ZXIoaW1nID0+IGltZy5kZWxTZWxlY3RlZCkubGVuZ3RoO1xuXG4gICAgaWYgKCF0aGlzLm5iSW1nVG9EZWxTZWxlY3RlZCkge1xuICAgICAgdGhpcy5jb25maXJtSW1nU3VwID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoRGlzcGxheVdpbmRvd01vc2FpYygpIHtcbiAgICB0aGlzLnN3aXRjaERpc3BsYXlXaW5kb3cuZW1pdCh0cnVlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInZtJCB8IGFzeW5jIGFzIHZtXCI+XG5cbiAgPGRpdiBjbGFzcz1cImltYWdlcy12aWV3XCIgW25nQ2xhc3NdPVwieydmdWxsU2l6ZSc6IGZ1bGxTaXplLCAnc21hbGwnOiBzdGF0ZURpc3BsYXllZCA9PT0gJ3NtYWxsJ31cIiBbQGVhc2VJbk91dF09XCInaW4nXCI+XG4gICAgPCEtLSBTdWJoZWFkZXIgOiBJbWcgbnVtYmVyIGFuZCBhY3Rpb25zIGJ0biAoc3VwIGltZyBsaXN0LCBzd2l0Y2ggZm9ybWEgZGlzcGxheSkgLS0+XG4gICAgPGRpdlxuICAgICpuZ0lmPVwiKHN0YXRlRGlzcGxheWVkICE9PSAnc21hbGwnIHx8IHRhYkRpc3BsYXllZCA9PT0gJ2ltZy11cGxvYWQnKVwiXG4gICAgY2xhc3M9XCJpbWFnZXMtdmlld19fY29udGFpbmVyXCJcbiAgICBbbmdDbGFzc109XCJ7J2ltYWdlcy12aWV3X19jb250YWluZXItLXVwbG9hZFRhYic6IHRhYkRpc3BsYXllZCA9PT0gJ2ltZy11cGxvYWQnLCAnaW1hZ2VzLXZpZXdfX2NvbnRhaW5lci0td2luZG93Jzogc3RhdGVEaXNwbGF5ZWQgPT09ICd3aW5kb3cnfVwiXG4gICAgPlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwidGFiRGlzcGxheWVkICE9PSAnaW1nLXVwbG9hZCdcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cIm1haW5Db2xvclwiIFtuZ0NsYXNzXT1cInsnaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fdG90YWwtLWhpZGUnOiB2bS5kaXNwbGF5UGV4ZWxzUmVzdWx0c31cIj57eyAnSW1nTWFuYWdlci5JbWdMaWIubmJJbWcnIHwgdHJhbnNsYXRlIH19IDoge3t2bS5pbWFnZVRvdGFsfX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJ0YWJEaXNwbGF5ZWQgPT09ICdpbWctdXBsb2FkJ1wiPlxuICAgICAgICAgIDxwIGNsYXNzPVwibWFpbkNvbG9yXCI+e3sgJ0ltZ01hbmFnZXIuSW1nTGliLmxhc3RJbWdzJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaGFzLWFkZG9ucyBzdWJIZWFkZXJBY3Rpb25zXCIgKm5nSWY9XCJ0YWJEaXNwbGF5ZWQgIT09ICdpbWctdXBsb2FkJ1wiPlxuXG4gICAgICAgICAgPCEtLSBGb3IgbGlzdGZvcm1hIDogRGlzcGxheSBidG4gZGVsIG11bHRpcGxlIGltZyAmIENvbmZpcm0gYWN0aW9uIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZXMtdmlld19fY29udGFpbmVyX19ib3hBY3Rpb25cIj5cblxuXG4gICAgICAgICAgICAgIDwhLS0gU2VsZWN0IC0tPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24gc3VjY2VzcyBpbWFnZXMtdmlld19fY29udGFpbmVyX19ib3hBY3Rpb25fX2ltcG9ydFwiXG4gICAgICAgICAgICAgICAgQGluc2VydFJlbW92ZUFubmltXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJsaXN0RGlzcGxheWVkICYmIG5iSW1nVG9EZWxTZWxlY3RlZCAmJiAhY29uZmlybUltZ1N1cCAmJiAhZGVsTGlzdEltZ0xvYWRlciAmJiBtdWx0aXBsZUltZ01vZGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RJbWdDaG9zZW4odm0ucGljdHVyZXNMaXN0KVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYWwgZmEtY2hlY2tcIj48L2k+XG4gICAgICAgICAgICAgICAgICB7eyAnSW1nTWFuYWdlci5JbWdMaWIuc2VsZWN0JyB8IHRyYW5zbGF0ZSB9fSAoe3tuYkltZ1RvRGVsU2VsZWN0ZWR9fSlcbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPCEtLSBEaXNwbGF5IGJ0biBkZWwgbXVsdGlwbGUgaW1nIC0tPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJsaXN0RGlzcGxheWVkICYmIG5iSW1nVG9EZWxTZWxlY3RlZCAmJiAhY29uZmlybUltZ1N1cFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRpc3BsYXlDb25maXJtSW1nU3VwKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGltYWdlcy12aWV3X19jb250YWluZXJfX2JveEFjdGlvbl9fZGVsQnRuIGRhbmdlclwiXG4gICAgICAgICAgICAgICAgQGluc2VydFJlbW92ZUFubmltXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFsIGZhLXRpbWVzXCI+PC9pPnt7ICdJbWdNYW5hZ2VyLkltZ0xpYi5kZWxNbHQnIHwgdHJhbnNsYXRlIH19ICh7e25iSW1nVG9EZWxTZWxlY3RlZH19KVxuICAgICAgICAgICAgICAgICAgPHNwYW4gYnRuTG9hZGluZ0FuaW0gKm5nSWY9XCJkZWxMaXN0SW1nTG9hZGVyXCIgY2xhc3M9XCJidG5Mb2FkaW5nQW5uaW1hdGlvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPCEtLSBDb25maXJtIGFjdGlvbiAtLT5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fYm94QWN0aW9uX19jb25maXJtU3VwXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ltYWdlcy12aWV3X19jb250YWluZXJfX2JveEFjdGlvbl9fY29uZmlybVN1cC0tdmlzaWJsZSc6IGNvbmZpcm1JbWdTdXB9XCI+XG4gICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIm5iSW1nVG9EZWxTZWxlY3RlZCA+IDFcIiBjbGFzcz1cImltYWdlcy12aWV3X19jb250YWluZXJfX2JveEFjdGlvbl9fY29uZmlybVN1cF9fdGV4dFwiPnt7ICdJbWdNYW5hZ2VyLkltZ0xpYi5jb25maXJtU3VwUXVlc3Rpb25zJyB8IHRyYW5zbGF0ZTp7bmJJbWFnZTogbmJJbWdUb0RlbFNlbGVjdGVkfSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwibmJJbWdUb0RlbFNlbGVjdGVkID09PSAxXCIgY2xhc3M9XCJpbWFnZXMtdmlld19fY29udGFpbmVyX19ib3hBY3Rpb25fX2NvbmZpcm1TdXBfX3RleHRcIj57eyAnSW1nTWFuYWdlci5JbWdMaWIuY29uZmlybVN1cFF1ZXN0aW9uJyB8IHRyYW5zbGF0ZTp7bmJJbWFnZTogbmJJbWdUb0RlbFNlbGVjdGVkfSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24gaW1hZ2VzLXZpZXdfX2NvbnRhaW5lcl9fYm94QWN0aW9uX19jb25maXJtU3VwX19jYW5jZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbFN1cCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdJbWdNYW5hZ2VyLkltZ0xpYi5jYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUxpc3RJbWcodm0ucGljdHVyZXNMaXN0KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpbWFnZXMtdmlld19fY29udGFpbmVyX19kZWxCdG4gZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdJbWdNYW5hZ2VyLkltZ0xpYi5jb25maXJtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICA8IS0tIFN3aXRoIG1vc2FpYy9saXN0IGZvcm1hIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zIGltYWdlcy12aWV3X19jb250YWluZXJfX2J1dHRvbkJveFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1saWdodGVkIGltYWdlcy12aWV3X19jb250YWluZXJfX2J1dHRvbkJveF9fYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpZkRpc3BsYXllZCc6ICFsaXN0RGlzcGxheWVkfVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblN3aXRjaEZvcm1hdERpc3BsYXllZChmYWxzZSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpcy1zbWFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhciBmYS10aFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24gaXMtbGlnaHRlZCBpbWFnZXMtdmlld19fY29udGFpbmVyX19idXR0b25Cb3hfX2J0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aWZEaXNwbGF5ZWQnOiBsaXN0RGlzcGxheWVkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblN3aXRjaEZvcm1hdERpc3BsYXllZCh0cnVlKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpcy1zbWFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtYmFyc1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuXG4gICAgPCEtLSBJbWFnZXMgc2VjdGlvbiAtLT5cbiAgPG5nLXNjcm9sbGJhclxuICAgIGNsYXNzPVwiaW1hZ2VzLXZpZXdfX3Njcm9sbFwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ2ltYWdlcy12aWV3X19zY3JvbGwtLWhpZGUtLW1vc2FpYyc6IHZtLmRpc3BsYXlQZXhlbHNSZXN1bHRzICYmICFsaXN0RGlzcGxheWVkLFxuICAgICAgJ2ltYWdlcy12aWV3X19zY3JvbGwtLWhpZGUtLXRhYmxlJzogdm0uZGlzcGxheVBleGVsc1Jlc3VsdHMgJiYgbGlzdERpc3BsYXllZCxcbiAgICAgICdpbWFnZXMtdmlld19fc2Nyb2xsLS1mdWxsJzogc3RhdGVEaXNwbGF5ZWQgPT09ICdmdWxsJyxcbiAgICAgICdpbWFnZXMtdmlld19fc2Nyb2xsLS1zbWFsbERpc3BsYXknIDogc3RhdGVEaXNwbGF5ZWQgPT09ICdzbWFsbCcgJiYgdGFiRGlzcGxheWVkICE9PSAnaW1nLXVwbG9hZCcsXG4gICAgICAnaW1hZ2VzLXZpZXdfX3Njcm9sbC0tc21hbGxVcGxvYWREaXNwbGF5JyA6IHN0YXRlRGlzcGxheWVkID09PSAnc21hbGwnICYmIHRhYkRpc3BsYXllZCA9PT0gJ2ltZy11cGxvYWQnLFxuICAgICAgJ2ltYWdlcy12aWV3X19zY3JvbGwtLXdpbmRvdyc6IHN0YXRlRGlzcGxheWVkID09PSAnd2luZG93J1xuICB9XCJcbiAgPlxuICAgIDxkaXYgI2ltZ0xpYkNvbnRhaW5lciBjbGFzcz1cImltYWdlcy12aWV3X193cmFwcGVyXCI+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFsaXN0RGlzcGxheWVkIHx8IHN0YXRlRGlzcGxheWVkID09PSAnc21hbGwnXCIgW0BlYXNlSW5PdXRdPVwiJ2luJ1wiPlxuICAgICAgICAgIDxtb3NhaWMtdmlld1xuICAgICAgICAgICAgW3BpY3R1cmVzTGlzdF09XCJ2bS5waWN0dXJlc0xpc3RcIlxuICAgICAgICAgICAgKHBpY3R1cmVzTGlzdENoYW5nZSk9XCJvblBpY3R1cmVzTGlzdENoYW5nZSh2bS5waWN0dXJlc0xpc3QpXCJcbiAgICAgICAgICAgIFt0YWJsZUZpbHRlcnNdPVwidm0udGFibGVGaWx0ZXJzXCJcbiAgICAgICAgICAgIChmaWx0ZXJzQ2hhbmdlKT1cInNlYXJjaEltYWdlc1BhcmFtZXRlcnMkLm5leHQoZ2V0UGFyYW1zKHZtLnRhYmxlRmlsdGVycykpO1wiXG4gICAgICAgICAgICBbKGRpc2FibGUpXT1cImRpc2FibGVcIlxuICAgICAgICAgICAgKHBpY3R1cmVOYW1lQ2hhbmdlKT1cIm9uUmVuYW1lUGljdHVyZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzd2l0Y2hEaXNwbGF5V2luZG93KT1cInN3aXRjaERpc3BsYXlXaW5kb3dNb3NhaWMoKVwiXG4gICAgICAgICAgICBbbmJGYWtlSW1nXT1cIm5iRmFrZUltZ1wiXG4gICAgICAgICAgICBbc3RhdGVEaXNwbGF5ZWRdPVwic3RhdGVEaXNwbGF5ZWRcIlxuICAgICAgICAgICAgW3RhYkRpc3BsYXllZF09XCJ0YWJEaXNwbGF5ZWRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlQZXhlbHNSZXN1bHRzXT1cInZtLmRpc3BsYXlQZXhlbHNSZXN1bHRzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmddPVwidm0uaXNMb2FkaW5nXCJcbiAgICAgICAgICAgIFtmdWxsU2l6ZV09XCJmdWxsU2l6ZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvbW9zYWljLXZpZXc+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJsaXN0RGlzcGxheWVkICYmIHN0YXRlRGlzcGxheWVkICE9PSAnc21hbGwnXCIgW0BlYXNlSW5PdXRdPVwiJ2luJ1wiPlxuICAgICAgICAgIDx0YWJsZS12aWV3XG4gICAgICAgICAgICBbcGljdHVyZXNMaXN0XT1cInZtLnBpY3R1cmVzTGlzdFwiXG4gICAgICAgICAgICAocGljdHVyZXNMaXN0Q2hhbmdlKT1cIm9uUGljdHVyZXNMaXN0Q2hhbmdlKHZtLnBpY3R1cmVzTGlzdClcIlxuICAgICAgICAgICAgW3RhYmxlRmlsdGVyc109XCJ2bS50YWJsZUZpbHRlcnNcIlxuICAgICAgICAgICAgKGZpbHRlcnNDaGFuZ2UpPVwic2VhcmNoSW1hZ2VzUGFyYW1ldGVycyQubmV4dChnZXRQYXJhbXModm0udGFibGVGaWx0ZXJzKSk7XCJcbiAgICAgICAgICAgIFsoZGlzYWJsZSldPVwiZGlzYWJsZVwiXG4gICAgICAgICAgICAocGljdHVyZU5hbWVDaGFuZ2UpPVwib25SZW5hbWVQaWN0dXJlKCRldmVudClcIlxuICAgICAgICAgICAgW2Rpc3BsYXlQZXhlbHNSZXN1bHRzXT1cInZtLmRpc3BsYXlQZXhlbHNSZXN1bHRzXCJcbiAgICAgICAgICAgIFtzdGF0ZURpc3BsYXllZF09XCJzdGF0ZURpc3BsYXllZFwiXG4gICAgICAgICAgICBbaXNMb2FkaW5nXT1cInZtLmlzTG9hZGluZ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC90YWJsZS12aWV3PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1zY3JvbGxiYXI+XG5cbiAgPCEtLSBQZXhlbHMgU2VjdGlvbiAtIFdoZW4gbm8gaW1nIGZvdW5kIC0tPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJ2bS5kaXNwbGF5UGV4ZWxzUmVzdWx0c1wiXG4gICAgY2xhc3M9XCJpbWFnZXMtdmlldy0tcGV4ZWxzXCJcbiAgICBbQGVhc2VJbk91dF09XCInaW4nXCI+XG4gICAgPHBleGVscy1saWJcbiAgICAgIFtzZWFyY2hWYWx1ZV09XCJ2bS50YWJsZUZpbHRlcnMuc2VhcmNoVmFsdWVcIlxuICAgICAgW2Rpc2FibGVTZWFyY2hdPVwidHJ1ZVwiXG4gICAgPlxuICAgIDwvcGV4ZWxzLWxpYj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj4iXX0=