mmhglobal-dynamicform 2.40.0 → 2.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +14 -0
  2. package/esm2020/lib/mmhglobal-dynamicform.module.mjs +6 -1
  3. package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +2 -2
  4. package/esm2020/lib/zbreadcrumb/zbreadcrumb.component.mjs +88 -0
  5. package/esm2020/lib/zchart/zchart.component.mjs +142 -103
  6. package/esm2020/lib/zdatetime/zdatetime.component.mjs +11 -3
  7. package/esm2020/lib/zgauge/zgauge.component.mjs +12 -21
  8. package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +81 -5
  9. package/esm2020/lib/zgrid/zgrid.component.mjs +88 -7
  10. package/esm2020/lib/zgrid/zgrid.service.mjs +8 -1
  11. package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +163 -15
  12. package/esm2020/lib/ztreelist/ztreelist.component.mjs +3 -3
  13. package/esm2020/lib/ztrendcard/ztrendcard.component.mjs +25 -13
  14. package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +2 -2
  15. package/esm2020/public-api.mjs +2 -1
  16. package/fesm2015/mmhglobal-dynamicform.mjs +619 -162
  17. package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
  18. package/fesm2020/mmhglobal-dynamicform.mjs +601 -160
  19. package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
  20. package/lib/mmhglobal-dynamicform.module.d.ts +104 -103
  21. package/lib/zbreadcrumb/zbreadcrumb.component.d.ts +25 -0
  22. package/lib/zchart/zchart.component.d.ts +30 -12
  23. package/lib/zdatetime/zdatetime.component.d.ts +2 -0
  24. package/lib/zgauge/zgauge.component.d.ts +0 -9
  25. package/lib/zgrid/zgrid.binding.directive.d.ts +10 -2
  26. package/lib/zgrid/zgrid.component.d.ts +13 -5
  27. package/lib/zgrid/zgrid.service.d.ts +3 -0
  28. package/lib/ztexteditor/ztexteditor.component.d.ts +19 -4
  29. package/lib/ztrendcard/ztrendcard.component.d.ts +9 -2
  30. package/package.json +1 -1
  31. package/public-api.d.ts +1 -0
@@ -5,6 +5,7 @@ import { Directive, Input, Inject } from "@angular/core";
5
5
  import { of } from "rxjs";
6
6
  import { map, switchMap, tap } from "rxjs/operators";
7
7
  import { DataBindingDirective, GridComponent } from "@progress/kendo-angular-grid";
8
+ import { process } from "@progress/kendo-data-query";
8
9
  //import { MainService } from "../services/main.service";
9
10
  import { ZComponentHelper, StateType } from "mmhglobal-zcore";
10
11
  import * as i0 from "@angular/core";
@@ -16,7 +17,7 @@ export class ZGridBindingDirective extends DataBindingDirective {
16
17
  webapiService, toastService,
17
18
  //private mainService: MainService,
18
19
  //private offlineDatabaseService: OfflineDatabaseService,
19
- signalrService, gridService, loggingService, stateSettingService, componentService) {
20
+ signalrService, gridService, loggingService, stateSettingService, componentService, storageService) {
20
21
  super(grid);
21
22
  this.webapiService = webapiService;
22
23
  this.toastService = toastService;
@@ -25,6 +26,7 @@ export class ZGridBindingDirective extends DataBindingDirective {
25
26
  this.loggingService = loggingService;
26
27
  this.stateSettingService = stateSettingService;
27
28
  this.componentService = componentService;
29
+ this.storageService = storageService;
28
30
  this.changeEvent = {
29
31
  pageChanged: false,
30
32
  filterChanged: false,
@@ -457,11 +459,20 @@ export class ZGridBindingDirective extends DataBindingDirective {
457
459
  this.params.pageNo = this.getPageNo(stateSkip, stateTake);
458
460
  this.params.pageSize = stateTake;
459
461
  if (this.field.ExternalPagination) {
462
+ const sessionData = this.tryGetDataFromSession();
463
+ if (sessionData) {
464
+ this.handleGetDataBindingComplete(sessionData);
465
+ return;
466
+ }
460
467
  // For POST method Page WebAPI
468
+ const detailGridSessionKey = sessionStorage.getItem('detailGridSessionKey');
461
469
  this.webapiService
462
470
  .postApi(this.paginationApiPostUrl, this.params, null, null, null, null, true)
463
471
  .subscribe({
464
- next: (resp) => this.handleGetDataBindingComplete(resp),
472
+ next: (resp) => {
473
+ this.setDetailDataIntoSession(detailGridSessionKey, resp);
474
+ this.handleGetDataBindingComplete(resp);
475
+ },
465
476
  error: (err) => {
466
477
  this.toastService.show("Error occur in loading the data", "middle", false, 1500, "danger");
467
478
  this.grid.loading = false;
@@ -493,18 +504,36 @@ export class ZGridBindingDirective extends DataBindingDirective {
493
504
  this.grid.loading = false;
494
505
  this.gridSubject.next(this);
495
506
  this.notifyDataChange();
507
+ this.collapseAllDetailGrid();
496
508
  }
497
509
  }
498
510
  handleGetDataBindingComplete(data, skipCacheData) {
499
511
  this.aggregateHandling(data.dataSet);
500
512
  this.handleDateTimeIgnoringTimeZone(data.dataSet);
501
513
  this.grid.data = { data: data.dataSet, total: data.totalCount };
514
+ this.collapseAllDetailGrid();
502
515
  if (!skipCacheData) {
503
516
  const stateLogic = this.gridService.getGridStateLogic(this.field);
504
517
  if (stateLogic === StateType.cachedDataSetting || stateLogic === StateType.savedAndCachedDataSetting) {
505
518
  this.cacheGridData(stateLogic);
506
519
  }
507
520
  }
521
+ const { gridState } = this.zgridbinding.gridSetting;
522
+ const enableGrouping = this.field.GroupSetting?.EnableGrouping;
523
+ if (enableGrouping && gridState) {
524
+ const { data } = this.grid;
525
+ if (data?.data) {
526
+ try {
527
+ // Clone gridState and set skip to 0, to avoid direct mutation
528
+ const newGridState = { ...gridState, skip: 0 };
529
+ const { data: groupedData } = process(data.data, newGridState);
530
+ data.data = groupedData;
531
+ }
532
+ catch (error) {
533
+ console.error('Error grouping data:', error);
534
+ }
535
+ }
536
+ }
508
537
  this.grid.loading = false;
509
538
  this.afterDataBinded(data);
510
539
  this.gridSubject.next(this);
@@ -864,8 +893,55 @@ export class ZGridBindingDirective extends DataBindingDirective {
864
893
  ZComponentHelper.getGridColumns(this.gridSetting);
865
894
  this.loggingService.debugLog('generated grid columns', this.gridSetting);
866
895
  }
896
+ collapseAllDetailGrid() {
897
+ if (this.zgridbinding.data?.DetailGrid) {
898
+ // Collapse all expanded rows before fetching new data
899
+ if (this.grid.data && ('data' in this.grid.data) && this.grid.data.data?.length > 0) {
900
+ for (let i = 0; i < this.grid.data.data.length; i++) {
901
+ this.grid.collapseRow(i);
902
+ }
903
+ }
904
+ }
905
+ }
906
+ tryGetDataFromSession() {
907
+ const detailGridSessionKey = sessionStorage.getItem('detailGridSessionKey');
908
+ if (!this.isValidSessionKey(detailGridSessionKey)) {
909
+ return null;
910
+ }
911
+ const sessionData = this.getAndValidateSessionData(detailGridSessionKey);
912
+ if (sessionData && this.isSessionDataFresh(sessionData)) {
913
+ this.storageService.set('detailGridSessionKey', '');
914
+ return sessionData;
915
+ }
916
+ return null;
917
+ }
918
+ isValidSessionKey(key) {
919
+ return !ZComponentHelper.isNullUndefinedEmpty(key);
920
+ }
921
+ getAndValidateSessionData(key) {
922
+ const data = JSON.parse(sessionStorage.getItem(key));
923
+ return ZComponentHelper.isNullUndefinedEmpty(data) ? null : data;
924
+ }
925
+ isSessionDataFresh(data) {
926
+ const now = new Date();
927
+ const previousDate = new Date(data.currentDate);
928
+ const diffInMinutes = this.getTimeDifferenceInMinutes(now, previousDate);
929
+ return diffInMinutes <= 10;
930
+ }
931
+ getTimeDifferenceInMinutes(currentDate, previousDate) {
932
+ const diffInMs = currentDate.getTime() - previousDate.getTime();
933
+ return diffInMs / (1000 * 60);
934
+ }
935
+ setDetailDataIntoSession(detailGridSessionKey, data) {
936
+ if (ZComponentHelper.isNullUndefinedEmpty(detailGridSessionKey)) {
937
+ return;
938
+ }
939
+ data.currentDate = new Date();
940
+ this.storageService.set('detailGridSessionKey', '');
941
+ this.storageService.set(detailGridSessionKey, JSON.stringify(data));
942
+ }
867
943
  }
868
- ZGridBindingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZGridBindingDirective, deps: [{ token: GridComponent }, { token: i1.WebApiService }, { token: i1.ToastService }, { token: i1.SignalrService }, { token: i2.ZGridService }, { token: i1.LoggingService }, { token: i1.StateSettingService }, { token: i3.ZComponentService }], target: i0.ɵɵFactoryTarget.Directive });
944
+ ZGridBindingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZGridBindingDirective, deps: [{ token: GridComponent }, { token: i1.WebApiService }, { token: i1.ToastService }, { token: i1.SignalrService }, { token: i2.ZGridService }, { token: i1.LoggingService }, { token: i1.StateSettingService }, { token: i3.ZComponentService }, { token: i1.StorageSessionService }], target: i0.ɵɵFactoryTarget.Directive });
869
945
  ZGridBindingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.3", type: ZGridBindingDirective, selector: "[zgridbinding]", inputs: { zgridbinding: "zgridbinding" }, usesInheritance: true, ngImport: i0 });
870
946
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZGridBindingDirective, decorators: [{
871
947
  type: Directive,
@@ -875,7 +951,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
875
951
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
876
952
  type: Inject,
877
953
  args: [GridComponent]
878
- }] }, { type: i1.WebApiService }, { type: i1.ToastService }, { type: i1.SignalrService }, { type: i2.ZGridService }, { type: i1.LoggingService }, { type: i1.StateSettingService }, { type: i3.ZComponentService }]; }, propDecorators: { zgridbinding: [{
954
+ }] }, { type: i1.WebApiService }, { type: i1.ToastService }, { type: i1.SignalrService }, { type: i2.ZGridService }, { type: i1.LoggingService }, { type: i1.StateSettingService }, { type: i3.ZComponentService }, { type: i1.StorageSessionService }]; }, propDecorators: { zgridbinding: [{
879
955
  type: Input
880
956
  }] } });
881
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuYmluZGluZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96Z3JpZC96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RSw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBdUIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQXlDLE1BQU0sOEJBQThCLENBQUM7QUFLMUgseURBQXlEO0FBQ3pELE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsU0FBUyxFQUNWLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBT3pCLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxvQkFBb0I7SUF3RDdELFlBQ3lCLElBQUksRUFBRSx5RkFBeUY7SUFDOUcsYUFBNEIsRUFDNUIsWUFBMEI7SUFDbEMsbUNBQW1DO0lBQ25DLHlEQUF5RDtJQUNqRCxjQUE4QixFQUM5QixXQUF5QixFQUN6QixjQUE4QixFQUM5QixtQkFBd0MsRUFDeEMsZ0JBQW1DO1FBRTNDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVZKLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBRzFCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixnQkFBVyxHQUFYLFdBQVcsQ0FBYztRQUN6QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtR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QUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzRSxDQUFDOztrSEF0Z0NVLHFCQUFxQixrQkF5RHRCLGFBQWE7c0dBekRaLHFCQUFxQjsyRkFBckIscUJBQXFCO2tCQUhqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCOzswQkEwREksTUFBTTsyQkFBQyxhQUFhOzBQQWxEZCxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBEaXJlY3RpdmUsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgSW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgb2YgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IERhdGFCaW5kaW5nRGlyZWN0aXZlLCBHcmlkQ29tcG9uZW50LCBEYXRhU3RhdGVDaGFuZ2VFdmVudCwgUGFnZUNoYW5nZUV2ZW50IH0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWdyaWRcIjtcclxuaW1wb3J0IHsgU29ydERlc2NyaXB0b3IsIEZpbHRlckRlc2NyaXB0b3IsIH0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1kYXRhLXF1ZXJ5XCI7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7IFpHcmlkU2VydmljZSB9IGZyb20gXCIuL3pncmlkLnNlcnZpY2VcIjtcclxuLy9pbXBvcnQgeyBNYWluU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9tYWluLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtcclxuICBaQ29tcG9uZW50SGVscGVyLCBaRmllbGQsIFpHcmlkUG9zdEFwaVBhcmFtcyxcclxuICBXZWJBcGlTZXJ2aWNlLCBaR3JvdXAsIFRvYXN0U2VydmljZSwgU2lnbmFsclNlcnZpY2UsIEFjdGlvblR5cGUsIFpHcmlkQ29sdW1uQ29uZmlncywgWkdyaWRTZXR0aW5ncywgTG9nZ2luZ1NlcnZpY2UsIFpHcmlkRmlsdGVyUGFyYW1zLFxyXG4gIFN0YXRlVHlwZSwgU3RhdGVTZXR0aW5nU2VydmljZVxyXG59IGZyb20gXCJtbWhnbG9iYWwtemNvcmVcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlXCI7XHJcblxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6IFwiW3pncmlkYmluZGluZ11cIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFpHcmlkQmluZGluZ0RpcmVjdGl2ZSBleHRlbmRzIERhdGFCaW5kaW5nRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgY2hhbmdlRXZlbnQgPSB7XHJcbiAgICBwYWdlQ2hhbmdlZDogZmFsc2UsXHJcbiAgICBmaWx0ZXJDaGFuZ2VkOiBmYWxzZSxcclxuICAgIHNvcnRDaGFuZ2VkOiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgemdyaWRiaW5kaW5nOiB7XHJcbiAgICBkYXRhOiBaRmllbGQ7XHJcbiAgICBncm91cDogWkdyb3VwO1xyXG4gICAgcGFyYW1zOiBaR3JpZFBvc3RBcGlQYXJhbXM7XHJcbiAgICBncmlkU3ViamVjdDogU3ViamVjdDxhbnk+O1xyXG4gICAgZ3JpZFNldHRpbmc6IFpHcmlkU2V0dGluZ3M7XHJcbiAgfTtcclxuXHJcbiAgLy9zdGF0ZTogU3RhdGUgPSB7XHJcbiAgLy8gIHNraXA6IDAsXHJcbiAgLy8gIHRha2U6IDEwLFxyXG4gIC8vfTtcclxuXHJcbiAgLy9ncmlkQ29sdW1uczogYW55W10gPSBbXTtcclxuXHJcbiAgLy91c2FibGVDb2x1bW5zOiBhbnlbXSA9IFtdO1xyXG5cclxuICByZXNvdXJjZVVSTCA9IG51bGw7XHJcblxyXG4gIHBhZ2luYXRpb25BcGlQb3N0VXJsID0gbnVsbDtcclxuXHJcbiAgZGF0YVNvdXJjZSA9IG51bGw7XHJcblxyXG4gIGdldCBncmlkU2V0dGluZygpIHtcclxuICAgIHJldHVybiB0aGlzLnpncmlkYmluZGluZy5ncmlkU2V0dGluZztcclxuICB9XHJcbiAgc2V0IGdyaWRTZXR0aW5nKHZhbHVlKSB7XHJcbiAgICB0aGlzLnpncmlkYmluZGluZy5ncmlkU2V0dGluZyA9IHZhbHVlO1xyXG4gIH1cclxuICBnZXQgZmllbGQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YTtcclxuICB9XHJcblxyXG4gIGdldCBncnAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZ3JvdXA7XHJcbiAgfVxyXG5cclxuICBnZXQgZ3JpZFN1YmplY3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFyYW1zKCk6IFpHcmlkUG9zdEFwaVBhcmFtcyB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcucGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdldERhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkLmRhdGE7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoR3JpZENvbXBvbmVudCkgZ3JpZCwgLy8gSW5qZWN0aW5nIEdyaWRDb21wb25lbnQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBzY29wZSBhbmQgY29udGV4dCBvZiB0aGUgR3JpZENvbXBvbmVudC5cclxuICAgIHByaXZhdGUgd2ViYXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICAvL3ByaXZhdGUgbWFpblNlcnZpY2U6IE1haW5TZXJ2aWNlLFxyXG4gICAgLy9wcml2YXRlIG9mZmxpbmVEYXRhYmFzZVNlcnZpY2U6IE9mZmxpbmVEYXRhYmFzZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNpZ25hbHJTZXJ2aWNlOiBTaWduYWxyU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3JpZFNlcnZpY2U6IFpHcmlkU2VydmljZSxcclxuICAgIHByaXZhdGUgbG9nZ2luZ1NlcnZpY2U6IExvZ2dpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdGF0ZVNldHRpbmdTZXJ2aWNlOiBTdGF0ZVNldHRpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb21wb25lbnRTZXJ2aWNlOiBaQ29tcG9uZW50U2VydmljZVxyXG4gICkge1xyXG4gICAgc3VwZXIoZ3JpZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLmZpZWxkLlBhZ2VTaXplIHx8IDIwO1xyXG4gICAgdGhpcy5kYXRhU291cmNlID0gdGhpcy5maWVsZC5EYXRhU291cmNlID8/IG51bGw7XHJcblxyXG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHtcclxuICAgICAgdGhpcy5yZXNvdXJjZVVSTCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgICB0aGlzLmZpZWxkLlJlc291cmNlVVJMLFxyXG4gICAgICAgIHRoaXMuZ3JwXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMucmVzb3VyY2VVUkwpIHtcclxuICAgICAgICB0aGlzLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLnpncmlkYmluZGluZy5kYXRhLk5hbWUgIT09IFwiQWN0aXZpdHlMb2dHcmlkXCIpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgICAgXCJObyBpbml0aWFsaXNlIGZvciBGaWVsZC5SZXNvdXJjZVVSTDogXCIsXHJcbiAgICAgICAgICAgIHRoaXMuZmllbGQuUmVzb3VyY2VVUkxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXRSZXNvdXJjZVVybCh0aGlzLnJlc291cmNlVVJMKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0RmlsdGVyUGFyYW1zQnlQYXJlbnRSZWZJZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpZWxkLkRpc2FibGVHZW5lcmF0ZUNvbHVtbkJ5Rm9ybSkge1xyXG4gICAgICBjb25zdCBjb2x1bW5GaWVsZHMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5maWVsZC5Db2x1bW5GaWVsZHMsIHRoaXMuZ3JwKTtcclxuXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbHVtbkZpZWxkcykpIHtcclxuICAgICAgICB0aGlzLnNldENvbHVtbnMoY29sdW1uRmllbGRzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuZmllbGRbJ1NraXBMb2FkUmVzb3VyY2VVUkxEYXRhJ10pIHtcclxuICAgICAgICB0aGlzLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZ3JpZFN1YmplY3QubmV4dCh0aGlzKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmdlbmVyYXRlR3JpZENvbHVtbnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJldHJpZXZlR3JpZFN0YXRlQ2FjaGUoc3RhdGVUeXBlOiBTdGF0ZVR5cGUsIGZpZWxkOiBaRmllbGQpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZFNlcnZpY2UuZ2V0U3RhdGVDYWNoZShzdGF0ZVR5cGUsIGZpZWxkKS5waXBlKFxyXG4gICAgICBtYXAoKHNldHRpbmdDYWNoZVZhbHVlKSA9PiB7XHJcbiAgICAgICAgLy8gSWYgc2V0dGluZ0NhY2hlVmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQsIGNvbnRpbnVlIHdpdGggYSBmYWxsYmFjayB2YWx1ZVxyXG4gICAgICAgIHJldHVybiBzZXR0aW5nQ2FjaGVWYWx1ZTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoc2V0dGluZ0NhY2hlVmFsdWUpID0+IHtcclxuICAgICAgICBpZiAoc2V0dGluZ0NhY2hlVmFsdWUpIHtcclxuICAgICAgICAgIGNvbnN0IHBhcnNlZEpzb25EYXRhID0gc2V0dGluZ0NhY2hlVmFsdWUgYXMgWkdyaWRTZXR0aW5ncztcclxuICAgICAgICAgIGlmIChwYXJzZWRKc29uRGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZSA9IHBhcnNlZEpzb25EYXRhLmdyaWRTdGF0ZSA/PyB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZTtcclxuICAgICAgICAgICAgdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5Db25maWd1cmF0aW9ucyA9IHBhcnNlZEpzb25EYXRhLmNvbHVtbkNvbmZpZ3VyYXRpb25zID8/IG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRSZXNvdXJjZVVybChyZXNvdXJjZVVybDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBhcnJheSA9IHJlc291cmNlVXJsLnNwbGl0KFwiL2FwaS9cIik7XHJcbiAgICBpZiAoISFhcnJheVsxXSkge1xyXG4gICAgICBhcnJheVsxXSA9IFwiUGFnZVwiICsgYXJyYXlbMV07XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwgPSBhcnJheS5qb2luKFwiL2FwaS9cIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBhcnIgPSB0aGlzLnJlc291cmNlVVJMLnNwbGl0KFwiL1wiKTtcclxuICAgICAgYXJyW2Fyci5sZW5ndGggLSAyXSA9IFwiUGFnZVwiICsgYXJyW2Fyci5sZW5ndGggLSAyXTtcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCA9IGFyci5qb2luKFwiL1wiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RmlsdGVyUGFyYW1zQnlQYXJlbnRSZWZJZCgpIHtcclxuICAgIC8vIFVzZSBmaWVsZCBvd24gcmVmZXJlbmNlSWQgaWYgYXZhaWxhYmxlXHJcbiAgICBjb25zdCByZWZJZCA9IHRoaXMuZ2V0RmllbGRSZWZlcmVuY2VJZCgpIHx8IHRoaXMuZ3JwLnJlZmVyZW5jZUlkO1xyXG4gICAgY29uc3QgcmVmRmllbGQgPSB0aGlzLmZpZWxkLlJlZmVyZW5jZUZpZWxkIHx8IHRoaXMuZ3JwLnBhcmVudFJlZmVyZW5jZUZpZWxkO1xyXG4gICAgaWYgKHJlZklkICYmIHJlZkZpZWxkKSB7XHJcbiAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0ge1xyXG4gICAgICAgIGtleTogcmVmRmllbGQsXHJcbiAgICAgICAgb3BzOiBcIj1cIixcclxuICAgICAgICB2YWx1ZTogcmVmSWQsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMucHVzaChmaWx0ZXJWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpZWxkUmVmZXJlbmNlSWQoKSB7XHJcbiAgICBsZXQgZmllbGRSZWZlcmVuY2VJZCA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5maWVsZC5SZWZlcmVuY2VJZCkge1xyXG4gICAgICBmaWVsZFJlZmVyZW5jZUlkID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICAgIHRoaXMuZmllbGQuUmVmZXJlbmNlSWQsXHJcbiAgICAgICAgdGhpcy5ncnBcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmaWVsZFJlZmVyZW5jZUlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdlbmVyYXRlR3JpZENvbHVtbnMoKSB7XHJcbiAgICBjb25zdCBjb2x1bW5GaWVsZHMkOiBPYnNlcnZhYmxlPGFueT4gPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgIHRoaXMuZmllbGQuQ29sdW1uRmllbGRzLFxyXG4gICAgICB0aGlzLmdycFxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoY29sdW1uRmllbGRzJCkge1xyXG4gICAgICBjb2x1bW5GaWVsZHMkLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBncmlkU3RhdGVMb2dpYyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0R3JpZFN0YXRlTG9naWModGhpcy5maWVsZCk7XHJcblxyXG4gICAgICAgICAgaWYgKGdyaWRTdGF0ZUxvZ2ljICYmIGdyaWRTdGF0ZUxvZ2ljICE9PSBTdGF0ZVR5cGUuY2FjaGVkRGF0YVNldHRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmV0cmlldmVHcmlkU3RhdGVDYWNoZShTdGF0ZVR5cGUuc2F2ZWRTZXR0aW5nLCB0aGlzLmZpZWxkKS5waXBlKFxyXG4gICAgICAgICAgICAgIG1hcCgoc3RhdGUpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIG9mKGRhdGEpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRhcCgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ncmlkU2V0dGluZyA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5ncmlkU2V0dGluZywgLy8gUHJlc2VydmUgZXhpc3RpbmcgcHJvcGVydGllc1xyXG4gICAgICAgICAgICBjb2x1bW5GaWVsZDogZGF0YSxcclxuICAgICAgICAgICAgZ3JvdXA6IHRoaXMuemdyaWRiaW5kaW5nLmdyb3VwXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgWkNvbXBvbmVudEhlbHBlci5nZXRHcmlkQ29sdW1ucyh0aGlzLmdyaWRTZXR0aW5nKTtcclxuICAgICAgICAgIHRoaXMubG9nZ2luZ1NlcnZpY2UuZGVidWdMb2coJ2dlbmVyYXRlZCBncmlkIGNvbHVtbnMnLCB0aGlzLmdyaWRTZXR0aW5nKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmdldEZpbHRlclBhcmFtc0NvbHVtbnMoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0RmlsdGVyKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEZpbHRlclBhcmFtcygpO1xyXG4gICAgICAgICAgdGhpcy5nZXRTb3J0aW5nKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEdyYW50VHlwZSgpO1xyXG4gICAgICAgICAgdGhpcy5zZXRIaWRkZW5Db2x1bW4odGhpcy5ncmlkU2V0dGluZy5jb2x1bW5Db25maWd1cmF0aW9ucyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5wYXJhbXMucmVmZXJJZCA9IHRoaXMuZ2V0RmllbGRSZWZlcmVuY2VJZCgpIHx8IHRoaXMuZ3JwLnJlZmVyZW5jZUlkIHx8IG51bGw7XHJcbiAgICAgICAgfSlcclxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZpZWxkWydTa2lwTG9hZFJlc291cmNlVVJMRGF0YSddKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignRmFpbCB0byBnZW5lcmF0ZSBncmlkIGNvbHVtbiBmaWVsZHMuJyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuZmllbGQuQ29sdW1uRmllbGRzKTtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5ncnApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNraXBMb2FkUmVzb3VyY2VVUkxEYXRhKHNldHRpbmdWYWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5maWVsZFsnU2tpcExvYWRSZXNvdXJjZVVSTERhdGEnXSA9ICFzZXR0aW5nVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGhlIHRpdGxlIG9mIGEgY29sdW1uIGluIHRoZSBncmlkIHNldHRpbmcgYmFzZWQgb24gaXRzIHZhbHVlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbFZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gdG8gdXBkYXRlLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xOYW1lIC0gVGhlIG5ldyB0aXRsZSBmb3IgdGhlIGNvbHVtbi5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc2V0Q29sdW1uTmFtZShjb2xWYWx1ZTogc3RyaW5nLCBjb2xOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIEZpbmQgdGhlIGNvbHVtbiB3aXRoIHRoZSBtYXRjaGluZyBjb2xWYWx1ZS5cclxuICAgIGNvbnN0IGNvbHVtblRvVXBkYXRlID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoZmllbGQgPT4gZmllbGQuVmFsdWUgPT09IGNvbFZhbHVlKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgY29sdW1uIGlzIGZvdW5kLCB1cGRhdGUgaXRzIHRpdGxlIHByb3BlcnR5IHdpdGggY29sTmFtZS5cclxuICAgIGlmIChjb2x1bW5Ub1VwZGF0ZSkge1xyXG4gICAgICBjb2x1bW5Ub1VwZGF0ZS50aXRsZSA9IGNvbE5hbWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHZpc2liaWxpdHkgb2YgYSBjb2x1bW4gaW4gdGhlIGdyaWQgYmFzZWQgb24gaXRzIHZhbHVlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbFZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gdG8gc2V0IHZpc2liaWxpdHkgZm9yLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNWaXNpYmxlIC0gV2hldGhlciB0aGUgY29sdW1uIHNob3VsZCBiZSB2aXNpYmxlICh0cnVlKSBvciBoaWRkZW4gKGZhbHNlKS5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc2V0Q29sdW1uVmlzaWJsZShjb2xWYWx1ZTogc3RyaW5nLCBpc1Zpc2libGU6IGJvb2xlYW4pIHtcclxuICAgIC8vIEZpbmQgdGhlIGNvbHVtbiB3aXRoIHRoZSBtYXRjaGluZyBjb2xWYWx1ZS5cclxuICAgIGNvbnN0IGNvbHVtblRvVXBkYXRlID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoZmllbGQgPT4gZmllbGQuVmFsdWUgPT09IGNvbFZhbHVlKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgY29sdW1uIGlzIGZvdW5kLCB1cGRhdGUgaXRzICdoaWRkZW4nIHByb3BlcnR5IGJhc2VkIG9uICdpc1Zpc2libGUnLlxyXG4gICAgaWYgKGNvbHVtblRvVXBkYXRlKSB7XHJcbiAgICAgIGNvbHVtblRvVXBkYXRlLmhpZGRlbiA9ICFpc1Zpc2libGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBmaWx0ZXIgcGFyYW1ldGVycyBmb3IgY29sdW1ucyBhbmQgc2V0IHRoZW0gaW4gdGhlICdwYXJhbXMnIG9iamVjdC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyUGFyYW1zQ29sdW1ucygpIHtcclxuICAgIC8vIENyZWF0ZSBhbiBhcnJheSB0byBzdG9yZSBjb2x1bW4gZmllbGRzLlxyXG4gICAgY29uc3QgY29sRmllbGRzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBncmlkIGNvbHVtbnMgdG8gYnVpbGQgY29sdW1uIGZpZWxkIHN0cmluZ3MuXHJcbiAgICB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIGlmIChjb2x1bW4udmFsdWVFeHByKSB7XHJcbiAgICAgICAgLy8gSWYgJ3ZhbHVlRXhwcicgZXhpc3RzLCB1c2UgaXQgYXMgYW4gYWxpYXMgZm9yIHRoZSBmaWVsZC5cclxuICAgICAgICBjb2xGaWVsZHMucHVzaChjb2x1bW4udmFsdWVFeHByICsgXCIgYXMgXCIgKyBjb2x1bW4uZmllbGQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbEZpZWxkcy5wdXNoKGNvbHVtbi5maWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIENoZWNrIGlmICdJZCcgaXMgaW4gdGhlIGNvbHVtbiBmaWVsZHM7IGlmIG5vdCwgYWRkIGl0LlxyXG4gICAgaWYgKGNvbEZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmIChjb2xGaWVsZHMuaW5kZXhPZihcIklkXCIpID09PSAtMSkge1xyXG4gICAgICAgIGNvbEZpZWxkcy5wdXNoKFwiSWRcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGUgYW4gYXJyYXkgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGhlIGdlbmVyYXRlZCBjb2x1bW4gZmllbGRzLlxyXG4gICAgY29uc3QgdG1wR3JpZENvbHVtbjogYW55W10gPSBbXTtcclxuICAgIHRtcEdyaWRDb2x1bW4ucHVzaChjb2xGaWVsZHMuam9pbihcIixcIikpO1xyXG5cclxuICAgIC8vIElmIHRoZXJlIGFyZSBnZW5lcmF0ZUhpZGRlbkNvbHVtbnMgaW4gdGhlIHNldHRpbmcsIGFkZCB0aGVtIHRvIHRoZSBhcnJheS5cclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmdlbmVyYXRlSGlkZGVuQ29sdW1ucz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0bXBHcmlkQ29sdW1uLnB1c2godGhpcy5ncmlkU2V0dGluZy5nZW5lcmF0ZUhpZGRlbkNvbHVtbnMuam9pbihcIixcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNldCB0aGUgJ3BhcmFtcy5jb2x1bW5zJyBwcm9wZXJ0eSB3aXRoIHRoZSBjb25jYXRlbmF0ZWQgY29sdW1uIGZpZWxkcy5cclxuICAgIHRoaXMucGFyYW1zLmNvbHVtbnMgPSB0bXBHcmlkQ29sdW1uLmpvaW4oXCIsXCIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSAncGFyYW1zLmZpbHRlcnMnIHByb3BlcnR5IGJhc2VkIG9uIHRoZSAnZmllbGQuRmlsdGVycycgcHJvcGVydHkuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbHRlcigpIHtcclxuICAgIGlmICh0aGlzLnBhcmFtcy5maWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycykge1xyXG4gICAgICAvLyBDb21iaW5lICdwYXJhbXMuZmlsdGVycycgYW5kICdmaWVsZC5GaWx0ZXJzJyB1c2luZyAnJiYnIGlmIGJvdGggZXhpc3QuXHJcbiAgICAgIHRoaXMucGFyYW1zLmZpbHRlcnMgPSBgJHt0aGlzLnBhcmFtcy5maWx0ZXJzfSAmJiAke3RoaXMuZmllbGQuRmlsdGVyc31gO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoIXRoaXMucGFyYW1zLmZpbHRlcnMgJiYgdGhpcy5maWVsZC5GaWx0ZXJzKSB7XHJcbiAgICAgIC8vIFVzZSAnZmllbGQuRmlsdGVycycgZGlyZWN0bHkgaWYgJ3BhcmFtcy5maWx0ZXJzJyBkb2Vzbid0IGV4aXN0LlxyXG4gICAgICB0aGlzLnBhcmFtcy5maWx0ZXJzID0gdGhpcy5maWVsZC5GaWx0ZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmICdmaWVsZC5GaWx0ZXJzJyBjb250YWlucyByZWZlcmVuY2VzIHRvICdncm91cC4nIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBhY3R1YWwgdmFsdWVzLlxyXG4gICAgaWYgKHRoaXMuZmllbGQuRmlsdGVycyAmJiB0aGlzLmZpZWxkLkZpbHRlcnMuc3BsaXQoXCIgXCIpLnNvbWUoKGVsZW1lbnQpID0+IGVsZW1lbnQudHJpbSgpLnN0YXJ0c1dpdGgoXCJncm91cC5cIikpKSB7XHJcbiAgICAgIGNvbnN0IGZpbHRlcktleVZhbFBhaXJzID0gdGhpcy5maWVsZC5GaWx0ZXJzLnNwbGl0KFwiIFwiKTtcclxuICAgICAgY29uc3QgZ3JwVmFsdWVzID0gZmlsdGVyS2V5VmFsUGFpcnMuZmlsdGVyKChlbGVtZW50KSA9PiBlbGVtZW50LnRyaW0oKS5zdGFydHNXaXRoKFwiZ3JvdXAuXCIpKTtcclxuXHJcbiAgICAgIGdycFZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHtcclxuICAgICAgICBjb25zdCBhY3R1YWxWYWwgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodmFsLCB0aGlzLmdycCk7XHJcbiAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVycyA9IHRoaXMucGFyYW1zLmZpbHRlcnMucmVwbGFjZSh2YWwsIGFjdHVhbFZhbCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBmaWx0ZXIgcGFyYW1ldGVycyBpbiB0aGUgJ3BhcmFtcy5maWx0ZXJQYXJhbXMnIHByb3BlcnR5IGJhc2VkIG9uICdmaWVsZFsnRmlsdGVyUGFyYW1zJ10nLiBmaWx0ZXJQYXJhbXMgPT09IHVzZWQgZm9yIHRoZSBpbnB1dCBpbiB0aGUgY29sdW1uIGZpbHRlciBhdCB0aGUgVUkuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbHRlclBhcmFtcygpIHtcclxuICAgIGNvbnN0IGZpbHRlclBhcmFtcyA9IHRoaXMuZmllbGRbJ0ZpbHRlclBhcmFtcyddO1xyXG5cclxuICAgIC8vIEluaXRpYWxpemUgZmlsdGVyIHBhcmFtZXRlcnMgaWYgdW5kZWZpbmVkLlxyXG4gICAgaWYgKCF0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpbHRlclBhcmFtcykge1xyXG4gICAgICBpZiAoZmlsdGVyUGFyYW1zLnN0YXJ0c1dpdGgoXCJncm91cC5cIikpIHtcclxuICAgICAgICAvLyBJZiAnZmlsdGVyUGFyYW1zJyBzdGFydHMgd2l0aCBcImdyb3VwLlwiLCBleHRlbmQgdGhlIGV4aXN0aW5nIGFycmF5LlxyXG4gICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtcclxuICAgICAgICAgIC4uLnRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyxcclxuICAgICAgICAgIC4uLlpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShmaWx0ZXJQYXJhbXMsIHRoaXMuZ3JwKVxyXG4gICAgICAgIF07XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gSWYgJ2ZpbHRlclBhcmFtcycgZG9lcyBub3Qgc3RhcnQgd2l0aCBcImdyb3VwLlwiLCB1c2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gW1xyXG4gICAgICAgICAgLi4udGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLFxyXG4gICAgICAgICAgZmlsdGVyUGFyYW1zXHJcbiAgICAgICAgXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBjb2x1bW4gZmlsdGVycyBpbiB0aGUgZ3JpZCBzdGF0ZSBhbmQgYXBwZW5kIHRvIGZpbHRlcnBhcmFtXHJcbiAgICBpZiAodGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGU/LmZpbHRlcj8uZmlsdGVycykge1xyXG4gICAgICB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5maWx0ZXI/LmZpbHRlcnM/LmZvckVhY2goKGZpbHRlcjogRmlsdGVyRGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlclBhcmFtID0ge1xyXG4gICAgICAgICAga2V5OiBmaWx0ZXIuZmllbGQgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgb3BzOiB0aGlzLm1hcEZpbHRlck9wZXJhdG9yKGZpbHRlci5vcGVyYXRvciksXHJcbiAgICAgICAgICB2YWx1ZTogZmlsdGVyLnZhbHVlID09PSBudWxsID8gXCJcIiA6IGZpbHRlci52YWx1ZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vIENoZWNrIGlmIGEgZmlsdGVyIHBhcmFtZXRlciB3aXRoIHRoZSBzYW1lIGtleSBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAgICBjb25zdCBleGlzdGluZ1BhcmFtID0gdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLmZpbmQoKHBhcmFtKSA9PiBwYXJhbS5rZXkgPT09IGZpbHRlclBhcmFtLmtleSk7XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nUGFyYW0pIHtcclxuICAgICAgICAgIC8vIElmIGEgZmlsdGVyIHBhcmFtZXRlciB3aXRoIHRoZSBzYW1lIGtleSBleGlzdHMsIHVwZGF0ZSBpdHMgdmFsdWUuXHJcbiAgICAgICAgICBleGlzdGluZ1BhcmFtLnZhbHVlID0gZmlsdGVyUGFyYW0udmFsdWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIElmIG5vIGZpbHRlciBwYXJhbWV0ZXIgd2l0aCB0aGUgc2FtZSBrZXksIGFkZCBpdCB0byB0aGUgZmlsdGVyIHBhcmFtZXRlcnMuXHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMucHVzaChmaWx0ZXJQYXJhbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgc29ydGluZyBvcmRlciBpbiB0aGUgJ3BhcmFtcy5zb3J0T3JkZXInIHByb3BlcnR5IGJhc2VkIG9uICdmaWVsZC5Tb3J0T3JkZXInLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRTb3J0aW5nKCkge1xyXG4gICAgY29uc3Qgc29ydE9yZGVyID0gdGhpcy5maWVsZC5Tb3J0T3JkZXI7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgJ3NvcnRPcmRlcicgaXMgZGVmaW5lZCBhbmQgc3RhcnRzIHdpdGggXCJncm91cC5cIi5cclxuICAgIGlmIChzb3J0T3JkZXIgJiYgc29ydE9yZGVyLnN0YXJ0c1dpdGgoXCJncm91cC5cIikpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVyID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHNvcnRPcmRlciwgdGhpcy5ncnApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIElmICdzb3J0T3JkZXInIGlzIG5vdCBkZWZpbmVkIG9yIGRvZXNuJ3Qgc3RhcnQgd2l0aCBcImdyb3VwLlwiLCB1c2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlciA9IHNvcnRPcmRlcjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBzb3J0IHBhcmFtZXRlcnMgaWYgdW5kZWZpbmVkLlxyXG4gICAgaWYgKCF0aGlzLnBhcmFtcy5zb3J0T3JkZXJzKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlcnMgPSBbXTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5zb3J0KSB7XHJcbiAgICAgIHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnNvcnQuZm9yRWFjaCgoZGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICAgIGlmIChkZXNjcmlwdG9yLmRpcikge1xyXG4gICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGRlc2NyaXB0b3IuZmllbGQpO1xyXG4gICAgICAgICAgY29uc3Qgc29ydENvbHVtbk5hbWUgPSBmaWVsZC52YWx1ZUV4cHIgIT09IHVuZGVmaW5lZCA/IGZpZWxkLnZhbHVlRXhwciA6IGRlc2NyaXB0b3IuZmllbGQ7XHJcblxyXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgYSBzb3J0IGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuXHJcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1NvcnRDb2x1bW5JbmRleCA9IHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcy5maW5kSW5kZXgoKG5hbWUpID0+IG5hbWUgPT09IHNvcnRDb2x1bW5OYW1lKTtcclxuXHJcbiAgICAgICAgICBpZiAoZXhpc3RpbmdTb3J0Q29sdW1uSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIC8vIElmIGEgc29ydCBjb2x1bW4gd2l0aCB0aGUgc2FtZSBuYW1lIGV4aXN0cywgdXBkYXRlIGl0cyBzb3J0IG9yZGVyLlxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzW2V4aXN0aW5nU29ydENvbHVtbkluZGV4XSA9IGRlc2NyaXB0b3IuZGlyO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gSWYgbm8gc29ydCBjb2x1bW4gd2l0aCB0aGUgc2FtZSBuYW1lLCBhZGQgaXQgdG8gdGhlIHNvcnQgY29sdW1ucyBhbmQgc29ydCBvcmRlcnMuXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcy5wdXNoKHNvcnRDb2x1bW5OYW1lKTtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycy5wdXNoKGRlc2NyaXB0b3IuZGlyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBncmFudCB0eXBlIGluIHRoZSAncGFyYW1zLmdyYW50VHlwZScgcHJvcGVydHkgYmFzZWQgb24gJ2ZpZWxkLkdyYW50VHlwZScuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEdyYW50VHlwZSgpIHtcclxuICAgIGNvbnN0IGdyYW50VHlwZSA9IHRoaXMuZmllbGQuR3JhbnRUeXBlO1xyXG5cclxuICAgIC8vIENoZWNrIGlmICdncmFudFR5cGUnIGlzIGRlZmluZWQuXHJcbiAgICBpZiAoZ3JhbnRUeXBlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLnBhcmFtcy5ncmFudFR5cGUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoZ3JhbnRUeXBlLnRvU3RyaW5nKCksIHRoaXMuZ3JwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgJ2hpZGRlbicgcHJvcGVydHkgZm9yIGNvbHVtbnMgaW4gJ2dyaWRTZXR0aW5nJyBiYXNlZCBvbiAnY29sdW1uQ29uZmlncycuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1pHcmlkQ29sdW1uQ29uZmlnc1tdfSBjb2x1bW5Db25maWdzIC0gVGhlIGNvbHVtbiBjb25maWd1cmF0aW9uIHNldHRpbmdzLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0SGlkZGVuQ29sdW1uKGNvbHVtbkNvbmZpZ3M/OiBaR3JpZENvbHVtbkNvbmZpZ3NbXSkge1xyXG4gICAgaWYgKCF0aGlzLmdyaWRTZXR0aW5nPy5jb2x1bW5zKSByZXR1cm47XHJcbiAgXHJcbiAgICAvLyBTdG9yZSByZWZlcmVuY2UgdG8gY29sdW1ucyB0aGF0IGNhbiBiZSBoaWRkZW5cclxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uZW5hYmxlSGlkaW5nKTtcclxuICBcclxuICAgIC8vIFByZXNlcnZlIG9yaWdpbmFsIHZpc2liaWxpdHkgc3RhdGVcclxuICAgIGNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4gY29sdW1uLm9yaWdpbmFsSGlkZGVuVmFsdWUgPSAhY29sdW1uLmdyaWRDb2xWaXNpYmxlKTtcclxuICBcclxuICAgIC8vIERldGVybWluZSB3aGljaCBjb2x1bW5zIHNob3VsZCBiZSBoaWRkZW5cclxuICAgIGNvbnN0IGhpZGRlbkNvbHVtbnMgPSBjb2x1bW5Db25maWdzXHJcbiAgICA/IGNvbHVtbkNvbmZpZ3MuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uaGlkZGVuID09PSB0cnVlKVxyXG4gICAgOiBjb2x1bW5zLmZpbHRlcihjb2wgPT4gIWNvbC5ncmlkQ29sVmlzaWJsZSk7XHJcbiAgXHJcbiAgICAvLyBIaWRlIGNvbHVtbnMgYmFzZWQgb24gZmllbGQgbWF0Y2hpbmdcclxuICAgIGhpZGRlbkNvbHVtbnMuZm9yRWFjaChoaWRkZW5Db2x1bW4gPT4ge1xyXG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZChjID0+IGMuZmllbGQgPT09IGhpZGRlbkNvbHVtbi5maWVsZCk7XHJcbiAgICAgIGlmIChjb2x1bW4pIHtcclxuICAgICAgICBjb2x1bW4uaGlkZGVuID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlIGRhdGEgZm9yIGRhdGEgYmluZGluZy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2tpcFVzZUNhY2hlIC0gV2hldGhlciB0byBza2lwIHVzaW5nIGNhY2hlIGZvciBkYXRhIHJldHJpZXZhbC5cclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RGF0YUJpbmRpbmcoc2tpcFVzZUNhY2hlPzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG5cclxuICAgIC8vIGNvbnN0IGNhY2hlSW5mbyA9IHRoaXMuemdyaWRiaW5kaW5nLmRhdGEuQ2FjaGVJbmZvO1xyXG5cclxuICAgIC8vIGlmICghY2FjaGVJbmZvIHx8IHNraXBVc2VDYWNoZSkge1xyXG4gICAgLy8gICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAvLyAgIHJldHVybjtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBpZiAoY2FjaGVJbmZvKSB7XHJcbiAgICAvLyAgIGNvbnN0IGdyaWRTdGF0ZUxvZ2ljID0gdGhpcy5ncmlkU2VydmljZS5nZXRHcmlkU3RhdGVMb2dpYyh0aGlzLmZpZWxkKTtcclxuICAgIC8vICAgaWYgKGdyaWRTdGF0ZUxvZ2ljID09PSBHcmlkU3RhdGVMb2dpY1R5cGUuU2V0dGluZ09ubHkpIHtcclxuICAgIC8vICAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gY29tbWVudCBvdXQgb24gMjAyNDEwMDEuIGRlZmF1bHQgdG8gZmV0Y2ggdGhlIGRhdGEgZnJvbSBhcGkgaW5zdGVhZCBvZiBsb2FkaW5nIGZyb210IGhlIGNhY2hlLlxyXG4gICAgLy8gaWYgKCF0aGlzLmNoYW5nZUV2ZW50LnBhZ2VDaGFuZ2VkICYmICF0aGlzLmNoYW5nZUV2ZW50LnNvcnRDaGFuZ2VkICYmICF0aGlzLmNoYW5nZUV2ZW50LmZpbHRlckNoYW5nZWQpIHtcclxuICAgIC8vICAgY29uc3QgY3VycmVudERhdGFDYWNoZUluZm8gPSB0aGlzLmdyaWRTZXJ2aWNlLmdlbmVyYXRlQ2FjaGVJbmZvKHRoaXMuemdyaWRiaW5kaW5nLmRhdGEpO1xyXG4gICAgLy8gICBjb25zdCByZXN1bHQgPSB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UuZ2V0SXRlbUJ5S2V5KGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YUNhY2hlSW5mby5vZmZsaW5lRGF0YWJhc2VLZXkpO1xyXG4gICAgLy8gICBpZiAocmVzdWx0KSB7XHJcbiAgICAvLyAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKHJlc3VsdC5kYXRhLCB0cnVlKTtcclxuICAgIC8vICAgfSBlbHNlIHtcclxuICAgIC8vICAgICB0aGlzLmdldEdyaWREYXRhKCk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2Uge1xyXG4gICAgLy8gdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgZ3JpZCBkYXRhLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRHcmlkRGF0YSgpIHtcclxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIGlmICghdGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignR3JpZCBwYWdpbmF0aW9uIEFQSSBVUkwgaXMgdW5kZWZpbmVkLicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc3RhdGVTa2lwID0gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPyB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5za2lwIDogdGhpcy5zdGF0ZS5za2lwO1xyXG4gICAgICBjb25zdCBzdGF0ZVRha2UgPSB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZSA/IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlLnRha2UgOiB0aGlzLnN0YXRlLnRha2U7XHJcblxyXG4gICAgICB0aGlzLnBhcmFtcy5wYWdlTm8gPSB0aGlzLmdldFBhZ2VObyhzdGF0ZVNraXAsIHN0YXRlVGFrZSk7XHJcbiAgICAgIHRoaXMucGFyYW1zLnBhZ2VTaXplID0gc3RhdGVUYWtlO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZmllbGQuRXh0ZXJuYWxQYWdpbmF0aW9uKSB7XHJcbiAgICAgICAgLy8gRm9yIFBPU1QgbWV0aG9kIFBhZ2UgV2ViQVBJXHJcbiAgICAgICAgdGhpcy53ZWJhcGlTZXJ2aWNlXHJcbiAgICAgICAgICAucG9zdEFwaSh0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsLCB0aGlzLnBhcmFtcywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAocmVzcCkgPT4gdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKHJlc3ApLFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coXCJFcnJvciBvY2N1ciBpbiBsb2FkaW5nIHRoZSBkYXRhXCIsIFwibWlkZGxlXCIsIGZhbHNlLCAxNTAwLCBcImRhbmdlclwiKTtcclxuICAgICAgICAgICAgICB0aGlzLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBGb3IgR0VUIG1ldGhvZFxyXG4gICAgICAgIHRoaXMud2ViYXBpU2VydmljZVxyXG4gICAgICAgICAgLmdldEFwaSh0aGlzLnJlc291cmNlVVJMLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCB0b3RhbENvdW50ID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXNwLmRhdGFTZXQpIHtcclxuICAgICAgICAgICAgICBkYXRhID0gcmVzcC5kYXRhU2V0O1xyXG4gICAgICAgICAgICAgIHRvdGFsQ291bnQgPSByZXNwLnRvdGFsQ291bnQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZGF0YSA9IHJlc3A7XHJcbiAgICAgICAgICAgICAgdG90YWxDb3VudCA9IHJlc3AubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoeyBkYXRhU2V0OiBkYXRhLCB0b3RhbENvdW50OiB0b3RhbENvdW50IH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zdCBkYXRhU2V0ID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICAgIHRoaXMuZmllbGQuRGF0YVNvdXJjZSxcclxuICAgICAgICB0aGlzLmdycFxyXG4gICAgICApO1xyXG5cclxuICAgICAgdGhpcy5kYXRhID0gZGF0YVNldDtcclxuICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgICB0aGlzLm5vdGlmeURhdGFDaGFuZ2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShkYXRhOiBhbnksIHNraXBDYWNoZURhdGE/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmFnZ3JlZ2F0ZUhhbmRsaW5nKGRhdGEuZGF0YVNldCk7XHJcbiAgICB0aGlzLmhhbmRsZURhdGVUaW1lSWdub3JpbmdUaW1lWm9uZShkYXRhLmRhdGFTZXQpO1xyXG4gICAgdGhpcy5ncmlkLmRhdGEgPSB7IGRhdGE6IGRhdGEuZGF0YVNldCwgdG90YWw6IGRhdGEudG90YWxDb3VudCB9O1xyXG4gICAgaWYgKCFza2lwQ2FjaGVEYXRhKSB7XHJcbiAgICAgIGNvbnN0IHN0YXRlTG9naWMgPSB0aGlzLmdyaWRTZXJ2aWNlLmdldEdyaWRTdGF0ZUxvZ2ljKHRoaXMuZmllbGQpO1xyXG4gICAgICBpZiAoc3RhdGVMb2dpYyA9PT0gU3RhdGVUeXBlLmNhY2hlZERhdGFTZXR0aW5nIHx8IHN0YXRlTG9naWMgPT09IFN0YXRlVHlwZS5zYXZlZEFuZENhY2hlZERhdGFTZXR0aW5nKSB7XHJcbiAgICAgICAgdGhpcy5jYWNoZUdyaWREYXRhKHN0YXRlTG9naWMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmdyaWQubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5hZnRlckRhdGFCaW5kZWQoZGF0YSk7XHJcbiAgICB0aGlzLmdyaWRTdWJqZWN0Lm5leHQodGhpcyk7XHJcbiAgICB0aGlzLm5vdGlmeURhdGFDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRDaGFuZ2VFdmVudEZsYWcoKSB7XHJcbiAgICB0aGlzLmNoYW5nZUV2ZW50ID0ge1xyXG4gICAgICBwYWdlQ2hhbmdlZDogZmFsc2UsXHJcbiAgICAgIGZpbHRlckNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgICBzb3J0Q2hhbmdlZDogZmFsc2VcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FjaGVHcmlkRGF0YShzdGF0ZUxvZ2ljOiBTdGF0ZVR5cGUpIHtcclxuICAgIGNvbnN0IGNhY2hlTmFtZSA9IHRoaXMuc3RhdGVTZXR0aW5nU2VydmljZS5nZXRTdG9yYWdlQ2FjaGVLZXkoc3RhdGVMb2dpYywgdGhpcy5maWVsZCk7XHJcbiAgICBjb25zdCBncmlkU3RhdGUgPSB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZTtcclxuICAgIGNvbnN0IGdyaWREYXRhID0gdGhpcy5ncmlkPy5kYXRhIHx8IG51bGw7XHJcblxyXG4gICAgaWYgKCFncmlkRGF0YVsnZGF0YSddKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjYWNoZUluZm8gPSB0aGlzLnpncmlkYmluZGluZy5kYXRhLkNhY2hlSW5mbztcclxuXHJcbiAgICBpZiAoY2FjaGVJbmZvICYmICFjYWNoZUluZm8uRGlzYWJsZUNhY2hlRGF0YSkge1xyXG4gICAgICBjb25zdCBjb2x1bW5Db25maWd1cmF0aW9ucyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JpZENvbHVtbnNDb25maWcodGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFNldHRpbmcuY29sdW1ucyk7XHJcbiAgICAgIGxldCB1cGRhdGVkRGF0YSA9IFsuLi5ncmlkRGF0YVsnZGF0YSddXTtcclxuICAgICAgbGV0IHNraXBMaXN0ID0gW2dyaWRTdGF0ZS5za2lwXTtcclxuICAgICAgbGV0IGN1cnJlbnRHcmlkU2tpcCA9IGdyaWRTdGF0ZS5za2lwO1xyXG5cclxuICAgICAgY29uc3QgY2FjaGVHcmlkRGF0YSA9IHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBkYXRhU2V0OiB1cGRhdGVkRGF0YSxcclxuICAgICAgICAgIHRvdGFsQ291bnQ6IGdyaWREYXRhWyd0b3RhbCddXHJcbiAgICAgICAgfSxcclxuICAgICAgICBncmlkU3RhdGU6IGdyaWRTdGF0ZSxcclxuICAgICAgICBza2lwTGlzdDogc2tpcExpc3QsXHJcbiAgICAgICAgY2FjaGVEdXJhdGlvbjogY2FjaGVJbmZvLkNhY2hlRHVyYXRpb24sXHJcbiAgICAgICAgY29sdW1uQ29uZmlndXJhdGlvbnM6IGNvbHVtbkNvbmZpZ3VyYXRpb25zXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oY2FjaGVOYW1lLCBKU09OLnN0cmluZ2lmeShjYWNoZUdyaWREYXRhKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL1wiRmVhdHVyZURldmVsb3BtZW50fENvbXBldGVuY3lcIlxyXG4gIC8vIGNvbW1lbnRlZCBvdXQgZm9yIGZ1dHVyZSByZWZlcmVuY2UgYW5kIHJlLWRldmVsb3AuXHJcbiAgLy8gcHJpdmF0ZSBhc3luYyBzdWJzY3JpYmVDYWNoZURhdGFDaGFuZ2VzKCkge1xyXG4gIC8vICAgY29uc3QgY2FjaGVJbmZvID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5DYWNoZUluZm87XHJcblxyXG4gIC8vICAgaWYgKGNhY2hlSW5mbyAmJiAhY2FjaGVJbmZvLkRpc2FibGVDYWNoZURhdGEpIHtcclxuICAvLyAgICAgLy8gY2Fubm90IHVzZSBtYWluIHNlcnZpY2UgaGVyZS4gd2lsbCBnZXQgY2lyY3VsYXIgZXJyb3Igd2hlbiBidWlsZCBsaWJcclxuICAvLyAgICAgLy90aGlzLm1haW5TZXJ2aWNlLmpvaW5Qcm9qZWN0U2lnbmFsUigpO1xyXG5cclxuICAvLyAgICAgY29uc3QgY2FsbEJhY2tGdW5jdGlvbiA9IGAke2NhY2hlSW5mby5OYW1lfV9oYW5kbGVSZWNlaXZlZE1lc3NhZ2VgO1xyXG5cclxuICAvLyAgICAgLy8gY3JlYXRlIGFuZCBiaW5kIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJhY2sgZm9yIHRoZSBncmlkIGluIHRoZSBncm91cCB0cmlnZ2VyIGJ5IHNpZ25hbFIuXHJcbiAgLy8gICAgIGlmICghdGhpcy5ncnAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlcikge1xyXG4gIC8vICAgICAgIHRoaXMuZ3JwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIgPSB7fTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICB0aGlzLmdycC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyW2NhbGxCYWNrRnVuY3Rpb25dID0gdGhpcy5oYW5kbGVSZWNlaXZlZE1lc3NhZ2UuYmluZCh0aGlzKTtcclxuXHJcbiAgLy8gICAgIGNvbnN0IGdlbmVyYXRlZENhY2hlSW5mbyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2VuZXJhdGVDYWNoZUluZm8odGhpcy56Z3JpZGJpbmRpbmcuZGF0YSk7XHJcbiAgLy8gICAgIGlmIChnZW5lcmF0ZWRDYWNoZUluZm8uZGVmaW5lZERhdGFiYXNlICYmIGdlbmVyYXRlZENhY2hlSW5mby5kZWZpbmVkVGFibGUpIHtcclxuICAvLyAgICAgICBnZW5lcmF0ZWRDYWNoZUluZm8uZGVmaW5lZERhdGFiYXNlLmZvckVhY2goZGIgPT4ge1xyXG4gIC8vICAgICAgICAgZ2VuZXJhdGVkQ2FjaGVJbmZvLmRlZmluZWRUYWJsZS5mb3JFYWNoKHRhYmxlID0+IHtcclxuICAvLyAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0gYCR7ZGJ9fCR7dGFibGV9YDtcclxuICAvLyAgICAgICAgICAgY29uc29sZS5sb2coYExpc3RlbmluZyB0byBldmVudCBuYW1lOiAke2V2ZW50TmFtZX1gKTtcclxuICAvLyAgICAgICAgICAgdGhpcy5zaWduYWxyU2VydmljZS5zdWJzY3JpYmVUb0V2ZW50KHRoaXMuZ3JwLCBgJHtldmVudE5hbWV9YCwgYGdyb3VwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIuJHtjYWxsQmFja0Z1bmN0aW9ufWApO1xyXG4gIC8vICAgICAgICAgfSk7XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGFzeW5jIGhhbmRsZVJlY2VpdmVkTWVzc2FnZShncm91cDogWkdyb3VwLCByZXN1bHQ6IGFueSwgZXZlbnROYW1lOiBzdHJpbmcpIHtcclxuICAvLyAgIGNvbnNvbGUubG9nKGBUaGUgU2lnbmFsciB0cmlnZ2VyIGhhcyBiZWVuIGRldGVjdGVkLiBOb3csIHByb2NlZWQgdG8gdXBkYXRlIHRoZSBjYWNoZSBhbmQgZ3JpZCBkYXRhLmApO1xyXG5cclxuICAvLyAgIGNvbnN0IHJlc3BvbnNlZFJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcclxuICAvLyAgIGNvbnN0IGFjdGlvblR5cGUgPSByZXNwb25zZWRSZXN1bHQuQWN0aW9uO1xyXG4gIC8vICAgY29uc3QgcmVzcG9uc2VkUmVzdWx0SWQgPSByZXNwb25zZWRSZXN1bHRbJ0lkJ107XHJcbiAgLy8gICBjb25zdCB0ZW1wUGFyYW1zID0gWkNvbXBvbmVudEhlbHBlci5kZWVwQ2xvbmUodGhpcy5wYXJhbXMpO1xyXG4gIC8vICAgY29uc3QgY3VycmVudERhdGFDYWNoZUluZm8gPSB0aGlzLmdyaWRTZXJ2aWNlLmdlbmVyYXRlQ2FjaGVJbmZvKHRoaXMuemdyaWRiaW5kaW5nLmRhdGEpO1xyXG4gIC8vICAgY29uc3QgY3VycmVudERhdGEgPSBhd2FpdCB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UuZ2V0SXRlbUJ5S2V5KGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YUNhY2hlSW5mby5vZmZsaW5lRGF0YWJhc2VLZXkpO1xyXG5cclxuICAvLyAgIGlmIChjdXJyZW50RGF0YSkge1xyXG4gIC8vICAgICB0ZW1wUGFyYW1zLmZpbHRlcnMgPSBgSWQ9JHtyZXNwb25zZWRSZXN1bHRJZH1gO1xyXG5cclxuICAvLyAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFjdGlvblR5cGUuRGVsZXRlKSB7XHJcbiAgLy8gICAgICAgY3VycmVudERhdGEuZGF0YS5kYXRhU2V0ID0gY3VycmVudERhdGEuZGF0YS5kYXRhU2V0LmZpbHRlcihpdGVtID0+IGl0ZW0uSWQgIT09IHBhcnNlSW50KHJlc3BvbnNlZFJlc3VsdElkKSk7XHJcblxyXG4gIC8vICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuICAvLyAgICAgICBhd2FpdCB0aGlzLm9mZmxpbmVEYXRhYmFzZVNlcnZpY2UudXBkYXRlSXRlbShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGEpO1xyXG5cclxuICAvLyAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcblxyXG4gIC8vICAgICAgIGNvbnNvbGUubG9nKGBJdGVtIHVwZGF0ZWQ6ICR7Y3VycmVudERhdGF9YCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgZWxzZSB7XHJcbiAgLy8gICAgICAgdGhpcy53ZWJhcGlTZXJ2aWNlLnBvc3RBcGkodGhpcy5wYWdpbmF0aW9uQXBpUG9zdFVybCwgdGVtcFBhcmFtcywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSkuc3Vic2NyaWJlKGFzeW5jIHJlc3AgPT4ge1xyXG5cclxuICAvLyAgICAgICAgIGNvbnN0IGRhdGFiYXNlUmVjb3JkID0gcmVzcC5kYXRhU2V0WzBdO1xyXG5cclxuICAvLyAgICAgICAgIGlmIChkYXRhYmFzZVJlY29yZCkge1xyXG4gIC8vICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQWN0aW9uVHlwZS5VcGRhdGUpIHtcclxuICAvLyAgICAgICAgICAgICBjb25zdCBpbmRleFRvVXBkYXRlID0gY3VycmVudERhdGEuZGF0YS5kYXRhU2V0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uSWQgPT09IGRhdGFiYXNlUmVjb3JkLklkKTtcclxuICAvLyAgICAgICAgICAgICBpZiAoaW5kZXhUb1VwZGF0ZSAhPT0gLTEpIHtcclxuICAvLyAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgdXBkYXRlZCBuYW1lXHJcbiAgLy8gICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkSXRlbSA9IHsgLi4uY3VycmVudERhdGEuZGF0YS5kYXRhU2V0W2luZGV4VG9VcGRhdGVdLCAuLi5kYXRhYmFzZVJlY29yZCB9O1xyXG5cclxuICAvLyAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIG9sZCBpdGVtIHdpdGggdGhlIHVwZGF0ZWQgb25lXHJcbiAgLy8gICAgICAgICAgICAgICBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXRbaW5kZXhUb1VwZGF0ZV0gPSB1cGRhdGVkSXRlbTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcblxyXG4gIC8vICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLnVwZGF0ZUl0ZW0oY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhKTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgSXRlbSB1cGRhdGVkOiAke2N1cnJlbnREYXRhfWApO1xyXG4gIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkl0ZW0gbm90IGZvdW5kIHdpdGggSUQ6XCIsIGRhdGFiYXNlUmVjb3JkLklkKTtcclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgZWxzZSBpZiAoYWN0aW9uVHlwZSA9PT0gQWN0aW9uVHlwZS5BZGQgJiYgY3VycmVudERhdGEuZ3JpZFN0YXRlLnNraXAgPCAyMCkge1xyXG4gIC8vICAgICAgICAgICAgIGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldC51bnNoaWZ0KGRhdGFiYXNlUmVjb3JkKTtcclxuICAvLyAgICAgICAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcbiAgLy8gICAgICAgICAgICAgYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLnVwZGF0ZUl0ZW0oY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhKTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG5cclxuICAvLyAgICAgICAgICAgICBjb25zb2xlLmxvZyhgSXRlbSB1cGRhdGVkOiAke2N1cnJlbnREYXRhfWApO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgICBlbHNlIHtcclxuICAvLyAgICAgICAgICAgLy8gVW5hYmxlIHRvIGdldCBkYXRhLCByZWZyZXNoIHRoZSB3aG9sZSBncmlkIGRhdGEgZnJvbSBBUElcclxuICAvLyAgICAgICAgICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBlbHNlIHtcclxuICAvLyAgICAgLy8gVW5hYmxlIHRvIGdldCBmcm9tIGluZGV4ZWREQiBzdHJhaWdodCBnZXQgZnJvbSBBUElcclxuICAvLyAgICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckRhdGFCaW5kZWQoZGF0YSkge1xyXG4gICAgLy8gYWxsb3cgdG8gY2FsbCBiYWNrIHByb2plY3QgcGFnZSBhZnRlciBkYXRhIGJpbmRlZC5cclxuICAgIGxldCBiaW5kZWRWYWx1ZSA9IHRoaXMuemdyaWRiaW5kaW5nLmRhdGFbJ0FmdGVyRGF0YUJpbmRlZCddO1xyXG4gICAgaWYgKGJpbmRlZFZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IG1lID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcyk7XHJcbiAgICAgIGxldCBjYWxsRnVuYztcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0gYmluZGVkVmFsdWUubWF0Y2goL1xcYlxcKC4qL2dpKTtcclxuICAgICAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgICAgICBiaW5kZWRWYWx1ZSA9IGJpbmRlZFZhbHVlLnJlcGxhY2UocGFyYW1zWzBdLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYmluZGVkVmFsdWUgPSBiaW5kZWRWYWx1ZS5yZXBsYWNlKCdtb2RhbEdyb3VwLicsICdncm91cC4nKTtcclxuICAgICAgICBjYWxsRnVuYyA9IGV2YWwoJ21lLnpncmlkYmluZGluZy4nICsgYmluZGVkVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgIFwiRXJyb3Igd2hlbiBnZXRHcm91cFZhbHVlOiBcIixcclxuICAgICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICAgIFwiID4gRXJyb3I6IFwiLFxyXG4gICAgICAgICAgZXJyb3JcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICBjb25zdCBuZXdGdW5jID0gY2FsbEZ1bmMuYmluZChtZSk7XHJcbiAgICAgICAgbmV3RnVuYyhldmVudCwgbWUuemdyaWRiaW5kaW5nLmRhdGEsIGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJEYXRhKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkLmRhdGEgPSB7IGRhdGE6IFtdLCB0b3RhbDogMCB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGNvbHVtbiBhZ2dyZWdhdGlvbiBmb3IgdGhlIGdpdmVuIGRhdGEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2FueVtdfSBkYXRhIC0gVGhlIGRhdGEgdG8gYWdncmVnYXRlLlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYWdncmVnYXRlSGFuZGxpbmcoZGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBhZ2dyZWdhdGVDb2x1bW5zID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmFnZ3JlZ2F0ZVR5cGUpO1xyXG5cclxuICAgIGFnZ3JlZ2F0ZUNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZCA9IGNvbC5maWVsZDtcclxuICAgICAgY29uc3QgYWdncmVnYXRlVHlwZSA9IGNvbC5hZ2dyZWdhdGVUeXBlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnOicsICcnKTtcclxuXHJcbiAgICAgIGxldCBhZ2dyZWdhdGVWYWx1ZSA9IG51bGw7XHJcbiAgICAgIHN3aXRjaCAoYWdncmVnYXRlVHlwZSkge1xyXG4gICAgICAgIGNhc2UgXCJ0b3RhbFwiOlxyXG4gICAgICAgIGNhc2UgXCJzdW1cIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHRvdGFsLCBuZXh0KSA9PiB0b3RhbCArIG5leHRbZmllbGRdLCAwKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJhdmVyYWdlXCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKCh0b3RhbCwgbmV4dCkgPT4gdG90YWwgKyBuZXh0W2ZpZWxkXSwgMCkgLyBkYXRhLmxlbmd0aDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJjb3VudFwiOlxyXG4gICAgICAgICAgYWdncmVnYXRlVmFsdWUgPSBkYXRhLmxlbmd0aDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtYXhcIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHAsIGMpID0+IHBbZmllbGRdID4gY1tmaWVsZF0gPyBwIDogYylbZmllbGRdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIm1pblwiOlxyXG4gICAgICAgICAgYWdncmVnYXRlVmFsdWUgPSBkYXRhLnJlZHVjZSgocCwgYykgPT4gcFtmaWVsZF0gPCBjW2ZpZWxkXSA/IHAgOiBjKVtmaWVsZF07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgY29sLmFnZ3JlZ2F0ZVZhbHVlID0gYWdncmVnYXRlVmFsdWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlRGF0ZVRpbWVJZ25vcmluZ1RpbWVab25lKGRhdGFTZXQ6IGFueSkge1xyXG4gICAgLy8gQ29sdW1uIHR5cGVzIHJlbGF0ZWQgdG8gZGF0ZSBhbmQgdGltZSBoYW5kbGluZ1xyXG4gICAgY29uc3QgZGF0ZUNvbHVtblR5cGVzID0gWyd6ZGF0ZScsICd6dGltZScsICd6ZGF0ZXRpbWUnLCAnenNob3J0ZGF0ZScsICd6dWlkYXRldGltZScsICd6dWl0aW1lJ107XHJcblxyXG4gICAgLy8gRmlsdGVyIGNvbHVtbnMgdGhhdCBoYXZlIGRhdGUtcmVsYXRlZCB0eXBlc1xyXG4gICAgY29uc3QgZGF0ZVRpbWVDb2x1bW5zID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gZGF0ZUNvbHVtblR5cGVzLmluY2x1ZGVzKGNvbC5UeXBlKSk7XHJcblxyXG4gICAgLy8gRmlsdGVyIGNvbHVtbnMgd2hlcmUgdGhlIHRpbWV6b25lIHNob3VsZCBiZSBpZ25vcmVkXHJcbiAgICBjb25zdCBpZ25vcmVUaW1lWm9uZUNvbHVtbnMgPSBkYXRlVGltZUNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuSXNJZ25vcmVUaW1lWm9uZSk7XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgYXJlIGNvbHVtbnMgdGhhdCBzaG91bGQgaWdub3JlIHRoZSB0aW1lem9uZVxyXG4gICAgaWYgKGlnbm9yZVRpbWVab25lQ29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGRhdGFTZXQuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICBpZ25vcmVUaW1lWm9uZUNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgLy8gQWRqdXN0IGRhdGV0aW1lIGJhc2VkIG9uIHRoZSB0aW1lem9uZSBpZ25vcmluZyBzZXR0aW5nXHJcbiAgICAgICAgICBpZiAoZGF0YVtjb2wuVmFsdWVdKSB7XHJcbiAgICAgICAgICAgIGRhdGFbY29sLlZhbHVlXSA9IHRoaXMuY29tcG9uZW50U2VydmljZS5sb2NhbGl6ZURhdGVUaW1lQnlJZ25vcmluZ1RpbWVab25lKGRhdGFbY29sLlZhbHVlXSwgY29sKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNldCBhZ2dyZWdhdGUgdmFsdWVzIGZvciBjb2x1bW5zIHdpdGggYWdncmVnYXRlIHR5cGVzLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZ2dyZWdhdGVSZXNldFZhbHVlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgYWdncmVnYXRlQ29sdW1ucyA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5hZ2dyZWdhdGVUeXBlKTtcclxuICAgIGFnZ3JlZ2F0ZUNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBjb2wuYWdncmVnYXRlVmFsdWUgPSAwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgcGFnZSBjaGFuZ2UgZXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1BhZ2VDaGFuZ2VFdmVudH0gZXZlbnQgLSBUaGUgcGFnZSBjaGFuZ2UgZXZlbnQuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHBhZ2VDaGFuZ2UoZXZlbnQ6IFBhZ2VDaGFuZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5wYXJhbXMucGFnZU5vID0gdGhpcy5nZXRQYWdlTm8oZXZlbnQuc2tpcCwgdGhpcy5wYXJhbXMucGFnZVNpemUpO1xyXG4gICAgdGhpcy5zdGF0ZS5za2lwID0gZXZlbnQuc2tpcDtcclxuICAgIHRoaXMuY2hhbmdlRXZlbnQucGFnZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHNvcnQgY2hhbmdlIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtTb3J0RGVzY3JpcHRvcltdfSBzb3J0IC0gVGhlIHNvcnQgZGVzY3JpcHRvciBhcnJheS5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc29ydENoYW5nZShzb3J0OiBTb3J0RGVzY3JpcHRvcltdKTogdm9pZCB7XHJcbiAgICB0aGlzLnNvcnQgPSBzb3J0O1xyXG4gICAgdGhpcy5wYXJhbXMuc29ydENvbHVtbk5hbWVzID0gW107XHJcbiAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzID0gW107XHJcblxyXG4gICAgc29ydC5mb3JFYWNoKChkZXNjcmlwdG9yOiBTb3J0RGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICBpZiAoZGVzY3JpcHRvci5kaXIpIHtcclxuICAgICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzLnB1c2goZGVzY3JpcHRvci5kaXIpO1xyXG5cclxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gZGVzY3JpcHRvci5maWVsZCk7XHJcbiAgICAgICAgY29uc3Qgc29ydENvbHVtbk5hbWUgPSBmaWVsZC52YWx1ZUV4cHIgIT09IHVuZGVmaW5lZCA/IGZpZWxkLnZhbHVlRXhwciA6IGRlc2NyaXB0b3IuZmllbGQ7XHJcblxyXG4gICAgICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcy5wdXNoKHNvcnRDb2x1bW5OYW1lKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNoYW5nZUV2ZW50LnNvcnRDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBmaWx0ZXIgY2hhbmdlIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnl9IGV2ZW50IC0gVGhlIGZpbHRlciBjaGFuZ2UgZXZlbnQuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIGZpbHRlckNoYW5nZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhcmFtcy5wYWdlTm8gPSAwO1xyXG4gICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gW107XHJcbiAgICB0aGlzLnNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQuZmlsdGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGV2ZW50LmZpbHRlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5maWVsZCA9PT0gaXRlbS5maWVsZCk7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpdGVtLnZhbHVlID09PSBudWxsID8gXCJcIiA6IGl0ZW0udmFsdWU7XHJcblxyXG4gICAgICAgIGlmIChpdGVtLmZpbHRlcnMpIHtcclxuICAgICAgICAgIGl0ZW0uZmlsdGVycy5mb3JFYWNoKChmaWx0ZXI6IEZpbHRlckRlc2NyaXB0b3IpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVyUGFyYW06IFpHcmlkRmlsdGVyUGFyYW1zID0ge1xyXG4gICAgICAgICAgICAgIGtleTogZmlsdGVyLmZpZWxkIGFzIHN0cmluZyxcclxuICAgICAgICAgICAgICBvcHM6IHRoaXMubWFwRmlsdGVyT3BlcmF0b3IoZmlsdGVyLm9wZXJhdG9yKSxcclxuICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyLnZhbHVlID09PSBudWxsID8gXCJcIiA6IGZpbHRlci52YWx1ZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLnB1c2goZmlsdGVyUGFyYW0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgZmlsdGVyUGFyYW06IFpHcmlkRmlsdGVyUGFyYW1zID0ge1xyXG4gICAgICAgICAgICBrZXk6IGl0ZW0uZmllbGQsXHJcbiAgICAgICAgICAgIG9wczogdGhpcy5tYXBGaWx0ZXJPcGVyYXRvcihpdGVtLm9wZXJhdG9yKSxcclxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC52YWx1ZUV4cHIpIHtcclxuICAgICAgICAgICAgZmlsdGVyUGFyYW0ua2V5ID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YVsnRmlsdGVyV2l0aG91dEJyYWNrZXQnXSA/IGAke2ZpZWxkLnZhbHVlRXhwcn1gIDogYCgke2ZpZWxkLnZhbHVlRXhwcn0pYDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMucHVzaChmaWx0ZXJQYXJhbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC5HcmlkRmlsdGVyQ29uZmlndXJhdGlvbj8uT25DaGFuZ2UpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJHcmlkRmlsdGVyQ29uZmlndXJhdGlvbi5PbkNoYW5nZSB0cmlnZ2VyZWRcIik7XHJcbiAgICAgIC8vIFVzZSBzd2l0Y2hNYXAgdG8gaGFuZGxlIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uXHJcbiAgICAgIG9mKHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcykucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKGZpbHRlclBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgLy8gR2V0IHRoZSBmdW5jdGlvbiBleHByZXNzaW9uIGZyb20gdGhlIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICAgIGxldCBleHByZXNzaW9uID0gdGhpcy5maWVsZC5HcmlkRmlsdGVyQ29uZmlndXJhdGlvbi5PbkNoYW5nZTtcclxuXHJcbiAgICAgICAgICAvLyBSZXBsYWNlICdtb2RhbEdyb3VwLicgd2l0aCAnZ3JvdXAuJyBhbmQgJ2dyb3VwLicgd2l0aCAnZ3JwLidcclxuICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnJlcGxhY2UoL21vZGFsR3JvdXBcXC4vZywgJ2dyb3VwLicpLnJlcGxhY2UoL2dyb3VwXFwuL2csICdncnAuJyk7XHJcblxyXG4gICAgICAgICAgLy8gRW5zdXJlIHRoZSBleHByZXNzaW9uIHN0YXJ0cyB3aXRoICd0aGlzLicgdG8gYXZvaWQgYWNjZXNzaW5nIGdsb2JhbCBzY29wZVxyXG4gICAgICAgICAgaWYgKCFleHByZXNzaW9uLnN0YXJ0c1dpdGgoJ3RoaXMuJykpIHtcclxuICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGB0aGlzLiR7ZXhwcmVzc2lvbn1gO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGZ1bmMgPSBldmFsKGV4cHJlc3Npb24pO1xyXG4gICAgICAgICAgaWYgKCFmdW5jKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2luZ1NlcnZpY2UubG9nKGAke2V4cHJlc3Npb259IG5vdCBmb3VuZCBpbiB0aGlzIHNjb3BlIGZvciAke3RoaXMuZmllbGQuTmFtZX0gZ3JpZC5gKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNpbmNlIGZ1bmN0aW9uIG5vdCBmb3VuZCwgd2UgcmV0dXJuIHRoZSBvcmlnaW5hbCBwYXJhbXMuXHJcbiAgICAgICAgICAgIHJldHVybiBvZih0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGNhbGxGdW5jID0gZnVuYy5iaW5kKHRoaXMuZ3JwKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gY2FsbEZ1bmMoZmlsdGVyUGFyYW1zKTtcclxuICAgICAgICB9KVxyXG4gICAgICApLnN1YnNjcmliZSgodXBkYXRlZEZpbHRlclBhcmFtczogYW55W10pID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyh1cGRhdGVkRmlsdGVyUGFyYW1zKTtcclxuXHJcbiAgICAgICAgLy8gdXBkYXRlIGZpbHRlclBhcmFtc1xyXG4gICAgICAgIGlmICh1cGRhdGVkRmlsdGVyUGFyYW1zKSB7XHJcbiAgICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSB1cGRhdGVkRmlsdGVyUGFyYW1zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGFuZ2VFdmVudC5maWx0ZXJDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIEdyaWRGaWx0ZXJDb25maWd1cmF0aW9uLk9uQ2hhbmdlXHJcbiAgICAgIHRoaXMuY2hhbmdlRXZlbnQuZmlsdGVyQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkYXRhU3RhdGVDaGFuZ2Uoc3RhdGU6IERhdGFTdGF0ZUNoYW5nZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZSA9IHN0YXRlO1xyXG4gICAgdGhpcy5hZ2dyZWdhdGVSZXNldFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYXAgZmlsdGVyIG9wZXJhdG9yIHRvIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdG9yIC0gVGhlIGZpbHRlciBvcGVyYXRvci5cclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBtYXBwZWQgZmlsdGVyIG9wZXJhdG9yIHZhbHVlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbWFwRmlsdGVyT3BlcmF0b3Iob3BlcmF0b3I6IGFueSkge1xyXG4gICAgY29uc3Qgb3BlcmF0b3JNYXBwaW5nczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuICAgICAgXCJlcVwiOiBcImVxXCIsXHJcbiAgICAgIFwibmVxXCI6IFwibmVxXCIsXHJcbiAgICAgIFwibHRcIjogXCJsdFwiLFxyXG4gICAgICBcImx0ZVwiOiBcImx0ZVwiLFxyXG4gICAgICBcImd0XCI6IFwiZ3RcIixcclxuICAgICAgXCJndGVcIjogXCJndGVcIixcclxuICAgICAgXCJzdGFydHN3aXRoXCI6IFwic3RhcnRzd2l0aFwiLFxyXG4gICAgICBcImVuZHN3aXRoXCI6IFwiZW5kc3dpdGhcIixcclxuICAgICAgXCJpc251bGxcIjogXCJpc251bGxcIixcclxuICAgICAgXCJpc25vdG51bGxcIjogXCJpc25vdG51bGxcIixcclxuICAgIH07XHJcbiAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBcImNvbnRhaW5zXCJcclxuICAgIGlmIChvcGVyYXRvciA9PT0gXCJjb250YWluc1wiICYmICF0aGlzLmZpZWxkWydGaWx0ZXJDb250YWluc1VzaW5nRXF1YWwnXSkge1xyXG4gICAgICByZXR1cm4gXCJjb250YWluc1wiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybiB0aGUgbWFwcGVkIG9wZXJhdG9yIG9yIGRlZmF1bHQgdG8gXCI9PVwiXHJcbiAgICByZXR1cm4gb3BlcmF0b3JNYXBwaW5nc1tvcGVyYXRvcl0gfHwgXCI9PVwiO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQYWdlTm8oc3RhdGVTa2lwOiBudW1iZXIsIHN0YXRlVGFrZTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gc3RhdGVTa2lwIC8gc3RhdGVUYWtlO1xyXG4gIH1cclxuXHJcbiAgLy8gY29sdW1uRmllbGQgPSBkYXRhOiBBcnJheTxaRmllbGQ+LFxyXG4gIC8vIGNvbHVtbnMgPSBncmlkQ29sdW1uczogYW55W10sXHJcbiAgLy8gZ3JvdXAgPSBncm91cDogWkdyb3VwLFxyXG4gIC8vIGNvbHVtbkNvbmZpZ3VyYXRpb25zID0gZ3JpZFNldHRpbmdzPzogWkdyaWRDb2x1bW5TZXR0aW5nc1tdLFxyXG4gIC8vIGdlbmVyYXRlSGlkZGVuQ29sdW1ucyA9IHVzYWJsZUNvbHVtbnM/OiBhbnlbXSxcclxuICAvLyBncmlkQXR0cmlidXRlcyA9IGdyaWRGaWVsZD86IFpGaWVsZFxyXG5cclxuICBwdWJsaWMgc2V0Q29sdW1ucyhjb2x1bW5zOiBhbnlbXSkge1xyXG4gICAgdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5GaWVsZCA9IGNvbHVtbnM7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLmdldEdyaWRDb2x1bW5zKHRoaXMuZ3JpZFNldHRpbmcpO1xyXG5cclxuICAgIHRoaXMubG9nZ2luZ1NlcnZpY2UuZGVidWdMb2coJ2dlbmVyYXRlZCBncmlkIGNvbHVtbnMnLCB0aGlzLmdyaWRTZXR0aW5nKTtcclxuICB9XHJcbn1cclxuIl19
957
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemdyaWQuYmluZGluZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96Z3JpZC96Z3JpZC5iaW5kaW5nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RSw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBdUIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQXlDLE1BQU0sOEJBQThCLENBQUM7QUFDMUgsT0FBTyxFQUFvQyxPQUFPLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUl2Rix5REFBeUQ7QUFDekQsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixTQUFTLEVBRVYsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7QUFPekIsTUFBTSxPQUFPLHFCQUFzQixTQUFRLG9CQUFvQjtJQXdEN0QsWUFDeUIsSUFBSSxFQUFFLHlGQUF5RjtJQUM5RyxhQUE0QixFQUM1QixZQUEwQjtJQUNsQyxtQ0FBbUM7SUFDbkMseURBQXlEO0lBQ2pELGNBQThCLEVBQzlCLFdBQXlCLEVBQ3pCLGNBQThCLEVBQzlCLG1CQUF3QyxFQUN4QyxnQkFBbUMsRUFDMUIsY0FBcUM7UUFFdEQsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBWEosa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFHMUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUFjO1FBQ3pCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUI7UUFDMUIsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBbEVoRCxnQkFBVyxHQUFHO1lBQ3BCLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLFdBQVcsRUFBRSxLQUFLO1NBQ25CLENBQUE7UUFVRCxrQkFBa0I7UUFDbEIsWUFBWTtRQUNaLGFBQWE7UUFDYixJQUFJO1FBRUosMEJBQTBCO1FBRTFCLDRCQUE0QjtRQUU1QixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVuQix5QkFBb0IsR0FBRyxJQUFJLENBQUM7UUFFNUIsZUFBVSxHQUFHLElBQUksQ0FBQztJQTBDbEIsQ0FBQztJQXhDRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxJQUFJLFdBQVcsQ0FBQyxLQUFLO1FBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUN4QyxDQUFDO0lBQ0QsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxHQUFHO1FBQ0wsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUN4QixDQUFDO0lBa0JNLFFBQVE7UUFDYixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDO1FBRWhELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUMvQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FDVCxDQUFDO1lBRUYsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssaUJBQWlCLEVBQUU7b0JBQ3JELE9BQU8sQ0FBQyxJQUFJLENBQ1YsdUNBQXVDLEVBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUN2QixDQUFDO2lCQUNIO2dCQUNELE9BQU87YUFDUjtZQUVELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXRDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1NBQ3JDO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFO1lBQzFDLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFdkYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQy9CO1lBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDN0I7aUJBQ0k7Z0JBQ0gsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3ZCO1NBQ0Y7YUFDSTtZQUNILElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVELGVBQWU7SUFDZixDQUFDO0lBRU0sV0FBVztRQUNoQixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVPLHNCQUFzQixDQUFDLFNBQW9CLEVBQUUsS0FBYTtRQUNoRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQzFELEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEVBQUU7WUFDeEIsNEVBQTRFO1lBQzVFLE9BQU8saUJBQWlCLENBQUM7UUFDM0IsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtZQUN4QixJQUFJLGlCQUFpQixFQUFFO2dCQUNyQixNQUFNLGNBQWMsR0FBRyxpQkFBa0MsQ0FBQztnQkFDMUQsSUFBSSxjQUFjLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7b0JBQ3BGLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEdBQUcsY0FBYyxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQztpQkFDckY7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU0sY0FBYyxDQUFDLFdBQW1CO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2QsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDakQ7YUFBTTtZQUNMLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7SUFFTyw0QkFBNEI7UUFDbEMseUNBQXlDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO1FBQ2pFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7UUFDNUUsSUFBSSxLQUFLLElBQUksUUFBUSxFQUFFO1lBQ3JCLE1BQU0sV0FBVyxHQUFHO2dCQUNsQixHQUFHLEVBQUUsUUFBUTtnQkFDYixHQUFHLEVBQUUsR0FBRztnQkFDUixLQUFLLEVBQUUsS0FBSzthQUNiLENBQUM7WUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7WUFDMUIsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUMvQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FDVCxDQUFDO1NBQ0g7UUFDRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFFTSxtQkFBbUI7UUFDeEIsTUFBTSxhQUFhLEdBQW9CLGdCQUFnQixDQUFDLGFBQWEsQ0FDbkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQ1QsQ0FBQztRQUVGLElBQUksYUFBYSxFQUFFO1lBQ2pCLGFBQWEsQ0FBQyxJQUFJLENBQ2hCLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNqQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFdEUsSUFBSSxjQUFjLElBQUksY0FBYyxLQUFLLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRTtvQkFDcEUsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUN6RSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDWixPQUFPLElBQUksQ0FBQztvQkFDZCxDQUFDLENBQUMsQ0FDSCxDQUFDO2lCQUNIO2dCQUVELE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNYLElBQUksQ0FBQyxXQUFXLEdBQUc7b0JBQ2pCLEdBQUcsSUFBSSxDQUFDLFdBQVc7b0JBQ25CLFdBQVcsRUFBRSxJQUFJO29CQUNqQixLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLO2lCQUMvQixDQUFBO2dCQUVELGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFFekUsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBRTVELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQztZQUNuRixDQUFDLENBQUMsQ0FDSCxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLEVBQUU7b0JBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztvQkFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzdCO3FCQUNJO29CQUNILElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztpQkFDdkI7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO2FBQ0k7WUFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztJQUVNLDBCQUEwQixDQUFDLFlBQXFCO1FBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQztJQUN4RCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksYUFBYSxDQUFDLFFBQWdCLEVBQUUsT0FBZTtRQUNwRCw4Q0FBOEM7UUFDOUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQztRQUV4RixrRUFBa0U7UUFDbEUsSUFBSSxjQUFjLEVBQUU7WUFDbEIsY0FBYyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZ0JBQWdCLENBQUMsUUFBZ0IsRUFBRSxTQUFrQjtRQUMxRCw4Q0FBOEM7UUFDOUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQztRQUV4Riw2RUFBNkU7UUFDN0UsSUFBSSxjQUFjLEVBQUU7WUFDbEIsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQztTQUNwQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssc0JBQXNCO1FBQzVCLDBDQUEwQztRQUMxQyxNQUFNLFNBQVMsR0FBa0IsRUFBRSxDQUFDO1FBRXBDLGtFQUFrRTtRQUNsRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMxQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7Z0JBQ3BCLDJEQUEyRDtnQkFDM0QsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDMUQ7aUJBQU07Z0JBQ0wsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDOUI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILHlEQUF5RDtRQUN6RCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDbEMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0QjtTQUNGO1FBRUQsb0VBQW9FO1FBQ3BFLE1BQU0sYUFBYSxHQUFVLEVBQUUsQ0FBQztRQUNoQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV4Qyw0RUFBNEU7UUFDNUUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdEQsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3RFO1FBRUQseUVBQXlFO1FBQ3pFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxTQUFTO1FBQ2YsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUM3Qyx5RUFBeUU7WUFDekUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3pFO2FBQ0ksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ25ELGtFQUFrRTtZQUNsRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztTQUMxQztRQUVELGdHQUFnRztRQUNoRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRTtZQUM5RyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4RCxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUU3RixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3hCLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGVBQWU7UUFDckIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVoRCw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO1lBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztTQUMvQjtRQUVELElBQUksWUFBWSxFQUFFO1lBQ2hCLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDckMscUVBQXFFO2dCQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRztvQkFDekIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVk7b0JBQzNCLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDO2lCQUMxRCxDQUFDO2FBQ0g7aUJBQ0k7Z0JBQ0gsbUVBQW1FO2dCQUNuRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRztvQkFDekIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVk7b0JBQzNCLFlBQVk7aUJBQ2IsQ0FBQzthQUNIO1NBQ0Y7UUFFRCxnRkFBZ0Y7UUFDaEYsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO1lBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBd0IsRUFBRSxFQUFFO2dCQUMvRSxNQUFNLFdBQVcsR0FBRztvQkFDbEIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFlO29CQUMzQixHQUFHLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7b0JBQzVDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSztpQkFDakQsQ0FBQztnQkFDRixnRUFBZ0U7Z0JBQ2hFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlGLElBQUksYUFBYSxFQUFFO29CQUNqQixvRUFBb0U7b0JBQ3BFLGFBQWEsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztpQkFDekM7cUJBQU07b0JBQ0wsNkVBQTZFO29CQUM3RSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQzVDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssVUFBVTtRQUNoQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUV2Qyw0REFBNEQ7UUFDNUQsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM3RTthQUNJO1lBQ0gsaUZBQWlGO1lBQ2pGLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztTQUNuQztRQUdELDJDQUEyQztRQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztTQUNsQztRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO1lBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDckQsSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNsQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNyRixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztvQkFFMUYsNERBQTREO29CQUM1RCxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxDQUFDO29CQUV6RyxJQUFJLHVCQUF1QixLQUFLLENBQUMsQ0FBQyxFQUFFO3dCQUNsQyxxRUFBcUU7d0JBQ3JFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQztxQkFDbEU7eUJBQU07d0JBQ0wsb0ZBQW9GO3dCQUNwRixJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7d0JBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQzdDO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssWUFBWTtRQUNsQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUV2QyxtQ0FBbUM7UUFDbkMsSUFBSSxTQUFTLElBQUksU0FBUyxFQUFFO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hGO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssZUFBZSxDQUFDLGFBQW9DO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU87WUFBRSxPQUFPO1FBRXZDLGdEQUFnRDtRQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFL0UscUNBQXFDO1FBQ3JDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFL0UsMkNBQTJDO1FBQzNDLE1BQU0sYUFBYSxHQUFHLGFBQWE7WUFDakMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQztZQUN4RCxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRS9DLHVDQUF1QztRQUN2QyxhQUFhLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xGLElBQUksTUFBTSxFQUFFO2dCQUNWLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQ3RCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxjQUFjLENBQUMsWUFBc0I7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuQixzREFBc0Q7UUFFdEQsb0NBQW9DO1FBQ3BDLHdCQUF3QjtRQUN4QixZQUFZO1FBQ1osSUFBSTtRQUVKLG1CQUFtQjtRQUNuQiwyRUFBMkU7UUFDM0UsNkRBQTZEO1FBQzdELDBCQUEwQjtRQUMxQixjQUFjO1FBQ2QsTUFBTTtRQUNOLElBQUk7UUFFSixpR0FBaUc7UUFDakcsMkdBQTJHO1FBQzNHLDZGQUE2RjtRQUM3Riw0SEFBNEg7UUFDNUgsa0JBQWtCO1FBQ2xCLDREQUE0RDtRQUM1RCxhQUFhO1FBQ2IsMEJBQTBCO1FBQzFCLE1BQU07UUFDTixJQUFJO1FBQ0osU0FBUztRQUNULHNCQUFzQjtRQUN0QixJQUFJO0lBQ04sQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxXQUFXO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLENBQUMsQ0FBQztnQkFDdEQsT0FBTzthQUNSO1lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDakcsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFFakcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1lBRWpDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRTtnQkFDakMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQ2pELElBQUksV0FBVyxFQUFFO29CQUNmLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDL0MsT0FBTztpQkFDUjtnQkFFRCw4QkFBOEI7Z0JBQzlCLE1BQU0sb0JBQW9CLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUM1RSxJQUFJLENBQUMsYUFBYTtxQkFDZixPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztxQkFDN0UsU0FBUyxDQUFDO29CQUNWLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO3dCQUNaLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDMUQsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMxQyxDQUFDO29CQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO3dCQUMzRixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQzVCLENBQUM7aUJBQ0YsQ0FBQyxDQUFDO2FBQ047aUJBQ0k7Z0JBQ0gsaUJBQWlCO2dCQUNqQixJQUFJLENBQUMsYUFBYTtxQkFDZixNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztxQkFDNUQsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ2xCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDaEIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO29CQUVuQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7d0JBQ2hCLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO3dCQUNwQixVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztxQkFDOUI7eUJBQU07d0JBQ0wsSUFBSSxHQUFHLElBQUksQ0FBQzt3QkFDWixVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztxQkFDMUI7b0JBRUQsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDL0UsQ0FBQyxDQUFDLENBQUM7YUFDTjtTQUNGO2FBQ0k7WUFDSCxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLENBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUNyQixJQUFJLENBQUMsR0FBRyxDQUNULENBQUM7WUFFRixJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztZQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7U0FDOUI7SUFDSCxDQUFDO0lBRU8sNEJBQTRCLENBQUMsSUFBUyxFQUFFLGFBQXVCO1FBQ3JFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsRSxJQUFJLFVBQVUsS0FBSyxTQUFTLENBQUMsaUJBQWlCLElBQUksVUFBVSxLQUFLLFNBQVMsQ0FBQyx5QkFBeUIsRUFBRTtnQkFDcEcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNoQztTQUNGO1FBRUQsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO1FBQ3BELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQztRQUUvRCxJQUFJLGNBQWMsSUFBSSxTQUFTLEVBQUU7WUFDL0IsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFFM0IsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFO2dCQUNkLElBQUk7b0JBQ0YsOERBQThEO29CQUM5RCxNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDL0MsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFFL0QsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUM7aUJBQ3pCO2dCQUFDLE9BQU8sS0FBSyxFQUFFO29CQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQzlDO2FBQ0Y7U0FDRjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNqQixXQUFXLEVBQUUsS0FBSztZQUNsQixhQUFhLEVBQUUsS0FBSztZQUNwQixXQUFXLEVBQUUsS0FBSztTQUNuQixDQUFBO0lBQ0gsQ0FBQztJQUVPLGFBQWEsQ0FBQyxVQUFxQjtRQUN6QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUM7UUFFekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyQixPQUFPO1NBQ1I7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFbkQsSUFBSSxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUU7WUFDNUMsTUFBTSxvQkFBb0IsR0FBRyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxRyxJQUFJLFdBQVcsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxlQUFlLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztZQUVyQyxNQUFNLGFBQWEsR0FBRztnQkFDcEIsSUFBSSxFQUFFO29CQUNKLE9BQU8sRUFBRSxXQUFXO29CQUNwQixVQUFVLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQztpQkFDOUI7Z0JBQ0QsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixhQUFhLEVBQUUsU0FBUyxDQUFDLGFBQWE7Z0JBQ3RDLG9CQUFvQixFQUFFLG9CQUFvQjthQUMzQyxDQUFBO1lBRUQsY0FBYyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1NBQ2xFO0lBQ0gsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxxREFBcUQ7SUFDckQsOENBQThDO0lBQzlDLHdEQUF3RDtJQUV4RCxvREFBb0Q7SUFDcEQsOEVBQThFO0lBQzlFLCtDQUErQztJQUUvQywwRUFBMEU7SUFFMUUsb0dBQW9HO0lBQ3BHLDhDQUE4QztJQUM5Qyw4Q0FBOEM7SUFDOUMsUUFBUTtJQUNSLGlHQUFpRztJQUVqRyw2RkFBNkY7SUFDN0YsbUZBQW1GO0lBQ25GLDJEQUEyRDtJQUMzRCw2REFBNkQ7SUFDN0QsZ0RBQWdEO0lBQ2hELGtFQUFrRTtJQUNsRSxnSUFBZ0k7SUFDaEksY0FBYztJQUNkLFlBQVk7SUFDWixRQUFRO0lBQ1IsTUFBTTtJQUNOLElBQUk7SUFFSiwrRUFBK0U7SUFDL0UsMkdBQTJHO0lBRTNHLGdEQUFnRDtJQUNoRCwrQ0FBK0M7SUFDL0MscURBQXFEO0lBQ3JELGdFQUFnRTtJQUNoRSw2RkFBNkY7SUFDN0YsdUlBQXVJO0lBRXZJLHVCQUF1QjtJQUN2QixzREFBc0Q7SUFFdEQsOENBQThDO0lBQzlDLHFIQUFxSDtJQUVySCxtRUFBbUU7SUFDbkUseUZBQXlGO0lBRXpGLG1FQUFtRTtJQUVuRSxxREFBcUQ7SUFDckQsUUFBUTtJQUNSLGFBQWE7SUFDYixrSUFBa0k7SUFFbEksa0RBQWtEO0lBRWxELGdDQUFnQztJQUNoQyxvREFBb0Q7SUFDcEQsK0dBQStHO0lBQy9HLDBDQUEwQztJQUMxQyw2REFBNkQ7SUFDN0QsdUdBQXVHO0lBRXZHLDZEQUE2RDtJQUM3RCx1RUFBdUU7SUFFdkUsMkVBQTJFO0lBRTNFLGlHQUFpRztJQUVqRyw2REFBNkQ7SUFDN0QsdUJBQXVCO0lBQ3ZCLDJFQUEyRTtJQUMzRSxnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLHlGQUF5RjtJQUN6RixnRUFBZ0U7SUFDaEUseUVBQXlFO0lBQ3pFLCtGQUErRjtJQUUvRix5RUFBeUU7SUFFekUsMkRBQTJEO0lBQzNELGNBQWM7SUFDZCxZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCLHdFQUF3RTtJQUN4RSxnQ0FBZ0M7SUFDaEMsWUFBWTtJQUNaLFlBQVk7SUFDWixRQUFRO0lBQ1IsTUFBTTtJQUNOLFdBQVc7SUFDWCw0REFBNEQ7SUFDNUQsMEJBQTBCO0lBQzFCLE1BQU07SUFDTixJQUFJO0lBRUksZUFBZSxDQUFDLElBQUk7UUFDMUIscURBQXFEO1FBQ3JELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDNUQsSUFBSSxXQUFXLEVBQUU7WUFDZixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuQyxJQUFJLFFBQVEsQ0FBQztZQUViLElBQUk7Z0JBQ0YsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxNQUFNLEVBQUU7b0JBQ1YsV0FBVyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2lCQUNsRDtnQkFDRCxXQUFXLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzNELFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsV0FBVyxDQUFDLENBQUM7YUFDbkQ7WUFDRCxPQUFPLEtBQUssRUFBRTtnQkFDWixPQUFPLENBQUMsSUFBSSxDQUNWLDRCQUE0QixFQUM1QixLQUFLLENBQUMsTUFBTSxFQUNaLFlBQVksRUFDWixLQUFLLENBQ04sQ0FBQzthQUNIO1lBRUQsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUU7Z0JBQ2xDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDNUM7U0FDRjtJQUNILENBQUM7SUFFTSxTQUFTO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxpQkFBaUIsQ0FBQyxJQUFTO1FBQ2pDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRW5GLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM3QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQ3hCLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV2RSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDMUIsUUFBUSxhQUFhLEVBQUU7Z0JBQ3JCLEtBQUssT0FBTyxDQUFDO2dCQUNiLEtBQUssS0FBSztvQkFDUixjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3RFLE1BQU07Z0JBQ1IsS0FBSyxTQUFTO29CQUNaLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUNwRixNQUFNO2dCQUNSLEtBQUssT0FBTztvQkFDVixjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztvQkFDN0IsTUFBTTtnQkFDUixLQUFLLEtBQUs7b0JBQ1IsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMzRSxNQUFNO2dCQUNSLEtBQUssS0FBSztvQkFDUixjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzNFLE1BQU07YUFDVDtZQUVELEdBQUcsQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDhCQUE4QixDQUFDLE9BQVk7UUFDakQsaURBQWlEO1FBQ2pELE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVoRyw4Q0FBOEM7UUFDOUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVuRyxzREFBc0Q7UUFDdEQsTUFBTSxxQkFBcUIsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFbEYsdURBQXVEO1FBQ3ZELElBQUkscUJBQXFCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNwQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNyQixxQkFBcUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ2xDLHlEQUF5RDtvQkFDekQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3FCQUNsRztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLG1CQUFtQjtRQUN6QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNuRixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDN0IsR0FBRyxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxVQUFVLENBQUMsS0FBc0I7UUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFVBQVUsQ0FBQyxJQUFzQjtRQUN0QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRTVCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUEwQixFQUFFLEVBQUU7WUFDMUMsSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUU1QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyRixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFFMUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ2xEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFlBQVksQ0FBQyxLQUFVO1FBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFFcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBRXBELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUF3QixFQUFFLEVBQUU7d0JBQ2hELE1BQU0sV0FBVyxHQUFzQjs0QkFDckMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFlOzRCQUMzQixHQUFHLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7NEJBQzVDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSzt5QkFDakQsQ0FBQzt3QkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQzdDLENBQUMsQ0FBQyxDQUFDO2lCQUNKO3FCQUNJO29CQUNILE1BQU0sV0FBVyxHQUFzQjt3QkFDckMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLO3dCQUNmLEdBQUcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzt3QkFDMUMsS0FBSyxFQUFFLEtBQUs7cUJBQ2IsQ0FBQztvQkFFRixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFO3dCQUM1QixXQUFXLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQztxQkFDbEg7b0JBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUM1QztZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEVBQUUsUUFBUSxFQUFFO1lBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUMxRCxxREFBcUQ7WUFDckQsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUMvQixTQUFTLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtnQkFDekIscURBQXFEO2dCQUNyRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQztnQkFFN0QsK0RBQStEO2dCQUMvRCxVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFdkYsNEVBQTRFO2dCQUM1RSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDbkMsVUFBVSxHQUFHLFFBQVEsVUFBVSxFQUFFLENBQUM7aUJBQ25DO2dCQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDVCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsZ0NBQWdDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQztvQkFFOUYsMkRBQTJEO29CQUMzRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNyQztnQkFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFckMsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQyxTQUFTLENBQUMsQ0FBQyxtQkFBMEIsRUFBRSxFQUFFO2dCQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBRWpDLHNCQUFzQjtnQkFDdEIsSUFBSSxtQkFBbUIsRUFBRTtvQkFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsbUJBQW1CLENBQUM7aUJBQ2hEO2dCQUVELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFDSTtZQUNILGtEQUFrRDtZQUNsRCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDdEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztJQUVNLGVBQWUsQ0FBQyxLQUEyQjtRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ25DLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGlCQUFpQixDQUFDLFFBQWE7UUFDckMsTUFBTSxnQkFBZ0IsR0FBOEI7WUFDbEQsSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUUsS0FBSztZQUNaLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLEtBQUs7WUFDWixJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUssRUFBRSxLQUFLO1lBQ1osWUFBWSxFQUFFLFlBQVk7WUFDMUIsVUFBVSxFQUFFLFVBQVU7WUFDdEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsV0FBVyxFQUFFLFdBQVc7U0FDekIsQ0FBQztRQUNGLHFDQUFxQztRQUNyQyxJQUFJLFFBQVEsS0FBSyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLEVBQUU7WUFDdEUsT0FBTyxVQUFVLENBQUM7U0FDbkI7UUFFRCxnREFBZ0Q7UUFDaEQsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDNUMsQ0FBQztJQUVPLFNBQVMsQ0FBQyxTQUFpQixFQUFFLFNBQWlCO1FBQ3BELE9BQU8sU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLGdDQUFnQztJQUNoQyx5QkFBeUI7SUFDekIsK0RBQStEO0lBQy9ELGlEQUFpRDtJQUNqRCxzQ0FBc0M7SUFFL0IsVUFBVSxDQUFDLE9BQWM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO1FBQ3ZDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFUSxxQkFBcUI7UUFDNUIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDdEMsc0RBQXNEO1lBQ3RELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDbkYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMxQjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLE1BQU0sb0JBQW9CLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsRUFBRTtZQUNqRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDekUsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3ZELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sV0FBVyxDQUFDO1NBQ3BCO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8saUJBQWlCLENBQUMsR0FBVztRQUNuQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVPLHlCQUF5QixDQUFDLEdBQVc7UUFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckQsT0FBTyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbkUsQ0FBQztJQUVPLGtCQUFrQixDQUFDLElBQVM7UUFDbEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLFlBQVksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN6RSxPQUFPLGFBQWEsSUFBSSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLDBCQUEwQixDQUFDLFdBQWlCLEVBQUUsWUFBa0I7UUFDdEUsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoRSxPQUFPLFFBQVEsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU8sd0JBQXdCLENBQUMsb0JBQTRCLEVBQUUsSUFBUztRQUN0RSxJQUFJLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFDL0QsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDOztrSEEvbENVLHFCQUFxQixrQkF5RHRCLGFBQWE7c0dBekRaLHFCQUFxQjsyRkFBckIscUJBQXFCO2tCQUhqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCOzswQkEwREksTUFBTTsyQkFBQyxhQUFhOzhSQWxEZCxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBEaXJlY3RpdmUsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgSW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgb2YgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IERhdGFCaW5kaW5nRGlyZWN0aXZlLCBHcmlkQ29tcG9uZW50LCBEYXRhU3RhdGVDaGFuZ2VFdmVudCwgUGFnZUNoYW5nZUV2ZW50IH0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWdyaWRcIjtcclxuaW1wb3J0IHsgU29ydERlc2NyaXB0b3IsIEZpbHRlckRlc2NyaXB0b3IsIHByb2Nlc3MgfSBmcm9tIFwiQHByb2dyZXNzL2tlbmRvLWRhdGEtcXVlcnlcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgWkdyaWRTZXJ2aWNlIH0gZnJvbSBcIi4vemdyaWQuc2VydmljZVwiO1xyXG4vL2ltcG9ydCB7IE1haW5TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL21haW4uc2VydmljZVwiO1xyXG5pbXBvcnQge1xyXG4gIFpDb21wb25lbnRIZWxwZXIsIFpGaWVsZCwgWkdyaWRQb3N0QXBpUGFyYW1zLFxyXG4gIFdlYkFwaVNlcnZpY2UsIFpHcm91cCwgVG9hc3RTZXJ2aWNlLCBTaWduYWxyU2VydmljZSwgQWN0aW9uVHlwZSwgWkdyaWRDb2x1bW5Db25maWdzLCBaR3JpZFNldHRpbmdzLCBMb2dnaW5nU2VydmljZSwgWkdyaWRGaWx0ZXJQYXJhbXMsXHJcbiAgU3RhdGVUeXBlLCBTdGF0ZVNldHRpbmdTZXJ2aWNlLFxyXG4gIFN0b3JhZ2VTZXNzaW9uU2VydmljZVxyXG59IGZyb20gXCJtbWhnbG9iYWwtemNvcmVcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlXCI7XHJcblxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6IFwiW3pncmlkYmluZGluZ11cIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFpHcmlkQmluZGluZ0RpcmVjdGl2ZSBleHRlbmRzIERhdGFCaW5kaW5nRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgY2hhbmdlRXZlbnQgPSB7XHJcbiAgICBwYWdlQ2hhbmdlZDogZmFsc2UsXHJcbiAgICBmaWx0ZXJDaGFuZ2VkOiBmYWxzZSxcclxuICAgIHNvcnRDaGFuZ2VkOiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgemdyaWRiaW5kaW5nOiB7XHJcbiAgICBkYXRhOiBaRmllbGQ7XHJcbiAgICBncm91cDogWkdyb3VwO1xyXG4gICAgcGFyYW1zOiBaR3JpZFBvc3RBcGlQYXJhbXM7XHJcbiAgICBncmlkU3ViamVjdDogU3ViamVjdDxhbnk+O1xyXG4gICAgZ3JpZFNldHRpbmc6IFpHcmlkU2V0dGluZ3M7XHJcbiAgfTtcclxuXHJcbiAgLy9zdGF0ZTogU3RhdGUgPSB7XHJcbiAgLy8gIHNraXA6IDAsXHJcbiAgLy8gIHRha2U6IDEwLFxyXG4gIC8vfTtcclxuXHJcbiAgLy9ncmlkQ29sdW1uczogYW55W10gPSBbXTtcclxuXHJcbiAgLy91c2FibGVDb2x1bW5zOiBhbnlbXSA9IFtdO1xyXG5cclxuICByZXNvdXJjZVVSTCA9IG51bGw7XHJcblxyXG4gIHBhZ2luYXRpb25BcGlQb3N0VXJsID0gbnVsbDtcclxuXHJcbiAgZGF0YVNvdXJjZSA9IG51bGw7XHJcblxyXG4gIGdldCBncmlkU2V0dGluZygpIHtcclxuICAgIHJldHVybiB0aGlzLnpncmlkYmluZGluZy5ncmlkU2V0dGluZztcclxuICB9XHJcbiAgc2V0IGdyaWRTZXR0aW5nKHZhbHVlKSB7XHJcbiAgICB0aGlzLnpncmlkYmluZGluZy5ncmlkU2V0dGluZyA9IHZhbHVlO1xyXG4gIH1cclxuICBnZXQgZmllbGQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YTtcclxuICB9XHJcblxyXG4gIGdldCBncnAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZ3JvdXA7XHJcbiAgfVxyXG5cclxuICBnZXQgZ3JpZFN1YmplY3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFyYW1zKCk6IFpHcmlkUG9zdEFwaVBhcmFtcyB7XHJcbiAgICByZXR1cm4gdGhpcy56Z3JpZGJpbmRpbmcucGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdldERhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkLmRhdGE7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoR3JpZENvbXBvbmVudCkgZ3JpZCwgLy8gSW5qZWN0aW5nIEdyaWRDb21wb25lbnQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBzY29wZSBhbmQgY29udGV4dCBvZiB0aGUgR3JpZENvbXBvbmVudC5cclxuICAgIHByaXZhdGUgd2ViYXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICAvL3ByaXZhdGUgbWFpblNlcnZpY2U6IE1haW5TZXJ2aWNlLFxyXG4gICAgLy9wcml2YXRlIG9mZmxpbmVEYXRhYmFzZVNlcnZpY2U6IE9mZmxpbmVEYXRhYmFzZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNpZ25hbHJTZXJ2aWNlOiBTaWduYWxyU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3JpZFNlcnZpY2U6IFpHcmlkU2VydmljZSxcclxuICAgIHByaXZhdGUgbG9nZ2luZ1NlcnZpY2U6IExvZ2dpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdGF0ZVNldHRpbmdTZXJ2aWNlOiBTdGF0ZVNldHRpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb21wb25lbnRTZXJ2aWNlOiBaQ29tcG9uZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXNzaW9uU2VydmljZSxcclxuICApIHtcclxuICAgIHN1cGVyKGdyaWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICB0aGlzLmdyaWQubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5maWVsZC5QYWdlU2l6ZSB8fCAyMDtcclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuZmllbGQuRGF0YVNvdXJjZSA/PyBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIHRoaXMucmVzb3VyY2VVUkwgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoXHJcbiAgICAgICAgdGhpcy5maWVsZC5SZXNvdXJjZVVSTCxcclxuICAgICAgICB0aGlzLmdycFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLnJlc291cmNlVVJMKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5OYW1lICE9PSBcIkFjdGl2aXR5TG9nR3JpZFwiKSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAgIFwiTm8gaW5pdGlhbGlzZSBmb3IgRmllbGQuUmVzb3VyY2VVUkw6IFwiLFxyXG4gICAgICAgICAgICB0aGlzLmZpZWxkLlJlc291cmNlVVJMXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2V0UmVzb3VyY2VVcmwodGhpcy5yZXNvdXJjZVVSTCk7XHJcblxyXG4gICAgICB0aGlzLnNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWVsZC5EaXNhYmxlR2VuZXJhdGVDb2x1bW5CeUZvcm0pIHtcclxuICAgICAgY29uc3QgY29sdW1uRmllbGRzID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMuZmllbGQuQ29sdW1uRmllbGRzLCB0aGlzLmdycCk7XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5GaWVsZHMpKSB7XHJcbiAgICAgICAgdGhpcy5zZXRDb2x1bW5zKGNvbHVtbkZpZWxkcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmZpZWxkWydTa2lwTG9hZFJlc291cmNlVVJMRGF0YSddKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmdyaWRTdWJqZWN0Lm5leHQodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5nZW5lcmF0ZUdyaWRDb2x1bW5zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXRyaWV2ZUdyaWRTdGF0ZUNhY2hlKHN0YXRlVHlwZTogU3RhdGVUeXBlLCBmaWVsZDogWkZpZWxkKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWRTZXJ2aWNlLmdldFN0YXRlQ2FjaGUoc3RhdGVUeXBlLCBmaWVsZCkucGlwZShcclxuICAgICAgbWFwKChzZXR0aW5nQ2FjaGVWYWx1ZSkgPT4ge1xyXG4gICAgICAgIC8vIElmIHNldHRpbmdDYWNoZVZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkLCBjb250aW51ZSB3aXRoIGEgZmFsbGJhY2sgdmFsdWVcclxuICAgICAgICByZXR1cm4gc2V0dGluZ0NhY2hlVmFsdWU7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKHNldHRpbmdDYWNoZVZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdDYWNoZVZhbHVlKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXJzZWRKc29uRGF0YSA9IHNldHRpbmdDYWNoZVZhbHVlIGFzIFpHcmlkU2V0dGluZ3M7XHJcbiAgICAgICAgICBpZiAocGFyc2VkSnNvbkRhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPSBwYXJzZWRKc29uRGF0YS5ncmlkU3RhdGUgPz8gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFNldHRpbmcuY29sdW1uQ29uZmlndXJhdGlvbnMgPSBwYXJzZWRKc29uRGF0YS5jb2x1bW5Db25maWd1cmF0aW9ucyA/PyBudWxsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UmVzb3VyY2VVcmwocmVzb3VyY2VVcmw6IHN0cmluZykge1xyXG4gICAgY29uc3QgYXJyYXkgPSByZXNvdXJjZVVybC5zcGxpdChcIi9hcGkvXCIpO1xyXG4gICAgaWYgKCEhYXJyYXlbMV0pIHtcclxuICAgICAgYXJyYXlbMV0gPSBcIlBhZ2VcIiArIGFycmF5WzFdO1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsID0gYXJyYXkuam9pbihcIi9hcGkvXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYXJyID0gdGhpcy5yZXNvdXJjZVVSTC5zcGxpdChcIi9cIik7XHJcbiAgICAgIGFyclthcnIubGVuZ3RoIC0gMl0gPSBcIlBhZ2VcIiArIGFyclthcnIubGVuZ3RoIC0gMl07XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwgPSBhcnIuam9pbihcIi9cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZpbHRlclBhcmFtc0J5UGFyZW50UmVmSWQoKSB7XHJcbiAgICAvLyBVc2UgZmllbGQgb3duIHJlZmVyZW5jZUlkIGlmIGF2YWlsYWJsZVxyXG4gICAgY29uc3QgcmVmSWQgPSB0aGlzLmdldEZpZWxkUmVmZXJlbmNlSWQoKSB8fCB0aGlzLmdycC5yZWZlcmVuY2VJZDtcclxuICAgIGNvbnN0IHJlZkZpZWxkID0gdGhpcy5maWVsZC5SZWZlcmVuY2VGaWVsZCB8fCB0aGlzLmdycC5wYXJlbnRSZWZlcmVuY2VGaWVsZDtcclxuICAgIGlmIChyZWZJZCAmJiByZWZGaWVsZCkge1xyXG4gICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHtcclxuICAgICAgICBrZXk6IHJlZkZpZWxkLFxyXG4gICAgICAgIG9wczogXCI9XCIsXHJcbiAgICAgICAgdmFsdWU6IHJlZklkLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLnB1c2goZmlsdGVyVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWVsZFJlZmVyZW5jZUlkKCkge1xyXG4gICAgbGV0IGZpZWxkUmVmZXJlbmNlSWQgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuUmVmZXJlbmNlSWQpIHtcclxuICAgICAgZmllbGRSZWZlcmVuY2VJZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgICB0aGlzLmZpZWxkLlJlZmVyZW5jZUlkLFxyXG4gICAgICAgIHRoaXMuZ3JwXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmllbGRSZWZlcmVuY2VJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZW5lcmF0ZUdyaWRDb2x1bW5zKCkge1xyXG4gICAgY29uc3QgY29sdW1uRmllbGRzJDogT2JzZXJ2YWJsZTxhbnk+ID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICB0aGlzLmZpZWxkLkNvbHVtbkZpZWxkcyxcclxuICAgICAgdGhpcy5ncnBcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGNvbHVtbkZpZWxkcyQpIHtcclxuICAgICAgY29sdW1uRmllbGRzJC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZ3JpZFN0YXRlTG9naWMgPSB0aGlzLmdyaWRTZXJ2aWNlLmdldEdyaWRTdGF0ZUxvZ2ljKHRoaXMuZmllbGQpO1xyXG5cclxuICAgICAgICAgIGlmIChncmlkU3RhdGVMb2dpYyAmJiBncmlkU3RhdGVMb2dpYyAhPT0gU3RhdGVUeXBlLmNhY2hlZERhdGFTZXR0aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJldHJpZXZlR3JpZFN0YXRlQ2FjaGUoU3RhdGVUeXBlLnNhdmVkU2V0dGluZywgdGhpcy5maWVsZCkucGlwZShcclxuICAgICAgICAgICAgICBtYXAoKHN0YXRlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBvZihkYXRhKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKGRhdGEpID0+IHtcclxuICAgICAgICAgIHRoaXMuZ3JpZFNldHRpbmcgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZ3JpZFNldHRpbmcsIC8vIFByZXNlcnZlIGV4aXN0aW5nIHByb3BlcnRpZXNcclxuICAgICAgICAgICAgY29sdW1uRmllbGQ6IGRhdGEsXHJcbiAgICAgICAgICAgIGdyb3VwOiB0aGlzLnpncmlkYmluZGluZy5ncm91cFxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIFpDb21wb25lbnRIZWxwZXIuZ2V0R3JpZENvbHVtbnModGhpcy5ncmlkU2V0dGluZyk7XHJcbiAgICAgICAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmRlYnVnTG9nKCdnZW5lcmF0ZWQgZ3JpZCBjb2x1bW5zJywgdGhpcy5ncmlkU2V0dGluZyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5nZXRGaWx0ZXJQYXJhbXNDb2x1bW5zKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEZpbHRlcigpO1xyXG4gICAgICAgICAgdGhpcy5nZXRGaWx0ZXJQYXJhbXMoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0U29ydGluZygpO1xyXG4gICAgICAgICAgdGhpcy5nZXRHcmFudFR5cGUoKTtcclxuICAgICAgICAgIHRoaXMuc2V0SGlkZGVuQ29sdW1uKHRoaXMuZ3JpZFNldHRpbmcuY29sdW1uQ29uZmlndXJhdGlvbnMpO1xyXG5cclxuICAgICAgICAgIHRoaXMucGFyYW1zLnJlZmVySWQgPSB0aGlzLmdldEZpZWxkUmVmZXJlbmNlSWQoKSB8fCB0aGlzLmdycC5yZWZlcmVuY2VJZCB8fCBudWxsO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5maWVsZFsnU2tpcExvYWRSZXNvdXJjZVVSTERhdGEnXSkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZ3JpZFN1YmplY3QubmV4dCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWwgdG8gZ2VuZXJhdGUgZ3JpZCBjb2x1bW4gZmllbGRzLicpO1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmZpZWxkLkNvbHVtbkZpZWxkcyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuZ3JwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTa2lwTG9hZFJlc291cmNlVVJMRGF0YShzZXR0aW5nVmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmllbGRbJ1NraXBMb2FkUmVzb3VyY2VVUkxEYXRhJ10gPSAhc2V0dGluZ1ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSB0aXRsZSBvZiBhIGNvbHVtbiBpbiB0aGUgZ3JpZCBzZXR0aW5nIGJhc2VkIG9uIGl0cyB2YWx1ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sTmFtZSAtIFRoZSBuZXcgdGl0bGUgZm9yIHRoZSBjb2x1bW4uXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNldENvbHVtbk5hbWUoY29sVmFsdWU6IHN0cmluZywgY29sTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBGaW5kIHRoZSBjb2x1bW4gd2l0aCB0aGUgbWF0Y2hpbmcgY29sVmFsdWUuXHJcbiAgICBjb25zdCBjb2x1bW5Ub1VwZGF0ZSA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGZpZWxkID0+IGZpZWxkLlZhbHVlID09PSBjb2xWYWx1ZSk7XHJcblxyXG4gICAgLy8gSWYgdGhlIGNvbHVtbiBpcyBmb3VuZCwgdXBkYXRlIGl0cyB0aXRsZSBwcm9wZXJ0eSB3aXRoIGNvbE5hbWUuXHJcbiAgICBpZiAoY29sdW1uVG9VcGRhdGUpIHtcclxuICAgICAgY29sdW1uVG9VcGRhdGUudGl0bGUgPSBjb2xOYW1lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSB2aXNpYmlsaXR5IG9mIGEgY29sdW1uIGluIHRoZSBncmlkIGJhc2VkIG9uIGl0cyB2YWx1ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uIHRvIHNldCB2aXNpYmlsaXR5IGZvci5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzVmlzaWJsZSAtIFdoZXRoZXIgdGhlIGNvbHVtbiBzaG91bGQgYmUgdmlzaWJsZSAodHJ1ZSkgb3IgaGlkZGVuIChmYWxzZSkuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNldENvbHVtblZpc2libGUoY29sVmFsdWU6IHN0cmluZywgaXNWaXNpYmxlOiBib29sZWFuKSB7XHJcbiAgICAvLyBGaW5kIHRoZSBjb2x1bW4gd2l0aCB0aGUgbWF0Y2hpbmcgY29sVmFsdWUuXHJcbiAgICBjb25zdCBjb2x1bW5Ub1VwZGF0ZSA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGZpZWxkID0+IGZpZWxkLlZhbHVlID09PSBjb2xWYWx1ZSk7XHJcblxyXG4gICAgLy8gSWYgdGhlIGNvbHVtbiBpcyBmb3VuZCwgdXBkYXRlIGl0cyAnaGlkZGVuJyBwcm9wZXJ0eSBiYXNlZCBvbiAnaXNWaXNpYmxlJy5cclxuICAgIGlmIChjb2x1bW5Ub1VwZGF0ZSkge1xyXG4gICAgICBjb2x1bW5Ub1VwZGF0ZS5oaWRkZW4gPSAhaXNWaXNpYmxlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgZmlsdGVyIHBhcmFtZXRlcnMgZm9yIGNvbHVtbnMgYW5kIHNldCB0aGVtIGluIHRoZSAncGFyYW1zJyBvYmplY3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbHRlclBhcmFtc0NvbHVtbnMoKSB7XHJcbiAgICAvLyBDcmVhdGUgYW4gYXJyYXkgdG8gc3RvcmUgY29sdW1uIGZpZWxkcy5cclxuICAgIGNvbnN0IGNvbEZpZWxkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG5cclxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZ3JpZCBjb2x1bW5zIHRvIGJ1aWxkIGNvbHVtbiBmaWVsZCBzdHJpbmdzLlxyXG4gICAgdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnZhbHVlRXhwcikge1xyXG4gICAgICAgIC8vIElmICd2YWx1ZUV4cHInIGV4aXN0cywgdXNlIGl0IGFzIGFuIGFsaWFzIGZvciB0aGUgZmllbGQuXHJcbiAgICAgICAgY29sRmllbGRzLnB1c2goY29sdW1uLnZhbHVlRXhwciArIFwiIGFzIFwiICsgY29sdW1uLmZpZWxkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb2xGaWVsZHMucHVzaChjb2x1bW4uZmllbGQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiAnSWQnIGlzIGluIHRoZSBjb2x1bW4gZmllbGRzOyBpZiBub3QsIGFkZCBpdC5cclxuICAgIGlmIChjb2xGaWVsZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAoY29sRmllbGRzLmluZGV4T2YoXCJJZFwiKSA9PT0gLTEpIHtcclxuICAgICAgICBjb2xGaWVsZHMucHVzaChcIklkXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuIGFycmF5IHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSBnZW5lcmF0ZWQgY29sdW1uIGZpZWxkcy5cclxuICAgIGNvbnN0IHRtcEdyaWRDb2x1bW46IGFueVtdID0gW107XHJcbiAgICB0bXBHcmlkQ29sdW1uLnB1c2goY29sRmllbGRzLmpvaW4oXCIsXCIpKTtcclxuXHJcbiAgICAvLyBJZiB0aGVyZSBhcmUgZ2VuZXJhdGVIaWRkZW5Db2x1bW5zIGluIHRoZSBzZXR0aW5nLCBhZGQgdGhlbSB0byB0aGUgYXJyYXkuXHJcbiAgICBpZiAodGhpcy5ncmlkU2V0dGluZy5nZW5lcmF0ZUhpZGRlbkNvbHVtbnM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdG1wR3JpZENvbHVtbi5wdXNoKHRoaXMuZ3JpZFNldHRpbmcuZ2VuZXJhdGVIaWRkZW5Db2x1bW5zLmpvaW4oXCIsXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXQgdGhlICdwYXJhbXMuY29sdW1ucycgcHJvcGVydHkgd2l0aCB0aGUgY29uY2F0ZW5hdGVkIGNvbHVtbiBmaWVsZHMuXHJcbiAgICB0aGlzLnBhcmFtcy5jb2x1bW5zID0gdG1wR3JpZENvbHVtbi5qb2luKFwiLFwiKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgJ3BhcmFtcy5maWx0ZXJzJyBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgJ2ZpZWxkLkZpbHRlcnMnIHByb3BlcnR5LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXIoKSB7XHJcbiAgICBpZiAodGhpcy5wYXJhbXMuZmlsdGVycyAmJiB0aGlzLmZpZWxkLkZpbHRlcnMpIHtcclxuICAgICAgLy8gQ29tYmluZSAncGFyYW1zLmZpbHRlcnMnIGFuZCAnZmllbGQuRmlsdGVycycgdXNpbmcgJyYmJyBpZiBib3RoIGV4aXN0LlxyXG4gICAgICB0aGlzLnBhcmFtcy5maWx0ZXJzID0gYCR7dGhpcy5wYXJhbXMuZmlsdGVyc30gJiYgJHt0aGlzLmZpZWxkLkZpbHRlcnN9YDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCF0aGlzLnBhcmFtcy5maWx0ZXJzICYmIHRoaXMuZmllbGQuRmlsdGVycykge1xyXG4gICAgICAvLyBVc2UgJ2ZpZWxkLkZpbHRlcnMnIGRpcmVjdGx5IGlmICdwYXJhbXMuZmlsdGVycycgZG9lc24ndCBleGlzdC5cclxuICAgICAgdGhpcy5wYXJhbXMuZmlsdGVycyA9IHRoaXMuZmllbGQuRmlsdGVycztcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiAnZmllbGQuRmlsdGVycycgY29udGFpbnMgcmVmZXJlbmNlcyB0byAnZ3JvdXAuJyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggYWN0dWFsIHZhbHVlcy5cclxuICAgIGlmICh0aGlzLmZpZWxkLkZpbHRlcnMgJiYgdGhpcy5maWVsZC5GaWx0ZXJzLnNwbGl0KFwiIFwiKS5zb21lKChlbGVtZW50KSA9PiBlbGVtZW50LnRyaW0oKS5zdGFydHNXaXRoKFwiZ3JvdXAuXCIpKSkge1xyXG4gICAgICBjb25zdCBmaWx0ZXJLZXlWYWxQYWlycyA9IHRoaXMuZmllbGQuRmlsdGVycy5zcGxpdChcIiBcIik7XHJcbiAgICAgIGNvbnN0IGdycFZhbHVlcyA9IGZpbHRlcktleVZhbFBhaXJzLmZpbHRlcigoZWxlbWVudCkgPT4gZWxlbWVudC50cmltKCkuc3RhcnRzV2l0aChcImdyb3VwLlwiKSk7XHJcblxyXG4gICAgICBncnBWYWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsVmFsID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHZhbCwgdGhpcy5ncnApO1xyXG4gICAgICAgIHRoaXMucGFyYW1zLmZpbHRlcnMgPSB0aGlzLnBhcmFtcy5maWx0ZXJzLnJlcGxhY2UodmFsLCBhY3R1YWxWYWwpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZmlsdGVyIHBhcmFtZXRlcnMgaW4gdGhlICdwYXJhbXMuZmlsdGVyUGFyYW1zJyBwcm9wZXJ0eSBiYXNlZCBvbiAnZmllbGRbJ0ZpbHRlclBhcmFtcyddJy4gZmlsdGVyUGFyYW1zID09PSB1c2VkIGZvciB0aGUgaW5wdXQgaW4gdGhlIGNvbHVtbiBmaWx0ZXIgYXQgdGhlIFVJLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJQYXJhbXMoKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJQYXJhbXMgPSB0aGlzLmZpZWxkWydGaWx0ZXJQYXJhbXMnXTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIGZpbHRlciBwYXJhbWV0ZXJzIGlmIHVuZGVmaW5lZC5cclxuICAgIGlmICghdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWx0ZXJQYXJhbXMpIHtcclxuICAgICAgaWYgKGZpbHRlclBhcmFtcy5zdGFydHNXaXRoKFwiZ3JvdXAuXCIpKSB7XHJcbiAgICAgICAgLy8gSWYgJ2ZpbHRlclBhcmFtcycgc3RhcnRzIHdpdGggXCJncm91cC5cIiwgZXh0ZW5kIHRoZSBleGlzdGluZyBhcnJheS5cclxuICAgICAgICB0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMgPSBbXHJcbiAgICAgICAgICAuLi50aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMsXHJcbiAgICAgICAgICAuLi5aQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoZmlsdGVyUGFyYW1zLCB0aGlzLmdycClcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIElmICdmaWx0ZXJQYXJhbXMnIGRvZXMgbm90IHN0YXJ0IHdpdGggXCJncm91cC5cIiwgdXNlIGl0IGRpcmVjdGx5LlxyXG4gICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtcclxuICAgICAgICAgIC4uLnRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyxcclxuICAgICAgICAgIGZpbHRlclBhcmFtc1xyXG4gICAgICAgIF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgY29sdW1uIGZpbHRlcnMgaW4gdGhlIGdyaWQgc3RhdGUgYW5kIGFwcGVuZCB0byBmaWx0ZXJwYXJhbVxyXG4gICAgaWYgKHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlPy5maWx0ZXI/LmZpbHRlcnMpIHtcclxuICAgICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUuZmlsdGVyPy5maWx0ZXJzPy5mb3JFYWNoKChmaWx0ZXI6IEZpbHRlckRlc2NyaXB0b3IpID0+IHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJQYXJhbSA9IHtcclxuICAgICAgICAgIGtleTogZmlsdGVyLmZpZWxkIGFzIHN0cmluZyxcclxuICAgICAgICAgIG9wczogdGhpcy5tYXBGaWx0ZXJPcGVyYXRvcihmaWx0ZXIub3BlcmF0b3IpLFxyXG4gICAgICAgICAgdmFsdWU6IGZpbHRlci52YWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBmaWx0ZXIudmFsdWUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBDaGVjayBpZiBhIGZpbHRlciBwYXJhbWV0ZXIgd2l0aCB0aGUgc2FtZSBrZXkgYWxyZWFkeSBleGlzdHMuXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdQYXJhbSA9IHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5maW5kKChwYXJhbSkgPT4gcGFyYW0ua2V5ID09PSBmaWx0ZXJQYXJhbS5rZXkpO1xyXG4gICAgICAgIGlmIChleGlzdGluZ1BhcmFtKSB7XHJcbiAgICAgICAgICAvLyBJZiBhIGZpbHRlciBwYXJhbWV0ZXIgd2l0aCB0aGUgc2FtZSBrZXkgZXhpc3RzLCB1cGRhdGUgaXRzIHZhbHVlLlxyXG4gICAgICAgICAgZXhpc3RpbmdQYXJhbS52YWx1ZSA9IGZpbHRlclBhcmFtLnZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBJZiBubyBmaWx0ZXIgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUga2V5LCBhZGQgaXQgdG8gdGhlIGZpbHRlciBwYXJhbWV0ZXJzLlxyXG4gICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLnB1c2goZmlsdGVyUGFyYW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHNvcnRpbmcgb3JkZXIgaW4gdGhlICdwYXJhbXMuc29ydE9yZGVyJyBwcm9wZXJ0eSBiYXNlZCBvbiAnZmllbGQuU29ydE9yZGVyJy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0U29ydGluZygpIHtcclxuICAgIGNvbnN0IHNvcnRPcmRlciA9IHRoaXMuZmllbGQuU29ydE9yZGVyO1xyXG5cclxuICAgIC8vIENoZWNrIGlmICdzb3J0T3JkZXInIGlzIGRlZmluZWQgYW5kIHN0YXJ0cyB3aXRoIFwiZ3JvdXAuXCIuXHJcbiAgICBpZiAoc29ydE9yZGVyICYmIHNvcnRPcmRlci5zdGFydHNXaXRoKFwiZ3JvdXAuXCIpKSB7XHJcbiAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlciA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShzb3J0T3JkZXIsIHRoaXMuZ3JwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBJZiAnc29ydE9yZGVyJyBpcyBub3QgZGVmaW5lZCBvciBkb2Vzbid0IHN0YXJ0IHdpdGggXCJncm91cC5cIiwgdXNlIGl0IGRpcmVjdGx5LlxyXG4gICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXIgPSBzb3J0T3JkZXI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIEluaXRpYWxpemUgc29ydCBwYXJhbWV0ZXJzIGlmIHVuZGVmaW5lZC5cclxuICAgIGlmICghdGhpcy5wYXJhbXMuc29ydE9yZGVycykge1xyXG4gICAgICB0aGlzLnBhcmFtcy5zb3J0T3JkZXJzID0gW107XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcykge1xyXG4gICAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUuc29ydCkge1xyXG4gICAgICB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS5zb3J0LmZvckVhY2goKGRlc2NyaXB0b3IpID0+IHtcclxuICAgICAgICBpZiAoZGVzY3JpcHRvci5kaXIpIHtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5ncmlkU2V0dGluZy5jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBkZXNjcmlwdG9yLmZpZWxkKTtcclxuICAgICAgICAgIGNvbnN0IHNvcnRDb2x1bW5OYW1lID0gZmllbGQudmFsdWVFeHByICE9PSB1bmRlZmluZWQgPyBmaWVsZC52YWx1ZUV4cHIgOiBkZXNjcmlwdG9yLmZpZWxkO1xyXG5cclxuICAgICAgICAgIC8vIENoZWNrIGlmIGEgc29ydCBjb2x1bW4gd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdTb3J0Q29sdW1uSW5kZXggPSB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMuZmluZEluZGV4KChuYW1lKSA9PiBuYW1lID09PSBzb3J0Q29sdW1uTmFtZSk7XHJcblxyXG4gICAgICAgICAgaWYgKGV4aXN0aW5nU29ydENvbHVtbkluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAvLyBJZiBhIHNvcnQgY29sdW1uIHdpdGggdGhlIHNhbWUgbmFtZSBleGlzdHMsIHVwZGF0ZSBpdHMgc29ydCBvcmRlci5cclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVyc1tleGlzdGluZ1NvcnRDb2x1bW5JbmRleF0gPSBkZXNjcmlwdG9yLmRpcjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIElmIG5vIHNvcnQgY29sdW1uIHdpdGggdGhlIHNhbWUgbmFtZSwgYWRkIGl0IHRvIHRoZSBzb3J0IGNvbHVtbnMgYW5kIHNvcnQgb3JkZXJzLlxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMucHVzaChzb3J0Q29sdW1uTmFtZSk7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLnNvcnRPcmRlcnMucHVzaChkZXNjcmlwdG9yLmRpcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZ3JhbnQgdHlwZSBpbiB0aGUgJ3BhcmFtcy5ncmFudFR5cGUnIHByb3BlcnR5IGJhc2VkIG9uICdmaWVsZC5HcmFudFR5cGUnLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRHcmFudFR5cGUoKSB7XHJcbiAgICBjb25zdCBncmFudFR5cGUgPSB0aGlzLmZpZWxkLkdyYW50VHlwZTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiAnZ3JhbnRUeXBlJyBpcyBkZWZpbmVkLlxyXG4gICAgaWYgKGdyYW50VHlwZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5wYXJhbXMuZ3JhbnRUeXBlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGdyYW50VHlwZS50b1N0cmluZygpLCB0aGlzLmdycCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlICdoaWRkZW4nIHByb3BlcnR5IGZvciBjb2x1bW5zIGluICdncmlkU2V0dGluZycgYmFzZWQgb24gJ2NvbHVtbkNvbmZpZ3MnLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtaR3JpZENvbHVtbkNvbmZpZ3NbXX0gY29sdW1uQ29uZmlncyAtIFRoZSBjb2x1bW4gY29uZmlndXJhdGlvbiBzZXR0aW5ncy5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIHNldEhpZGRlbkNvbHVtbihjb2x1bW5Db25maWdzPzogWkdyaWRDb2x1bW5Db25maWdzW10pIHtcclxuICAgIGlmICghdGhpcy5ncmlkU2V0dGluZz8uY29sdW1ucykgcmV0dXJuO1xyXG5cclxuICAgIC8vIFN0b3JlIHJlZmVyZW5jZSB0byBjb2x1bW5zIHRoYXQgY2FuIGJlIGhpZGRlblxyXG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi5lbmFibGVIaWRpbmcpO1xyXG5cclxuICAgIC8vIFByZXNlcnZlIG9yaWdpbmFsIHZpc2liaWxpdHkgc3RhdGVcclxuICAgIGNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4gY29sdW1uLm9yaWdpbmFsSGlkZGVuVmFsdWUgPSAhY29sdW1uLmdyaWRDb2xWaXNpYmxlKTtcclxuXHJcbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgaGlkZGVuXHJcbiAgICBjb25zdCBoaWRkZW5Db2x1bW5zID0gY29sdW1uQ29uZmlnc1xyXG4gICAgICA/IGNvbHVtbkNvbmZpZ3MuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uaGlkZGVuID09PSB0cnVlKVxyXG4gICAgICA6IGNvbHVtbnMuZmlsdGVyKGNvbCA9PiAhY29sLmdyaWRDb2xWaXNpYmxlKTtcclxuXHJcbiAgICAvLyBIaWRlIGNvbHVtbnMgYmFzZWQgb24gZmllbGQgbWF0Y2hpbmdcclxuICAgIGhpZGRlbkNvbHVtbnMuZm9yRWFjaChoaWRkZW5Db2x1bW4gPT4ge1xyXG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZChjID0+IGMuZmllbGQgPT09IGhpZGRlbkNvbHVtbi5maWVsZCk7XHJcbiAgICAgIGlmIChjb2x1bW4pIHtcclxuICAgICAgICBjb2x1bW4uaGlkZGVuID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBkYXRhIGZvciBkYXRhIGJpbmRpbmcuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNraXBVc2VDYWNoZSAtIFdoZXRoZXIgdG8gc2tpcCB1c2luZyBjYWNoZSBmb3IgZGF0YSByZXRyaWV2YWwuXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XHJcbiAgICovXHJcbiAgcHVibGljIGdldERhdGFCaW5kaW5nKHNraXBVc2VDYWNoZT86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuXHJcbiAgICAvLyBjb25zdCBjYWNoZUluZm8gPSB0aGlzLnpncmlkYmluZGluZy5kYXRhLkNhY2hlSW5mbztcclxuXHJcbiAgICAvLyBpZiAoIWNhY2hlSW5mbyB8fCBza2lwVXNlQ2FjaGUpIHtcclxuICAgIC8vICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgLy8gICByZXR1cm47XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gaWYgKGNhY2hlSW5mbykge1xyXG4gICAgLy8gICBjb25zdCBncmlkU3RhdGVMb2dpYyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0R3JpZFN0YXRlTG9naWModGhpcy5maWVsZCk7XHJcbiAgICAvLyAgIGlmIChncmlkU3RhdGVMb2dpYyA9PT0gR3JpZFN0YXRlTG9naWNUeXBlLlNldHRpbmdPbmx5KSB7XHJcbiAgICAvLyAgICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgLy8gICAgIHJldHVybjtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIGNvbW1lbnQgb3V0IG9uIDIwMjQxMDAxLiBkZWZhdWx0IHRvIGZldGNoIHRoZSBkYXRhIGZyb20gYXBpIGluc3RlYWQgb2YgbG9hZGluZyBmcm9tdCBoZSBjYWNoZS5cclxuICAgIC8vIGlmICghdGhpcy5jaGFuZ2VFdmVudC5wYWdlQ2hhbmdlZCAmJiAhdGhpcy5jaGFuZ2VFdmVudC5zb3J0Q2hhbmdlZCAmJiAhdGhpcy5jaGFuZ2VFdmVudC5maWx0ZXJDaGFuZ2VkKSB7XHJcbiAgICAvLyAgIGNvbnN0IGN1cnJlbnREYXRhQ2FjaGVJbmZvID0gdGhpcy5ncmlkU2VydmljZS5nZW5lcmF0ZUNhY2hlSW5mbyh0aGlzLnpncmlkYmluZGluZy5kYXRhKTtcclxuICAgIC8vICAgY29uc3QgcmVzdWx0ID0gdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLmdldEl0ZW1CeUtleShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGFDYWNoZUluZm8ub2ZmbGluZURhdGFiYXNlS2V5KTtcclxuICAgIC8vICAgaWYgKHJlc3VsdCkge1xyXG4gICAgLy8gICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShyZXN1bHQuZGF0YSwgdHJ1ZSk7XHJcbiAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgdGhpcy5nZXRHcmlkRGF0YSgpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgICAvLyBlbHNlIHtcclxuICAgIC8vIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlIGdyaWQgZGF0YS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0R3JpZERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xyXG4gICAgICBpZiAoIXRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ0dyaWQgcGFnaW5hdGlvbiBBUEkgVVJMIGlzIHVuZGVmaW5lZC4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHN0YXRlU2tpcCA9IHRoaXMuZ3JpZFNldHRpbmcuZ3JpZFN0YXRlID8gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUuc2tpcCA6IHRoaXMuc3RhdGUuc2tpcDtcclxuICAgICAgY29uc3Qgc3RhdGVUYWtlID0gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPyB0aGlzLmdyaWRTZXR0aW5nLmdyaWRTdGF0ZS50YWtlIDogdGhpcy5zdGF0ZS50YWtlO1xyXG5cclxuICAgICAgdGhpcy5wYXJhbXMucGFnZU5vID0gdGhpcy5nZXRQYWdlTm8oc3RhdGVTa2lwLCBzdGF0ZVRha2UpO1xyXG4gICAgICB0aGlzLnBhcmFtcy5wYWdlU2l6ZSA9IHN0YXRlVGFrZTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmZpZWxkLkV4dGVybmFsUGFnaW5hdGlvbikge1xyXG4gICAgICAgIGNvbnN0IHNlc3Npb25EYXRhID0gdGhpcy50cnlHZXREYXRhRnJvbVNlc3Npb24oKTtcclxuICAgICAgICBpZiAoc2Vzc2lvbkRhdGEpIHtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShzZXNzaW9uRGF0YSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBGb3IgUE9TVCBtZXRob2QgUGFnZSBXZWJBUElcclxuICAgICAgICBjb25zdCBkZXRhaWxHcmlkU2Vzc2lvbktleSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2RldGFpbEdyaWRTZXNzaW9uS2V5Jyk7XHJcbiAgICAgICAgdGhpcy53ZWJhcGlTZXJ2aWNlXHJcbiAgICAgICAgICAucG9zdEFwaSh0aGlzLnBhZ2luYXRpb25BcGlQb3N0VXJsLCB0aGlzLnBhcmFtcywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgIG5leHQ6IChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXREZXRhaWxEYXRhSW50b1Nlc3Npb24oZGV0YWlsR3JpZFNlc3Npb25LZXksIHJlc3ApO1xyXG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShyZXNwKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KFwiRXJyb3Igb2NjdXIgaW4gbG9hZGluZyB0aGUgZGF0YVwiLCBcIm1pZGRsZVwiLCBmYWxzZSwgMTUwMCwgXCJkYW5nZXJcIik7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gRm9yIEdFVCBtZXRob2RcclxuICAgICAgICB0aGlzLndlYmFwaVNlcnZpY2VcclxuICAgICAgICAgIC5nZXRBcGkodGhpcy5yZXNvdXJjZVVSTCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgdG90YWxDb3VudCA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzcC5kYXRhU2V0KSB7XHJcbiAgICAgICAgICAgICAgZGF0YSA9IHJlc3AuZGF0YVNldDtcclxuICAgICAgICAgICAgICB0b3RhbENvdW50ID0gcmVzcC50b3RhbENvdW50O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRhdGEgPSByZXNwO1xyXG4gICAgICAgICAgICAgIHRvdGFsQ291bnQgPSByZXNwLmxlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKHsgZGF0YVNldDogZGF0YSwgdG90YWxDb3VudDogdG90YWxDb3VudCB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc3QgZGF0YVNldCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShcclxuICAgICAgICB0aGlzLmZpZWxkLkRhdGFTb3VyY2UsXHJcbiAgICAgICAgdGhpcy5ncnBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGFTZXQ7XHJcbiAgICAgIHRoaXMuZ3JpZC5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZ3JpZFN1YmplY3QubmV4dCh0aGlzKTtcclxuICAgICAgdGhpcy5ub3RpZnlEYXRhQ2hhbmdlKCk7XHJcbiAgICAgIHRoaXMuY29sbGFwc2VBbGxEZXRhaWxHcmlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoZGF0YTogYW55LCBza2lwQ2FjaGVEYXRhPzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5hZ2dyZWdhdGVIYW5kbGluZyhkYXRhLmRhdGFTZXQpO1xyXG4gICAgdGhpcy5oYW5kbGVEYXRlVGltZUlnbm9yaW5nVGltZVpvbmUoZGF0YS5kYXRhU2V0KTtcclxuICAgIHRoaXMuZ3JpZC5kYXRhID0geyBkYXRhOiBkYXRhLmRhdGFTZXQsIHRvdGFsOiBkYXRhLnRvdGFsQ291bnQgfTtcclxuICAgIHRoaXMuY29sbGFwc2VBbGxEZXRhaWxHcmlkKCk7XHJcbiAgICBpZiAoIXNraXBDYWNoZURhdGEpIHtcclxuICAgICAgY29uc3Qgc3RhdGVMb2dpYyA9IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0R3JpZFN0YXRlTG9naWModGhpcy5maWVsZCk7XHJcbiAgICAgIGlmIChzdGF0ZUxvZ2ljID09PSBTdGF0ZVR5cGUuY2FjaGVkRGF0YVNldHRpbmcgfHwgc3RhdGVMb2dpYyA9PT0gU3RhdGVUeXBlLnNhdmVkQW5kQ2FjaGVkRGF0YVNldHRpbmcpIHtcclxuICAgICAgICB0aGlzLmNhY2hlR3JpZERhdGEoc3RhdGVMb2dpYyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7IGdyaWRTdGF0ZSB9ID0gdGhpcy56Z3JpZGJpbmRpbmcuZ3JpZFNldHRpbmc7XHJcbiAgICBjb25zdCBlbmFibGVHcm91cGluZyA9IHRoaXMuZmllbGQuR3JvdXBTZXR0aW5nPy5FbmFibGVHcm91cGluZztcclxuXHJcbiAgICBpZiAoZW5hYmxlR3JvdXBpbmcgJiYgZ3JpZFN0YXRlKSB7XHJcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gdGhpcy5ncmlkO1xyXG5cclxuICAgICAgaWYgKGRhdGE/LmRhdGEpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gQ2xvbmUgZ3JpZFN0YXRlIGFuZCBzZXQgc2tpcCB0byAwLCB0byBhdm9pZCBkaXJlY3QgbXV0YXRpb25cclxuICAgICAgICAgIGNvbnN0IG5ld0dyaWRTdGF0ZSA9IHsgLi4uZ3JpZFN0YXRlLCBza2lwOiAwIH07XHJcbiAgICAgICAgICBjb25zdCB7IGRhdGE6IGdyb3VwZWREYXRhIH0gPSBwcm9jZXNzKGRhdGEuZGF0YSwgbmV3R3JpZFN0YXRlKTtcclxuXHJcbiAgICAgICAgICBkYXRhLmRhdGEgPSBncm91cGVkRGF0YTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ3JvdXBpbmcgZGF0YTonLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuYWZ0ZXJEYXRhQmluZGVkKGRhdGEpO1xyXG4gICAgdGhpcy5ncmlkU3ViamVjdC5uZXh0KHRoaXMpO1xyXG4gICAgdGhpcy5ub3RpZnlEYXRhQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Q2hhbmdlRXZlbnRGbGFnKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudCA9IHtcclxuICAgICAgcGFnZUNoYW5nZWQ6IGZhbHNlLFxyXG4gICAgICBmaWx0ZXJDaGFuZ2VkOiBmYWxzZSxcclxuICAgICAgc29ydENoYW5nZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhY2hlR3JpZERhdGEoc3RhdGVMb2dpYzogU3RhdGVUeXBlKSB7XHJcbiAgICBjb25zdCBjYWNoZU5hbWUgPSB0aGlzLnN0YXRlU2V0dGluZ1NlcnZpY2UuZ2V0U3RvcmFnZUNhY2hlS2V5KHN0YXRlTG9naWMsIHRoaXMuZmllbGQpO1xyXG4gICAgY29uc3QgZ3JpZFN0YXRlID0gdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGU7XHJcbiAgICBjb25zdCBncmlkRGF0YSA9IHRoaXMuZ3JpZD8uZGF0YSB8fCBudWxsO1xyXG5cclxuICAgIGlmICghZ3JpZERhdGFbJ2RhdGEnXSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2FjaGVJbmZvID0gdGhpcy56Z3JpZGJpbmRpbmcuZGF0YS5DYWNoZUluZm87XHJcblxyXG4gICAgaWYgKGNhY2hlSW5mbyAmJiAhY2FjaGVJbmZvLkRpc2FibGVDYWNoZURhdGEpIHtcclxuICAgICAgY29uc3QgY29sdW1uQ29uZmlndXJhdGlvbnMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyaWRDb2x1bW5zQ29uZmlnKHRoaXMuemdyaWRiaW5kaW5nLmdyaWRTZXR0aW5nLmNvbHVtbnMpO1xyXG4gICAgICBsZXQgdXBkYXRlZERhdGEgPSBbLi4uZ3JpZERhdGFbJ2RhdGEnXV07XHJcbiAgICAgIGxldCBza2lwTGlzdCA9IFtncmlkU3RhdGUuc2tpcF07XHJcbiAgICAgIGxldCBjdXJyZW50R3JpZFNraXAgPSBncmlkU3RhdGUuc2tpcDtcclxuXHJcbiAgICAgIGNvbnN0IGNhY2hlR3JpZERhdGEgPSB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgZGF0YVNldDogdXBkYXRlZERhdGEsXHJcbiAgICAgICAgICB0b3RhbENvdW50OiBncmlkRGF0YVsndG90YWwnXVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ3JpZFN0YXRlOiBncmlkU3RhdGUsXHJcbiAgICAgICAgc2tpcExpc3Q6IHNraXBMaXN0LFxyXG4gICAgICAgIGNhY2hlRHVyYXRpb246IGNhY2hlSW5mby5DYWNoZUR1cmF0aW9uLFxyXG4gICAgICAgIGNvbHVtbkNvbmZpZ3VyYXRpb25zOiBjb2x1bW5Db25maWd1cmF0aW9uc1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGNhY2hlTmFtZSwgSlNPTi5zdHJpbmdpZnkoY2FjaGVHcmlkRGF0YSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9cIkZlYXR1cmVEZXZlbG9wbWVudHxDb21wZXRlbmN5XCJcclxuICAvLyBjb21tZW50ZWQgb3V0IGZvciBmdXR1cmUgcmVmZXJlbmNlIGFuZCByZS1kZXZlbG9wLlxyXG4gIC8vIHByaXZhdGUgYXN5bmMgc3Vic2NyaWJlQ2FjaGVEYXRhQ2hhbmdlcygpIHtcclxuICAvLyAgIGNvbnN0IGNhY2hlSW5mbyA9IHRoaXMuemdyaWRiaW5kaW5nLmRhdGEuQ2FjaGVJbmZvO1xyXG5cclxuICAvLyAgIGlmIChjYWNoZUluZm8gJiYgIWNhY2hlSW5mby5EaXNhYmxlQ2FjaGVEYXRhKSB7XHJcbiAgLy8gICAgIC8vIGNhbm5vdCB1c2UgbWFpbiBzZXJ2aWNlIGhlcmUuIHdpbGwgZ2V0IGNpcmN1bGFyIGVycm9yIHdoZW4gYnVpbGQgbGliXHJcbiAgLy8gICAgIC8vdGhpcy5tYWluU2VydmljZS5qb2luUHJvamVjdFNpZ25hbFIoKTtcclxuXHJcbiAgLy8gICAgIGNvbnN0IGNhbGxCYWNrRnVuY3Rpb24gPSBgJHtjYWNoZUluZm8uTmFtZX1faGFuZGxlUmVjZWl2ZWRNZXNzYWdlYDtcclxuXHJcbiAgLy8gICAgIC8vIGNyZWF0ZSBhbmQgYmluZCBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiYWNrIGZvciB0aGUgZ3JpZCBpbiB0aGUgZ3JvdXAgdHJpZ2dlciBieSBzaWduYWxSLlxyXG4gIC8vICAgICBpZiAoIXRoaXMuZ3JwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIpIHtcclxuICAvLyAgICAgICB0aGlzLmdycC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyID0ge307XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgdGhpcy5ncnAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlcltjYWxsQmFja0Z1bmN0aW9uXSA9IHRoaXMuaGFuZGxlUmVjZWl2ZWRNZXNzYWdlLmJpbmQodGhpcyk7XHJcblxyXG4gIC8vICAgICBjb25zdCBnZW5lcmF0ZWRDYWNoZUluZm8gPSB0aGlzLmdyaWRTZXJ2aWNlLmdlbmVyYXRlQ2FjaGVJbmZvKHRoaXMuemdyaWRiaW5kaW5nLmRhdGEpO1xyXG4gIC8vICAgICBpZiAoZ2VuZXJhdGVkQ2FjaGVJbmZvLmRlZmluZWREYXRhYmFzZSAmJiBnZW5lcmF0ZWRDYWNoZUluZm8uZGVmaW5lZFRhYmxlKSB7XHJcbiAgLy8gICAgICAgZ2VuZXJhdGVkQ2FjaGVJbmZvLmRlZmluZWREYXRhYmFzZS5mb3JFYWNoKGRiID0+IHtcclxuICAvLyAgICAgICAgIGdlbmVyYXRlZENhY2hlSW5mby5kZWZpbmVkVGFibGUuZm9yRWFjaCh0YWJsZSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGAke2RifXwke3RhYmxlfWA7XHJcbiAgLy8gICAgICAgICAgIGNvbnNvbGUubG9nKGBMaXN0ZW5pbmcgdG8gZXZlbnQgbmFtZTogJHtldmVudE5hbWV9YCk7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuc2lnbmFsclNlcnZpY2Uuc3Vic2NyaWJlVG9FdmVudCh0aGlzLmdycCwgYCR7ZXZlbnROYW1lfWAsIGBncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyLiR7Y2FsbEJhY2tGdW5jdGlvbn1gKTtcclxuICAvLyAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBhc3luYyBoYW5kbGVSZWNlaXZlZE1lc3NhZ2UoZ3JvdXA6IFpHcm91cCwgcmVzdWx0OiBhbnksIGV2ZW50TmFtZTogc3RyaW5nKSB7XHJcbiAgLy8gICBjb25zb2xlLmxvZyhgVGhlIFNpZ25hbHIgdHJpZ2dlciBoYXMgYmVlbiBkZXRlY3RlZC4gTm93LCBwcm9jZWVkIHRvIHVwZGF0ZSB0aGUgY2FjaGUgYW5kIGdyaWQgZGF0YS5gKTtcclxuXHJcbiAgLy8gICBjb25zdCByZXNwb25zZWRSZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XHJcbiAgLy8gICBjb25zdCBhY3Rpb25UeXBlID0gcmVzcG9uc2VkUmVzdWx0LkFjdGlvbjtcclxuICAvLyAgIGNvbnN0IHJlc3BvbnNlZFJlc3VsdElkID0gcmVzcG9uc2VkUmVzdWx0WydJZCddO1xyXG4gIC8vICAgY29uc3QgdGVtcFBhcmFtcyA9IFpDb21wb25lbnRIZWxwZXIuZGVlcENsb25lKHRoaXMucGFyYW1zKTtcclxuICAvLyAgIGNvbnN0IGN1cnJlbnREYXRhQ2FjaGVJbmZvID0gdGhpcy5ncmlkU2VydmljZS5nZW5lcmF0ZUNhY2hlSW5mbyh0aGlzLnpncmlkYmluZGluZy5kYXRhKTtcclxuICAvLyAgIGNvbnN0IGN1cnJlbnREYXRhID0gYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLmdldEl0ZW1CeUtleShjdXJyZW50RGF0YUNhY2hlSW5mbywgY3VycmVudERhdGFDYWNoZUluZm8ub2ZmbGluZURhdGFiYXNlS2V5KTtcclxuXHJcbiAgLy8gICBpZiAoY3VycmVudERhdGEpIHtcclxuICAvLyAgICAgdGVtcFBhcmFtcy5maWx0ZXJzID0gYElkPSR7cmVzcG9uc2VkUmVzdWx0SWR9YDtcclxuXHJcbiAgLy8gICAgIGlmIChhY3Rpb25UeXBlID09PSBBY3Rpb25UeXBlLkRlbGV0ZSkge1xyXG4gIC8vICAgICAgIGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldCA9IGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldC5maWx0ZXIoaXRlbSA9PiBpdGVtLklkICE9PSBwYXJzZUludChyZXNwb25zZWRSZXN1bHRJZCkpO1xyXG5cclxuICAvLyAgICAgICB0aGlzLmhhbmRsZUdldERhdGFCaW5kaW5nQ29tcGxldGUoY3VycmVudERhdGEuZGF0YSwgdHJ1ZSk7XHJcbiAgLy8gICAgICAgYXdhaXQgdGhpcy5vZmZsaW5lRGF0YWJhc2VTZXJ2aWNlLnVwZGF0ZUl0ZW0oY3VycmVudERhdGFDYWNoZUluZm8sIGN1cnJlbnREYXRhKTtcclxuXHJcbiAgLy8gICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG5cclxuICAvLyAgICAgICBjb25zb2xlLmxvZyhgSXRlbSB1cGRhdGVkOiAke2N1cnJlbnREYXRhfWApO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGVsc2Uge1xyXG4gIC8vICAgICAgIHRoaXMud2ViYXBpU2VydmljZS5wb3N0QXBpKHRoaXMucGFnaW5hdGlvbkFwaVBvc3RVcmwsIHRlbXBQYXJhbXMsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHRydWUpLnN1YnNjcmliZShhc3luYyByZXNwID0+IHtcclxuXHJcbiAgLy8gICAgICAgICBjb25zdCBkYXRhYmFzZVJlY29yZCA9IHJlc3AuZGF0YVNldFswXTtcclxuXHJcbiAgLy8gICAgICAgICBpZiAoZGF0YWJhc2VSZWNvcmQpIHtcclxuICAvLyAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFjdGlvblR5cGUuVXBkYXRlKSB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgaW5kZXhUb1VwZGF0ZSA9IGN1cnJlbnREYXRhLmRhdGEuZGF0YVNldC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLklkID09PSBkYXRhYmFzZVJlY29yZC5JZCk7XHJcbiAgLy8gICAgICAgICAgICAgaWYgKGluZGV4VG9VcGRhdGUgIT09IC0xKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHVwZGF0ZWQgbmFtZVxyXG4gIC8vICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZEl0ZW0gPSB7IC4uLmN1cnJlbnREYXRhLmRhdGEuZGF0YVNldFtpbmRleFRvVXBkYXRlXSwgLi4uZGF0YWJhc2VSZWNvcmQgfTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBvbGQgaXRlbSB3aXRoIHRoZSB1cGRhdGVkIG9uZVxyXG4gIC8vICAgICAgICAgICAgICAgY3VycmVudERhdGEuZGF0YS5kYXRhU2V0W2luZGV4VG9VcGRhdGVdID0gdXBkYXRlZEl0ZW07XHJcblxyXG4gIC8vICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG5cclxuICAvLyAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS51cGRhdGVJdGVtKGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YSk7XHJcblxyXG4gIC8vICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEl0ZW0gdXBkYXRlZDogJHtjdXJyZW50RGF0YX1gKTtcclxuICAvLyAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJJdGVtIG5vdCBmb3VuZCB3aXRoIElEOlwiLCBkYXRhYmFzZVJlY29yZC5JZCk7XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIGVsc2UgaWYgKGFjdGlvblR5cGUgPT09IEFjdGlvblR5cGUuQWRkICYmIGN1cnJlbnREYXRhLmdyaWRTdGF0ZS5za2lwIDwgMjApIHtcclxuICAvLyAgICAgICAgICAgICBjdXJyZW50RGF0YS5kYXRhLmRhdGFTZXQudW5zaGlmdChkYXRhYmFzZVJlY29yZCk7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5oYW5kbGVHZXREYXRhQmluZGluZ0NvbXBsZXRlKGN1cnJlbnREYXRhLmRhdGEsIHRydWUpO1xyXG4gIC8vICAgICAgICAgICAgIGF3YWl0IHRoaXMub2ZmbGluZURhdGFiYXNlU2VydmljZS51cGRhdGVJdGVtKGN1cnJlbnREYXRhQ2FjaGVJbmZvLCBjdXJyZW50RGF0YSk7XHJcblxyXG4gIC8vICAgICAgICAgICAgIHRoaXMuaGFuZGxlR2V0RGF0YUJpbmRpbmdDb21wbGV0ZShjdXJyZW50RGF0YS5kYXRhLCB0cnVlKTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coYEl0ZW0gdXBkYXRlZDogJHtjdXJyZW50RGF0YX1gKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgZWxzZSB7XHJcbiAgLy8gICAgICAgICAgIC8vIFVuYWJsZSB0byBnZXQgZGF0YSwgcmVmcmVzaCB0aGUgd2hvbGUgZ3JpZCBkYXRhIGZyb20gQVBJXHJcbiAgLy8gICAgICAgICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgZWxzZSB7XHJcbiAgLy8gICAgIC8vIFVuYWJsZSB0byBnZXQgZnJvbSBpbmRleGVkREIgc3RyYWlnaHQgZ2V0IGZyb20gQVBJXHJcbiAgLy8gICAgIHRoaXMuZ2V0R3JpZERhdGEoKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJEYXRhQmluZGVkKGRhdGEpIHtcclxuICAgIC8vIGFsbG93IHRvIGNhbGwgYmFjayBwcm9qZWN0IHBhZ2UgYWZ0ZXIgZGF0YSBiaW5kZWQuXHJcbiAgICBsZXQgYmluZGVkVmFsdWUgPSB0aGlzLnpncmlkYmluZGluZy5kYXRhWydBZnRlckRhdGFCaW5kZWQnXTtcclxuICAgIGlmIChiaW5kZWRWYWx1ZSkge1xyXG4gICAgICBjb25zdCBtZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMpO1xyXG4gICAgICBsZXQgY2FsbEZ1bmM7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IGJpbmRlZFZhbHVlLm1hdGNoKC9cXGJcXCguKi9naSk7XHJcbiAgICAgICAgaWYgKHBhcmFtcykge1xyXG4gICAgICAgICAgYmluZGVkVmFsdWUgPSBiaW5kZWRWYWx1ZS5yZXBsYWNlKHBhcmFtc1swXSwgXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJpbmRlZFZhbHVlID0gYmluZGVkVmFsdWUucmVwbGFjZSgnbW9kYWxHcm91cC4nLCAnZ3JvdXAuJyk7XHJcbiAgICAgICAgY2FsbEZ1bmMgPSBldmFsKCdtZS56Z3JpZGJpbmRpbmcuJyArIGJpbmRlZFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICBcIkVycm9yIHdoZW4gZ2V0R3JvdXBWYWx1ZTogXCIsXHJcbiAgICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgICBcIiA+IEVycm9yOiBcIixcclxuICAgICAgICAgIGVycm9yXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgY29uc3QgbmV3RnVuYyA9IGNhbGxGdW5jLmJpbmQobWUpO1xyXG4gICAgICAgIG5ld0Z1bmMoZXZlbnQsIG1lLnpncmlkYmluZGluZy5kYXRhLCBkYXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyRGF0YSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZC5kYXRhID0geyBkYXRhOiBbXSwgdG90YWw6IDAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBjb2x1bW4gYWdncmVnYXRpb24gZm9yIHRoZSBnaXZlbiBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnlbXX0gZGF0YSAtIFRoZSBkYXRhIHRvIGFnZ3JlZ2F0ZS5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwcml2YXRlIGFnZ3JlZ2F0ZUhhbmRsaW5nKGRhdGE6IGFueSkge1xyXG4gICAgY29uc3QgYWdncmVnYXRlQ29sdW1ucyA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5hZ2dyZWdhdGVUeXBlKTtcclxuXHJcbiAgICBhZ2dyZWdhdGVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSBjb2wuZmllbGQ7XHJcbiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZVR5cGUgPSBjb2wuYWdncmVnYXRlVHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJzonLCAnJyk7XHJcblxyXG4gICAgICBsZXQgYWdncmVnYXRlVmFsdWUgPSBudWxsO1xyXG4gICAgICBzd2l0Y2ggKGFnZ3JlZ2F0ZVR5cGUpIHtcclxuICAgICAgICBjYXNlIFwidG90YWxcIjpcclxuICAgICAgICBjYXNlIFwic3VtXCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKCh0b3RhbCwgbmV4dCkgPT4gdG90YWwgKyBuZXh0W2ZpZWxkXSwgMCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiYXZlcmFnZVwiOlxyXG4gICAgICAgICAgYWdncmVnYXRlVmFsdWUgPSBkYXRhLnJlZHVjZSgodG90YWwsIG5leHQpID0+IHRvdGFsICsgbmV4dFtmaWVsZF0sIDApIC8gZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiY291bnRcIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwibWF4XCI6XHJcbiAgICAgICAgICBhZ2dyZWdhdGVWYWx1ZSA9IGRhdGEucmVkdWNlKChwLCBjKSA9PiBwW2ZpZWxkXSA+IGNbZmllbGRdID8gcCA6IGMpW2ZpZWxkXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaW5cIjpcclxuICAgICAgICAgIGFnZ3JlZ2F0ZVZhbHVlID0gZGF0YS5yZWR1Y2UoKHAsIGMpID0+IHBbZmllbGRdIDwgY1tmaWVsZF0gPyBwIDogYylbZmllbGRdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbC5hZ2dyZWdhdGVWYWx1ZSA9IGFnZ3JlZ2F0ZVZhbHVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZURhdGVUaW1lSWdub3JpbmdUaW1lWm9uZShkYXRhU2V0OiBhbnkpIHtcclxuICAgIC8vIENvbHVtbiB0eXBlcyByZWxhdGVkIHRvIGRhdGUgYW5kIHRpbWUgaGFuZGxpbmdcclxuICAgIGNvbnN0IGRhdGVDb2x1bW5UeXBlcyA9IFsnemRhdGUnLCAnenRpbWUnLCAnemRhdGV0aW1lJywgJ3pzaG9ydGRhdGUnLCAnenVpZGF0ZXRpbWUnLCAnenVpdGltZSddO1xyXG5cclxuICAgIC8vIEZpbHRlciBjb2x1bW5zIHRoYXQgaGF2ZSBkYXRlLXJlbGF0ZWQgdHlwZXNcclxuICAgIGNvbnN0IGRhdGVUaW1lQ29sdW1ucyA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maWx0ZXIoY29sID0+IGRhdGVDb2x1bW5UeXBlcy5pbmNsdWRlcyhjb2wuVHlwZSkpO1xyXG5cclxuICAgIC8vIEZpbHRlciBjb2x1bW5zIHdoZXJlIHRoZSB0aW1lem9uZSBzaG91bGQgYmUgaWdub3JlZFxyXG4gICAgY29uc3QgaWdub3JlVGltZVpvbmVDb2x1bW5zID0gZGF0ZVRpbWVDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLklzSWdub3JlVGltZVpvbmUpO1xyXG5cclxuICAgIC8vIElmIHRoZXJlIGFyZSBjb2x1bW5zIHRoYXQgc2hvdWxkIGlnbm9yZSB0aGUgdGltZXpvbmVcclxuICAgIGlmIChpZ25vcmVUaW1lWm9uZUNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBkYXRhU2V0LmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgaWdub3JlVGltZVpvbmVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgIC8vIEFkanVzdCBkYXRldGltZSBiYXNlZCBvbiB0aGUgdGltZXpvbmUgaWdub3Jpbmcgc2V0dGluZ1xyXG4gICAgICAgICAgaWYgKGRhdGFbY29sLlZhbHVlXSkge1xyXG4gICAgICAgICAgICBkYXRhW2NvbC5WYWx1ZV0gPSB0aGlzLmNvbXBvbmVudFNlcnZpY2UubG9jYWxpemVEYXRlVGltZUJ5SWdub3JpbmdUaW1lWm9uZShkYXRhW2NvbC5WYWx1ZV0sIGNvbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgYWdncmVnYXRlIHZhbHVlcyBmb3IgY29sdW1ucyB3aXRoIGFnZ3JlZ2F0ZSB0eXBlcy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYWdncmVnYXRlUmVzZXRWYWx1ZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFnZ3JlZ2F0ZUNvbHVtbnMgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuYWdncmVnYXRlVHlwZSk7XHJcbiAgICBhZ2dyZWdhdGVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgY29sLmFnZ3JlZ2F0ZVZhbHVlID0gMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHBhZ2UgY2hhbmdlIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtQYWdlQ2hhbmdlRXZlbnR9IGV2ZW50IC0gVGhlIHBhZ2UgY2hhbmdlIGV2ZW50LlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwYWdlQ2hhbmdlKGV2ZW50OiBQYWdlQ2hhbmdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMucGFyYW1zLnBhZ2VObyA9IHRoaXMuZ2V0UGFnZU5vKGV2ZW50LnNraXAsIHRoaXMucGFyYW1zLnBhZ2VTaXplKTtcclxuICAgIHRoaXMuc3RhdGUuc2tpcCA9IGV2ZW50LnNraXA7XHJcbiAgICB0aGlzLmNoYW5nZUV2ZW50LnBhZ2VDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2V0RGF0YUJpbmRpbmcoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBzb3J0IGNoYW5nZSBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7U29ydERlc2NyaXB0b3JbXX0gc29ydCAtIFRoZSBzb3J0IGRlc2NyaXB0b3IgYXJyYXkuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNvcnRDaGFuZ2Uoc29ydDogU29ydERlc2NyaXB0b3JbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5zb3J0ID0gc29ydDtcclxuICAgIHRoaXMucGFyYW1zLnNvcnRDb2x1bW5OYW1lcyA9IFtdO1xyXG4gICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycyA9IFtdO1xyXG5cclxuICAgIHNvcnQuZm9yRWFjaCgoZGVzY3JpcHRvcjogU29ydERlc2NyaXB0b3IpID0+IHtcclxuICAgICAgaWYgKGRlc2NyaXB0b3IuZGlyKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbXMuc29ydE9yZGVycy5wdXNoKGRlc2NyaXB0b3IuZGlyKTtcclxuXHJcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdyaWRTZXR0aW5nLmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IGRlc2NyaXB0b3IuZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IHNvcnRDb2x1bW5OYW1lID0gZmllbGQudmFsdWVFeHByICE9PSB1bmRlZmluZWQgPyBmaWVsZC52YWx1ZUV4cHIgOiBkZXNjcmlwdG9yLmZpZWxkO1xyXG5cclxuICAgICAgICB0aGlzLnBhcmFtcy5zb3J0Q29sdW1uTmFtZXMucHVzaChzb3J0Q29sdW1uTmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudC5zb3J0Q2hhbmdlZCA9IHRydWU7XHJcbiAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgZmlsdGVyIGNoYW5nZSBldmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7YW55fSBldmVudCAtIFRoZSBmaWx0ZXIgY2hhbmdlIGV2ZW50LlxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaWx0ZXJDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wYXJhbXMucGFnZU5vID0gMDtcclxuICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcyA9IFtdO1xyXG4gICAgdGhpcy5zZXRGaWx0ZXJQYXJhbXNCeVBhcmVudFJlZklkKCk7XHJcblxyXG4gICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LmZpbHRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBldmVudC5maWx0ZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ3JpZFNldHRpbmcuY29sdW1ucy5maW5kKGNvbCA9PiBjb2wuZmllbGQgPT09IGl0ZW0uZmllbGQpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXRlbS52YWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBpdGVtLnZhbHVlO1xyXG5cclxuICAgICAgICBpZiAoaXRlbS5maWx0ZXJzKSB7XHJcbiAgICAgICAgICBpdGVtLmZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyOiBGaWx0ZXJEZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlclBhcmFtOiBaR3JpZEZpbHRlclBhcmFtcyA9IHtcclxuICAgICAgICAgICAgICBrZXk6IGZpbHRlci5maWVsZCBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgb3BzOiB0aGlzLm1hcEZpbHRlck9wZXJhdG9yKGZpbHRlci5vcGVyYXRvciksXHJcbiAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlci52YWx1ZSA9PT0gbnVsbCA/IFwiXCIgOiBmaWx0ZXIudmFsdWUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLmZpbHRlclBhcmFtcy5wdXNoKGZpbHRlclBhcmFtKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGZpbHRlclBhcmFtOiBaR3JpZEZpbHRlclBhcmFtcyA9IHtcclxuICAgICAgICAgICAga2V5OiBpdGVtLmZpZWxkLFxyXG4gICAgICAgICAgICBvcHM6IHRoaXMubWFwRmlsdGVyT3BlcmF0b3IoaXRlbS5vcGVyYXRvciksXHJcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQudmFsdWVFeHByKSB7XHJcbiAgICAgICAgICAgIGZpbHRlclBhcmFtLmtleSA9IHRoaXMuemdyaWRiaW5kaW5nLmRhdGFbJ0ZpbHRlcldpdGhvdXRCcmFja2V0J10gPyBgJHtmaWVsZC52YWx1ZUV4cHJ9YCA6IGAoJHtmaWVsZC52YWx1ZUV4cHJ9KWA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zLnB1c2goZmlsdGVyUGFyYW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZmllbGQuR3JpZEZpbHRlckNvbmZpZ3VyYXRpb24/Lk9uQ2hhbmdlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiR3JpZEZpbHRlckNvbmZpZ3VyYXRpb24uT25DaGFuZ2UgdHJpZ2dlcmVkXCIpO1xyXG4gICAgICAvLyBVc2Ugc3dpdGNoTWFwIHRvIGhhbmRsZSB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvblxyXG4gICAgICBvZih0aGlzLnBhcmFtcy5maWx0ZXJQYXJhbXMpLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChmaWx0ZXJQYXJhbXMpID0+IHtcclxuICAgICAgICAgIC8vIEdldCB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbiBmcm9tIHRoZSBjb25maWd1cmF0aW9uXHJcbiAgICAgICAgICBsZXQgZXhwcmVzc2lvbiA9IHRoaXMuZmllbGQuR3JpZEZpbHRlckNvbmZpZ3VyYXRpb24uT25DaGFuZ2U7XHJcblxyXG4gICAgICAgICAgLy8gUmVwbGFjZSAnbW9kYWxHcm91cC4nIHdpdGggJ2dyb3VwLicgYW5kICdncm91cC4nIHdpdGggJ2dycC4nXHJcbiAgICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5yZXBsYWNlKC9tb2RhbEdyb3VwXFwuL2csICdncm91cC4nKS5yZXBsYWNlKC9ncm91cFxcLi9nLCAnZ3JwLicpO1xyXG5cclxuICAgICAgICAgIC8vIEVuc3VyZSB0aGUgZXhwcmVzc2lvbiBzdGFydHMgd2l0aCAndGhpcy4nIHRvIGF2b2lkIGFjY2Vzc2luZyBnbG9iYWwgc2NvcGVcclxuICAgICAgICAgIGlmICghZXhwcmVzc2lvbi5zdGFydHNXaXRoKCd0aGlzLicpKSB7XHJcbiAgICAgICAgICAgIGV4cHJlc3Npb24gPSBgdGhpcy4ke2V4cHJlc3Npb259YDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBmdW5jID0gZXZhbChleHByZXNzaW9uKTtcclxuICAgICAgICAgIGlmICghZnVuYykge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmxvZyhgJHtleHByZXNzaW9ufSBub3QgZm91bmQgaW4gdGhpcyBzY29wZSBmb3IgJHt0aGlzLmZpZWxkLk5hbWV9IGdyaWQuYCk7XHJcblxyXG4gICAgICAgICAgICAvLyBTaW5jZSBmdW5jdGlvbiBub3QgZm91bmQsIHdlIHJldHVybiB0aGUgb3JpZ2luYWwgcGFyYW1zLlxyXG4gICAgICAgICAgICByZXR1cm4gb2YodGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBjYWxsRnVuYyA9IGZ1bmMuYmluZCh0aGlzLmdycCk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGNhbGxGdW5jKGZpbHRlclBhcmFtcyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKS5zdWJzY3JpYmUoKHVwZGF0ZWRGaWx0ZXJQYXJhbXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2codXBkYXRlZEZpbHRlclBhcmFtcyk7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZSBmaWx0ZXJQYXJhbXNcclxuICAgICAgICBpZiAodXBkYXRlZEZpbHRlclBhcmFtcykge1xyXG4gICAgICAgICAgdGhpcy5wYXJhbXMuZmlsdGVyUGFyYW1zID0gdXBkYXRlZEZpbHRlclBhcmFtcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2hhbmdlRXZlbnQuZmlsdGVyQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhQmluZGluZygpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBJZiB0aGVyZSBpcyBubyBHcmlkRmlsdGVyQ29uZmlndXJhdGlvbi5PbkNoYW5nZVxyXG4gICAgICB0aGlzLmNoYW5nZUV2ZW50LmZpbHRlckNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGF0YVN0YXRlQ2hhbmdlKHN0YXRlOiBEYXRhU3RhdGVDaGFuZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5ncmlkU2V0dGluZy5ncmlkU3RhdGUgPSBzdGF0ZTtcclxuICAgIHRoaXMuYWdncmVnYXRlUmVzZXRWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFwIGZpbHRlciBvcGVyYXRvciB0byBpdHMgY29ycmVzcG9uZGluZyB2YWx1ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIFRoZSBmaWx0ZXIgb3BlcmF0b3IuXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgbWFwcGVkIGZpbHRlciBvcGVyYXRvciB2YWx1ZS5cclxuICAgKi9cclxuICBwcml2YXRlIG1hcEZpbHRlck9wZXJhdG9yKG9wZXJhdG9yOiBhbnkpIHtcclxuICAgIGNvbnN0IG9wZXJhdG9yTWFwcGluZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XHJcbiAgICAgIFwiZXFcIjogXCJlcVwiLFxyXG4gICAgICBcIm5lcVwiOiBcIm5lcVwiLFxyXG4gICAgICBcImx0XCI6IFwibHRcIixcclxuICAgICAgXCJsdGVcIjogXCJsdGVcIixcclxuICAgICAgXCJndFwiOiBcImd0XCIsXHJcbiAgICAgIFwiZ3RlXCI6IFwiZ3RlXCIsXHJcbiAgICAgIFwic3RhcnRzd2l0aFwiOiBcInN0YXJ0c3dpdGhcIixcclxuICAgICAgXCJlbmRzd2l0aFwiOiBcImVuZHN3aXRoXCIsXHJcbiAgICAgIFwiaXNudWxsXCI6IFwiaXNudWxsXCIsXHJcbiAgICAgIFwiaXNub3RudWxsXCI6IFwiaXNub3RudWxsXCIsXHJcbiAgICB9O1xyXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZSBmb3IgXCJjb250YWluc1wiXHJcbiAgICBpZiAob3BlcmF0b3IgPT09IFwiY29udGFpbnNcIiAmJiAhdGhpcy5maWVsZFsnRmlsdGVyQ29udGFpbnNVc2luZ0VxdWFsJ10pIHtcclxuICAgICAgcmV0dXJuIFwiY29udGFpbnNcIjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gdGhlIG1hcHBlZCBvcGVyYXRvciBvciBkZWZhdWx0IHRvIFwiPT1cIlxyXG4gICAgcmV0dXJuIG9wZXJhdG9yTWFwcGluZ3Nbb3BlcmF0b3JdIHx8IFwiPT1cIjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UGFnZU5vKHN0YXRlU2tpcDogbnVtYmVyLCBzdGF0ZVRha2U6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHN0YXRlU2tpcCAvIHN0YXRlVGFrZTtcclxuICB9XHJcblxyXG4gIC8vIGNvbHVtbkZpZWxkID0gZGF0YTogQXJyYXk8WkZpZWxkPixcclxuICAvLyBjb2x1bW5zID0gZ3JpZENvbHVtbnM6IGFueVtdLFxyXG4gIC8vIGdyb3VwID0gZ3JvdXA6IFpHcm91cCxcclxuICAvLyBjb2x1bW5Db25maWd1cmF0aW9ucyA9IGdyaWRTZXR0aW5ncz86IFpHcmlkQ29sdW1uU2V0dGluZ3NbXSxcclxuICAvLyBnZW5lcmF0ZUhpZGRlbkNvbHVtbnMgPSB1c2FibGVDb2x1bW5zPzogYW55W10sXHJcbiAgLy8gZ3JpZEF0dHJpYnV0ZXMgPSBncmlkRmllbGQ/OiBaRmllbGRcclxuXHJcbiAgcHVibGljIHNldENvbHVtbnMoY29sdW1uczogYW55W10pIHtcclxuICAgIHRoaXMuZ3JpZFNldHRpbmcuY29sdW1uRmllbGQgPSBjb2x1bW5zO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5nZXRHcmlkQ29sdW1ucyh0aGlzLmdyaWRTZXR0aW5nKTtcclxuXHJcbiAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmRlYnVnTG9nKCdnZW5lcmF0ZWQgZ3JpZCBjb2x1bW5zJywgdGhpcy5ncmlkU2V0dGluZyk7XHJcbiAgfVxyXG5cclxuICAgcHJpdmF0ZSBjb2xsYXBzZUFsbERldGFpbEdyaWQoKSB7XHJcbiAgICBpZiAodGhpcy56Z3JpZGJpbmRpbmcuZGF0YT8uRGV0YWlsR3JpZCkge1xyXG4gICAgICAvLyBDb2xsYXBzZSBhbGwgZXhwYW5kZWQgcm93cyBiZWZvcmUgZmV0Y2hpbmcgbmV3IGRhdGFcclxuICAgICAgaWYgKHRoaXMuZ3JpZC5kYXRhICYmICgnZGF0YScgaW4gdGhpcy5ncmlkLmRhdGEpICYmIHRoaXMuZ3JpZC5kYXRhLmRhdGE/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZ3JpZC5kYXRhLmRhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZC5jb2xsYXBzZVJvdyhpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJ5R2V0RGF0YUZyb21TZXNzaW9uKCk6IGFueSB7XHJcbiAgICBjb25zdCBkZXRhaWxHcmlkU2Vzc2lvbktleSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2RldGFpbEdyaWRTZXNzaW9uS2V5Jyk7XHJcbiAgICBpZiAoIXRoaXMuaXNWYWxpZFNlc3Npb25LZXkoZGV0YWlsR3JpZFNlc3Npb25LZXkpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlc3Npb25EYXRhID0gdGhpcy5nZXRBbmRWYWxpZGF0ZVNlc3Npb25EYXRhKGRldGFpbEdyaWRTZXNzaW9uS2V5KTtcclxuICAgIGlmIChzZXNzaW9uRGF0YSAmJiB0aGlzLmlzU2Vzc2lvbkRhdGFGcmVzaChzZXNzaW9uRGF0YSkpIHtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQoJ2RldGFpbEdyaWRTZXNzaW9uS2V5JywgJycpO1xyXG4gICAgICByZXR1cm4gc2Vzc2lvbkRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzVmFsaWRTZXNzaW9uS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIVpDb21wb25lbnRIZWxwZXIuaXNOdWxsVW5kZWZpbmVkRW1wdHkoa2V5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QW5kVmFsaWRhdGVTZXNzaW9uRGF0YShrZXk6IHN0cmluZyk6IGFueSB7XHJcbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGtleSkpO1xyXG4gICAgcmV0dXJuIFpDb21wb25lbnRIZWxwZXIuaXNOdWxsVW5kZWZpbmVkRW1wdHkoZGF0YSkgPyBudWxsIDogZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNTZXNzaW9uRGF0YUZyZXNoKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgIGNvbnN0IHByZXZpb3VzRGF0ZSA9IG5ldyBEYXRlKGRhdGEuY3VycmVudERhdGUpO1xyXG4gICAgY29uc3QgZGlmZkluTWludXRlcyA9IHRoaXMuZ2V0VGltZURpZmZlcmVuY2VJbk1pbnV0ZXMobm93LCBwcmV2aW91c0RhdGUpO1xyXG4gICAgcmV0dXJuIGRpZmZJbk1pbnV0ZXMgPD0gMTA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFRpbWVEaWZmZXJlbmNlSW5NaW51dGVzKGN1cnJlbnREYXRlOiBEYXRlLCBwcmV2aW91c0RhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgY29uc3QgZGlmZkluTXMgPSBjdXJyZW50RGF0ZS5nZXRUaW1lKCkgLSBwcmV2aW91c0RhdGUuZ2V0VGltZSgpO1xyXG4gICAgcmV0dXJuIGRpZmZJbk1zIC8gKDEwMDAgKiA2MCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldERldGFpbERhdGFJbnRvU2Vzc2lvbihkZXRhaWxHcmlkU2Vzc2lvbktleTogc3RyaW5nLCBkYXRhOiBhbnkpIHtcclxuICAgIGlmIChaQ29tcG9uZW50SGVscGVyLmlzTnVsbFVuZGVmaW5lZEVtcHR5KGRldGFpbEdyaWRTZXNzaW9uS2V5KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBkYXRhLmN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KCdkZXRhaWxHcmlkU2Vzc2lvbktleScsICcnKTtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KGRldGFpbEdyaWRTZXNzaW9uS2V5LCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==