fabrikantencore 2.33.4 → 2.33.6

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,6 +1,7 @@
1
1
  import { ViewEncapsulation } from '@angular/core';
2
2
  import { Component } from '@angular/core';
3
3
  import { TranslationCategory, TranslationSubCategory, TextureRequestModel, FabrikantenFilterOptionViewModel } from '../../swagger/SwaggerClient';
4
+ import { FabFormDialogComponent } from '../fab-form-dialog/fab-form-dialog.component';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "../../services/mobile.service";
6
7
  import * as i2 from "../../services/fabrikanten.service";
@@ -42,15 +43,19 @@ class FabTextureConfiguratorComponent {
42
43
  LintvoegMin = 6;
43
44
  LintvoegMax = 14;
44
45
  Stootvoeg = 10;
45
- StootvoegMin = 6;
46
+ StootvoegMin = 0;
46
47
  StootvoegMax = 14;
47
48
  AantalStenen = 100;
48
49
  HiRes = false;
49
50
  Shade = true;
50
51
  Loading = false;
51
52
  SingleStoneMode = false;
53
+ DisableDuitsWildverband = false;
54
+ MixRatioSelect = false;
52
55
  TextureResponseModel = null;
53
56
  TextureMixResponseModel = null;
57
+ Kern = null;
58
+ //public StateDisplayForm: boolean = false;
54
59
  SelectedFormaat = null;
55
60
  StoneRowObjects = new Array();
56
61
  constructor(MobileService, FabrikantenService, TranslateService, ActivatedRoute, dialog, TextureApiClient, ChangeDetectorRef) {
@@ -87,6 +92,9 @@ class FabTextureConfiguratorComponent {
87
92
  }
88
93
  }
89
94
  ngOnInit() {
95
+ this.TextureApiClient.getKern().subscribe((model) => {
96
+ this.Kern = model;
97
+ });
90
98
  this.FabrikantenService.LoadFabrikantenViewModel(this.ChangeDetectorRef, this.ActivatedRoute, () => {
91
99
  this.FillArrays();
92
100
  var stone = this.ActivatedRoute.snapshot.paramMap.get('stone');
@@ -95,31 +103,42 @@ class FabTextureConfiguratorComponent {
95
103
  var stone_format = stone + "_" + format;
96
104
  for (var i = 0; i < this.StoneRowObjects.length; i++) {
97
105
  for (var j = 0; j < this.StoneRowObjects[i].options.length; j++) {
98
- if (this.StoneRowObjects[i].options[j].urlName == stone_format) {
99
- this.StoneRowObjects[i].Select(this.StoneRowObjects[i].options[j]);
100
- var formats = this.GetFormaat();
101
- for (var p = 0; p < formats.length; p++) {
102
- if (formats[p].urlName == format) {
103
- this.StoneRowObjects[i].FabTextureConfiguratorComponent.SelectedFormaat = formats[p];
106
+ for (var o = 0; o < this.StoneRowObjects[i].options[j].options.length; o++) {
107
+ if (this.StoneRowObjects[i].options[j].options[o].urlName == stone_format) {
108
+ this.StoneRowObjects[i].Select(this.StoneRowObjects[i].options[j].options[o]);
109
+ var formats = this.GetFormaat();
110
+ for (var p = 0; p < formats.length; p++) {
111
+ if (formats[p].urlName == format) {
112
+ this.StoneRowObjects[i].FabTextureConfiguratorComponent.SelectedFormaat = formats[p];
113
+ }
104
114
  }
115
+ this.SingleStoneMode = true;
116
+ return;
105
117
  }
106
- this.SingleStoneMode = true;
107
- return;
108
118
  }
109
119
  }
110
120
  }
111
121
  }
112
122
  });
113
123
  }
114
- IsLoading() {
115
- if (this.Loading) {
124
+ HasToFillForm() {
125
+ if (this.FabrikantenService.FabrikantenSettingsViewModel.downloadFormEnabled && !this.FabrikantenService.FabrikantenViewModel.hasFilledForms && !this.FabrikantenService.FabrikantenViewModel.skipForms) {
116
126
  return true;
117
127
  }
128
+ return false;
129
+ }
130
+ IsLoading() {
118
131
  if (this.FabrikantenService.IsLoadingSmall()) {
119
132
  return true;
120
133
  }
121
134
  return false;
122
135
  }
136
+ IsLoadingTextures() {
137
+ if (this.Loading) {
138
+ return true;
139
+ }
140
+ return false;
141
+ }
123
142
  IsTextureMix25() {
124
143
  return this.FabrikantenService.FabrikantenSettingsViewModel?.textureConfiguratorEnableMix25 == true;
125
144
  }
@@ -152,6 +171,9 @@ class FabTextureConfiguratorComponent {
152
171
  if (this.SelectedVoegId == -1) {
153
172
  return true;
154
173
  }
174
+ if (this.Loading) {
175
+ return true;
176
+ }
155
177
  var stones = this.GetSelectedStones();
156
178
  if (stones.length == 0) {
157
179
  return true;
@@ -159,11 +181,29 @@ class FabTextureConfiguratorComponent {
159
181
  return false;
160
182
  }
161
183
  ShowTexture() {
184
+ if (this.IsLoadingTextures()) {
185
+ return false;
186
+ }
162
187
  if (this.TextureResponseModel != null) {
163
188
  return true;
164
189
  }
165
190
  return false;
166
191
  }
192
+ ShowKern(stone, option) {
193
+ if (this.Kern != null) {
194
+ for (var i = 0; i < this.Kern.length; i++) {
195
+ if (this.Kern[i].toLowerCase().indexOf(stone.name.toLowerCase()) != -1 &&
196
+ this.Kern[i].toLowerCase().indexOf(option.name.toLowerCase()) != -1) {
197
+ return true;
198
+ }
199
+ //var string = option.name;
200
+ //this.Kern[i]: "Alt Berlin FO (normaalformaat)"
201
+ //option.name: "Normaalformaat"
202
+ //stone.name: "Alt Berlin FO "
203
+ }
204
+ }
205
+ return false;
206
+ }
167
207
  GetSelectedStones() {
168
208
  var stones = new Array();
169
209
  for (var i = 0; i < this.StoneRowObjects.length; i++) {
@@ -171,6 +211,27 @@ class FabTextureConfiguratorComponent {
171
211
  }
172
212
  return stones;
173
213
  }
214
+ GetSelectedStoneObjects() {
215
+ var stones = new Array();
216
+ for (var i = 0; i < this.StoneRowObjects.length; i++) {
217
+ this.StoneRowObjects[i].GetSelectedStoneObjects(stones);
218
+ }
219
+ return stones;
220
+ }
221
+ GetSelectedAmount() {
222
+ var count = 0;
223
+ var stones = new Array();
224
+ for (var i = 0; i < this.StoneRowObjects.length; i++) {
225
+ this.StoneRowObjects[i].GetSelectedStoneObjects(stones);
226
+ }
227
+ for (var i = 0; i < stones.length; i++) {
228
+ count++;
229
+ if (stones[i].selecteddouble) {
230
+ count++;
231
+ }
232
+ }
233
+ return count;
234
+ }
174
235
  GetFormaat() {
175
236
  if (this.FabrikantenService.FabrikantenViewModel?.inputs != undefined) {
176
237
  for (var i = 0; i < this.FabrikantenService.FabrikantenViewModel.inputs.length; i++) {
@@ -201,7 +262,18 @@ class FabTextureConfiguratorComponent {
201
262
  }
202
263
  GetVerbanden() {
203
264
  if (this.FabrikantenService.FabrikantenViewModel?.products != undefined) {
204
- return this.FabrikantenService.FabrikantenViewModel?.products;
265
+ if (this.DisableDuitsWildverband) {
266
+ var array = new Array();
267
+ for (var i = 0; i < this.FabrikantenService.FabrikantenViewModel.products.length; i++) {
268
+ if (this.FabrikantenService.FabrikantenViewModel.products[i].name.toLowerCase().indexOf("duits") == -1) {
269
+ array.push(this.FabrikantenService.FabrikantenViewModel.products[i]);
270
+ }
271
+ }
272
+ return array;
273
+ }
274
+ else {
275
+ return this.FabrikantenService.FabrikantenViewModel.products;
276
+ }
205
277
  }
206
278
  else {
207
279
  return new Array();
@@ -339,81 +411,109 @@ class FabTextureConfiguratorComponent {
339
411
  return false;
340
412
  }
341
413
  TextuurGenereren() {
342
- var valid = true;
343
- if (this.IsRatioBlocking()) {
344
- valid = false;
345
- }
346
- if (valid) {
347
- var stones = this.GetSelectedStones();
348
- if (stones.length > 0) {
349
- this.Loading = true;
350
- var request = new TextureRequestModel();
351
- request.verbandId = this.SelectedVerbandId;
352
- request.steenId = stones[0].id;
353
- request.steenRatio = stones[0].mixRatio;
354
- request.voegId = this.SelectedVoegId;
355
- request.highResolution = this.HiRes;
356
- request.shaduw = this.Shade;
357
- if (this.HiRes) {
358
- request.minAantalBitmap = 100;
359
- }
360
- else {
361
- request.minAantalBitmap = this.AantalStenen;
362
- }
363
- if (stones.length < 2) {
364
- request.steen2Id = -1;
365
- }
366
- else {
367
- request.steen2Id = stones[1].id;
368
- request.steen2Ratio = stones[1].mixRatio;
369
- }
370
- if (stones.length < 3) {
371
- request.steen3Id = -1;
372
- }
373
- else {
374
- request.steen3Id = stones[2].id;
375
- request.steen3Ratio = stones[2].mixRatio;
376
- }
377
- if (stones.length < 4) {
378
- request.steen4Id = -1;
379
- }
380
- else {
381
- request.steen4Id = stones[3].id;
382
- request.steen4Ratio = stones[3].mixRatio;
383
- }
384
- if (stones.length < 5) {
385
- request.steen5Id = -1;
414
+ if (this.HasToFillForm()) {
415
+ var dialogRef = this.dialog.open(FabFormDialogComponent, {
416
+ data: {
417
+ form: this.FabrikantenService.FabrikantenSettingsViewModel.downloadForm
386
418
  }
387
- else {
388
- request.steen5Id = stones[4].id;
389
- request.steen5Ratio = stones[4].mixRatio;
419
+ });
420
+ dialogRef.afterClosed().subscribe((data) => {
421
+ if (this.FabrikantenService.FabrikantenViewModel.hasFilledForms) {
422
+ this.TextuurGenereren();
390
423
  }
391
- if (this.Stootvoeg < this.StootvoegMin) {
392
- this.Stootvoeg = this.StootvoegMin;
393
- }
394
- if (this.Stootvoeg > this.StootvoegMax) {
395
- this.Stootvoeg = this.StootvoegMax;
396
- }
397
- request.breedteStootvoeg = this.Stootvoeg;
398
- if (this.Lintvoeg < this.LintvoegMin) {
399
- this.Lintvoeg = this.LintvoegMin;
400
- }
401
- if (this.Lintvoeg > this.LintvoegMax) {
402
- this.Lintvoeg = this.LintvoegMax;
424
+ });
425
+ }
426
+ else {
427
+ var valid = true;
428
+ if (this.IsRatioBlocking()) {
429
+ valid = false;
430
+ }
431
+ if (valid) {
432
+ var stones = this.GetSelectedStoneObjects();
433
+ var allstones = new Array();
434
+ for (var i = 0; i < stones.length; i++) {
435
+ if (stones[i].selecteddouble) {
436
+ stones[i].options[0].mixRatio = stones[i].mixRatio / 2;
437
+ stones[i].options[1].mixRatio = stones[i].mixRatio / 2;
438
+ }
439
+ else {
440
+ stones[i].options[0].mixRatio = stones[i].mixRatio;
441
+ }
442
+ allstones.push(stones[i].options[0]);
443
+ if (stones[i].selecteddouble) {
444
+ allstones.push(stones[i].options[1]);
445
+ }
403
446
  }
404
- request.hoogteLintvoeg = this.Lintvoeg;
405
- this.TextureApiClient.getTexture(request).subscribe((model) => {
406
- this.TextureResponseModel = model;
407
- this.Loading = false;
408
- }, (error) => {
409
- if (error.status == 400)
410
- console.log(error.json());
447
+ if (allstones.length > 0) {
448
+ this.Loading = true;
449
+ var request = new TextureRequestModel();
450
+ request.verbandId = this.SelectedVerbandId;
451
+ request.steenId = allstones[0].id;
452
+ request.steenRatio = allstones[0].mixRatio;
453
+ request.voegId = this.SelectedVoegId;
454
+ request.highResolution = this.HiRes;
455
+ request.shaduw = this.Shade;
456
+ if (this.HiRes) {
457
+ request.minAantalBitmap = 100;
458
+ }
459
+ else {
460
+ request.minAantalBitmap = this.AantalStenen;
461
+ }
462
+ if (allstones.length < 2) {
463
+ request.steen2Id = -1;
464
+ }
465
+ else {
466
+ request.steen2Id = allstones[1].id;
467
+ request.steen2Ratio = allstones[1].mixRatio;
468
+ }
469
+ if (allstones.length < 3) {
470
+ request.steen3Id = -1;
471
+ }
472
+ else {
473
+ request.steen3Id = allstones[2].id;
474
+ request.steen3Ratio = allstones[2].mixRatio;
475
+ }
476
+ if (allstones.length < 4) {
477
+ request.steen4Id = -1;
478
+ }
479
+ else {
480
+ request.steen4Id = allstones[3].id;
481
+ request.steen4Ratio = allstones[3].mixRatio;
482
+ }
483
+ if (allstones.length < 5) {
484
+ request.steen5Id = -1;
485
+ }
411
486
  else {
412
- console.log('An unexpected error occured');
413
- console.log(error);
487
+ request.steen5Id = allstones[4].id;
488
+ request.steen5Ratio = allstones[4].mixRatio;
489
+ }
490
+ if (this.Stootvoeg < this.StootvoegMin) {
491
+ this.Stootvoeg = this.StootvoegMin;
492
+ }
493
+ if (this.Stootvoeg > this.StootvoegMax) {
494
+ this.Stootvoeg = this.StootvoegMax;
495
+ }
496
+ request.breedteStootvoeg = this.Stootvoeg;
497
+ if (this.Lintvoeg < this.LintvoegMin) {
498
+ this.Lintvoeg = this.LintvoegMin;
499
+ }
500
+ if (this.Lintvoeg > this.LintvoegMax) {
501
+ this.Lintvoeg = this.LintvoegMax;
414
502
  }
415
- this.Loading = false;
416
- });
503
+ request.hoogteLintvoeg = this.Lintvoeg;
504
+ this.TextureApiClient.getTexture(request).subscribe((model) => {
505
+ this.TextureResponseModel = model;
506
+ this.Loading = false;
507
+ }, (error) => {
508
+ if (error.status == 400)
509
+ console.log(error.json());
510
+ else {
511
+ console.log('An unexpected error occured');
512
+ console.log(error);
513
+ }
514
+ this.Loading = false;
515
+ });
516
+ }
417
517
  }
418
518
  }
419
519
  }
@@ -421,74 +521,70 @@ class FabTextureConfiguratorComponent {
421
521
  this.UpdateRatios();
422
522
  }
423
523
  UpdateRatios() {
424
- var stones = this.GetSelectedStones();
524
+ var stones = this.GetSelectedStoneObjects();
525
+ var amount = this.GetSelectedAmount();
526
+ this.MixRatioSelect = true;
425
527
  if (stones.length != 0) {
426
528
  if (this.IsTextureMix25()) {
427
- if (stones.length == 4 || stones.length == 5) {
428
- for (var i = 0; i < this.StoneRowObjects.length; i++) {
429
- for (var j = 0; j < this.StoneRowObjects[i].options.length; j++) {
430
- for (var s = 0; s < stones.length; s++) {
431
- if (this.StoneRowObjects[i].options[j].id == stones[s].id) {
432
- this.StoneRowObjects[i].options[j].mixRatio = 25;
433
- }
434
- }
529
+ if (amount > 3) {
530
+ for (var i = 0; i < stones.length; i++) {
531
+ if (stones[i].selecteddouble) {
532
+ stones[i].mixRatio = 50;
533
+ }
534
+ else {
535
+ stones[i].mixRatio = 25;
435
536
  }
436
537
  }
538
+ this.MixRatioSelect = false;
437
539
  }
438
- else if (stones.length == 3) {
439
- var last = false;
440
- var index = 0;
441
- var found = false;
442
- for (var i = 0; i < this.StoneRowObjects.length; i++) {
443
- for (var j = 0; j < this.StoneRowObjects[i].options.length; j++) {
444
- for (var s = 0; s < stones.length; s++) {
445
- if (this.StoneRowObjects[i].options[j].id == stones[s].id) {
446
- if ((this.StoneRowObjects[i].options[j].mixRatio == 75 ||
447
- this.StoneRowObjects[i].options[j].mixRatio == 50) && !found) {
448
- this.StoneRowObjects[i].options[j].mixRatio = 50;
449
- index = 10;
450
- last = false;
451
- found = true;
452
- }
453
- else {
454
- if (!last || found) {
455
- this.StoneRowObjects[i].options[j].mixRatio = 25;
456
- }
457
- else {
458
- this.StoneRowObjects[i].options[j].mixRatio = 50;
459
- }
460
- }
461
- index++;
462
- if (index == 2) {
463
- last = true;
464
- }
465
- }
540
+ else if (amount == 3) {
541
+ var first = true;
542
+ for (var i = 0; i < stones.length; i++) {
543
+ if (stones[i].selecteddouble) {
544
+ stones[i].mixRatio = 50;
545
+ }
546
+ else {
547
+ if (first) {
548
+ stones[i].mixRatio = 50;
549
+ first = false;
550
+ }
551
+ else {
552
+ stones[i].mixRatio = 25;
466
553
  }
467
554
  }
468
555
  }
556
+ this.MixRatioSelect = false;
469
557
  }
470
- else if (stones.length == 2) {
471
- for (var i = 0; i < this.StoneRowObjects.length; i++) {
472
- for (var j = 0; j < this.StoneRowObjects[i].options.length; j++) {
473
- for (var s = 0; s < stones.length; s++) {
474
- if (this.StoneRowObjects[i].options[j].id == stones[s].id) {
475
- this.StoneRowObjects[i].options[j].mixRatio = 50;
476
- }
477
- }
558
+ else if (amount == 2) {
559
+ for (var i = 0; i < stones.length; i++) {
560
+ if (stones[i].selecteddouble) {
561
+ stones[i].mixRatio = 100;
562
+ }
563
+ else {
564
+ stones[i].mixRatio = 50;
478
565
  }
479
566
  }
567
+ this.MixRatioSelect = false;
480
568
  }
481
569
  }
482
570
  else {
483
- for (var i = 0; i < this.StoneRowObjects.length; i++) {
484
- for (var j = 0; j < this.StoneRowObjects[i].options.length; j++) {
485
- for (var s = 0; s < stones.length; s++) {
486
- if (this.StoneRowObjects[i].options[j].id == stones[s].id) {
487
- this.StoneRowObjects[i].options[j].mixRatio = Math.round(100 / stones.length);
488
- }
489
- }
490
- }
491
- }
571
+ //for (var i = 0; i < this.StoneRowObjects.length; i++) {
572
+ // for (var j = 0; j < this.StoneRowObjects[i].options.length; j++) {
573
+ // for (var s = 0; s < stones.length; s++) {
574
+ // if (this.StoneRowObjects[i].options[j].Contains(stones[s].id)) {
575
+ // this.StoneRowObjects[i].options[j].mixRatio = Math.round(100 / stones.length);
576
+ // }
577
+ // }
578
+ // }
579
+ //}
580
+ }
581
+ }
582
+ }
583
+ UpdateDisableDuitsWildverband() {
584
+ this.DisableDuitsWildverband = false;
585
+ if (this.SelectedFormaat?.name != null) {
586
+ if (this.SelectedFormaat.name?.toLowerCase().indexOf("moduul") != -1) {
587
+ this.DisableDuitsWildverband = true;
492
588
  }
493
589
  }
494
590
  }
@@ -521,6 +617,9 @@ class FabTextureConfiguratorComponent {
521
617
  }
522
618
  return "";
523
619
  }
620
+ GetKern() {
621
+ return this.TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.CustomItem, undefined, "Kern");
622
+ }
524
623
  GetLSTooltip() {
525
624
  return this.TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.CustomItem, undefined, "LS");
526
625
  }
@@ -556,17 +655,15 @@ class FabTextureConfiguratorComponent {
556
655
  return -1;
557
656
  }
558
657
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FabTextureConfiguratorComponent, deps: [{ token: i1.MobileService }, { token: i2.FabrikantenService }, { token: i3.TranslateService }, { token: i4.ActivatedRoute }, { token: i5.MatLegacyDialog }, { token: i6.TextureApiClient }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
559
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FabTextureConfiguratorComponent, selector: "app-fab-texture-configurator", ngImport: i0, template: "<div *ngIf=\"IsLoading()\" class=\"loader\">\r\n <mat-card class=\"loader-card\">\r\n <mat-card-content>\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </mat-card-content>\r\n <mat-card-subtitle class=\"loader-subtitle\" *ngIf=\"!FabrikantenService.IsStartingDownload()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductsLoading) }}\r\n </mat-card-subtitle>\r\n </mat-card>\r\n</div>\r\n\r\n<div *ngIf=\"!IsLoading()\">\r\n <div class=\"center-block\">\r\n <ng-container class=\"table-container\" *ngIf=\"!this.SingleStoneMode\">\r\n <table class=\"main-table\">\r\n <tr class=\"main-table-top-row\">\r\n <td class=\"main-table-top-row-first main-table-top-row-td\"></td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-top-row-other main-table-top-row-td\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, option.id) }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <ng-container *ngFor=\"let stone of StoneRowObjects\">\r\n <tr class=\"main-table-row\">\r\n <td class=\"main-table-row-td main-table-row-td-first\">\r\n <div>\r\n <div class=\"main-table-row-td-name\">\r\n {{ stone.name }}\r\n </div>\r\n <div *ngIf=\"stone.double\" class=\"lsws-container\">\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetLSTooltip() }}\">\r\n <div class=\"lsws-item-text\">LS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n <div class=\"lsws-item\">\r\n <mat-slide-toggle [(ngModel)]=\"stone.selecteddouble\" [disabled]=\"stone.DisableToggle()\"></mat-slide-toggle>\r\n </div>\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetWSTooltip() }}\">\r\n <div class=\"lsws-item-text\">WS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-row-td main-table-row-td-item\">\r\n <ng-container *ngIf=\"stone.HasStone(option)\">\r\n <div style=\"position: relative;\">\r\n <div class=\"stone-tile\" (click)=\"stone.Select(option)\" [class.selected]=\"stone.IsSelected(option)\" [class.not-selectable]=\"!stone.CanSelectStone(option)\">\r\n <img [src]=\"stone.GetImage(option)\" />\r\n </div>\r\n <div class=\"mix-block\" *ngIf=\"GetSelectedStones().length > 1 && stone.IsSelected(option)\">\r\n <ng-container *ngIf=\"!IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n mix %\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"stone.GetStone(option).mixRatio\">\r\n </mat-form-field>\r\n </ng-container>\r\n <ng-container *ngIf=\"IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n mix %\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"stone.GetStone(option).mixRatio\" (changed)=\"UpdateRatios()\">\r\n <mat-option [value]=\"25\">25%</mat-option>\r\n <mat-option [value]=\"50\">50%</mat-option>\r\n <mat-option [value]=\"75\">75%</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </ng-container>\r\n\r\n\r\n <div class=\"texture-container\" [class.texture-container-margin]=\"this.SingleStoneMode\">\r\n <div class=\"texture-container-fly\">\r\n <div class=\"displayflex\">\r\n <div class=\"component-block first-row\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Verband) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVerbandId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVerbandId as id\">\r\n <ng-container *ngIf=\"GetVerbandById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let verband of GetVerbanden()\">\r\n <mat-option [value]=\"verband.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"verband.imagePath != null && verband.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePathProduct(verband) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, verband.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block first-row\">\r\n <ng-container *ngIf=\"GetVoeg() != null\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Voeg) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVoegId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVoegId as id\">\r\n <ng-container *ngIf=\"GetVoegById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let voeg of GetVoeg().filter.options\">\r\n <mat-option [value]=\"voeg.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"voeg.imagePath != null && voeg.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePath(voeg) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, voeg.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Stootvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ StootvoegMin }}\" max=\"{{ StootvoegMax }}\" [(ngModel)]=\"Stootvoeg\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Lintvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ LintvoegMin }}\" max=\"{{ LintvoegMax }}\" [(ngModel)]=\"Lintvoeg\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"slider-block\" *ngIf=\"!HiRes\">\r\n <div class=\"slider-block-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.AantalStenen) }}\r\n </div>\r\n <div class=\"slider-block-slider\">\r\n <mat-slider min=\"100\" max=\"2000\" step=\"50\" showTickMarks discrete style=\"width: 100%;\">\r\n <input matSliderThumb [(ngModel)]=\"AantalStenen\">\r\n </mat-slider>\r\n </div>\r\n <div class=\"slider-block-amount\">\r\n {{ AantalStenen }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"HiRes\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.HogeResolutie) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"Shade\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Shaduw) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"buttonrow\">\r\n <button mat-raised-button (click)=\"SingleStoneMode = false;\" class=\"link textuur-knop\" *ngIf=\"SingleStoneMode\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Mix) }}\r\n </button>\r\n\r\n <button mat-raised-button (click)=\"TextuurGenereren()\" class=\"link textuur-knop\" [disabled]=\"GenerateDisabled()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.TextuurGenereren) }}\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"ShowTexture()\">\r\n <div class=\"image-row\">\r\n <div>\r\n <div>\r\n <a href=\"{{ TextureResponseModel.patroonURL }}\" target=\"_blank\">\r\n <img class=\"image image-patroon\" src=\"{{ TextureResponseModel.patroonURL }}\" />\r\n </a>\r\n </div>\r\n <div>\r\n <a href=\"{{ GetPatroonDownloadURL() }}\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadTexture) }}\r\n </button>\r\n </a>\r\n </div>\r\n <div>\r\n <a href=\"{{ GetBumpDownloadURL() }}\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadBump) }}\r\n </button>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["app-fab-texture-configurator .center-block{max-width:1280px;margin:auto;display:flex}app-fab-texture-configurator .main-table{margin:auto}app-fab-texture-configurator .texture-container{padding:30px;width:300px}app-fab-texture-configurator .texture-container-margin{margin:auto}app-fab-texture-configurator .texture-container-fly{position:fixed;width:300px}app-fab-texture-configurator .mix-block{width:125px;margin-left:auto;margin-right:auto;position:absolute;bottom:-19px;left:15px;background:#fff}app-fab-texture-configurator .mix-block mat-form-field-wrapper{padding-bottom:0}app-fab-texture-configurator .loader-card{margin:200px auto auto;width:300px}app-fab-texture-configurator .loader-subtitle{text-align:center}app-fab-texture-configurator .loader-spinner{margin:auto}app-fab-texture-configurator .stone-tile{cursor:pointer;border:2px solid #FFF;height:150px;width:150px}app-fab-texture-configurator .stone-tile img{height:150px;width:150px}app-fab-texture-configurator .selected{border:2px solid #F00}app-fab-texture-configurator .not-selectable{cursor:default!important;opacity:.2}app-fab-texture-configurator .textuur-knop{width:100%}app-fab-texture-configurator .high-res-checkbox-div{padding-bottom:20px}app-fab-texture-configurator .image-patroon{width:100%}app-fab-texture-configurator .image-row{padding-top:30px}app-fab-texture-configurator .mat-form-field{width:100%}app-fab-texture-configurator .lsws-container{display:flex}app-fab-texture-configurator .lsws-item{padding:5px;display:flex}app-fab-texture-configurator .link{margin-bottom:10px}app-fab-texture-configurator .slider-block{display:flex}app-fab-texture-configurator .slider-block-name{line-height:48px}app-fab-texture-configurator .slider-block-amount{line-height:48px;width:40px;text-align:center}app-fab-texture-configurator .slider-block-slider{flex:auto;padding-right:20px;padding-left:10px}.filter-option-image-mini-div{max-height:40px;padding-right:4px}.filter-option-image-mini-div .filter-option-image{width:40px;height:40px}.select-mat-option{height:4em!important}.select-mat-option .mat-option-text:first-letter{text-transform:capitalize}.select-mat-option .mat-option-text{display:flex}.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:#0000008a}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#000}.mat-select-value{padding-top:35px}.select-trigger-content-text{position:relative;bottom:10px}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i10.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i11.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i12.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i13.MatSlider, selector: "mat-slider", inputs: ["color", "disableRipple", "disabled", "discrete", "showTickMarks", "min", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i13.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }, { kind: "component", type: i14.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i14.MatLegacyCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { kind: "directive", type: i14.MatLegacyCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i16.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i17.MatLegacySlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i18.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i19.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "directive", type: i19.MatLegacySelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i20.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }], encapsulation: i0.ViewEncapsulation.None });
658
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FabTextureConfiguratorComponent, selector: "app-fab-texture-configurator", ngImport: i0, template: "<div *ngIf=\"IsLoading()\" class=\"loader\">\r\n <mat-card class=\"loader-card\">\r\n <mat-card-content>\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </mat-card-content>\r\n <mat-card-subtitle class=\"loader-subtitle\" *ngIf=\"!FabrikantenService.IsStartingDownload()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductsLoading) }}\r\n </mat-card-subtitle>\r\n </mat-card>\r\n</div>\r\n\r\n<div *ngIf=\"!IsLoading()\" style=\"display: flex;\">\r\n <div style=\"flex:auto;\"></div>\r\n <div class=\"center-block\">\r\n <ng-container class=\"table-container\" *ngIf=\"!this.SingleStoneMode\">\r\n <table class=\"main-table\">\r\n <tr class=\"main-table-top-row\">\r\n <td class=\"main-table-top-row-first main-table-top-row-td\"></td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-top-row-other main-table-top-row-td\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, option.id) }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <ng-container *ngFor=\"let stone of StoneRowObjects\">\r\n <tr class=\"main-table-row\">\r\n <td class=\"main-table-row-td main-table-row-td-first\">\r\n <div>\r\n <div class=\"main-table-row-td-name\">\r\n {{ stone.name }}\r\n </div>\r\n </div>\r\n </td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-row-td main-table-row-td-item\">\r\n <ng-container *ngIf=\"stone.HasStone(option)\">\r\n <div style=\"position: relative;\">\r\n <div class=\"stone-tile\" (click)=\"stone.Select(option)\" [class.selected]=\"stone.IsSelected(option)\" [class.not-selectable]=\"!stone.CanSelectStone(option)\">\r\n <div class=\"kern-div\" *ngIf=\"ShowKern(stone, option)\">{{ GetKern() }}</div>\r\n <img [src]=\"stone.GetImage(option)\" />\r\n </div>\r\n <div class=\"mix-block\" *ngIf=\"GetSelectedStoneObjects().length > 1 && stone.IsSelected(option)\">\r\n <ng-container *ngIf=\"!IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n mix %\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"stone.GetStone(option).mixRatio\">\r\n </mat-form-field>\r\n </ng-container>\r\n <ng-container *ngIf=\"IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n mix %\r\n </mat-label>\r\n <ng-container >\r\n <mat-select [ngModel]=\"stone.GetStoneFormaatObject(option).mixRatio\" (changed)=\"UpdateRatios()\" [disabled]=\"!MixRatioSelect\">\r\n <mat-option [value]=\"25\">25%</mat-option>\r\n <mat-option [value]=\"50\">50%</mat-option>\r\n <mat-option [value]=\"75\">75%</mat-option>\r\n </mat-select>\r\n </ng-container>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"stone.IsDouvleAV(option)\" class=\"lsws-container\">\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetLSTooltip() }}\">\r\n <div class=\"lsws-item-text\">LS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n <div class=\"lsws-item\">\r\n <mat-slide-toggle [(ngModel)]=\"stone.GetStoneFormaatObject(option).selecteddouble\" (change)=\"UpdateRatios()\" [disabled]=\"stone.DisableToggle()\"></mat-slide-toggle>\r\n </div>\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetWSTooltip() }}\">\r\n <div class=\"lsws-item-text\">WS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </ng-container>\r\n\r\n\r\n <div class=\"texture-container\" [class.texture-container-margin]=\"this.SingleStoneMode\">\r\n <div class=\"texture-container-fly\">\r\n <div class=\"displayflex\">\r\n <div class=\"component-block first-row\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Verband) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVerbandId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVerbandId as id\">\r\n <ng-container *ngIf=\"GetVerbandById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let verband of GetVerbanden()\">\r\n <mat-option [value]=\"verband.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"verband.imagePath != null && verband.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePathProduct(verband) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, verband.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block first-row\">\r\n <ng-container *ngIf=\"GetVoeg() != null\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Voeg) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVoegId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVoegId as id\">\r\n <ng-container *ngIf=\"GetVoegById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let voeg of GetVoeg().filter.options\">\r\n <mat-option [value]=\"voeg.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"voeg.imagePath != null && voeg.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePath(voeg) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, voeg.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Stootvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ StootvoegMin }}\" max=\"{{ StootvoegMax }}\" [(ngModel)]=\"Stootvoeg\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Lintvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ LintvoegMin }}\" max=\"{{ LintvoegMax }}\" [(ngModel)]=\"Lintvoeg\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"slider-block\" *ngIf=\"!HiRes\">\r\n <div class=\"slider-block-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.AantalStenen) }}\r\n </div>\r\n <div class=\"slider-block-slider\">\r\n <mat-slider min=\"100\" max=\"2000\" step=\"50\" showTickMarks discrete style=\"width: 100%;\">\r\n <input matSliderThumb [(ngModel)]=\"AantalStenen\">\r\n </mat-slider>\r\n </div>\r\n <div class=\"slider-block-amount\">\r\n {{ AantalStenen }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"HiRes\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.HogeResolutie) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"Shade\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Shaduw) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"buttonrow\">\r\n <button mat-raised-button (click)=\"SingleStoneMode = false;\" class=\"link textuur-knop\" *ngIf=\"SingleStoneMode\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Mix) }}\r\n </button>\r\n\r\n <button mat-raised-button (click)=\"TextuurGenereren()\" class=\"link textuur-knop\" [disabled]=\"GenerateDisabled()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.TextuurGenereren) }}\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"IsLoadingTextures()\" class=\"texture-loader\">\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </div>\r\n\r\n <div *ngIf=\"ShowTexture()\">\r\n <div class=\"image-row\">\r\n <div>\r\n <div>\r\n <a href=\"{{ TextureResponseModel.patroonURL }}\" target=\"_blank\">\r\n <img class=\"image image-patroon\" src=\"{{ TextureResponseModel.patroonURL }}\" />\r\n </a>\r\n </div>\r\n <div>\r\n <a href=\"{{ GetPatroonDownloadURL() }}\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadTexture) }}\r\n </button>\r\n </a>\r\n </div>\r\n <div>\r\n <a href=\"{{ GetBumpDownloadURL() }}\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadBump) }}\r\n </button>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"flex:auto;\"></div>\r\n</div>\r\n", styles: ["app-fab-texture-configurator .mix-block .mat-form-field-wrapper{padding-bottom:0}app-fab-texture-configurator .mix-block .mat-form-field-underline{bottom:0}app-fab-texture-configurator .center-block{margin:auto;display:flex}app-fab-texture-configurator .texture-container{padding:30px;width:300px}app-fab-texture-configurator .texture-loader{padding-top:50px}app-fab-texture-configurator .texture-container-margin{margin:auto}app-fab-texture-configurator .texture-container-fly{position:fixed;width:300px}app-fab-texture-configurator .mix-block{width:125px;margin-left:auto;margin-right:auto;position:absolute;bottom:45px;left:15px;background:#fff}app-fab-texture-configurator .mix-block mat-form-field-wrapper{padding-bottom:0}app-fab-texture-configurator .kern-div{position:absolute;top:3px;left:3px;background-color:#f6d18d;border-radius:12px;font-size:12px;padding:3px 10px}app-fab-texture-configurator .loader-card{margin:200px auto auto;width:300px}app-fab-texture-configurator .loader-subtitle{text-align:center}app-fab-texture-configurator .loader-spinner{margin:auto}app-fab-texture-configurator .stone-tile{cursor:pointer;border:2px solid #FFF;height:150px;width:150px;position:relative}app-fab-texture-configurator .stone-tile img{height:150px;width:150px}app-fab-texture-configurator .selected{border:2px solid #F00}app-fab-texture-configurator .not-selectable{cursor:default!important;opacity:.2}app-fab-texture-configurator .textuur-knop{width:100%}app-fab-texture-configurator .high-res-checkbox-div{padding-bottom:20px}app-fab-texture-configurator .image-patroon{width:100%}app-fab-texture-configurator .image-row{padding-top:30px}app-fab-texture-configurator .mat-form-field{width:100%}app-fab-texture-configurator .lsws-container{display:flex;position:absolute;bottom:4px;width:100%;background-color:#fff}app-fab-texture-configurator .lsws-item{padding:5px;display:flex}app-fab-texture-configurator .link{margin-bottom:10px}app-fab-texture-configurator .slider-block{display:flex}app-fab-texture-configurator .slider-block-name{line-height:48px}app-fab-texture-configurator .slider-block-amount{line-height:48px;width:40px;text-align:center}app-fab-texture-configurator .slider-block-slider{flex:auto;padding-right:20px;padding-left:10px}.filter-option-image-mini-div{max-height:40px;padding-right:4px}.filter-option-image-mini-div .filter-option-image{width:40px;height:40px}.select-mat-option{height:4em!important}.select-mat-option .mat-option-text:first-letter{text-transform:capitalize}.select-mat-option .mat-option-text{display:flex}.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:#0000008a}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#000}.mat-select-value{padding-top:35px}.select-trigger-content-text{position:relative;bottom:10px}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i10.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i11.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i12.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i13.MatSlider, selector: "mat-slider", inputs: ["color", "disableRipple", "disabled", "discrete", "showTickMarks", "min", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i13.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }, { kind: "component", type: i14.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i14.MatLegacyCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { kind: "directive", type: i14.MatLegacyCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i16.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i17.MatLegacySlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i18.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i19.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "directive", type: i19.MatLegacySelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i20.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }], encapsulation: i0.ViewEncapsulation.None });
560
659
  }
561
660
  export { FabTextureConfiguratorComponent };
562
661
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FabTextureConfiguratorComponent, decorators: [{
563
662
  type: Component,
564
- args: [{ selector: 'app-fab-texture-configurator', encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"IsLoading()\" class=\"loader\">\r\n <mat-card class=\"loader-card\">\r\n <mat-card-content>\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </mat-card-content>\r\n <mat-card-subtitle class=\"loader-subtitle\" *ngIf=\"!FabrikantenService.IsStartingDownload()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductsLoading) }}\r\n </mat-card-subtitle>\r\n </mat-card>\r\n</div>\r\n\r\n<div *ngIf=\"!IsLoading()\">\r\n <div class=\"center-block\">\r\n <ng-container class=\"table-container\" *ngIf=\"!this.SingleStoneMode\">\r\n <table class=\"main-table\">\r\n <tr class=\"main-table-top-row\">\r\n <td class=\"main-table-top-row-first main-table-top-row-td\"></td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-top-row-other main-table-top-row-td\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, option.id) }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <ng-container *ngFor=\"let stone of StoneRowObjects\">\r\n <tr class=\"main-table-row\">\r\n <td class=\"main-table-row-td main-table-row-td-first\">\r\n <div>\r\n <div class=\"main-table-row-td-name\">\r\n {{ stone.name }}\r\n </div>\r\n <div *ngIf=\"stone.double\" class=\"lsws-container\">\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetLSTooltip() }}\">\r\n <div class=\"lsws-item-text\">LS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n <div class=\"lsws-item\">\r\n <mat-slide-toggle [(ngModel)]=\"stone.selecteddouble\" [disabled]=\"stone.DisableToggle()\"></mat-slide-toggle>\r\n </div>\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetWSTooltip() }}\">\r\n <div class=\"lsws-item-text\">WS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-row-td main-table-row-td-item\">\r\n <ng-container *ngIf=\"stone.HasStone(option)\">\r\n <div style=\"position: relative;\">\r\n <div class=\"stone-tile\" (click)=\"stone.Select(option)\" [class.selected]=\"stone.IsSelected(option)\" [class.not-selectable]=\"!stone.CanSelectStone(option)\">\r\n <img [src]=\"stone.GetImage(option)\" />\r\n </div>\r\n <div class=\"mix-block\" *ngIf=\"GetSelectedStones().length > 1 && stone.IsSelected(option)\">\r\n <ng-container *ngIf=\"!IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n mix %\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"stone.GetStone(option).mixRatio\">\r\n </mat-form-field>\r\n </ng-container>\r\n <ng-container *ngIf=\"IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n mix %\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"stone.GetStone(option).mixRatio\" (changed)=\"UpdateRatios()\">\r\n <mat-option [value]=\"25\">25%</mat-option>\r\n <mat-option [value]=\"50\">50%</mat-option>\r\n <mat-option [value]=\"75\">75%</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </ng-container>\r\n\r\n\r\n <div class=\"texture-container\" [class.texture-container-margin]=\"this.SingleStoneMode\">\r\n <div class=\"texture-container-fly\">\r\n <div class=\"displayflex\">\r\n <div class=\"component-block first-row\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Verband) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVerbandId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVerbandId as id\">\r\n <ng-container *ngIf=\"GetVerbandById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let verband of GetVerbanden()\">\r\n <mat-option [value]=\"verband.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"verband.imagePath != null && verband.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePathProduct(verband) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, verband.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block first-row\">\r\n <ng-container *ngIf=\"GetVoeg() != null\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Voeg) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVoegId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVoegId as id\">\r\n <ng-container *ngIf=\"GetVoegById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let voeg of GetVoeg().filter.options\">\r\n <mat-option [value]=\"voeg.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"voeg.imagePath != null && voeg.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePath(voeg) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, voeg.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Stootvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ StootvoegMin }}\" max=\"{{ StootvoegMax }}\" [(ngModel)]=\"Stootvoeg\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Lintvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ LintvoegMin }}\" max=\"{{ LintvoegMax }}\" [(ngModel)]=\"Lintvoeg\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"slider-block\" *ngIf=\"!HiRes\">\r\n <div class=\"slider-block-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.AantalStenen) }}\r\n </div>\r\n <div class=\"slider-block-slider\">\r\n <mat-slider min=\"100\" max=\"2000\" step=\"50\" showTickMarks discrete style=\"width: 100%;\">\r\n <input matSliderThumb [(ngModel)]=\"AantalStenen\">\r\n </mat-slider>\r\n </div>\r\n <div class=\"slider-block-amount\">\r\n {{ AantalStenen }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"HiRes\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.HogeResolutie) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"Shade\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Shaduw) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"buttonrow\">\r\n <button mat-raised-button (click)=\"SingleStoneMode = false;\" class=\"link textuur-knop\" *ngIf=\"SingleStoneMode\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Mix) }}\r\n </button>\r\n\r\n <button mat-raised-button (click)=\"TextuurGenereren()\" class=\"link textuur-knop\" [disabled]=\"GenerateDisabled()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.TextuurGenereren) }}\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"ShowTexture()\">\r\n <div class=\"image-row\">\r\n <div>\r\n <div>\r\n <a href=\"{{ TextureResponseModel.patroonURL }}\" target=\"_blank\">\r\n <img class=\"image image-patroon\" src=\"{{ TextureResponseModel.patroonURL }}\" />\r\n </a>\r\n </div>\r\n <div>\r\n <a href=\"{{ GetPatroonDownloadURL() }}\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadTexture) }}\r\n </button>\r\n </a>\r\n </div>\r\n <div>\r\n <a href=\"{{ GetBumpDownloadURL() }}\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadBump) }}\r\n </button>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["app-fab-texture-configurator .center-block{max-width:1280px;margin:auto;display:flex}app-fab-texture-configurator .main-table{margin:auto}app-fab-texture-configurator .texture-container{padding:30px;width:300px}app-fab-texture-configurator .texture-container-margin{margin:auto}app-fab-texture-configurator .texture-container-fly{position:fixed;width:300px}app-fab-texture-configurator .mix-block{width:125px;margin-left:auto;margin-right:auto;position:absolute;bottom:-19px;left:15px;background:#fff}app-fab-texture-configurator .mix-block mat-form-field-wrapper{padding-bottom:0}app-fab-texture-configurator .loader-card{margin:200px auto auto;width:300px}app-fab-texture-configurator .loader-subtitle{text-align:center}app-fab-texture-configurator .loader-spinner{margin:auto}app-fab-texture-configurator .stone-tile{cursor:pointer;border:2px solid #FFF;height:150px;width:150px}app-fab-texture-configurator .stone-tile img{height:150px;width:150px}app-fab-texture-configurator .selected{border:2px solid #F00}app-fab-texture-configurator .not-selectable{cursor:default!important;opacity:.2}app-fab-texture-configurator .textuur-knop{width:100%}app-fab-texture-configurator .high-res-checkbox-div{padding-bottom:20px}app-fab-texture-configurator .image-patroon{width:100%}app-fab-texture-configurator .image-row{padding-top:30px}app-fab-texture-configurator .mat-form-field{width:100%}app-fab-texture-configurator .lsws-container{display:flex}app-fab-texture-configurator .lsws-item{padding:5px;display:flex}app-fab-texture-configurator .link{margin-bottom:10px}app-fab-texture-configurator .slider-block{display:flex}app-fab-texture-configurator .slider-block-name{line-height:48px}app-fab-texture-configurator .slider-block-amount{line-height:48px;width:40px;text-align:center}app-fab-texture-configurator .slider-block-slider{flex:auto;padding-right:20px;padding-left:10px}.filter-option-image-mini-div{max-height:40px;padding-right:4px}.filter-option-image-mini-div .filter-option-image{width:40px;height:40px}.select-mat-option{height:4em!important}.select-mat-option .mat-option-text:first-letter{text-transform:capitalize}.select-mat-option .mat-option-text{display:flex}.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:#0000008a}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#000}.mat-select-value{padding-top:35px}.select-trigger-content-text{position:relative;bottom:10px}\n"] }]
663
+ args: [{ selector: 'app-fab-texture-configurator', encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"IsLoading()\" class=\"loader\">\r\n <mat-card class=\"loader-card\">\r\n <mat-card-content>\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </mat-card-content>\r\n <mat-card-subtitle class=\"loader-subtitle\" *ngIf=\"!FabrikantenService.IsStartingDownload()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductsLoading) }}\r\n </mat-card-subtitle>\r\n </mat-card>\r\n</div>\r\n\r\n<div *ngIf=\"!IsLoading()\" style=\"display: flex;\">\r\n <div style=\"flex:auto;\"></div>\r\n <div class=\"center-block\">\r\n <ng-container class=\"table-container\" *ngIf=\"!this.SingleStoneMode\">\r\n <table class=\"main-table\">\r\n <tr class=\"main-table-top-row\">\r\n <td class=\"main-table-top-row-first main-table-top-row-td\"></td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-top-row-other main-table-top-row-td\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, option.id) }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <ng-container *ngFor=\"let stone of StoneRowObjects\">\r\n <tr class=\"main-table-row\">\r\n <td class=\"main-table-row-td main-table-row-td-first\">\r\n <div>\r\n <div class=\"main-table-row-td-name\">\r\n {{ stone.name }}\r\n </div>\r\n </div>\r\n </td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-row-td main-table-row-td-item\">\r\n <ng-container *ngIf=\"stone.HasStone(option)\">\r\n <div style=\"position: relative;\">\r\n <div class=\"stone-tile\" (click)=\"stone.Select(option)\" [class.selected]=\"stone.IsSelected(option)\" [class.not-selectable]=\"!stone.CanSelectStone(option)\">\r\n <div class=\"kern-div\" *ngIf=\"ShowKern(stone, option)\">{{ GetKern() }}</div>\r\n <img [src]=\"stone.GetImage(option)\" />\r\n </div>\r\n <div class=\"mix-block\" *ngIf=\"GetSelectedStoneObjects().length > 1 && stone.IsSelected(option)\">\r\n <ng-container *ngIf=\"!IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n mix %\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"stone.GetStone(option).mixRatio\">\r\n </mat-form-field>\r\n </ng-container>\r\n <ng-container *ngIf=\"IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n mix %\r\n </mat-label>\r\n <ng-container >\r\n <mat-select [ngModel]=\"stone.GetStoneFormaatObject(option).mixRatio\" (changed)=\"UpdateRatios()\" [disabled]=\"!MixRatioSelect\">\r\n <mat-option [value]=\"25\">25%</mat-option>\r\n <mat-option [value]=\"50\">50%</mat-option>\r\n <mat-option [value]=\"75\">75%</mat-option>\r\n </mat-select>\r\n </ng-container>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"stone.IsDouvleAV(option)\" class=\"lsws-container\">\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetLSTooltip() }}\">\r\n <div class=\"lsws-item-text\">LS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n <div class=\"lsws-item\">\r\n <mat-slide-toggle [(ngModel)]=\"stone.GetStoneFormaatObject(option).selecteddouble\" (change)=\"UpdateRatios()\" [disabled]=\"stone.DisableToggle()\"></mat-slide-toggle>\r\n </div>\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetWSTooltip() }}\">\r\n <div class=\"lsws-item-text\">WS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </ng-container>\r\n\r\n\r\n <div class=\"texture-container\" [class.texture-container-margin]=\"this.SingleStoneMode\">\r\n <div class=\"texture-container-fly\">\r\n <div class=\"displayflex\">\r\n <div class=\"component-block first-row\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Verband) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVerbandId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVerbandId as id\">\r\n <ng-container *ngIf=\"GetVerbandById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let verband of GetVerbanden()\">\r\n <mat-option [value]=\"verband.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"verband.imagePath != null && verband.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePathProduct(verband) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, verband.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block first-row\">\r\n <ng-container *ngIf=\"GetVoeg() != null\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Voeg) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVoegId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVoegId as id\">\r\n <ng-container *ngIf=\"GetVoegById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let voeg of GetVoeg().filter.options\">\r\n <mat-option [value]=\"voeg.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"voeg.imagePath != null && voeg.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePath(voeg) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, voeg.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Stootvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ StootvoegMin }}\" max=\"{{ StootvoegMax }}\" [(ngModel)]=\"Stootvoeg\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Lintvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ LintvoegMin }}\" max=\"{{ LintvoegMax }}\" [(ngModel)]=\"Lintvoeg\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"slider-block\" *ngIf=\"!HiRes\">\r\n <div class=\"slider-block-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.AantalStenen) }}\r\n </div>\r\n <div class=\"slider-block-slider\">\r\n <mat-slider min=\"100\" max=\"2000\" step=\"50\" showTickMarks discrete style=\"width: 100%;\">\r\n <input matSliderThumb [(ngModel)]=\"AantalStenen\">\r\n </mat-slider>\r\n </div>\r\n <div class=\"slider-block-amount\">\r\n {{ AantalStenen }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"HiRes\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.HogeResolutie) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"Shade\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Shaduw) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"buttonrow\">\r\n <button mat-raised-button (click)=\"SingleStoneMode = false;\" class=\"link textuur-knop\" *ngIf=\"SingleStoneMode\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Mix) }}\r\n </button>\r\n\r\n <button mat-raised-button (click)=\"TextuurGenereren()\" class=\"link textuur-knop\" [disabled]=\"GenerateDisabled()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.TextuurGenereren) }}\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"IsLoadingTextures()\" class=\"texture-loader\">\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </div>\r\n\r\n <div *ngIf=\"ShowTexture()\">\r\n <div class=\"image-row\">\r\n <div>\r\n <div>\r\n <a href=\"{{ TextureResponseModel.patroonURL }}\" target=\"_blank\">\r\n <img class=\"image image-patroon\" src=\"{{ TextureResponseModel.patroonURL }}\" />\r\n </a>\r\n </div>\r\n <div>\r\n <a href=\"{{ GetPatroonDownloadURL() }}\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadTexture) }}\r\n </button>\r\n </a>\r\n </div>\r\n <div>\r\n <a href=\"{{ GetBumpDownloadURL() }}\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadBump) }}\r\n </button>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"flex:auto;\"></div>\r\n</div>\r\n", styles: ["app-fab-texture-configurator .mix-block .mat-form-field-wrapper{padding-bottom:0}app-fab-texture-configurator .mix-block .mat-form-field-underline{bottom:0}app-fab-texture-configurator .center-block{margin:auto;display:flex}app-fab-texture-configurator .texture-container{padding:30px;width:300px}app-fab-texture-configurator .texture-loader{padding-top:50px}app-fab-texture-configurator .texture-container-margin{margin:auto}app-fab-texture-configurator .texture-container-fly{position:fixed;width:300px}app-fab-texture-configurator .mix-block{width:125px;margin-left:auto;margin-right:auto;position:absolute;bottom:45px;left:15px;background:#fff}app-fab-texture-configurator .mix-block mat-form-field-wrapper{padding-bottom:0}app-fab-texture-configurator .kern-div{position:absolute;top:3px;left:3px;background-color:#f6d18d;border-radius:12px;font-size:12px;padding:3px 10px}app-fab-texture-configurator .loader-card{margin:200px auto auto;width:300px}app-fab-texture-configurator .loader-subtitle{text-align:center}app-fab-texture-configurator .loader-spinner{margin:auto}app-fab-texture-configurator .stone-tile{cursor:pointer;border:2px solid #FFF;height:150px;width:150px;position:relative}app-fab-texture-configurator .stone-tile img{height:150px;width:150px}app-fab-texture-configurator .selected{border:2px solid #F00}app-fab-texture-configurator .not-selectable{cursor:default!important;opacity:.2}app-fab-texture-configurator .textuur-knop{width:100%}app-fab-texture-configurator .high-res-checkbox-div{padding-bottom:20px}app-fab-texture-configurator .image-patroon{width:100%}app-fab-texture-configurator .image-row{padding-top:30px}app-fab-texture-configurator .mat-form-field{width:100%}app-fab-texture-configurator .lsws-container{display:flex;position:absolute;bottom:4px;width:100%;background-color:#fff}app-fab-texture-configurator .lsws-item{padding:5px;display:flex}app-fab-texture-configurator .link{margin-bottom:10px}app-fab-texture-configurator .slider-block{display:flex}app-fab-texture-configurator .slider-block-name{line-height:48px}app-fab-texture-configurator .slider-block-amount{line-height:48px;width:40px;text-align:center}app-fab-texture-configurator .slider-block-slider{flex:auto;padding-right:20px;padding-left:10px}.filter-option-image-mini-div{max-height:40px;padding-right:4px}.filter-option-image-mini-div .filter-option-image{width:40px;height:40px}.select-mat-option{height:4em!important}.select-mat-option .mat-option-text:first-letter{text-transform:capitalize}.select-mat-option .mat-option-text{display:flex}.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:#0000008a}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#000}.mat-select-value{padding-top:35px}.select-trigger-content-text{position:relative;bottom:10px}\n"] }]
565
664
  }], ctorParameters: function () { return [{ type: i1.MobileService }, { type: i2.FabrikantenService }, { type: i3.TranslateService }, { type: i4.ActivatedRoute }, { type: i5.MatLegacyDialog }, { type: i6.TextureApiClient }, { type: i0.ChangeDetectorRef }]; } });
566
665
  class StoneRowObject {
567
666
  name;
568
- double = false;
569
- selecteddouble = false;
570
667
  options = new Array();
571
668
  FabrikantenService;
572
669
  FabTextureConfiguratorComponent;
@@ -579,10 +676,12 @@ class StoneRowObject {
579
676
  if (this.CanSelectStone(option)) {
580
677
  for (var i = 0; i < this.options.length; i++) {
581
678
  var name = this.options[i].name;
582
- if (name != null && option.name != null && name.toLowerCase().indexOf(option.name.toLowerCase()) != -1) {
583
- this.options[i].hidden = !this.options[i].hidden;
584
- if (this.options[i].hidden) {
679
+ if (name != null && option.name != null && name.toLowerCase().indexOf(option.name.toLowerCase()) != -1 && (option.name != "Dunnformaat" || name.toLowerCase().indexOf("dubbel") == -1)) {
680
+ this.options[i].selected = !this.options[i].selected;
681
+ this.options[i].selecteddouble = false;
682
+ if (this.options[i].selected) {
585
683
  this.FabTextureConfiguratorComponent.SelectedFormaat = option;
684
+ this.FabTextureConfiguratorComponent.UpdateDisableDuitsWildverband();
586
685
  }
587
686
  else {
588
687
  if (this.FabTextureConfiguratorComponent.NoStoneSelected()) {
@@ -595,18 +694,28 @@ class StoneRowObject {
595
694
  }
596
695
  }
597
696
  AddOption(option) {
598
- var name = option.name;
697
+ var name = option.name + "";
698
+ name = name.replace("(voorzijde)", "");
699
+ name = name.replace("(achterzijde)", "");
700
+ name = name.trim();
701
+ var stonerow = null;
599
702
  if (name != null) {
600
- if (name.toLowerCase().indexOf("voorzijde") != -1 ||
601
- name.toLowerCase().indexOf("achterzijde") != -1) {
602
- this.double = true;
703
+ for (var i = 0; i < this.options.length; i++) {
704
+ if (this.options[i].name == name) {
705
+ stonerow = this.options[i];
706
+ }
603
707
  }
604
708
  }
605
- this.options.push(option);
709
+ if (stonerow == null) {
710
+ stonerow = new StoneFormaatObject();
711
+ stonerow.name = name + "";
712
+ this.options.push(stonerow);
713
+ }
714
+ stonerow.AddStone(option);
606
715
  }
607
716
  CanSelectStone(option) {
608
- var stones = this.FabTextureConfiguratorComponent.GetSelectedStones();
609
- if (stones.length == 5) {
717
+ var amount = this.FabTextureConfiguratorComponent.GetSelectedAmount();
718
+ if (amount == 4) {
610
719
  return this.IsSelected(option);
611
720
  }
612
721
  else {
@@ -618,8 +727,24 @@ class StoneRowObject {
618
727
  }
619
728
  }
620
729
  DisableToggle() {
621
- var stones = this.FabTextureConfiguratorComponent.GetSelectedStones();
622
- return stones.length == 5;
730
+ var stones = this.FabTextureConfiguratorComponent.GetSelectedStoneObjects();
731
+ return stones.length == 4;
732
+ }
733
+ GetSelectedStoneObjects(stones) {
734
+ for (var i = 0; i < this.options.length; i++) {
735
+ if (this.options[i].selected) {
736
+ stones.push(this.options[i]);
737
+ }
738
+ }
739
+ }
740
+ GetStoneFormaatObject(option) {
741
+ for (var i = 0; i < this.options.length; i++) {
742
+ var name = this.options[i].name;
743
+ if (name != null && option.name != null && name.toLowerCase().indexOf(option.name.toLowerCase()) != -1) {
744
+ return this.options[i];
745
+ }
746
+ }
747
+ return null;
623
748
  }
624
749
  HasStone(option) {
625
750
  for (var i = 0; i < this.options.length; i++) {
@@ -630,9 +755,26 @@ class StoneRowObject {
630
755
  }
631
756
  return false;
632
757
  }
758
+ IsDouvleAV(option) {
759
+ for (var i = 0; i < this.options.length; i++) {
760
+ var name = this.options[i].name;
761
+ if (name != null && option.name != null && name.toLowerCase().indexOf(option.name.toLowerCase()) != -1) {
762
+ return this.options[i].doubleav;
763
+ }
764
+ }
765
+ return false;
766
+ }
633
767
  HasStoneSelected() {
634
768
  for (var i = 0; i < this.options.length; i++) {
635
- if (this.options[i].hidden) {
769
+ if (this.options[i].selected) {
770
+ return true;
771
+ }
772
+ }
773
+ return false;
774
+ }
775
+ IsAnySelected() {
776
+ for (var i = 0; i < this.options.length; i++) {
777
+ if (this.options[i].selected) {
636
778
  return true;
637
779
  }
638
780
  }
@@ -642,7 +784,7 @@ class StoneRowObject {
642
784
  for (var i = 0; i < this.options.length; i++) {
643
785
  var name = this.options[i].name;
644
786
  if (name != null && option.name != null && name.toLowerCase().indexOf(option.name.toLowerCase()) != -1) {
645
- return this.options[i].hidden;
787
+ return this.options[i].selected;
646
788
  }
647
789
  }
648
790
  return false;
@@ -651,7 +793,7 @@ class StoneRowObject {
651
793
  for (var i = 0; i < this.options.length; i++) {
652
794
  var name = this.options[i].name;
653
795
  if (name != null && option.name != null && name.toLowerCase().indexOf(option.name.toLowerCase()) != -1) {
654
- var value = this.options[i].imagePath + "";
796
+ var value = this.options[i].options[0].imagePath + "";
655
797
  if (value.indexOf("#BCB#") != -1) {
656
798
  var bcburl = this.FabrikantenService.FabrikantenSettingsViewModel.bcbWebserviceURLBase + "";
657
799
  bcburl = bcburl.substring(0, bcburl.length - 1);
@@ -666,24 +808,52 @@ class StoneRowObject {
666
808
  for (var i = 0; i < this.options.length; i++) {
667
809
  var name = this.options[i].name;
668
810
  if (name != null && option.name != null && name.toLowerCase().indexOf(option.name.toLowerCase()) != -1) {
669
- return this.options[i];
811
+ return this.options[i].options[0];
670
812
  }
671
813
  }
672
814
  return new FabrikantenFilterOptionViewModel();
673
815
  }
674
816
  GetSelectedStones(stones) {
675
817
  for (var i = 0; i < this.options.length; i++) {
676
- if (this.options[i].hidden) {
677
- if (this.selecteddouble) {
818
+ this.options[i].GetSelectedStones(stones);
819
+ }
820
+ }
821
+ }
822
+ class StoneFormaatObject {
823
+ name = "";
824
+ mixRatio = 0;
825
+ selectedMixRatio = 0;
826
+ selected = false;
827
+ options = new Array();
828
+ doubleav = false;
829
+ selecteddouble = false;
830
+ constructor() {
831
+ }
832
+ Contains(id) {
833
+ for (var i = 0; i < this.options.length; i++) {
834
+ if (this.options[i].id == id) {
835
+ return true;
836
+ }
837
+ }
838
+ return false;
839
+ }
840
+ AddStone(stone) {
841
+ this.options.push(stone);
842
+ if (this.options.length > 1) {
843
+ this.doubleav = true;
844
+ }
845
+ }
846
+ GetSelectedStones(stones) {
847
+ if (this.selected) {
848
+ if (this.selecteddouble) {
849
+ for (var i = 0; i < this.options.length; i++) {
678
850
  stones.push(this.options[i]);
679
851
  }
680
- else {
681
- if (this.options[i].name?.toLowerCase().indexOf("achterzijde") == -1) {
682
- stones.push(this.options[i]);
683
- }
684
- }
852
+ }
853
+ else if (this.options.length > 0) {
854
+ stones.push(this.options[0]);
685
855
  }
686
856
  }
687
857
  }
688
858
  }
689
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9mYWJyaWthbnRlbmNvcmUvY29tcG9uZW50cy9mYWItdGV4dHVyZS1jb25maWd1cmF0b3IvZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9mYWJyaWthbnRlbmNvcmUvY29tcG9uZW50cy9mYWItdGV4dHVyZS1jb25maWd1cmF0b3IvZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQXFCLFNBQVMsRUFBMEMsTUFBTSxlQUFlLENBQUM7QUFNckcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUF5SSxtQkFBbUIsRUFBeUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUcvVixNQU1hLCtCQUErQjtJQWtDakM7SUFDQTtJQUNBO0lBQ0M7SUFDRDtJQUNDO0lBQ0E7SUF0Q1YsSUFBVyxtQkFBbUI7UUFDNUIsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRU0saUJBQWlCLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDL0IsY0FBYyxHQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzVCLFFBQVEsR0FBVyxFQUFFLENBQUM7SUFDdEIsV0FBVyxHQUFXLENBQUMsQ0FBQztJQUN4QixXQUFXLEdBQVcsRUFBRSxDQUFDO0lBQ3pCLFNBQVMsR0FBVyxFQUFFLENBQUM7SUFDdkIsWUFB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QyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtnQkFFMUIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDOUI7cUJBQ0k7b0JBQ0gsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7d0JBQ3BFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUM5QjtpQkFDRjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkNoYW5nZXMsIERvQ2hlY2ssIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0TGVnYWN5RGlhbG9nIGFzIE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBGYWJyaWthbnRlblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mYWJyaWthbnRlbi5zZXJ2aWNlJztcbmltcG9ydCB7IE1vYmlsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2JpbGUuc2VydmljZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25DYXRlZ29yeSwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeSwgRmFicmlrYW50ZW5UZXh0dXJlQmFzZVZpZXdNb2RlbCwgRmFicmlrYW50ZW5GaWx0ZXJWaWV3TW9kZWwsIEZhYnJpa2FudGVuSW5wdXRWaWV3TW9kZWwsIEZhYnJpa2FudGVuUHJvZHVjdFZpZXdNb2RlbCwgVGV4dHVyZUFwaUNsaWVudCwgVGV4dHVyZVJlcXVlc3RNb2RlbCwgVGV4dHVyZVJlc3BvbnNlTW9kZWwsIFRleHR1cmVNaXhSZXNwb25zZU1vZGVsLCBUZXh0dXJlTWl4UmVxdWVzdE1vZGVsLCBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCB9IGZyb20gJy4uLy4uL3N3YWdnZXIvU3dhZ2dlckNsaWVudCc7XG5pbXBvcnQgeyBGYWJEaXNwbGF5UGhvdG9EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9mYWItZGlzcGxheS1waG90by1kaWFsb2cvZmFiLWRpc3BsYXktcGhvdG8tZGlhbG9nLmNvbXBvbmVudCc7XHJcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWZhYi10ZXh0dXJlLWNvbmZpZ3VyYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9mYWItdGV4dHVyZS1jb25maWd1cmF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mYWItdGV4dHVyZS1jb25maWd1cmF0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBGYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBEb0NoZWNrIHtcblxuICBwdWJsaWMgZ2V0IFRyYW5zbGF0aW9uQ2F0ZWdvcnkoKSB7XG4gICAgcmV0dXJuIFRyYW5zbGF0aW9uQ2F0ZWdvcnk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkoKSB7XG4gICAgcmV0dXJuIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnk7XG4gIH1cblxuICBwdWJsaWMgU2VsZWN0ZWRWZXJiYW5kSWQ6IG51bWJlciA9IC0xO1xuICBwdWJsaWMgU2VsZWN0ZWRWb2VnSWQ6IG51bWJlciA9IC0xO1xuICBwdWJsaWMgTGludHZvZWc6IG51bWJlciA9IDEyO1xuICBwdWJsaWMgTGludHZvZWdNaW46IG51bWJlciA9IDY7XG4gIHB1YmxpYyBMaW50dm9lZ01heDogbnVtYmVyID0gMTQ7XG4gIHB1YmxpYyBTdG9vdHZvZWc6IG51bWJlciA9IDEwO1xuICBwdWJsaWMgU3Rvb3R2b2VnTWluOiBudW1iZXIgPSA2O1xuICBwdWJsaWMgU3Rvb3R2b2VnTWF4OiBudW1iZXIgPSAxNDtcblxuICBwdWJsaWMgQWFudGFsU3RlbmVuOiBudW1iZXIgPSAxMDA7XG5cbiAgcHVibGljIEhpUmVzOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBTaGFkZTogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBTaW5nbGVTdG9uZU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgVGV4dHVyZVJlc3BvbnNlTW9kZWw6IFRleHR1cmVSZXNwb25zZU1vZGVsIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBUZXh0dXJlTWl4UmVzcG9uc2VNb2RlbDogVGV4dHVyZU1peFJlc3BvbnNlTW9kZWwgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgU2VsZWN0ZWRGb3JtYWF0OiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBTdG9uZVJvd09iamVjdHM6IEFycmF5PFN0b25lUm93T2JqZWN0PiA9IG5ldyBBcnJheTxTdG9uZVJvd09iamVjdD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgTW9iaWxlU2VydmljZTogTW9iaWxlU2VydmljZSxcbiAgICBwdWJsaWMgRmFicmlrYW50ZW5TZXJ2aWNlOiBGYWJyaWthbnRlblNlcnZpY2UsXG4gICAgcHVibGljIFRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBBY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgVGV4dHVyZUFwaUNsaWVudDogVGV4dHVyZUFwaUNsaWVudCxcbiAgICBwcml2YXRlIENoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuUHJvY2Vzc1BhcmFtZXRlcnModGhpcy5BY3RpdmF0ZWRSb3V0ZSwgdGhpcy5DaGFuZ2VEZXRlY3RvclJlZik7XG4gIH1cblxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuSXNMb2FkaW5nKCkpIHtcclxuICAgICAgaWYgKHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgdGhpcy5GaWxsQXJyYXlzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLlNlbGVjdGVkVmVyYmFuZElkID09IC0xKSB7XHJcbiAgICAgICAgdmFyIHZlcmJhbmRlbiA9IHRoaXMuR2V0VmVyYmFuZGVuKClcclxuICAgICAgICB0aGlzLlNlbGVjdGVkVmVyYmFuZElkID0gdmVyYmFuZGVuWzBdLmlkO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcmJhbmRlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKHZlcmJhbmRlbltpXS5ncm91cCA9PSBcImRlZmF1bHRcIikge1xyXG4gICAgICAgICAgICB0aGlzLlNlbGVjdGVkVmVyYmFuZElkID0gdmVyYmFuZGVuW2ldLmlkO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5TZWxlY3RlZFZvZWdJZCA9PSAtMSkge1xyXG4gICAgICAgIHZhciB2b2VnID0gdGhpcy5HZXRWb2VnKCk7XHJcblxyXG4gICAgICAgIGlmICh2b2VnPy5maWx0ZXI/Lm9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5TZWxlY3RlZFZvZWdJZCA9IHZvZWcuZmlsdGVyLm9wdGlvbnNbMF0uaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkxvYWRGYWJyaWthbnRlblZpZXdNb2RlbCh0aGlzLkNoYW5nZURldGVjdG9yUmVmLCB0aGlzLkFjdGl2YXRlZFJvdXRlLCAoKSA9PiB7XG4gICAgICB0aGlzLkZpbGxBcnJheXMoKTtcblxuICAgICAgdmFyIHN0b25lID0gdGhpcy5BY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ3N0b25lJyk7XHJcbiAgICAgIHZhciBmb3JtYXQgPSB0aGlzLkFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnZm9ybWF0Jyk7XHJcblxyXG4gICAgICBpZiAoc3RvbmUgIT0gbnVsbCkge1xyXG4gICAgICAgIHZhciBzdG9uZV9mb3JtYXQgPSBzdG9uZSArIFwiX1wiICsgZm9ybWF0O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnNbal0udXJsTmFtZSA9PSBzdG9uZV9mb3JtYXQpIHtcclxuICAgICAgICAgICAgICB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5TZWxlY3QodGhpcy5TdG9uZVJvd09iamVjdHNbaV0ub3B0aW9uc1tqXSk7XHJcblxyXG4gICAgICAgICAgICAgIHZhciBmb3JtYXRzID0gdGhpcy5HZXRGb3JtYWF0KCk7XHJcblxyXG4gICAgICAgICAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgZm9ybWF0cy5sZW5ndGg7IHArKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1hdHNbcF0udXJsTmFtZSA9PSBmb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5TdG9uZVJvd09iamVjdHNbaV0uRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5TZWxlY3RlZEZvcm1hYXQgPSBmb3JtYXRzW3BdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5TaW5nbGVTdG9uZU1vZGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBJc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuTG9hZGluZykge1xuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XG5cbiAgICBpZiAodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuSXNMb2FkaW5nU21hbGwoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxuXG4gIHB1YmxpYyBJc1RleHR1cmVNaXgyNSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5TZXR0aW5nc1ZpZXdNb2RlbD8udGV4dHVyZUNvbmZpZ3VyYXRvckVuYWJsZU1peDI1ID09IHRydWU7XHJcbiAgfVxuXG4gIHB1YmxpYyBOb1N0b25lU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLlN0b25lUm93T2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLkhhc1N0b25lU2VsZWN0ZWQoKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRTdGVlbigpOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbFtdIHtcbiAgICBpZiAodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWw/LmlucHV0cyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFyIGZpbHRlciA9IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmlucHV0c1tpXS5maWx0ZXI7XHJcbiAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsICYmIGZpbHRlci5uYW1lID09IFwiU3RlZW4gMVwiKSB7XHJcbiAgICAgICAgICB2YXIgb3B0aW9ucyA9IGZpbHRlci5vcHRpb25zO1xyXG5cclxuICAgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFycmF5PEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsPigpO1xyXG4gIH1cblxuICBwdWJsaWMgR2VuZXJhdGVEaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLlNlbGVjdGVkVmVyYmFuZElkID09IC0xKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5TZWxlY3RlZFZvZWdJZCA9PSAtMSkge1xuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHN0b25lcyA9IHRoaXMuR2V0U2VsZWN0ZWRTdG9uZXMoKTtcblxuICAgIGlmIChzdG9uZXMubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cblxuICBwdWJsaWMgU2hvd1RleHR1cmUoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5UZXh0dXJlUmVzcG9uc2VNb2RlbCAhPSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XG5cbiAgcHVibGljIEdldFNlbGVjdGVkU3RvbmVzKCk6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsW10ge1xuICAgIHZhciBzdG9uZXMgPSBuZXcgQXJyYXk8RmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWw+KCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5HZXRTZWxlY3RlZFN0b25lcyhzdG9uZXMpO1xyXG4gICAgfVxuXG4gICAgcmV0dXJuIHN0b25lcztcclxuICB9XG5cbiAgcHVibGljIEdldEZvcm1hYXQoKTogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWxbXSB7XG4gICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsPy5pbnB1dHMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmlucHV0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciBmaWx0ZXIgPSB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5pbnB1dHNbaV0uZmlsdGVyO1xyXG4gICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIubmFtZSA9PSBcIkZvcm1hYXRcIikge1xyXG4gICAgICAgICAgdmFyIG9wdGlvbnMgPSBmaWx0ZXIub3B0aW9ucztcclxuXHJcbiAgICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBcnJheTxGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbD4oKTtcclxuICB9XG5cbiAgcHVibGljIEdldFZvZWcoKTogRmFicmlrYW50ZW5JbnB1dFZpZXdNb2RlbCB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsPy5pbnB1dHMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmlucHV0c1tpXS5maWx0ZXI/Lm5hbWUgPT0gXCJWb2VnXCIpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5pbnB1dHNbaV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0Vm9lZ0J5SWQoaWQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgbGlzdCA9IHRoaXMuR2V0Vm9lZygpPy5maWx0ZXI/Lm9wdGlvbnM7IC8vIG9mIGNhY2hlIGRlemUgbGlqc3QgaW4gZWVuIHByb3BlcnR5XHJcbiAgICByZXR1cm4gbGlzdD8uZmluZCh2ID0+IHYuaWQgPT09IGlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRWZXJiYW5kZW4oKTogRmFicmlrYW50ZW5Qcm9kdWN0Vmlld01vZGVsW10ge1xyXG4gICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsPy5wcm9kdWN0cyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsPy5wcm9kdWN0cztcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gbmV3IEFycmF5PEZhYnJpa2FudGVuUHJvZHVjdFZpZXdNb2RlbD4oKTtcclxuICAgIH1cclxuXHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRWZXJiYW5kQnlJZChpZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5HZXRWZXJiYW5kZW4oKTsgLy8gb2YgY2FjaGUgZGV6ZSBsaWpzdCBpbiBlZW4gcHJvcGVydHlcclxuICAgIHJldHVybiBsaXN0Py5maW5kKHYgPT4gdi5pZCA9PT0gaWQpO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0SW1hZ2VQYXRoKG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiBzdHJpbmcge1xyXG4gICAgdmFyIHZhbHVlID0gb3B0aW9uLmltYWdlUGF0aCArIFwiXCI7XHJcblxyXG4gICAgaWYgKHZhbHVlLmluZGV4T2YoXCIjQkNCI1wiKSAhPSAtMSkge1xyXG4gICAgICB2YXIgYmNidXJsID0gdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5TZXR0aW5nc1ZpZXdNb2RlbC5iY2JXZWJzZXJ2aWNlVVJMQmFzZSArIFwiXCI7XHJcbiAgICAgIGJjYnVybCA9IGJjYnVybC5zdWJzdHJpbmcoMCwgYmNidXJsLmxlbmd0aCAtIDEpO1xyXG5cclxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKFwiI0JDQiNcIiwgYmNidXJsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0SW1hZ2VQYXRoUHJvZHVjdChvcHRpb246IEZhYnJpa2FudGVuUHJvZHVjdFZpZXdNb2RlbCk6IHN0cmluZyB7XHJcbiAgICB2YXIgdmFsdWUgPSBvcHRpb24uaW1hZ2VQYXRoICsgXCJcIjtcclxuXHJcbiAgICBpZiAodmFsdWUuaW5kZXhPZihcIiNCQ0IjXCIpICE9IC0xKSB7XHJcbiAgICAgIHZhciBiY2J1cmwgPSB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmJjYldlYnNlcnZpY2VVUkxCYXNlICsgXCJcIjtcclxuICAgICAgYmNidXJsID0gYmNidXJsLnN1YnN0cmluZygwLCBiY2J1cmwubGVuZ3RoIC0gMSk7XHJcblxyXG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoXCIjQkNCI1wiLCBiY2J1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XG5cbiAgcHVibGljIEdldFBhdHJvb25Eb3dubG9hZFVSTCgpOiBzdHJpbmcge1xyXG5cclxuICAgIHZhciB1cmwgPSB0aGlzLlRleHR1cmVSZXNwb25zZU1vZGVsPy5wYXRyb29uVVJMICsgXCJcIjtcclxuXHJcbiAgICB1cmwgPSB1cmwucmVwbGFjZSh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmJjYldlYnNlcnZpY2VVUkxCYXNlICsgXCJcIiwgXCJcIik7XHJcblxyXG4gICAgdmFyIHRlbXAgPVxyXG4gICAgICB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmJjYldlYnNlcnZpY2VVUkxCYXNlICtcclxuICAgICAgXCJEb3dubG9hZC5hc3B4P2ZpbGU9XCIgK1xyXG4gICAgICB1cmwgK1xyXG4gICAgICBcIiZkb2VsPVwiICtcclxuICAgICAgdGhpcy5HZXREb3dubG9hZE5hbWUoKSArXHJcbiAgICAgIFwiLnBuZ1wiO1xyXG5cclxuICAgIHJldHVybiB0ZW1wO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEdldEJ1bXBEb3dubG9hZFVSTCgpOiBzdHJpbmcge1xyXG4gICAgdmFyIHVybCA9IHRoaXMuVGV4dHVyZVJlc3BvbnNlTW9kZWw/LmJ1bXBVUkwgKyBcIlwiO1xyXG5cclxuICAgIHVybCA9IHVybC5yZXBsYWNlKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuYmNiV2Vic2VydmljZVVSTEJhc2UgKyBcIlwiLCBcIlwiKTtcclxuXHJcbiAgICB2YXIgdGVtcCA9XHJcbiAgICAgIHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuYmNiV2Vic2VydmljZVVSTEJhc2UgK1xyXG4gICAgICBcIkRvd25sb2FkLmFzcHg/ZmlsZT1cIiArXHJcbiAgICAgIHVybCArXHJcbiAgICAgIFwiJmRvZWw9XCIgK1xyXG4gICAgICB0aGlzLkdldERvd25sb2FkTmFtZSgpICtcclxuICAgICAgXCJfYnVtcC5wbmdcIjtcclxuXHJcbiAgICByZXR1cm4gdGVtcDtcclxuICB9XG5cbiAgcHVibGljIEdldERvd25sb2FkTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgdmFyIGJvbmQgPSB0aGlzLkdldFZlcmJhbmRCeUlkKHRoaXMuU2VsZWN0ZWRWZXJiYW5kSWQpO1xyXG4gICAgdmFyIGJvbmRfc3RyID0gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuUHJvZHVjdCwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5OYW1lLCBib25kPy5pZCkudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICB2YXIgdm9lZyA9IHRoaXMuR2V0Vm9lZ0J5SWQodGhpcy5TZWxlY3RlZFZvZWdJZCk7XHJcbiAgICB2YXIgdm9lZ19zdHIgPSB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5GaWx0ZXJPcHRpb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgdm9lZz8uaWQpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgdmFyIHJlc28gPSBcIkxRXCI7XHJcblxyXG4gICAgaWYgKHRoaXMuSGlSZXMpIHtcclxuICAgICAgcmVzbyA9IFwiSFFcIjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgc3RvbmVzID0gdGhpcy5HZXRTZWxlY3RlZFN0b25lcygpO1xyXG4gICAgdmFyIHN0ZWVuID0gXCJcIjtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0b25lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoc3RlZW4gIT0gXCJcIikge1xyXG4gICAgICAgIHN0ZWVuICs9IFwiX1wiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzdGVlbiArPSAoc3RvbmVzW2ldLnVybE5hbWUgKyBcIlwiKS5yZXBsYWNlKFwiX1wiLCBcIiBcIik7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGVuZCA9IFwiX1wiICsgdGhpcy5HZXREaW1lbnNpb24oKSArIFwiX1wiICsgYm9uZF9zdHIgKyBcIl9cIiArIHZvZWdfc3RyICsgXCJfXCIgKyByZXNvXHJcblxyXG4gICAgdmFyIGxlZnQgPSAyNTAgLSBlbmQubGVuZ3RoO1xyXG5cclxuICAgIGlmIChzdGVlbi5sZW5ndGggPiBsZWZ0KSB7XHJcbiAgICAgIHN0ZWVuID0gc3RlZW4uc3Vic3RyaW5nKDAsIGxlZnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdGVlbiArIGVuZDtcclxuICB9XG5cbiAgcHVibGljIEdldEFjdGl2ZVN0ZWVuKCk6IHN0cmluZyB7XHJcbiAgICB2YXIgc3RvbmVzID0gdGhpcy5HZXRTZWxlY3RlZFN0b25lcygpO1xyXG5cclxuICAgIGlmIChzdG9uZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gc3RvbmVzWzBdLnVybE5hbWUgKyBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cblxuICBwdWJsaWMgRmlsbEFycmF5cygpIHtcbiAgICB0aGlzLlN0b25lUm93T2JqZWN0cyA9IG5ldyBBcnJheTxTdG9uZVJvd09iamVjdD4oKTtcclxuXHJcbiAgICB2YXIgZm9ybWFhdCA9IHRoaXMuR2V0U3RlZW4oKTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcm1hYXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIG5hbWU6IHN0cmluZyA9IGZvcm1hYXRbaV0ubmFtZSArIFwiXCI7XHJcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmluZGV4T2YoJygnKSkgKyBcIlwiO1xyXG5cclxuICAgICAgdmFyIHN0b25lcm93b2JqZWN0OiBTdG9uZVJvd09iamVjdCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLlN0b25lUm93T2JqZWN0cy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLlN0b25lUm93T2JqZWN0c1tqXS5uYW1lID09IG5hbWUpIHtcclxuICAgICAgICAgIHN0b25lcm93b2JqZWN0ID0gdGhpcy5TdG9uZVJvd09iamVjdHNbal07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc3RvbmVyb3dvYmplY3QgPT0gbnVsbCkge1xyXG4gICAgICAgIHN0b25lcm93b2JqZWN0ID0gbmV3IFN0b25lUm93T2JqZWN0KG5hbWUsIHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLCB0aGlzKTtcclxuICAgICAgICB0aGlzLlN0b25lUm93T2JqZWN0cy5wdXNoKHN0b25lcm93b2JqZWN0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3RvbmVyb3dvYmplY3QuQWRkT3B0aW9uKGZvcm1hYXRbaV0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuU3RvbmVSb3dPYmplY3RzLnNvcnQoZnVuY3Rpb24gKHN0b25lMSwgc3RvbmUyKSB7IHJldHVybiBzdG9uZTEubmFtZS5sb2NhbGVDb21wYXJlKHN0b25lMi5uYW1lKSB9KTtcclxuICB9XG5cbiAgcHVibGljIElzUmF0aW9CbG9ja2luZygpOiBib29sZWFuIHtcbiAgICB2YXIgdmVyYmFuZCA9IHRoaXMuR2V0VmVyYmFuZEJ5SWQodGhpcy5TZWxlY3RlZFZlcmJhbmRJZCk7XG5cbiAgICBpZiAodmVyYmFuZD8uaW5mbyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgdmFyIG9iamVjdCA9IEpTT04ucGFyc2UodmVyYmFuZC5pbmZvKTtcclxuICAgICAgdmFyIHN0ciA9IHRoaXMuR2V0TGVuZ3RlKCkgKyBcIiA9PSBcIiArICgyICogdGhpcy5HZXRCcmVlZHRlKCkpICsgXCIgKyBcIiArIHRoaXMuU3Rvb3R2b2VnO1xyXG4gICAgICAvL2FsZXJ0KG9iamVjdC5yYXRpbyArIFwiOiBcIiArIHN0ciArIFwiIDogXCIgKyBldmFsKHN0cikpO1xyXG4gICAgICB2YXIgZXZhbFN0ciA9IG9iamVjdC5yYXRpbyArIFwiXCI7XHJcbiAgICAgIGV2YWxTdHIgPSBldmFsU3RyLnJlcGxhY2UoXCJicmVlZHRlXCIsIHRoaXMuR2V0QnJlZWR0ZSgpLnRvU3RyaW5nKCkpO1xyXG4gICAgICBldmFsU3RyID0gZXZhbFN0ci5yZXBsYWNlKFwibGVuZ3RlXCIsIHRoaXMuR2V0TGVuZ3RlKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgIGV2YWxTdHIgPSBldmFsU3RyLnJlcGxhY2UoXCJ2b2VnYnJlZWR0ZVwiLCB0aGlzLlN0b290dm9lZy50b1N0cmluZygpKTtcclxuXHJcbiAgICAgIGlmIChldmFsKGV2YWxTdHIpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHZhciBtZXNzYWdlID0gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlJhdGlvV2FybmluZyk7XHJcbiAgICAgICAgbWVzc2FnZSArPSBcIlxcclxcblwiO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXHJcXG5cIjtcclxuICAgICAgICBtZXNzYWdlICs9IHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5QaWNrZWRCb25kKSArIFwiOiBcIiArIHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LlByb2R1Y3QsIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgdmVyYmFuZC5pZCk7XHJcbiAgICAgICAgbWVzc2FnZSArPSBcIlxcclxcblwiO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlJhdGlvQm9uZCkgKyBcIjogXCIgKyBvYmplY3QucmF0aW87XHJcbiAgICAgICAgbWVzc2FnZSArPSBcIlxcclxcblwiO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXHJcXG5cIjtcclxuICAgICAgICBtZXNzYWdlICs9IHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5TdG9uZUxlbmd0ZSkgKyBcIjogXCIgKyB0aGlzLkdldExlbmd0ZSgpO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXHJcXG5cIjtcclxuICAgICAgICBtZXNzYWdlICs9IHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5TdG9uZVdpZHRoKSArIFwiOiBcIiArIHRoaXMuR2V0QnJlZWR0ZSgpO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXHJcXG5cIjtcclxuICAgICAgICBtZXNzYWdlICs9IHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5TdG9vdHZvZWcpICsgXCI6IFwiICsgdGhpcy5TdG9vdHZvZWc7XHJcbiAgICAgICAgbWVzc2FnZSArPSBcIlxcclxcblwiO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXHJcXG5cIjtcclxuICAgICAgICBtZXNzYWdlICs9IHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5TdG9uZUNvbXBsZXRlKSArIFwiOiBcIiArIGV2YWxTdHI7XHJcblxyXG4gICAgICAgIGFsZXJ0KG1lc3NhZ2UpO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cblxuICBwdWJsaWMgVGV4dHV1ckdlbmVyZXJlbigpOiB2b2lkIHtcclxuICAgIHZhciB2YWxpZCA9IHRydWU7XHJcblxyXG4gICAgaWYgKHRoaXMuSXNSYXRpb0Jsb2NraW5nKCkpIHtcclxuICAgICAgdmFsaWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsaWQpIHtcclxuICAgICAgdmFyIHN0b25lcyA9IHRoaXMuR2V0U2VsZWN0ZWRTdG9uZXMoKTtcclxuICAgICAgaWYgKHN0b25lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBUZXh0dXJlUmVxdWVzdE1vZGVsKCk7XHJcblxyXG4gICAgICAgIHJlcXVlc3QudmVyYmFuZElkID0gdGhpcy5TZWxlY3RlZFZlcmJhbmRJZDtcclxuICAgICAgICByZXF1ZXN0LnN0ZWVuSWQgPSBzdG9uZXNbMF0uaWQ7XHJcbiAgICAgICAgcmVxdWVzdC5zdGVlblJhdGlvID0gc3RvbmVzWzBdLm1peFJhdGlvO1xyXG4gICAgICAgIHJlcXVlc3Qudm9lZ0lkID0gdGhpcy5TZWxlY3RlZFZvZWdJZDtcclxuICAgICAgICByZXF1ZXN0LmhpZ2hSZXNvbHV0aW9uID0gdGhpcy5IaVJlcztcclxuICAgICAgICByZXF1ZXN0LnNoYWR1dyA9IHRoaXMuU2hhZGU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLkhpUmVzKSB7XHJcbiAgICAgICAgICByZXF1ZXN0Lm1pbkFhbnRhbEJpdG1hcCA9IDEwMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICByZXF1ZXN0Lm1pbkFhbnRhbEJpdG1hcCA9IHRoaXMuQWFudGFsU3RlbmVuO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmIChzdG9uZXMubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgcmVxdWVzdC5zdGVlbjJJZCA9IC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHJlcXVlc3Quc3RlZW4ySWQgPSBzdG9uZXNbMV0uaWQ7XHJcbiAgICAgICAgICByZXF1ZXN0LnN0ZWVuMlJhdGlvID0gc3RvbmVzWzFdLm1peFJhdGlvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHN0b25lcy5sZW5ndGggPCAzKSB7XHJcbiAgICAgICAgICByZXF1ZXN0LnN0ZWVuM0lkID0gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmVxdWVzdC5zdGVlbjNJZCA9IHN0b25lc1syXS5pZDtcclxuICAgICAgICAgIHJlcXVlc3Quc3RlZW4zUmF0aW8gPSBzdG9uZXNbMl0ubWl4UmF0aW87XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3RvbmVzLmxlbmd0aCA8IDQpIHtcclxuICAgICAgICAgIHJlcXVlc3Quc3RlZW40SWQgPSAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICByZXF1ZXN0LnN0ZWVuNElkID0gc3RvbmVzWzNdLmlkO1xyXG4gICAgICAgICAgcmVxdWVzdC5zdGVlbjRSYXRpbyA9IHN0b25lc1szXS5taXhSYXRpbztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzdG9uZXMubGVuZ3RoIDwgNSkge1xyXG4gICAgICAgICAgcmVxdWVzdC5zdGVlbjVJZCA9IC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHJlcXVlc3Quc3RlZW41SWQgPSBzdG9uZXNbNF0uaWQ7XHJcbiAgICAgICAgICByZXF1ZXN0LnN0ZWVuNVJhdGlvID0gc3RvbmVzWzRdLm1peFJhdGlvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuU3Rvb3R2b2VnIDwgdGhpcy5TdG9vdHZvZWdNaW4pIHtcclxuICAgICAgICAgIHRoaXMuU3Rvb3R2b2VnID0gdGhpcy5TdG9vdHZvZWdNaW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5TdG9vdHZvZWcgPiB0aGlzLlN0b290dm9lZ01heCkge1xyXG4gICAgICAgICAgdGhpcy5TdG9vdHZvZWcgPSB0aGlzLlN0b290dm9lZ01heDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlcXVlc3QuYnJlZWR0ZVN0b290dm9lZyA9IHRoaXMuU3Rvb3R2b2VnO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5MaW50dm9lZyA8IHRoaXMuTGludHZvZWdNaW4pIHtcclxuICAgICAgICAgIHRoaXMuTGludHZvZWcgPSB0aGlzLkxpbnR2b2VnTWluO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuTGludHZvZWcgPiB0aGlzLkxpbnR2b2VnTWF4KSB7XHJcbiAgICAgICAgICB0aGlzLkxpbnR2b2VnID0gdGhpcy5MaW50dm9lZ01heDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlcXVlc3QuaG9vZ3RlTGludHZvZWcgPSB0aGlzLkxpbnR2b2VnO1xyXG5cclxuICAgICAgICB0aGlzLlRleHR1cmVBcGlDbGllbnQuZ2V0VGV4dHVyZShyZXF1ZXN0KS5zdWJzY3JpYmUoKG1vZGVsOiBUZXh0dXJlUmVzcG9uc2VNb2RlbCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5UZXh0dXJlUmVzcG9uc2VNb2RlbCA9IG1vZGVsO1xyXG4gICAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSwgKGVycm9yOiBSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDApXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yLmpzb24oKSk7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJlZCcpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XG5cbiAgcHVibGljIFNldE1peFJhdGlvcygpOiB2b2lkIHtcbiAgICB0aGlzLlVwZGF0ZVJhdGlvcygpO1xyXG4gIH1cblxuICBwdWJsaWMgVXBkYXRlUmF0aW9zKCk6IHZvaWQge1xuICAgIHZhciBzdG9uZXMgPSB0aGlzLkdldFNlbGVjdGVkU3RvbmVzKCk7XG5cbiAgICBpZiAoc3RvbmVzLmxlbmd0aCAhPSAwKSB7XG5cbiAgICAgIGlmICh0aGlzLklzVGV4dHVyZU1peDI1KCkpIHtcbiAgICAgICAgaWYgKHN0b25lcy5sZW5ndGggPT0gNCB8fCBzdG9uZXMubGVuZ3RoID09IDUpIHtcclxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5TdG9uZVJvd09iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5TdG9uZVJvd09iamVjdHNbaV0ub3B0aW9ucy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgc3RvbmVzLmxlbmd0aDsgcysrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5TdG9uZVJvd09iamVjdHNbaV0ub3B0aW9uc1tqXS5pZCA9PSBzdG9uZXNbc10uaWQpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5TdG9uZVJvd09iamVjdHNbaV0ub3B0aW9uc1tqXS5taXhSYXRpbyA9IDI1O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzdG9uZXMubGVuZ3RoID09IDMpIHtcclxuICAgICAgICAgIHZhciBsYXN0ID0gZmFsc2U7XHJcbiAgICAgICAgICB2YXIgaW5kZXggPSAwO1xyXG4gICAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IHN0b25lcy5sZW5ndGg7IHMrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnNbal0uaWQgPT0gc3RvbmVzW3NdLmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5TdG9uZVJvd09iamVjdHNbaV0ub3B0aW9uc1tqXS5taXhSYXRpbyA9PSA3NSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnNbal0ubWl4UmF0aW8gPT0gNTApICYmICFmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnNbal0ubWl4UmF0aW8gPSA1MDtcclxuICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDEwO1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXN0IHx8IGZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5vcHRpb25zW2pdLm1peFJhdGlvID0gMjU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5TdG9uZVJvd09iamVjdHNbaV0ub3B0aW9uc1tqXS5taXhSYXRpbyA9IDUwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgaW5kZXgrKztcclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc3RvbmVzLmxlbmd0aCA9PSAyKSB7XHJcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IHN0b25lcy5sZW5ndGg7IHMrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnNbal0uaWQgPT0gc3RvbmVzW3NdLmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnNbal0ubWl4UmF0aW8gPSA1MDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5vcHRpb25zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgc3RvbmVzLmxlbmd0aDsgcysrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnNbal0uaWQgPT0gc3RvbmVzW3NdLmlkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5vcHRpb25zW2pdLm1peFJhdGlvID0gTWF0aC5yb3VuZCgxMDAgLyBzdG9uZXMubGVuZ3RoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XG5cbiAgcHVibGljIEdldEZvcm1hYXRTdHIoKTogc3RyaW5nIHtcbiAgICB2YXIgc3RvbmVzID0gdGhpcy5HZXRTZWxlY3RlZFN0b25lcygpO1xuXG4gICAgaWYgKHN0b25lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHZhciBuYW1lOiBzdHJpbmcgPSBzdG9uZXNbMF0ubmFtZSArIFwiXCI7XHJcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmluZGV4T2YoJygnKSkgKyBcIlwiO1xyXG5cclxuICAgICAgaWYgKG5hbWUuaW5kZXhPZihcInZvb3J6aWpkZVwiKSAhPSAtMSkge1xyXG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoXCIgKHZvb3J6aWpkZSlcIiwgXCJcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuYW1lLmluZGV4T2YoXCJhY2h0ZXJ6aWpkZVwiKSAhPSAtMSkge1xyXG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoXCIgKGFjaHRlcnppamRlKVwiLCBcIlwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XG5cclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0RGltZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgdmFyIGZvcm1hYXQgPSB0aGlzLkdldEZvcm1hYXRTdHIoKTtcblxuICAgIHN3aXRjaCAoZm9ybWFhdCkge1xuICAgICAgY2FzZSBcIihub3JtYWFsZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gXCIyNDB4MTE1eDcxXCI7XHJcbiAgICAgIGNhc2UgXCIoZHVubmZvcm1hYXQpXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiMjQweDExNXg1MlwiO1xyXG4gICAgICBjYXNlIFwiKG1vZHV1bGZvcm1hYXQgNTIpXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiMjkweDkweDUyXCI7XHJcbiAgICAgIGNhc2UgXCIod2FhbGZvcm1hYXQpXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiMjEweDEwMHg1MlwiO1xyXG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRMU1Rvb2x0aXAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LkN1c3RvbUl0ZW0sIHVuZGVmaW5lZCwgXCJMU1wiKTtcclxuICB9XG5cbiAgcHVibGljIEdldFdTVG9vbHRpcCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuQ3VzdG9tSXRlbSwgdW5kZWZpbmVkLCBcIldTXCIpO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0TGVuZ3RlKCk6IG51bWJlciB7XG4gICAgdmFyIGZvcm1hYXQgPSB0aGlzLkdldEZvcm1hYXRTdHIoKTtcblxuICAgIHN3aXRjaCAoZm9ybWFhdCkge1xuICAgICAgY2FzZSBcIihub3JtYWFsZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gMjQwO1xyXG4gICAgICBjYXNlIFwiKGR1bm5mb3JtYWF0KVwiOlxyXG4gICAgICAgIHJldHVybiAyNDA7XHJcbiAgICAgIGNhc2UgXCIobW9kdXVsZm9ybWFhdCA1MilcIjpcclxuICAgICAgICByZXR1cm4gMjkwO1xyXG4gICAgICBjYXNlIFwiKHdhYWxmb3JtYWF0KVwiOlxyXG4gICAgICAgIHJldHVybiAyMTA7XHJcbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRCcmVlZHRlKCk6IG51bWJlciB7XG4gICAgdmFyIGZvcm1hYXQgPSB0aGlzLkdldEZvcm1hYXRTdHIoKTtcblxuICAgIHN3aXRjaCAoZm9ybWFhdCkge1xuICAgICAgY2FzZSBcIihub3JtYWFsZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gMTE1O1xyXG4gICAgICBjYXNlIFwiKGR1bm5mb3JtYWF0KVwiOlxyXG4gICAgICAgIHJldHVybiAxMTU7XHJcbiAgICAgIGNhc2UgXCIobW9kdXVsZm9ybWFhdCA1MilcIjpcclxuICAgICAgICByZXR1cm4gOTA7XHJcbiAgICAgIGNhc2UgXCIod2FhbGZvcm1hYXQpXCI6XHJcbiAgICAgICAgcmV0dXJuIDEwMDtcclxuICAgIH1cblxuICAgIHJldHVybiAtMTtcclxuICB9XG59XG5cbmNsYXNzIFN0b25lUm93T2JqZWN0IHtcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGRvdWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkZG91YmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIG9wdGlvbnM6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsW10gPSBuZXcgQXJyYXk8RmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWw+KCk7XHJcblxyXG4gIHByaXZhdGUgRmFicmlrYW50ZW5TZXJ2aWNlOiBGYWJyaWthbnRlblNlcnZpY2U7XHJcbiAgcHVibGljIEZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQ6IEZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgRmFicmlrYW50ZW5TZXJ2aWNlOiBGYWJyaWthbnRlblNlcnZpY2UsIEZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQ6IEZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQpIHtcclxuICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICB0aGlzLkZhYnJpa2FudGVuU2VydmljZSA9IEZhYnJpa2FudGVuU2VydmljZTtcclxuICAgIHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudCA9IEZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgU2VsZWN0KG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5DYW5TZWxlY3RTdG9uZShvcHRpb24pKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciBuYW1lID0gdGhpcy5vcHRpb25zW2ldLm5hbWU7XHJcbiAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBvcHRpb24ubmFtZSAhPSBudWxsICYmIG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKG9wdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCkpICE9IC0xKSB7XHJcblxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zW2ldLmhpZGRlbiA9ICF0aGlzLm9wdGlvbnNbaV0uaGlkZGVuO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uaGlkZGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5TZWxlY3RlZEZvcm1hYXQgPSBvcHRpb247XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5Ob1N0b25lU2VsZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5TZWxlY3RlZEZvcm1hYXQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuU2V0TWl4UmF0aW9zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQWRkT3B0aW9uKG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiB2b2lkIHtcbiAgICB2YXIgbmFtZSA9IG9wdGlvbi5uYW1lO1xuXG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwidm9vcnppamRlXCIpICE9IC0xIHx8XHJcbiAgICAgICAgbmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJhY2h0ZXJ6aWpkZVwiKSAhPSAtMSkge1xyXG4gICAgICAgIHRoaXMuZG91YmxlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zLnB1c2gob3B0aW9uKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBDYW5TZWxlY3RTdG9uZShvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogYm9vbGVhbiB7XG4gICAgdmFyIHN0b25lcyA9IHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5HZXRTZWxlY3RlZFN0b25lcygpO1xuXG4gICAgaWYgKHN0b25lcy5sZW5ndGggPT0gNSkge1xuICAgICAgcmV0dXJuIHRoaXMuSXNTZWxlY3RlZChvcHRpb24pO1xyXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5TZWxlY3RlZEZvcm1hYXQgPT0gbnVsbCB8fFxuICAgICAgICB0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuU2VsZWN0ZWRGb3JtYWF0LmlkID09IG9wdGlvbi5pZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgRGlzYWJsZVRvZ2dsZSgpOiBib29sZWFuIHtcbiAgICB2YXIgc3RvbmVzID0gdGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LkdldFNlbGVjdGVkU3RvbmVzKCk7XG5cbiAgICByZXR1cm4gc3RvbmVzLmxlbmd0aCA9PSA1O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEhhc1N0b25lKG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiBib29sZWFuIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgbmFtZSA9IHRoaXMub3B0aW9uc1tpXS5uYW1lO1xyXG4gICAgICBpZiAobmFtZSAhPSBudWxsICYmIG9wdGlvbi5uYW1lICE9IG51bGwgJiYgbmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yob3B0aW9uLm5hbWUudG9Mb3dlckNhc2UoKSkgIT0gLTEpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEhhc1N0b25lU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9uc1tpXS5oaWRkZW4pIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIElzU2VsZWN0ZWQob3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBuYW1lID0gdGhpcy5vcHRpb25zW2ldLm5hbWU7XHJcbiAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgb3B0aW9uLm5hbWUgIT0gbnVsbCAmJiBuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihvcHRpb24ubmFtZS50b0xvd2VyQ2FzZSgpKSAhPSAtMSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbaV0uaGlkZGVuO1xyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0SW1hZ2Uob3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IHN0cmluZyB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIG5hbWUgPSB0aGlzLm9wdGlvbnNbaV0ubmFtZTtcclxuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBvcHRpb24ubmFtZSAhPSBudWxsICYmIG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKG9wdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCkpICE9IC0xKSB7XHJcblxyXG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMub3B0aW9uc1tpXS5pbWFnZVBhdGggKyBcIlwiO1xyXG5cclxuICAgICAgICBpZiAodmFsdWUuaW5kZXhPZihcIiNCQ0IjXCIpICE9IC0xKSB7XHJcbiAgICAgICAgICB2YXIgYmNidXJsID0gdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5TZXR0aW5nc1ZpZXdNb2RlbC5iY2JXZWJzZXJ2aWNlVVJMQmFzZSArIFwiXCI7XHJcbiAgICAgICAgICBiY2J1cmwgPSBiY2J1cmwuc3Vic3RyaW5nKDAsIGJjYnVybC5sZW5ndGggLSAxKTtcclxuXHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoXCIjQkNCI1wiLCBiY2J1cmwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gXCJcIjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRTdG9uZShvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBuYW1lID0gdGhpcy5vcHRpb25zW2ldLm5hbWU7XHJcbiAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgb3B0aW9uLm5hbWUgIT0gbnVsbCAmJiBuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihvcHRpb24ubmFtZS50b0xvd2VyQ2FzZSgpKSAhPSAtMSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbaV07XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIHJldHVybiBuZXcgRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRTZWxlY3RlZFN0b25lcyhzdG9uZXM6IEFycmF5PEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsPik6IHZvaWQge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uaGlkZGVuKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkZG91YmxlKSB7XHJcbiAgICAgICAgICBzdG9uZXMucHVzaCh0aGlzLm9wdGlvbnNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0ubmFtZT8udG9Mb3dlckNhc2UoKS5pbmRleE9mKFwiYWNodGVyemlqZGVcIikgPT0gLTEpIHtcclxuICAgICAgICAgICAgc3RvbmVzLnB1c2godGhpcy5vcHRpb25zW2ldKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cbiIsIjxkaXYgKm5nSWY9XCJJc0xvYWRpbmcoKVwiIGNsYXNzPVwibG9hZGVyXCI+XHJcbiAgPG1hdC1jYXJkIGNsYXNzPVwibG9hZGVyLWNhcmRcIj5cclxuICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICA8bWF0LXNwaW5uZXIgY2xhc3M9XCJsb2FkZXItc3Bpbm5lclwiIFtkaWFtZXRlcl09XCI4MFwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICA8bWF0LWNhcmQtc3VidGl0bGUgY2xhc3M9XCJsb2FkZXItc3VidGl0bGVcIiAqbmdJZj1cIiFGYWJyaWthbnRlblNlcnZpY2UuSXNTdGFydGluZ0Rvd25sb2FkKClcIj5cclxuICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5Qcm9kdWN0c0xvYWRpbmcpIH19XHJcbiAgICA8L21hdC1jYXJkLXN1YnRpdGxlPlxyXG4gIDwvbWF0LWNhcmQ+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cIiFJc0xvYWRpbmcoKVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjZW50ZXItYmxvY2tcIj5cclxuICAgIDxuZy1jb250YWluZXIgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIiAqbmdJZj1cIiF0aGlzLlNpbmdsZVN0b25lTW9kZVwiPlxyXG4gICAgICA8dGFibGUgY2xhc3M9XCJtYWluLXRhYmxlXCI+XHJcbiAgICAgICAgPHRyIGNsYXNzPVwibWFpbi10YWJsZS10b3Atcm93XCI+XHJcbiAgICAgICAgICA8dGQgY2xhc3M9XCJtYWluLXRhYmxlLXRvcC1yb3ctZmlyc3QgbWFpbi10YWJsZS10b3Atcm93LXRkXCI+PC90ZD5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBHZXRGb3JtYWF0KClcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwibWFpbi10YWJsZS10b3Atcm93LW90aGVyIG1haW4tdGFibGUtdG9wLXJvdy10ZFwiPlxyXG4gICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5GaWx0ZXJPcHRpb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgb3B0aW9uLmlkKSB9fVxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdG9uZSBvZiBTdG9uZVJvd09iamVjdHNcIj5cclxuICAgICAgICAgIDx0ciBjbGFzcz1cIm1haW4tdGFibGUtcm93XCI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1haW4tdGFibGUtcm93LXRkIG1haW4tdGFibGUtcm93LXRkLWZpcnN0XCI+XHJcbiAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYWluLXRhYmxlLXJvdy10ZC1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHN0b25lLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN0b25lLmRvdWJsZVwiIGNsYXNzPVwibHN3cy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxzd3MtaXRlbVwiIG1hdFRvb2x0aXBDbGFzcz1cImZpbHRlci10b29sdGlwXCIgbWF0VG9vbHRpcD1cInt7IEdldExTVG9vbHRpcCgpIH19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxzd3MtaXRlbS10ZXh0XCI+TFM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+aW5mbzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibHN3cy1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgWyhuZ01vZGVsKV09XCJzdG9uZS5zZWxlY3RlZGRvdWJsZVwiIFtkaXNhYmxlZF09XCJzdG9uZS5EaXNhYmxlVG9nZ2xlKClcIj48L21hdC1zbGlkZS10b2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibHN3cy1pdGVtXCIgbWF0VG9vbHRpcENsYXNzPVwiZmlsdGVyLXRvb2x0aXBcIiBtYXRUb29sdGlwPVwie3sgR2V0V1NUb29sdGlwKCkgfX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibHN3cy1pdGVtLXRleHRcIj5XUzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIEdldEZvcm1hYXQoKVwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1haW4tdGFibGUtcm93LXRkIG1haW4tdGFibGUtcm93LXRkLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdG9uZS5IYXNTdG9uZShvcHRpb24pXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b25lLXRpbGVcIiAoY2xpY2spPVwic3RvbmUuU2VsZWN0KG9wdGlvbilcIiBbY2xhc3Muc2VsZWN0ZWRdPVwic3RvbmUuSXNTZWxlY3RlZChvcHRpb24pXCIgW2NsYXNzLm5vdC1zZWxlY3RhYmxlXT1cIiFzdG9uZS5DYW5TZWxlY3RTdG9uZShvcHRpb24pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwic3RvbmUuR2V0SW1hZ2Uob3B0aW9uKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1peC1ibG9ja1wiICpuZ0lmPVwiR2V0U2VsZWN0ZWRTdG9uZXMoKS5sZW5ndGggPiAxICYmIHN0b25lLklzU2VsZWN0ZWQob3B0aW9uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFJc1RleHR1cmVNaXgyNSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIGNsYXNzPVwic21hbGwtaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ICVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBtYXg9XCIxMDBcIiBbKG5nTW9kZWwpXT1cInN0b25lLkdldFN0b25lKG9wdGlvbikubWl4UmF0aW9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIklzVGV4dHVyZU1peDI1KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgY2xhc3M9XCJmdWxsd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwic2VsZWN0LW1hdC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ICVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cInN0b25lLkdldFN0b25lKG9wdGlvbikubWl4UmF0aW9cIiAoY2hhbmdlZCk9XCJVcGRhdGVSYXRpb3MoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjI1XCI+MjUlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjUwXCI+NTAlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjc1XCI+NzUlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC90YWJsZT5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwidGV4dHVyZS1jb250YWluZXJcIiBbY2xhc3MudGV4dHVyZS1jb250YWluZXItbWFyZ2luXT1cInRoaXMuU2luZ2xlU3RvbmVNb2RlXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0dXJlLWNvbnRhaW5lci1mbHlcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzcGxheWZsZXhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtYmxvY2sgZmlyc3Qtcm93XCI+XHJcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIGNsYXNzPVwiZnVsbHdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cInNlbGVjdC1tYXQtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuVmVyYmFuZCkgfX1cclxuICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cIlNlbGVjdGVkVmVyYmFuZElkXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiU2VsZWN0ZWRWZXJiYW5kSWQgYXMgaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiR2V0VmVyYmFuZEJ5SWQoaWQpIGFzIHZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LXRyaWdnZXItY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbHRlci1vcHRpb24taW1hZ2UtbWluaS1kaXZcIiAqbmdJZj1cInYuaW1hZ2VQYXRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIkdldEltYWdlUGF0aFByb2R1Y3QodilcIiBjbGFzcz1cImZpbHRlci1vcHRpb24taW1hZ2VcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LXRyaWdnZXItY29udGVudC10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LlByb2R1Y3QsIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgdi5pZCkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZlcmJhbmQgb2YgR2V0VmVyYmFuZGVuKClcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInZlcmJhbmQuaWRcIiBjbGFzcz1cInNlbGVjdC1tYXQtb3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZlcmJhbmQuaW1hZ2VQYXRoICE9IG51bGwgJiYgdmVyYmFuZC5pbWFnZVBhdGggIT0gJydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItb3B0aW9uLWltYWdlLW1pbmktZGl2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwie3sgR2V0SW1hZ2VQYXRoUHJvZHVjdCh2ZXJiYW5kKSB9fVwiIGNsYXNzPVwiZmlsdGVyLW9wdGlvbi1pbWFnZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuUHJvZHVjdCwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5OYW1lLCB2ZXJiYW5kLmlkKSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50LWJsb2NrIGZpcnN0LXJvd1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiR2V0Vm9lZygpICE9IG51bGxcIj5cclxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBjbGFzcz1cImZ1bGx3aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cInNlbGVjdC1tYXQtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5Wb2VnKSB9fVxyXG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cIlNlbGVjdGVkVm9lZ0lkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlNlbGVjdGVkVm9lZ0lkIGFzIGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiR2V0Vm9lZ0J5SWQoaWQpIGFzIHZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QtdHJpZ2dlci1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWx0ZXItb3B0aW9uLWltYWdlLW1pbmktZGl2XCIgKm5nSWY9XCJ2LmltYWdlUGF0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIkdldEltYWdlUGF0aFByb2R1Y3QodilcIiBjbGFzcz1cImZpbHRlci1vcHRpb24taW1hZ2VcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC10cmlnZ2VyLWNvbnRlbnQtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkZpbHRlck9wdGlvbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5OYW1lLCB2LmlkKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdm9lZyBvZiBHZXRWb2VnKCkuZmlsdGVyLm9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwidm9lZy5pZFwiIGNsYXNzPVwic2VsZWN0LW1hdC1vcHRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2b2VnLmltYWdlUGF0aCAhPSBudWxsICYmIHZvZWcuaW1hZ2VQYXRoICE9ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItb3B0aW9uLWltYWdlLW1pbmktZGl2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJ7eyBHZXRJbWFnZVBhdGgodm9lZykgfX1cIiBjbGFzcz1cImZpbHRlci1vcHRpb24taW1hZ2VcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkZpbHRlck9wdGlvbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5OYW1lLCB2b2VnLmlkKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50LWJsb2NrXCI+XHJcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIGNsYXNzPVwic21hbGwtaW5wdXRcIj5cclxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5TdG9vdHZvZWcpIH19XHJcbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCJ7eyBTdG9vdHZvZWdNaW4gfX1cIiBtYXg9XCJ7eyBTdG9vdHZvZWdNYXggfX1cIiBbKG5nTW9kZWwpXT1cIlN0b290dm9lZ1wiPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBvbmVudC1ibG9ja1wiPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBjbGFzcz1cInNtYWxsLWlucHV0XCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTGludHZvZWcpIH19XHJcbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCJ7eyBMaW50dm9lZ01pbiB9fVwiIG1heD1cInt7IExpbnR2b2VnTWF4IH19XCIgWyhuZ01vZGVsKV09XCJMaW50dm9lZ1wiPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItYmxvY2tcIiAqbmdJZj1cIiFIaVJlc1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1ibG9jay1uYW1lXCI+XHJcbiAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuQWFudGFsU3RlbmVuKSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLWJsb2NrLXNsaWRlclwiPlxyXG4gICAgICAgICAgICA8bWF0LXNsaWRlciBtaW49XCIxMDBcIiBtYXg9XCIyMDAwXCIgc3RlcD1cIjUwXCIgc2hvd1RpY2tNYXJrcyBkaXNjcmV0ZSBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRTbGlkZXJUaHVtYiBbKG5nTW9kZWwpXT1cIkFhbnRhbFN0ZW5lblwiPlxyXG4gICAgICAgICAgICA8L21hdC1zbGlkZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItYmxvY2stYW1vdW50XCI+XHJcbiAgICAgICAgICAgIHt7IEFhbnRhbFN0ZW5lbiB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoaWdoLXJlcy1jaGVja2JveC1kaXZcIj5cclxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJIaVJlc1wiIGNsYXNzPVwiaGlnaC1yZXMtY2hlY2tib3hcIj5cclxuICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5Ib2dlUmVzb2x1dGllKSB9fVxyXG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoaWdoLXJlcy1jaGVja2JveC1kaXZcIj5cclxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJTaGFkZVwiIGNsYXNzPVwiaGlnaC1yZXMtY2hlY2tib3hcIj5cclxuICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5TaGFkdXcpIH19XHJcbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbnJvd1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiU2luZ2xlU3RvbmVNb2RlID0gZmFsc2U7XCIgY2xhc3M9XCJsaW5rIHRleHR1dXIta25vcFwiICpuZ0lmPVwiU2luZ2xlU3RvbmVNb2RlXCI+XHJcbiAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTWl4KSB9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiVGV4dHV1ckdlbmVyZXJlbigpXCIgY2xhc3M9XCJsaW5rIHRleHR1dXIta25vcFwiIFtkaXNhYmxlZF09XCJHZW5lcmF0ZURpc2FibGVkKClcIj5cclxuICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5UZXh0dXVyR2VuZXJlcmVuKSB9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJTaG93VGV4dHVyZSgpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2Utcm93XCI+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJ7eyBUZXh0dXJlUmVzcG9uc2VNb2RlbC5wYXRyb29uVVJMIH19XCIgdGFyZ2V0PVwiX2JsYW5rXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWFnZSBpbWFnZS1wYXRyb29uXCIgc3JjPVwie3sgVGV4dHVyZVJlc3BvbnNlTW9kZWwucGF0cm9vblVSTCB9fVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJ7eyBHZXRQYXRyb29uRG93bmxvYWRVUkwoKSB9fVwiIHRhcmdldD1cIl9ibGFua1wiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNsYXNzPVwibGluayB0ZXh0dXVyLWtub3BcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LkRvd25sb2FkVGV4dHVyZSkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJ7eyBHZXRCdW1wRG93bmxvYWRVUkwoKSB9fVwiIHRhcmdldD1cIl9ibGFua1wiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNsYXNzPVwibGluayB0ZXh0dXVyLWtub3BcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LkRvd25sb2FkQnVtcCkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
859
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9mYWJyaWthbnRlbmNvcmUvY29tcG9uZW50cy9mYWItdGV4dHVyZS1jb25maWd1cmF0b3IvZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9mYWJyaWthbnRlbmNvcmUvY29tcG9uZW50cy9mYWItdGV4dHVyZS1jb25maWd1cmF0b3IvZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQXFCLFNBQVMsRUFBMEMsTUFBTSxlQUFlLENBQUM7QUFNckcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUF5SSxtQkFBbUIsRUFBeUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUvVixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUV0RixNQU1hLCtCQUErQjtJQXVDakM7SUFDQTtJQUNBO0lBQ0M7SUFDRDtJQUNDO0lBQ0E7SUEzQ1YsSUFBVyxtQkFBbUI7UUFDNUIsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRU0saUJBQWlCLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDL0IsY0FBYyxHQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzVCLFFBQVEsR0FBVyxFQUFFLENBQUM7SUFDdEIsV0FBVyxHQUFXLENBQUMsQ0FBQztJQUN4QixXQUFXLEdBQVcs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aUJBQ0ksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzlCO1NBQ0Y7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkNoYW5nZXMsIERvQ2hlY2ssIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0TGVnYWN5RGlhbG9nIGFzIE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBGYWJyaWthbnRlblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mYWJyaWthbnRlbi5zZXJ2aWNlJztcbmltcG9ydCB7IE1vYmlsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2JpbGUuc2VydmljZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25DYXRlZ29yeSwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeSwgRmFicmlrYW50ZW5UZXh0dXJlQmFzZVZpZXdNb2RlbCwgRmFicmlrYW50ZW5GaWx0ZXJWaWV3TW9kZWwsIEZhYnJpa2FudGVuSW5wdXRWaWV3TW9kZWwsIEZhYnJpa2FudGVuUHJvZHVjdFZpZXdNb2RlbCwgVGV4dHVyZUFwaUNsaWVudCwgVGV4dHVyZVJlcXVlc3RNb2RlbCwgVGV4dHVyZVJlc3BvbnNlTW9kZWwsIFRleHR1cmVNaXhSZXNwb25zZU1vZGVsLCBUZXh0dXJlTWl4UmVxdWVzdE1vZGVsLCBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCB9IGZyb20gJy4uLy4uL3N3YWdnZXIvU3dhZ2dlckNsaWVudCc7XG5pbXBvcnQgeyBGYWJEaXNwbGF5UGhvdG9EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9mYWItZGlzcGxheS1waG90by1kaWFsb2cvZmFiLWRpc3BsYXktcGhvdG8tZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZhYkZvcm1EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9mYWItZm9ybS1kaWFsb2cvZmFiLWZvcm0tZGlhbG9nLmNvbXBvbmVudCc7XHJcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWZhYi10ZXh0dXJlLWNvbmZpZ3VyYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9mYWItdGV4dHVyZS1jb25maWd1cmF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mYWItdGV4dHVyZS1jb25maWd1cmF0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBGYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBEb0NoZWNrIHtcblxuICBwdWJsaWMgZ2V0IFRyYW5zbGF0aW9uQ2F0ZWdvcnkoKSB7XG4gICAgcmV0dXJuIFRyYW5zbGF0aW9uQ2F0ZWdvcnk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkoKSB7XG4gICAgcmV0dXJuIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnk7XG4gIH1cblxuICBwdWJsaWMgU2VsZWN0ZWRWZXJiYW5kSWQ6IG51bWJlciA9IC0xO1xuICBwdWJsaWMgU2VsZWN0ZWRWb2VnSWQ6IG51bWJlciA9IC0xO1xuICBwdWJsaWMgTGludHZvZWc6IG51bWJlciA9IDEyO1xuICBwdWJsaWMgTGludHZvZWdNaW46IG51bWJlciA9IDY7XG4gIHB1YmxpYyBMaW50dm9lZ01heDogbnVtYmVyID0gMTQ7XG4gIHB1YmxpYyBTdG9vdHZvZWc6IG51bWJlciA9IDEwO1xuICBwdWJsaWMgU3Rvb3R2b2VnTWluOiBudW1iZXIgPSAwO1xuICBwdWJsaWMgU3Rvb3R2b2VnTWF4OiBudW1iZXIgPSAxNDtcblxuICBwdWJsaWMgQWFudGFsU3RlbmVuOiBudW1iZXIgPSAxMDA7XG5cbiAgcHVibGljIEhpUmVzOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBTaGFkZTogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBTaW5nbGVTdG9uZU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIERpc2FibGVEdWl0c1dpbGR2ZXJiYW5kOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBNaXhSYXRpb1NlbGVjdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBUZXh0dXJlUmVzcG9uc2VNb2RlbDogVGV4dHVyZVJlc3BvbnNlTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIFRleHR1cmVNaXhSZXNwb25zZU1vZGVsOiBUZXh0dXJlTWl4UmVzcG9uc2VNb2RlbCB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgS2Vybjogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuICAvL3B1YmxpYyBTdGF0ZURpc3BsYXlGb3JtOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIFNlbGVjdGVkRm9ybWFhdDogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgU3RvbmVSb3dPYmplY3RzOiBBcnJheTxTdG9uZVJvd09iamVjdD4gPSBuZXcgQXJyYXk8U3RvbmVSb3dPYmplY3Q+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIE1vYmlsZVNlcnZpY2U6IE1vYmlsZVNlcnZpY2UsXG4gICAgcHVibGljIEZhYnJpa2FudGVuU2VydmljZTogRmFicmlrYW50ZW5TZXJ2aWNlLFxuICAgIHB1YmxpYyBUcmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgQWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIFRleHR1cmVBcGlDbGllbnQ6IFRleHR1cmVBcGlDbGllbnQsXG4gICAgcHJpdmF0ZSBDaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLlByb2Nlc3NQYXJhbWV0ZXJzKHRoaXMuQWN0aXZhdGVkUm91dGUsIHRoaXMuQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLklzTG9hZGluZygpKSB7XHJcbiAgICAgIGlmICh0aGlzLlN0b25lUm93T2JqZWN0cy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgIHRoaXMuRmlsbEFycmF5cygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5TZWxlY3RlZFZlcmJhbmRJZCA9PSAtMSkge1xyXG4gICAgICAgIHZhciB2ZXJiYW5kZW4gPSB0aGlzLkdldFZlcmJhbmRlbigpXHJcbiAgICAgICAgdGhpcy5TZWxlY3RlZFZlcmJhbmRJZCA9IHZlcmJhbmRlblswXS5pZDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJiYW5kZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmICh2ZXJiYW5kZW5baV0uZ3JvdXAgPT0gXCJkZWZhdWx0XCIpIHtcclxuICAgICAgICAgICAgdGhpcy5TZWxlY3RlZFZlcmJhbmRJZCA9IHZlcmJhbmRlbltpXS5pZDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuU2VsZWN0ZWRWb2VnSWQgPT0gLTEpIHtcclxuICAgICAgICB2YXIgdm9lZyA9IHRoaXMuR2V0Vm9lZygpO1xyXG5cclxuICAgICAgICBpZiAodm9lZz8uZmlsdGVyPy5vcHRpb25zICE9IG51bGwpIHtcclxuICAgICAgICAgIHRoaXMuU2VsZWN0ZWRWb2VnSWQgPSB2b2VnLmZpbHRlci5vcHRpb25zWzBdLmlkO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLlRleHR1cmVBcGlDbGllbnQuZ2V0S2VybigpLnN1YnNjcmliZSgobW9kZWw6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgIHRoaXMuS2VybiA9IG1vZGVsO1xyXG4gICAgfSk7XG5cbiAgICB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5Mb2FkRmFicmlrYW50ZW5WaWV3TW9kZWwodGhpcy5DaGFuZ2VEZXRlY3RvclJlZiwgdGhpcy5BY3RpdmF0ZWRSb3V0ZSwgKCkgPT4ge1xuICAgICAgdGhpcy5GaWxsQXJyYXlzKCk7XG5cbiAgICAgIHZhciBzdG9uZSA9IHRoaXMuQWN0aXZhdGVkUm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdzdG9uZScpO1xyXG4gICAgICB2YXIgZm9ybWF0ID0gdGhpcy5BY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2Zvcm1hdCcpO1xyXG5cclxuICAgICAgaWYgKHN0b25lICE9IG51bGwpIHtcclxuICAgICAgICB2YXIgc3RvbmVfZm9ybWF0ID0gc3RvbmUgKyBcIl9cIiArIGZvcm1hdDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLlN0b25lUm93T2JqZWN0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5vcHRpb25zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIG8gPSAwOyBvIDwgdGhpcy5TdG9uZVJvd09iamVjdHNbaV0ub3B0aW9uc1tqXS5vcHRpb25zLmxlbmd0aDsgbysrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnNbal0ub3B0aW9uc1tvXS51cmxOYW1lID09IHN0b25lX2Zvcm1hdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TdG9uZVJvd09iamVjdHNbaV0uU2VsZWN0KHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnNbal0ub3B0aW9uc1tvXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGZvcm1hdHMgPSB0aGlzLkdldEZvcm1hYXQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBwID0gMDsgcCA8IGZvcm1hdHMubGVuZ3RoOyBwKyspIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdHNbcF0udXJsTmFtZSA9PSBmb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LlNlbGVjdGVkRm9ybWFhdCA9IGZvcm1hdHNbcF07XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLlNpbmdsZVN0b25lTW9kZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIEhhc1RvRmlsbEZvcm0oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuZG93bmxvYWRGb3JtRW5hYmxlZCAmJiAhdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwuaGFzRmlsbGVkRm9ybXMgJiYgIXRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLnNraXBGb3Jtcykge1xuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cblxuICBwdWJsaWMgSXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5Jc0xvYWRpbmdTbWFsbCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XG5cbiAgcHVibGljIElzTG9hZGluZ1RleHR1cmVzKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLkxvYWRpbmcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cblxuICBwdWJsaWMgSXNUZXh0dXJlTWl4MjUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWw/LnRleHR1cmVDb25maWd1cmF0b3JFbmFibGVNaXgyNSA9PSB0cnVlO1xyXG4gIH1cblxuICBwdWJsaWMgTm9TdG9uZVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5TdG9uZVJvd09iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5IYXNTdG9uZVNlbGVjdGVkKCkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0U3RlZW4oKTogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWxbXSB7XG4gICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsPy5pbnB1dHMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmlucHV0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciBmaWx0ZXIgPSB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5pbnB1dHNbaV0uZmlsdGVyO1xyXG4gICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIubmFtZSA9PSBcIlN0ZWVuIDFcIikge1xyXG4gICAgICAgICAgdmFyIG9wdGlvbnMgPSBmaWx0ZXIub3B0aW9ucztcclxuXHJcbiAgICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBcnJheTxGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbD4oKTtcclxuICB9XG5cbiAgcHVibGljIEdlbmVyYXRlRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5TZWxlY3RlZFZlcmJhbmRJZCA9PSAtMSkge1xuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuU2VsZWN0ZWRWb2VnSWQgPT0gLTEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLkxvYWRpbmcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBzdG9uZXMgPSB0aGlzLkdldFNlbGVjdGVkU3RvbmVzKCk7XG5cbiAgICBpZiAoc3RvbmVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XG5cbiAgcHVibGljIFNob3dUZXh0dXJlKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuSXNMb2FkaW5nVGV4dHVyZXMoKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuVGV4dHVyZVJlc3BvbnNlTW9kZWwgIT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxuXG4gIHB1YmxpYyBTaG93S2VybihzdG9uZTogU3RvbmVSb3dPYmplY3QsIG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5LZXJuICE9IG51bGwpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5LZXJuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuS2VybltpXS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc3RvbmUubmFtZS50b0xvd2VyQ2FzZSgpKSAhPSAtMSAmJlxyXG4gICAgICAgICAgdGhpcy5LZXJuW2ldLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihvcHRpb24ubmFtZSEudG9Mb3dlckNhc2UoKSkgIT0gLTEpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL3ZhciBzdHJpbmcgPSBvcHRpb24ubmFtZTtcclxuICAgICAgICAvL3RoaXMuS2VybltpXTogXCJBbHQgQmVybGluIEZPIChub3JtYWFsZm9ybWFhdClcIlxyXG4gICAgICAgIC8vb3B0aW9uLm5hbWU6IFwiTm9ybWFhbGZvcm1hYXRcIlxyXG4gICAgICAgIC8vc3RvbmUubmFtZTogXCJBbHQgQmVybGluIEZPIFwiXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRTZWxlY3RlZFN0b25lcygpOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbFtdIHtcbiAgICB2YXIgc3RvbmVzID0gbmV3IEFycmF5PEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsPigpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLlN0b25lUm93T2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5TdG9uZVJvd09iamVjdHNbaV0uR2V0U2VsZWN0ZWRTdG9uZXMoc3RvbmVzKTtcclxuICAgIH1cblxuICAgIHJldHVybiBzdG9uZXM7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRTZWxlY3RlZFN0b25lT2JqZWN0cygpOiBTdG9uZUZvcm1hYXRPYmplY3RbXSB7XG4gICAgdmFyIHN0b25lcyA9IG5ldyBBcnJheTxTdG9uZUZvcm1hYXRPYmplY3Q+KCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5HZXRTZWxlY3RlZFN0b25lT2JqZWN0cyhzdG9uZXMpO1xyXG4gICAgfVxuXG4gICAgcmV0dXJuIHN0b25lcztcclxuICB9XG5cbiAgcHVibGljIEdldFNlbGVjdGVkQW1vdW50KCk6IG51bWJlciB7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgc3RvbmVzID0gbmV3IEFycmF5PFN0b25lRm9ybWFhdE9iamVjdD4oKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5TdG9uZVJvd09iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLkdldFNlbGVjdGVkU3RvbmVPYmplY3RzKHN0b25lcyk7XHJcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0b25lcy5sZW5ndGg7IGkrKykge1xuICAgICAgY291bnQrKztcblxuICAgICAgaWYgKHN0b25lc1tpXS5zZWxlY3RlZGRvdWJsZSkge1xyXG4gICAgICAgIGNvdW50Kys7XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIHJldHVybiBjb3VudDtcclxuICB9XG5cbiAgcHVibGljIEdldEZvcm1hYXQoKTogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWxbXSB7XG4gICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsPy5pbnB1dHMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmlucHV0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciBmaWx0ZXIgPSB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5pbnB1dHNbaV0uZmlsdGVyO1xyXG4gICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIubmFtZSA9PSBcIkZvcm1hYXRcIikge1xyXG4gICAgICAgICAgdmFyIG9wdGlvbnMgPSBmaWx0ZXIub3B0aW9ucztcclxuXHJcbiAgICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBcnJheTxGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbD4oKTtcclxuICB9XG5cbiAgcHVibGljIEdldFZvZWcoKTogRmFicmlrYW50ZW5JbnB1dFZpZXdNb2RlbCB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsPy5pbnB1dHMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmlucHV0c1tpXS5maWx0ZXI/Lm5hbWUgPT0gXCJWb2VnXCIpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5pbnB1dHNbaV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0Vm9lZ0J5SWQoaWQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgbGlzdCA9IHRoaXMuR2V0Vm9lZygpPy5maWx0ZXI/Lm9wdGlvbnM7IC8vIG9mIGNhY2hlIGRlemUgbGlqc3QgaW4gZWVuIHByb3BlcnR5XHJcbiAgICByZXR1cm4gbGlzdD8uZmluZCh2ID0+IHYuaWQgPT09IGlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRWZXJiYW5kZW4oKTogRmFicmlrYW50ZW5Qcm9kdWN0Vmlld01vZGVsW10ge1xyXG4gICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsPy5wcm9kdWN0cyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKHRoaXMuRGlzYWJsZUR1aXRzV2lsZHZlcmJhbmQpIHtcclxuICAgICAgICB2YXIgYXJyYXkgPSBuZXcgQXJyYXk8RmFicmlrYW50ZW5Qcm9kdWN0Vmlld01vZGVsPigpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLnByb2R1Y3RzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwucHJvZHVjdHNbaV0ubmFtZSEudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwiZHVpdHNcIikgPT0gLTEpIHtcclxuICAgICAgICAgICAgYXJyYXkucHVzaCh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5wcm9kdWN0c1tpXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYXJyYXk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLnByb2R1Y3RzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIG5ldyBBcnJheTxGYWJyaWthbnRlblByb2R1Y3RWaWV3TW9kZWw+KCk7XHJcbiAgICB9XHJcblxyXG4gIH1cblxuICBwdWJsaWMgR2V0VmVyYmFuZEJ5SWQoaWQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgbGlzdCA9IHRoaXMuR2V0VmVyYmFuZGVuKCk7IC8vIG9mIGNhY2hlIGRlemUgbGlqc3QgaW4gZWVuIHByb3BlcnR5XHJcbiAgICByZXR1cm4gbGlzdD8uZmluZCh2ID0+IHYuaWQgPT09IGlkKTtcclxuICB9XG5cbiAgcHVibGljIEdldEltYWdlUGF0aChvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogc3RyaW5nIHtcclxuICAgIHZhciB2YWx1ZSA9IG9wdGlvbi5pbWFnZVBhdGggKyBcIlwiO1xyXG5cclxuICAgIGlmICh2YWx1ZS5pbmRleE9mKFwiI0JDQiNcIikgIT0gLTEpIHtcclxuICAgICAgdmFyIGJjYnVybCA9IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuYmNiV2Vic2VydmljZVVSTEJhc2UgKyBcIlwiO1xyXG4gICAgICBiY2J1cmwgPSBiY2J1cmwuc3Vic3RyaW5nKDAsIGJjYnVybC5sZW5ndGggLSAxKTtcclxuXHJcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShcIiNCQ0IjXCIsIGJjYnVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEdldEltYWdlUGF0aFByb2R1Y3Qob3B0aW9uOiBGYWJyaWthbnRlblByb2R1Y3RWaWV3TW9kZWwpOiBzdHJpbmcge1xyXG4gICAgdmFyIHZhbHVlID0gb3B0aW9uLmltYWdlUGF0aCArIFwiXCI7XHJcblxyXG4gICAgaWYgKHZhbHVlLmluZGV4T2YoXCIjQkNCI1wiKSAhPSAtMSkge1xyXG4gICAgICB2YXIgYmNidXJsID0gdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5TZXR0aW5nc1ZpZXdNb2RlbC5iY2JXZWJzZXJ2aWNlVVJMQmFzZSArIFwiXCI7XHJcbiAgICAgIGJjYnVybCA9IGJjYnVybC5zdWJzdHJpbmcoMCwgYmNidXJsLmxlbmd0aCAtIDEpO1xyXG5cclxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKFwiI0JDQiNcIiwgYmNidXJsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRQYXRyb29uRG93bmxvYWRVUkwoKTogc3RyaW5nIHtcclxuXHJcbiAgICB2YXIgdXJsID0gdGhpcy5UZXh0dXJlUmVzcG9uc2VNb2RlbD8ucGF0cm9vblVSTCArIFwiXCI7XHJcblxyXG4gICAgdXJsID0gdXJsLnJlcGxhY2UodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5TZXR0aW5nc1ZpZXdNb2RlbC5iY2JXZWJzZXJ2aWNlVVJMQmFzZSArIFwiXCIsIFwiXCIpO1xyXG5cclxuICAgIHZhciB0ZW1wID1cclxuICAgICAgdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5TZXR0aW5nc1ZpZXdNb2RlbC5iY2JXZWJzZXJ2aWNlVVJMQmFzZSArXHJcbiAgICAgIFwiRG93bmxvYWQuYXNweD9maWxlPVwiICtcclxuICAgICAgdXJsICtcclxuICAgICAgXCImZG9lbD1cIiArXHJcbiAgICAgIHRoaXMuR2V0RG93bmxvYWROYW1lKCkgK1xyXG4gICAgICBcIi5wbmdcIjtcclxuXHJcbiAgICByZXR1cm4gdGVtcDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRCdW1wRG93bmxvYWRVUkwoKTogc3RyaW5nIHtcclxuICAgIHZhciB1cmwgPSB0aGlzLlRleHR1cmVSZXNwb25zZU1vZGVsPy5idW1wVVJMICsgXCJcIjtcclxuXHJcbiAgICB1cmwgPSB1cmwucmVwbGFjZSh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmJjYldlYnNlcnZpY2VVUkxCYXNlICsgXCJcIiwgXCJcIik7XHJcblxyXG4gICAgdmFyIHRlbXAgPVxyXG4gICAgICB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmJjYldlYnNlcnZpY2VVUkxCYXNlICtcclxuICAgICAgXCJEb3dubG9hZC5hc3B4P2ZpbGU9XCIgK1xyXG4gICAgICB1cmwgK1xyXG4gICAgICBcIiZkb2VsPVwiICtcclxuICAgICAgdGhpcy5HZXREb3dubG9hZE5hbWUoKSArXHJcbiAgICAgIFwiX2J1bXAucG5nXCI7XHJcblxyXG4gICAgcmV0dXJuIHRlbXA7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXREb3dubG9hZE5hbWUoKTogc3RyaW5nIHtcclxuICAgIHZhciBib25kID0gdGhpcy5HZXRWZXJiYW5kQnlJZCh0aGlzLlNlbGVjdGVkVmVyYmFuZElkKTtcclxuICAgIHZhciBib25kX3N0ciA9IHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LlByb2R1Y3QsIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgYm9uZD8uaWQpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgdmFyIHZvZWcgPSB0aGlzLkdldFZvZWdCeUlkKHRoaXMuU2VsZWN0ZWRWb2VnSWQpO1xyXG4gICAgdmFyIHZvZWdfc3RyID0gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuRmlsdGVyT3B0aW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk5hbWUsIHZvZWc/LmlkKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIHZhciByZXNvID0gXCJMUVwiO1xyXG5cclxuICAgIGlmICh0aGlzLkhpUmVzKSB7XHJcbiAgICAgIHJlc28gPSBcIkhRXCI7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHN0b25lcyA9IHRoaXMuR2V0U2VsZWN0ZWRTdG9uZXMoKTtcclxuICAgIHZhciBzdGVlbiA9IFwiXCI7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdG9uZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHN0ZWVuICE9IFwiXCIpIHtcclxuICAgICAgICBzdGVlbiArPSBcIl9cIjtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3RlZW4gKz0gKHN0b25lc1tpXS51cmxOYW1lICsgXCJcIikucmVwbGFjZShcIl9cIiwgXCIgXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBlbmQgPSBcIl9cIiArIHRoaXMuR2V0RGltZW5zaW9uKCkgKyBcIl9cIiArIGJvbmRfc3RyICsgXCJfXCIgKyB2b2VnX3N0ciArIFwiX1wiICsgcmVzb1xyXG5cclxuICAgIHZhciBsZWZ0ID0gMjUwIC0gZW5kLmxlbmd0aDtcclxuXHJcbiAgICBpZiAoc3RlZW4ubGVuZ3RoID4gbGVmdCkge1xyXG4gICAgICBzdGVlbiA9IHN0ZWVuLnN1YnN0cmluZygwLCBsZWZ0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3RlZW4gKyBlbmQ7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRBY3RpdmVTdGVlbigpOiBzdHJpbmcge1xyXG4gICAgdmFyIHN0b25lcyA9IHRoaXMuR2V0U2VsZWN0ZWRTdG9uZXMoKTtcclxuXHJcbiAgICBpZiAoc3RvbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIHN0b25lc1swXS51cmxOYW1lICsgXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gXCJcIjtcclxuICB9XG5cbiAgcHVibGljIEZpbGxBcnJheXMoKSB7XG4gICAgdGhpcy5TdG9uZVJvd09iamVjdHMgPSBuZXcgQXJyYXk8U3RvbmVSb3dPYmplY3Q+KCk7XHJcblxyXG4gICAgdmFyIGZvcm1hYXQgPSB0aGlzLkdldFN0ZWVuKCk7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3JtYWF0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBuYW1lOiBzdHJpbmcgPSBmb3JtYWF0W2ldLm5hbWUgKyBcIlwiO1xyXG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5pbmRleE9mKCcoJykpICsgXCJcIjtcclxuXHJcbiAgICAgIHZhciBzdG9uZXJvd29iamVjdDogU3RvbmVSb3dPYmplY3QgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5TdG9uZVJvd09iamVjdHMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAodGhpcy5TdG9uZVJvd09iamVjdHNbal0ubmFtZSA9PSBuYW1lKSB7XHJcbiAgICAgICAgICBzdG9uZXJvd29iamVjdCA9IHRoaXMuU3RvbmVSb3dPYmplY3RzW2pdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHN0b25lcm93b2JqZWN0ID09IG51bGwpIHtcclxuICAgICAgICBzdG9uZXJvd29iamVjdCA9IG5ldyBTdG9uZVJvd09iamVjdChuYW1lLCB0aGlzLkZhYnJpa2FudGVuU2VydmljZSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5TdG9uZVJvd09iamVjdHMucHVzaChzdG9uZXJvd29iamVjdCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN0b25lcm93b2JqZWN0LkFkZE9wdGlvbihmb3JtYWF0W2ldKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLlN0b25lUm93T2JqZWN0cy5zb3J0KGZ1bmN0aW9uIChzdG9uZTEsIHN0b25lMikgeyByZXR1cm4gc3RvbmUxLm5hbWUubG9jYWxlQ29tcGFyZShzdG9uZTIubmFtZSkgfSk7XHJcbiAgfVxuXG4gIHB1YmxpYyBJc1JhdGlvQmxvY2tpbmcoKTogYm9vbGVhbiB7XG4gICAgdmFyIHZlcmJhbmQgPSB0aGlzLkdldFZlcmJhbmRCeUlkKHRoaXMuU2VsZWN0ZWRWZXJiYW5kSWQpO1xuXG4gICAgaWYgKHZlcmJhbmQ/LmluZm8gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHZhciBvYmplY3QgPSBKU09OLnBhcnNlKHZlcmJhbmQuaW5mbyk7XHJcbiAgICAgIHZhciBzdHIgPSB0aGlzLkdldExlbmd0ZSgpICsgXCIgPT0gXCIgKyAoMiAqIHRoaXMuR2V0QnJlZWR0ZSgpKSArIFwiICsgXCIgKyB0aGlzLlN0b290dm9lZztcclxuICAgICAgLy9hbGVydChvYmplY3QucmF0aW8gKyBcIjogXCIgKyBzdHIgKyBcIiA6IFwiICsgZXZhbChzdHIpKTtcclxuICAgICAgdmFyIGV2YWxTdHIgPSBvYmplY3QucmF0aW8gKyBcIlwiO1xyXG4gICAgICBldmFsU3RyID0gZXZhbFN0ci5yZXBsYWNlKFwiYnJlZWR0ZVwiLCB0aGlzLkdldEJyZWVkdGUoKS50b1N0cmluZygpKTtcclxuICAgICAgZXZhbFN0ciA9IGV2YWxTdHIucmVwbGFjZShcImxlbmd0ZVwiLCB0aGlzLkdldExlbmd0ZSgpLnRvU3RyaW5nKCkpO1xyXG4gICAgICBldmFsU3RyID0gZXZhbFN0ci5yZXBsYWNlKFwidm9lZ2JyZWVkdGVcIiwgdGhpcy5TdG9vdHZvZWcudG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICBpZiAoZXZhbChldmFsU3RyKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB2YXIgbWVzc2FnZSA9IHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5SYXRpb1dhcm5pbmcpO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXHJcXG5cIjtcclxuICAgICAgICBtZXNzYWdlICs9IFwiXFxyXFxuXCI7XHJcbiAgICAgICAgbWVzc2FnZSArPSB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuUGlja2VkQm9uZCkgKyBcIjogXCIgKyB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Qcm9kdWN0LCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk5hbWUsIHZlcmJhbmQuaWQpO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXHJcXG5cIjtcclxuICAgICAgICBtZXNzYWdlICs9IHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5SYXRpb0JvbmQpICsgXCI6IFwiICsgb2JqZWN0LnJhdGlvO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXHJcXG5cIjtcclxuICAgICAgICBtZXNzYWdlICs9IFwiXFxyXFxuXCI7XHJcbiAgICAgICAgbWVzc2FnZSArPSB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuU3RvbmVMZW5ndGUpICsgXCI6IFwiICsgdGhpcy5HZXRMZW5ndGUoKTtcclxuICAgICAgICBtZXNzYWdlICs9IFwiXFxyXFxuXCI7XHJcbiAgICAgICAgbWVzc2FnZSArPSB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuU3RvbmVXaWR0aCkgKyBcIjogXCIgKyB0aGlzLkdldEJyZWVkdGUoKTtcclxuICAgICAgICBtZXNzYWdlICs9IFwiXFxyXFxuXCI7XHJcbiAgICAgICAgbWVzc2FnZSArPSB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuU3Rvb3R2b2VnKSArIFwiOiBcIiArIHRoaXMuU3Rvb3R2b2VnO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXHJcXG5cIjtcclxuICAgICAgICBtZXNzYWdlICs9IFwiXFxyXFxuXCI7XHJcbiAgICAgICAgbWVzc2FnZSArPSB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuU3RvbmVDb21wbGV0ZSkgKyBcIjogXCIgKyBldmFsU3RyO1xyXG5cclxuICAgICAgICBhbGVydChtZXNzYWdlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XG5cbiAgcHVibGljIFRleHR1dXJHZW5lcmVyZW4oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5IYXNUb0ZpbGxGb3JtKCkpIHtcclxuICAgICAgdmFyIGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRmFiRm9ybURpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGZvcm06IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuZG93bmxvYWRGb3JtXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmhhc0ZpbGxlZEZvcm1zKSB7XHJcbiAgICAgICAgICB0aGlzLlRleHR1dXJHZW5lcmVyZW4oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHZhciB2YWxpZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAodGhpcy5Jc1JhdGlvQmxvY2tpbmcoKSkge1xyXG4gICAgICAgIHZhbGlkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh2YWxpZCkge1xyXG4gICAgICAgIHZhciBzdG9uZXMgPSB0aGlzLkdldFNlbGVjdGVkU3RvbmVPYmplY3RzKCk7XHJcbiAgICAgICAgdmFyIGFsbHN0b25lcyA9IG5ldyBBcnJheTxGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbD4oKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdG9uZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChzdG9uZXNbaV0uc2VsZWN0ZWRkb3VibGUpIHtcclxuICAgICAgICAgICAgc3RvbmVzW2ldLm9wdGlvbnNbMF0ubWl4UmF0aW8gPSBzdG9uZXNbaV0ubWl4UmF0aW8gLyAyO1xyXG4gICAgICAgICAgICBzdG9uZXNbaV0ub3B0aW9uc1sxXS5taXhSYXRpbyA9IHN0b25lc1tpXS5taXhSYXRpbyAvIDI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc3RvbmVzW2ldLm9wdGlvbnNbMF0ubWl4UmF0aW8gPSBzdG9uZXNbaV0ubWl4UmF0aW87XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYWxsc3RvbmVzLnB1c2goc3RvbmVzW2ldLm9wdGlvbnNbMF0pO1xyXG5cclxuICAgICAgICAgIGlmIChzdG9uZXNbaV0uc2VsZWN0ZWRkb3VibGUpIHtcclxuICAgICAgICAgICAgYWxsc3RvbmVzLnB1c2goc3RvbmVzW2ldLm9wdGlvbnNbMV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFsbHN0b25lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgVGV4dHVyZVJlcXVlc3RNb2RlbCgpO1xyXG5cclxuICAgICAgICAgIHJlcXVlc3QudmVyYmFuZElkID0gdGhpcy5TZWxlY3RlZFZlcmJhbmRJZDtcclxuICAgICAgICAgIHJlcXVlc3Quc3RlZW5JZCA9IGFsbHN0b25lc1swXS5pZDtcclxuICAgICAgICAgIHJlcXVlc3Quc3RlZW5SYXRpbyA9IGFsbHN0b25lc1swXS5taXhSYXRpbztcclxuICAgICAgICAgIHJlcXVlc3Qudm9lZ0lkID0gdGhpcy5TZWxlY3RlZFZvZWdJZDtcclxuICAgICAgICAgIHJlcXVlc3QuaGlnaFJlc29sdXRpb24gPSB0aGlzLkhpUmVzO1xyXG4gICAgICAgICAgcmVxdWVzdC5zaGFkdXcgPSB0aGlzLlNoYWRlO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLkhpUmVzKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3QubWluQWFudGFsQml0bWFwID0gMTAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3QubWluQWFudGFsQml0bWFwID0gdGhpcy5BYW50YWxTdGVuZW47XHJcbiAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgIGlmIChhbGxzdG9uZXMubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgICByZXF1ZXN0LnN0ZWVuMklkID0gLTE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmVxdWVzdC5zdGVlbjJJZCA9IGFsbHN0b25lc1sxXS5pZDtcclxuICAgICAgICAgICAgcmVxdWVzdC5zdGVlbjJSYXRpbyA9IGFsbHN0b25lc1sxXS5taXhSYXRpbztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoYWxsc3RvbmVzLmxlbmd0aCA8IDMpIHtcclxuICAgICAgICAgICAgcmVxdWVzdC5zdGVlbjNJZCA9IC0xO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3Quc3RlZW4zSWQgPSBhbGxzdG9uZXNbMl0uaWQ7XHJcbiAgICAgICAgICAgIHJlcXVlc3Quc3RlZW4zUmF0aW8gPSBhbGxzdG9uZXNbMl0ubWl4UmF0aW87XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGFsbHN0b25lcy5sZW5ndGggPCA0KSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3Quc3RlZW40SWQgPSAtMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXF1ZXN0LnN0ZWVuNElkID0gYWxsc3RvbmVzWzNdLmlkO1xyXG4gICAgICAgICAgICByZXF1ZXN0LnN0ZWVuNFJhdGlvID0gYWxsc3RvbmVzWzNdLm1peFJhdGlvO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChhbGxzdG9uZXMubGVuZ3RoIDwgNSkge1xyXG4gICAgICAgICAgICByZXF1ZXN0LnN0ZWVuNUlkID0gLTE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmVxdWVzdC5zdGVlbjVJZCA9IGFsbHN0b25lc1s0XS5pZDtcclxuICAgICAgICAgICAgcmVxdWVzdC5zdGVlbjVSYXRpbyA9IGFsbHN0b25lc1s0XS5taXhSYXRpbztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5TdG9vdHZvZWcgPCB0aGlzLlN0b290dm9lZ01pbikge1xyXG4gICAgICAgICAgICB0aGlzLlN0b290dm9lZyA9IHRoaXMuU3Rvb3R2b2VnTWluO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLlN0b290dm9lZyA+IHRoaXMuU3Rvb3R2b2VnTWF4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuU3Rvb3R2b2VnID0gdGhpcy5TdG9vdHZvZWdNYXg7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmVxdWVzdC5icmVlZHRlU3Rvb3R2b2VnID0gdGhpcy5TdG9vdHZvZWc7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuTGludHZvZWcgPCB0aGlzLkxpbnR2b2VnTWluKSB7XHJcbiAgICAgICAgICAgIHRoaXMuTGludHZvZWcgPSB0aGlzLkxpbnR2b2VnTWluO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLkxpbnR2b2VnID4gdGhpcy5MaW50dm9lZ01heCkge1xyXG4gICAgICAgICAgICB0aGlzLkxpbnR2b2VnID0gdGhpcy5MaW50dm9lZ01heDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXF1ZXN0Lmhvb2d0ZUxpbnR2b2VnID0gdGhpcy5MaW50dm9lZztcclxuXHJcbiAgICAgICAgICB0aGlzLlRleHR1cmVBcGlDbGllbnQuZ2V0VGV4dHVyZShyZXF1ZXN0KS5zdWJzY3JpYmUoKG1vZGVsOiBUZXh0dXJlUmVzcG9uc2VNb2RlbCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLlRleHR1cmVSZXNwb25zZU1vZGVsID0gbW9kZWw7XHJcbiAgICAgICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgfSwgKGVycm9yOiBSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwMClcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5qc29uKCkpO1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cmVkJyk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cblxuICBwdWJsaWMgU2V0TWl4UmF0aW9zKCk6IHZvaWQge1xuICAgIHRoaXMuVXBkYXRlUmF0aW9zKCk7XHJcbiAgfVxuXG4gIHB1YmxpYyBVcGRhdGVSYXRpb3MoKTogdm9pZCB7XG4gICAgdmFyIHN0b25lcyA9IHRoaXMuR2V0U2VsZWN0ZWRTdG9uZU9iamVjdHMoKTtcbiAgICB2YXIgYW1vdW50ID0gdGhpcy5HZXRTZWxlY3RlZEFtb3VudCgpO1xuICAgIHRoaXMuTWl4UmF0aW9TZWxlY3QgPSB0cnVlO1xuXG4gICAgaWYgKHN0b25lcy5sZW5ndGggIT0gMCkge1xuXG4gICAgICBpZiAodGhpcy5Jc1RleHR1cmVNaXgyNSgpKSB7XG4gICAgICAgIGlmIChhbW91bnQgPiAzKSB7XHJcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0b25lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoc3RvbmVzW2ldLnNlbGVjdGVkZG91YmxlKSB7XHJcbiAgICAgICAgICAgICAgc3RvbmVzW2ldLm1peFJhdGlvID0gNTA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgc3RvbmVzW2ldLm1peFJhdGlvID0gMjU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLk1peFJhdGlvU2VsZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGFtb3VudCA9PSAzKSB7XHJcbiAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlO1xyXG5cclxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RvbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChzdG9uZXNbaV0uc2VsZWN0ZWRkb3VibGUpIHtcclxuICAgICAgICAgICAgICBzdG9uZXNbaV0ubWl4UmF0aW8gPSA1MDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcclxuICAgICAgICAgICAgICAgIHN0b25lc1tpXS5taXhSYXRpbyA9IDUwO1xyXG4gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdG9uZXNbaV0ubWl4UmF0aW8gPSAyNTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLk1peFJhdGlvU2VsZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGFtb3VudCA9PSAyKSB7XHJcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0b25lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoc3RvbmVzW2ldLnNlbGVjdGVkZG91YmxlKSB7XHJcbiAgICAgICAgICAgICAgc3RvbmVzW2ldLm1peFJhdGlvID0gMTAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHN0b25lc1tpXS5taXhSYXRpbyA9IDUwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5NaXhSYXRpb1NlbGVjdCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLlN0b25lUm93T2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5vcHRpb25zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgLy8gICAgZm9yICh2YXIgcyA9IDA7IHMgPCBzdG9uZXMubGVuZ3RoOyBzKyspIHtcclxuICAgICAgICAvLyAgICAgIGlmICh0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5vcHRpb25zW2pdLkNvbnRhaW5zKHN0b25lc1tzXS5pZCkpIHtcclxuICAgICAgICAvLyAgICAgICAgdGhpcy5TdG9uZVJvd09iamVjdHNbaV0ub3B0aW9uc1tqXS5taXhSYXRpbyA9IE1hdGgucm91bmQoMTAwIC8gc3RvbmVzLmxlbmd0aCk7XHJcbiAgICAgICAgLy8gICAgICB9XHJcbiAgICAgICAgLy8gICAgfVxyXG4gICAgICAgIC8vICB9XHJcbiAgICAgICAgLy99XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XG5cbiAgcHVibGljIFVwZGF0ZURpc2FibGVEdWl0c1dpbGR2ZXJiYW5kKCk6IHZvaWQge1xyXG4gICAgdGhpcy5EaXNhYmxlRHVpdHNXaWxkdmVyYmFuZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLlNlbGVjdGVkRm9ybWFhdD8ubmFtZSAhPSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLlNlbGVjdGVkRm9ybWFhdC5uYW1lPy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJtb2R1dWxcIikgIT0gLTEpIHtcclxuICAgICAgICB0aGlzLkRpc2FibGVEdWl0c1dpbGR2ZXJiYW5kID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cblxuICBwdWJsaWMgR2V0Rm9ybWFhdFN0cigpOiBzdHJpbmcge1xuICAgIHZhciBzdG9uZXMgPSB0aGlzLkdldFNlbGVjdGVkU3RvbmVzKCk7XG5cbiAgICBpZiAoc3RvbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdmFyIG5hbWU6IHN0cmluZyA9IHN0b25lc1swXS5uYW1lICsgXCJcIjtcclxuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUuaW5kZXhPZignKCcpKSArIFwiXCI7XHJcblxyXG4gICAgICBpZiAobmFtZS5pbmRleE9mKFwidm9vcnppamRlXCIpICE9IC0xKSB7XHJcbiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShcIiAodm9vcnppamRlKVwiLCBcIlwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5hbWUuaW5kZXhPZihcImFjaHRlcnppamRlXCIpICE9IC0xKSB7XHJcbiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShcIiAoYWNodGVyemlqZGUpXCIsIFwiXCIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gbmFtZTtcclxuICAgIH1cblxyXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXREaW1lbnNpb24oKTogc3RyaW5nIHtcbiAgICB2YXIgZm9ybWFhdCA9IHRoaXMuR2V0Rm9ybWFhdFN0cigpO1xuXG4gICAgc3dpdGNoIChmb3JtYWF0KSB7XG4gICAgICBjYXNlIFwiKG5vcm1hYWxmb3JtYWF0KVwiOlxyXG4gICAgICAgIHJldHVybiBcIjI0MHgxMTV4NzFcIjtcclxuICAgICAgY2FzZSBcIihkdW5uZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gXCIyNDB4MTE1eDUyXCI7XHJcbiAgICAgIGNhc2UgXCIobW9kdXVsZm9ybWFhdCA1MilcIjpcclxuICAgICAgICByZXR1cm4gXCIyOTB4OTB4NTJcIjtcclxuICAgICAgY2FzZSBcIih3YWFsZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gXCIyMTB4MTAweDUyXCI7XHJcbiAgICB9XG5cbiAgICByZXR1cm4gXCJcIjtcclxuICB9XG5cbiAgcHVibGljIEdldEtlcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LkN1c3RvbUl0ZW0sIHVuZGVmaW5lZCwgXCJLZXJuXCIpO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0TFNUb29sdGlwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5DdXN0b21JdGVtLCB1bmRlZmluZWQsIFwiTFNcIik7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRXU1Rvb2x0aXAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LkN1c3RvbUl0ZW0sIHVuZGVmaW5lZCwgXCJXU1wiKTtcclxuICB9XG5cbiAgcHVibGljIEdldExlbmd0ZSgpOiBudW1iZXIge1xuICAgIHZhciBmb3JtYWF0ID0gdGhpcy5HZXRGb3JtYWF0U3RyKCk7XG5cbiAgICBzd2l0Y2ggKGZvcm1hYXQpIHtcbiAgICAgIGNhc2UgXCIobm9ybWFhbGZvcm1hYXQpXCI6XHJcbiAgICAgICAgcmV0dXJuIDI0MDtcclxuICAgICAgY2FzZSBcIihkdW5uZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gMjQwO1xyXG4gICAgICBjYXNlIFwiKG1vZHV1bGZvcm1hYXQgNTIpXCI6XHJcbiAgICAgICAgcmV0dXJuIDI5MDtcclxuICAgICAgY2FzZSBcIih3YWFsZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gMjEwO1xyXG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0QnJlZWR0ZSgpOiBudW1iZXIge1xuICAgIHZhciBmb3JtYWF0ID0gdGhpcy5HZXRGb3JtYWF0U3RyKCk7XG5cbiAgICBzd2l0Y2ggKGZvcm1hYXQpIHtcbiAgICAgIGNhc2UgXCIobm9ybWFhbGZvcm1hYXQpXCI6XHJcbiAgICAgICAgcmV0dXJuIDExNTtcclxuICAgICAgY2FzZSBcIihkdW5uZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gMTE1O1xyXG4gICAgICBjYXNlIFwiKG1vZHV1bGZvcm1hYXQgNTIpXCI6XHJcbiAgICAgICAgcmV0dXJuIDkwO1xyXG4gICAgICBjYXNlIFwiKHdhYWxmb3JtYWF0KVwiOlxyXG4gICAgICAgIHJldHVybiAxMDA7XHJcbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XHJcbiAgfVxufVxuXG5jbGFzcyBTdG9uZVJvd09iamVjdCB7XG4gIG5hbWU6IHN0cmluZztcclxuXHJcbiAgb3B0aW9uczogU3RvbmVGb3JtYWF0T2JqZWN0W10gPSBuZXcgQXJyYXk8U3RvbmVGb3JtYWF0T2JqZWN0PigpO1xyXG5cclxuICBwcml2YXRlIEZhYnJpa2FudGVuU2VydmljZTogRmFicmlrYW50ZW5TZXJ2aWNlO1xyXG4gIHB1YmxpYyBGYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50OiBGYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50O1xyXG5cclxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIEZhYnJpa2FudGVuU2VydmljZTogRmFicmlrYW50ZW5TZXJ2aWNlLCBGYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50OiBGYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50KSB7XHJcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgdGhpcy5GYWJyaWthbnRlblNlcnZpY2UgPSBGYWJyaWthbnRlblNlcnZpY2U7XHJcbiAgICB0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQgPSBGYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFNlbGVjdChvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuQ2FuU2VsZWN0U3RvbmUob3B0aW9uKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YXIgbmFtZSA9IHRoaXMub3B0aW9uc1tpXS5uYW1lO1xyXG4gICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgb3B0aW9uLm5hbWUgIT0gbnVsbCAmJiBuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihvcHRpb24ubmFtZS50b0xvd2VyQ2FzZSgpKSAhPSAtMSAmJiAob3B0aW9uLm5hbWUgIT0gXCJEdW5uZm9ybWFhdFwiIHx8IG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwiZHViYmVsXCIpID09IC0xKSkge1xyXG5cclxuICAgICAgICAgIHRoaXMub3B0aW9uc1tpXS5zZWxlY3RlZCA9ICF0aGlzLm9wdGlvbnNbaV0uc2VsZWN0ZWQ7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnNbaV0uc2VsZWN0ZWRkb3VibGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zW2ldLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5TZWxlY3RlZEZvcm1hYXQgPSBvcHRpb247XHJcbiAgICAgICAgICAgIHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5VcGRhdGVEaXNhYmxlRHVpdHNXaWxkdmVyYmFuZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuTm9TdG9uZVNlbGVjdGVkKCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuU2VsZWN0ZWRGb3JtYWF0ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LlNldE1peFJhdGlvcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIEFkZE9wdGlvbihvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogdm9pZCB7XG4gICAgdmFyIG5hbWUgPSBvcHRpb24ubmFtZSArIFwiXCI7XG5cbiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKFwiKHZvb3J6aWpkZSlcIiwgXCJcIik7XG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZShcIihhY2h0ZXJ6aWpkZSlcIiwgXCJcIik7XG4gICAgbmFtZSA9IG5hbWUudHJpbSgpO1xuXG4gICAgdmFyIHN0b25lcm93ID0gbnVsbDtcbiAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0ubmFtZSA9PSBuYW1lKSB7XHJcbiAgICAgICAgICBzdG9uZXJvdyA9IHRoaXMub3B0aW9uc1tpXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIGlmIChzdG9uZXJvdyA9PSBudWxsKSB7XG4gICAgICBzdG9uZXJvdyA9IG5ldyBTdG9uZUZvcm1hYXRPYmplY3QoKTtcclxuICAgICAgc3RvbmVyb3cubmFtZSA9IG5hbWUgKyBcIlwiO1xyXG4gICAgICB0aGlzLm9wdGlvbnMucHVzaChzdG9uZXJvdyk7XHJcblxyXG4gICAgfVxuXG4gICAgc3RvbmVyb3cuQWRkU3RvbmUob3B0aW9uKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBDYW5TZWxlY3RTdG9uZShvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogYm9vbGVhbiB7XG4gICAgdmFyIGFtb3VudCA9IHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5HZXRTZWxlY3RlZEFtb3VudCgpO1xuXG4gICAgaWYgKGFtb3VudCA9PSA0KSB7XG4gICAgICByZXR1cm4gdGhpcy5Jc1NlbGVjdGVkKG9wdGlvbik7XHJcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZiAodGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LlNlbGVjdGVkRm9ybWFhdCA9PSBudWxsIHx8XG4gICAgICAgIHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5TZWxlY3RlZEZvcm1hYXQuaWQgPT0gb3B0aW9uLmlkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBEaXNhYmxlVG9nZ2xlKCk6IGJvb2xlYW4ge1xuICAgIHZhciBzdG9uZXMgPSB0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuR2V0U2VsZWN0ZWRTdG9uZU9iamVjdHMoKTtcblxuICAgIHJldHVybiBzdG9uZXMubGVuZ3RoID09IDQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0U2VsZWN0ZWRTdG9uZU9iamVjdHMoc3RvbmVzOiBBcnJheTxTdG9uZUZvcm1hYXRPYmplY3Q+KTogdm9pZCB7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uc2VsZWN0ZWQpIHtcclxuICAgICAgICBzdG9uZXMucHVzaCh0aGlzLm9wdGlvbnNbaV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0U3RvbmVGb3JtYWF0T2JqZWN0KG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiBTdG9uZUZvcm1hYXRPYmplY3QgfCBudWxsIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgbmFtZSA9IHRoaXMub3B0aW9uc1tpXS5uYW1lO1xyXG4gICAgICBpZiAobmFtZSAhPSBudWxsICYmIG9wdGlvbi5uYW1lICE9IG51bGwgJiYgbmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yob3B0aW9uLm5hbWUudG9Mb3dlckNhc2UoKSkgIT0gLTEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zW2ldO1xyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBIYXNTdG9uZShvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogYm9vbGVhbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIG5hbWUgPSB0aGlzLm9wdGlvbnNbaV0ubmFtZTtcclxuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBvcHRpb24ubmFtZSAhPSBudWxsICYmIG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKG9wdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCkpICE9IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBJc0RvdXZsZUFWKG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiBib29sZWFuIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgbmFtZSA9IHRoaXMub3B0aW9uc1tpXS5uYW1lO1xyXG4gICAgICBpZiAobmFtZSAhPSBudWxsICYmIG9wdGlvbi5uYW1lICE9IG51bGwgJiYgbmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yob3B0aW9uLm5hbWUudG9Mb3dlckNhc2UoKSkgIT0gLTEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zW2ldLmRvdWJsZWF2O1xyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSGFzU3RvbmVTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zW2ldLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBJc0FueVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uc2VsZWN0ZWQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIElzU2VsZWN0ZWQob3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBuYW1lID0gdGhpcy5vcHRpb25zW2ldLm5hbWU7XHJcbiAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgb3B0aW9uLm5hbWUgIT0gbnVsbCAmJiBuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihvcHRpb24ubmFtZS50b0xvd2VyQ2FzZSgpKSAhPSAtMSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbaV0uc2VsZWN0ZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRJbWFnZShvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogc3RyaW5nIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgbmFtZSA9IHRoaXMub3B0aW9uc1tpXS5uYW1lO1xyXG4gICAgICBpZiAobmFtZSAhPSBudWxsICYmIG9wdGlvbi5uYW1lICE9IG51bGwgJiYgbmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yob3B0aW9uLm5hbWUudG9Mb3dlckNhc2UoKSkgIT0gLTEpIHtcclxuXHJcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5vcHRpb25zW2ldLm9wdGlvbnNbMF0uaW1hZ2VQYXRoICsgXCJcIjtcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoXCIjQkNCI1wiKSAhPSAtMSkge1xyXG4gICAgICAgICAgdmFyIGJjYnVybCA9IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuYmNiV2Vic2VydmljZVVSTEJhc2UgKyBcIlwiO1xyXG4gICAgICAgICAgYmNidXJsID0gYmNidXJsLnN1YnN0cmluZygwLCBiY2J1cmwubGVuZ3RoIC0gMSk7XHJcblxyXG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKFwiI0JDQiNcIiwgYmNidXJsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0U3RvbmUob3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgbmFtZSA9IHRoaXMub3B0aW9uc1tpXS5uYW1lO1xyXG4gICAgICBpZiAobmFtZSAhPSBudWxsICYmIG9wdGlvbi5uYW1lICE9IG51bGwgJiYgbmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yob3B0aW9uLm5hbWUudG9Mb3dlckNhc2UoKSkgIT0gLTEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zW2ldLm9wdGlvbnNbMF07XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIHJldHVybiBuZXcgRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRTZWxlY3RlZFN0b25lcyhzdG9uZXM6IEFycmF5PEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsPik6IHZvaWQge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMub3B0aW9uc1tpXS5HZXRTZWxlY3RlZFN0b25lcyhzdG9uZXMpO1xyXG4gICAgfVxyXG4gIH1cclxufVxuXG5jbGFzcyBTdG9uZUZvcm1hYXRPYmplY3Qge1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJcIjtcclxuICBwdWJsaWMgbWl4UmF0aW86IG51bWJlciA9IDA7XHJcbiAgcHVibGljIHNlbGVjdGVkTWl4UmF0aW86IG51bWJlciA9IDA7XHJcbiAgcHVibGljIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIG9wdGlvbnM6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsW10gPSBuZXcgQXJyYXk8RmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWw+KCk7XHJcbiAgcHVibGljIGRvdWJsZWF2OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNlbGVjdGVkZG91YmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIENvbnRhaW5zKGlkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uaWQgPT0gaWQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBBZGRTdG9uZShzdG9uZTogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiB2b2lkIHtcclxuICAgIHRoaXMub3B0aW9ucy5wdXNoKHN0b25lKTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5kb3VibGVhdiA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0U2VsZWN0ZWRTdG9uZXMoc3RvbmVzOiBBcnJheTxGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbD4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZCkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRkb3VibGUpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgc3RvbmVzLnB1c2godGhpcy5vcHRpb25zW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBzdG9uZXMucHVzaCh0aGlzLm9wdGlvbnNbMF0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XG4iLCI8ZGl2ICpuZ0lmPVwiSXNMb2FkaW5nKClcIiBjbGFzcz1cImxvYWRlclwiPlxyXG4gIDxtYXQtY2FyZCBjbGFzcz1cImxvYWRlci1jYXJkXCI+XHJcbiAgICA8bWF0LWNhcmQtY29udGVudD5cclxuICAgICAgPG1hdC1zcGlubmVyIGNsYXNzPVwibG9hZGVyLXNwaW5uZXJcIiBbZGlhbWV0ZXJdPVwiODBcIj48L21hdC1zcGlubmVyPlxyXG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxyXG4gICAgPG1hdC1jYXJkLXN1YnRpdGxlIGNsYXNzPVwibG9hZGVyLXN1YnRpdGxlXCIgKm5nSWY9XCIhRmFicmlrYW50ZW5TZXJ2aWNlLklzU3RhcnRpbmdEb3dubG9hZCgpXCI+XHJcbiAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuUHJvZHVjdHNMb2FkaW5nKSB9fVxyXG4gICAgPC9tYXQtY2FyZC1zdWJ0aXRsZT5cclxuICA8L21hdC1jYXJkPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgKm5nSWY9XCIhSXNMb2FkaW5nKClcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XHJcbiAgPGRpdiBzdHlsZT1cImZsZXg6YXV0bztcIj48L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiY2VudGVyLWJsb2NrXCI+XHJcbiAgICA8bmctY29udGFpbmVyIGNsYXNzPVwidGFibGUtY29udGFpbmVyXCIgKm5nSWY9XCIhdGhpcy5TaW5nbGVTdG9uZU1vZGVcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwibWFpbi10YWJsZVwiPlxyXG4gICAgICAgIDx0ciBjbGFzcz1cIm1haW4tdGFibGUtdG9wLXJvd1wiPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwibWFpbi10YWJsZS10b3Atcm93LWZpcnN0IG1haW4tdGFibGUtdG9wLXJvdy10ZFwiPjwvdGQ+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgR2V0Rm9ybWFhdCgpXCI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1haW4tdGFibGUtdG9wLXJvdy1vdGhlciBtYWluLXRhYmxlLXRvcC1yb3ctdGRcIj5cclxuICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuRmlsdGVyT3B0aW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk5hbWUsIG9wdGlvbi5pZCkgfX1cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RvbmUgb2YgU3RvbmVSb3dPYmplY3RzXCI+XHJcbiAgICAgICAgICA8dHIgY2xhc3M9XCJtYWluLXRhYmxlLXJvd1wiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJtYWluLXRhYmxlLXJvdy10ZCBtYWluLXRhYmxlLXJvdy10ZC1maXJzdFwiPlxyXG4gICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFpbi10YWJsZS1yb3ctdGQtbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBzdG9uZS5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIEdldEZvcm1hYXQoKVwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1haW4tdGFibGUtcm93LXRkIG1haW4tdGFibGUtcm93LXRkLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdG9uZS5IYXNTdG9uZShvcHRpb24pXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b25lLXRpbGVcIiAoY2xpY2spPVwic3RvbmUuU2VsZWN0KG9wdGlvbilcIiBbY2xhc3Muc2VsZWN0ZWRdPVwic3RvbmUuSXNTZWxlY3RlZChvcHRpb24pXCIgW2NsYXNzLm5vdC1zZWxlY3RhYmxlXT1cIiFzdG9uZS5DYW5TZWxlY3RTdG9uZShvcHRpb24pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2Vybi1kaXZcIiAqbmdJZj1cIlNob3dLZXJuKHN0b25lLCBvcHRpb24pXCI+e3sgR2V0S2VybigpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwic3RvbmUuR2V0SW1hZ2Uob3B0aW9uKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1peC1ibG9ja1wiICpuZ0lmPVwiR2V0U2VsZWN0ZWRTdG9uZU9iamVjdHMoKS5sZW5ndGggPiAxICYmIHN0b25lLklzU2VsZWN0ZWQob3B0aW9uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFJc1RleHR1cmVNaXgyNSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIGNsYXNzPVwic21hbGwtaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ICVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBtYXg9XCIxMDBcIiBbKG5nTW9kZWwpXT1cInN0b25lLkdldFN0b25lKG9wdGlvbikubWl4UmF0aW9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIklzVGV4dHVyZU1peDI1KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgY2xhc3M9XCJmdWxsd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwic2VsZWN0LW1hdC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ICVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFtuZ01vZGVsXT1cInN0b25lLkdldFN0b25lRm9ybWFhdE9iamVjdChvcHRpb24pLm1peFJhdGlvXCIgKGNoYW5nZWQpPVwiVXBkYXRlUmF0aW9zKClcIiBbZGlzYWJsZWRdPVwiIU1peFJhdGlvU2VsZWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCIyNVwiPjI1JTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjUwXCI+NTAlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiNzVcIj43NSU8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3RvbmUuSXNEb3V2bGVBVihvcHRpb24pXCIgY2xhc3M9XCJsc3dzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxzd3MtaXRlbVwiIG1hdFRvb2x0aXBDbGFzcz1cImZpbHRlci10b29sdGlwXCIgbWF0VG9vbHRpcD1cInt7IEdldExTVG9vbHRpcCgpIH19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsc3dzLWl0ZW0tdGV4dFwiPkxTPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxzd3MtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbKG5nTW9kZWwpXT1cInN0b25lLkdldFN0b25lRm9ybWFhdE9iamVjdChvcHRpb24pLnNlbGVjdGVkZG91YmxlXCIgKGNoYW5nZSk9XCJVcGRhdGVSYXRpb3MoKVwiIFtkaXNhYmxlZF09XCJzdG9uZS5EaXNhYmxlVG9nZ2xlKClcIj48L21hdC1zbGlkZS10b2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsc3dzLWl0ZW1cIiBtYXRUb29sdGlwQ2xhc3M9XCJmaWx0ZXItdG9vbHRpcFwiIG1hdFRvb2x0aXA9XCJ7eyBHZXRXU1Rvb2x0aXAoKSB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibHN3cy1pdGVtLXRleHRcIj5XUzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+aW5mbzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInRleHR1cmUtY29udGFpbmVyXCIgW2NsYXNzLnRleHR1cmUtY29udGFpbmVyLW1hcmdpbl09XCJ0aGlzLlNpbmdsZVN0b25lTW9kZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dHVyZS1jb250YWluZXItZmx5XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRpc3BsYXlmbGV4XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50LWJsb2NrIGZpcnN0LXJvd1wiPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBjbGFzcz1cImZ1bGx3aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJzZWxlY3QtbWF0LWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlZlcmJhbmQpIH19XHJcbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJTZWxlY3RlZFZlcmJhbmRJZFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlNlbGVjdGVkVmVyYmFuZElkIGFzIGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkdldFZlcmJhbmRCeUlkKGlkKSBhcyB2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC10cmlnZ2VyLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWx0ZXItb3B0aW9uLWltYWdlLW1pbmktZGl2XCIgKm5nSWY9XCJ2LmltYWdlUGF0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJHZXRJbWFnZVBhdGhQcm9kdWN0KHYpXCIgY2xhc3M9XCJmaWx0ZXItb3B0aW9uLWltYWdlXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC10cmlnZ2VyLWNvbnRlbnQtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Qcm9kdWN0LCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk5hbWUsIHYuaWQpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2ZXJiYW5kIG9mIEdldFZlcmJhbmRlbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJ2ZXJiYW5kLmlkXCIgY2xhc3M9XCJzZWxlY3QtbWF0LW9wdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2ZXJiYW5kLmltYWdlUGF0aCAhPSBudWxsICYmIHZlcmJhbmQuaW1hZ2VQYXRoICE9ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLW9wdGlvbi1pbWFnZS1taW5pLWRpdlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cInt7IEdldEltYWdlUGF0aFByb2R1Y3QodmVyYmFuZCkgfX1cIiBjbGFzcz1cImZpbHRlci1vcHRpb24taW1hZ2VcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LlByb2R1Y3QsIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgdmVyYmFuZC5pZCkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBvbmVudC1ibG9jayBmaXJzdC1yb3dcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkdldFZvZWcoKSAhPSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgY2xhc3M9XCJmdWxsd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJzZWxlY3QtbWF0LWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuVm9lZykgfX1cclxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJTZWxlY3RlZFZvZWdJZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJTZWxlY3RlZFZvZWdJZCBhcyBpZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkdldFZvZWdCeUlkKGlkKSBhcyB2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LXRyaWdnZXItY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsdGVyLW9wdGlvbi1pbWFnZS1taW5pLWRpdlwiICpuZ0lmPVwidi5pbWFnZVBhdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJHZXRJbWFnZVBhdGhQcm9kdWN0KHYpXCIgY2xhc3M9XCJmaWx0ZXItb3B0aW9uLWltYWdlXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QtdHJpZ2dlci1jb250ZW50LXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5GaWx0ZXJPcHRpb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgdi5pZCkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZvZWcgb2YgR2V0Vm9lZygpLmZpbHRlci5vcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInZvZWcuaWRcIiBjbGFzcz1cInNlbGVjdC1tYXQtb3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidm9lZy5pbWFnZVBhdGggIT0gbnVsbCAmJiB2b2VnLmltYWdlUGF0aCAhPSAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLW9wdGlvbi1pbWFnZS1taW5pLWRpdlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwie3sgR2V0SW1hZ2VQYXRoKHZvZWcpIH19XCIgY2xhc3M9XCJmaWx0ZXItb3B0aW9uLWltYWdlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5GaWx0ZXJPcHRpb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgdm9lZy5pZCkgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBvbmVudC1ibG9ja1wiPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBjbGFzcz1cInNtYWxsLWlucHV0XCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuU3Rvb3R2b2VnKSB9fVxyXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwie3sgU3Rvb3R2b2VnTWluIH19XCIgbWF4PVwie3sgU3Rvb3R2b2VnTWF4IH19XCIgWyhuZ01vZGVsKV09XCJTdG9vdHZvZWdcIj5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtYmxvY2tcIj5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgY2xhc3M9XCJzbWFsbC1pbnB1dFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LkxpbnR2b2VnKSB9fVxyXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwie3sgTGludHZvZWdNaW4gfX1cIiBtYXg9XCJ7eyBMaW50dm9lZ01heCB9fVwiIFsobmdNb2RlbCldPVwiTGludHZvZWdcIj5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLWJsb2NrXCIgKm5nSWY9XCIhSGlSZXNcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItYmxvY2stbmFtZVwiPlxyXG4gICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LkFhbnRhbFN0ZW5lbikgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1ibG9jay1zbGlkZXJcIj5cclxuICAgICAgICAgICAgPG1hdC1zbGlkZXIgbWluPVwiMTAwXCIgbWF4PVwiMjAwMFwiIHN0ZXA9XCI1MFwiIHNob3dUaWNrTWFya3MgZGlzY3JldGUgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgbWF0U2xpZGVyVGh1bWIgWyhuZ01vZGVsKV09XCJBYW50YWxTdGVuZW5cIj5cclxuICAgICAgICAgICAgPC9tYXQtc2xpZGVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLWJsb2NrLWFtb3VudFwiPlxyXG4gICAgICAgICAgICB7eyBBYW50YWxTdGVuZW4gfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGlnaC1yZXMtY2hlY2tib3gtZGl2XCI+XHJcbiAgICAgICAgICA8bWF0LWNoZWNrYm94IFsobmdNb2RlbCldPVwiSGlSZXNcIiBjbGFzcz1cImhpZ2gtcmVzLWNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuSG9nZVJlc29sdXRpZSkgfX1cclxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGlnaC1yZXMtY2hlY2tib3gtZGl2XCI+XHJcbiAgICAgICAgICA8bWF0LWNoZWNrYm94IFsobmdNb2RlbCldPVwiU2hhZGVcIiBjbGFzcz1cImhpZ2gtcmVzLWNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuU2hhZHV3KSB9fVxyXG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25yb3dcIj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIlNpbmdsZVN0b25lTW9kZSA9IGZhbHNlO1wiIGNsYXNzPVwibGluayB0ZXh0dXVyLWtub3BcIiAqbmdJZj1cIlNpbmdsZVN0b25lTW9kZVwiPlxyXG4gICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk1peCkgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIlRleHR1dXJHZW5lcmVyZW4oKVwiIGNsYXNzPVwibGluayB0ZXh0dXVyLWtub3BcIiBbZGlzYWJsZWRdPVwiR2VuZXJhdGVEaXNhYmxlZCgpXCI+XHJcbiAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuVGV4dHV1ckdlbmVyZXJlbikgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiSXNMb2FkaW5nVGV4dHVyZXMoKVwiIGNsYXNzPVwidGV4dHVyZS1sb2FkZXJcIj5cclxuICAgICAgICAgIDxtYXQtc3Bpbm5lciBjbGFzcz1cImxvYWRlci1zcGlubmVyXCIgW2RpYW1ldGVyXT1cIjgwXCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIlNob3dUZXh0dXJlKClcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS1yb3dcIj5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cInt7IFRleHR1cmVSZXNwb25zZU1vZGVsLnBhdHJvb25VUkwgfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5cclxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltYWdlIGltYWdlLXBhdHJvb25cIiBzcmM9XCJ7eyBUZXh0dXJlUmVzcG9uc2VNb2RlbC5wYXRyb29uVVJMIH19XCIgLz5cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cInt7IEdldFBhdHJvb25Eb3dubG9hZFVSTCgpIH19XCIgdGFyZ2V0PVwiX2JsYW5rXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY2xhc3M9XCJsaW5rIHRleHR1dXIta25vcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuRG93bmxvYWRUZXh0dXJlKSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cInt7IEdldEJ1bXBEb3dubG9hZFVSTCgpIH19XCIgdGFyZ2V0PVwiX2JsYW5rXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY2xhc3M9XCJsaW5rIHRleHR1dXIta25vcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuRG93bmxvYWRCdW1wKSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IHN0eWxlPVwiZmxleDphdXRvO1wiPjwvZGl2PlxyXG48L2Rpdj5cclxuIl19