@sunbird-cb/cbp-ai 0.1.121 → 0.1.122

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.
@@ -3,8 +3,8 @@ import { MatTableDataSource } from '@angular/material/table';
3
3
  import { Validators } from '@angular/forms';
4
4
  import html2pdf from 'html2pdf.js';
5
5
  import { DeleteRoleMappingPopupComponent } from '../delete-role-mapping-popup/delete-role-mapping-popup.component';
6
- import { interval, of, concat, forkJoin, Subject } from 'rxjs';
7
- import { catchError, switchMap, takeWhile, tap } from 'rxjs/operators';
6
+ import { interval, of, concat, Subject } from 'rxjs';
7
+ import { switchMap, takeWhile, tap } from 'rxjs/operators';
8
8
  import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "../../modules/shared/services/event.service";
@@ -118,6 +118,7 @@ export class RoleMappingGenerationComponent {
118
118
  this.showWorkAllocationOrderDocumentMissing = false;
119
119
  this.destroy$ = new Subject();
120
120
  this.immediateFailureHandled = false;
121
+ this.retriedAfterFailure = false;
121
122
  this.onDepartmentScroll = (event) => {
122
123
  const panel = event.target;
123
124
  if (panel.scrollTop + panel.clientHeight >= panel.scrollHeight - 60) {
@@ -228,6 +229,7 @@ export class RoleMappingGenerationComponent {
228
229
  }
229
230
  else {
230
231
  this.documents = [];
232
+ this.workAllocationOrderDocumentMissing = true;
231
233
  this.apiLoading = false;
232
234
  this.disableUploadDocument = false;
233
235
  this.disableUploadDocumentOriginal = false;
@@ -368,6 +370,13 @@ export class RoleMappingGenerationComponent {
368
370
  return changedKeys;
369
371
  }
370
372
  onGenerateRoleMapping() {
373
+ // Generation must not start (and no existing record be deleted) without a Work Allocation Order.
374
+ // Only look up an existing CBP so the user can still view it.
375
+ if (this.workAllocationOrderDocumentMissing) {
376
+ this.showExistingRoleMappingWithoutWAO();
377
+ return;
378
+ }
379
+ this.retriedAfterFailure = false;
371
380
  const currentFormValues = this.roleMappingForm.getRawValue();
372
381
  const formData = new FormData();
373
382
  formData.append('ministryType', currentFormValues.ministryType);
@@ -643,12 +652,18 @@ export class RoleMappingGenerationComponent {
643
652
  }
644
653
  }
645
654
  generateFinalRoleMapping() {
646
- this.apiLoading = true;
647
- this.immediateFailureHandled = false;
648
655
  if (!this.roleMappingForm.valid) {
649
656
  this.roleMappingForm.markAllAsTouched();
650
657
  return;
651
658
  }
659
+ if (this.workAllocationOrderDocumentMissing) {
660
+ this.loading = false;
661
+ this.apiLoading = false;
662
+ this.showWorkAllocationOrderDocumentMissing = true;
663
+ return;
664
+ }
665
+ this.apiLoading = true;
666
+ this.showWorkAllocationOrderDocumentMissing = false;
652
667
  const currentFormValues = this.roleMappingForm.getRawValue();
653
668
  let formUploadData = new FormData();
654
669
  // Ministry selection
@@ -699,6 +714,9 @@ export class RoleMappingGenerationComponent {
699
714
  req.department_name = departmentName?.orgName || '';
700
715
  }
701
716
  // Polling API
717
+ // Reset per-run state so a previous run's first response is never reused
718
+ this.firstApiResponse = null;
719
+ this.immediateFailureHandled = false;
702
720
  concat(of(null), // 🔥 immediate first emission
703
721
  interval(5000) // ⏱ subsequent polling every 5s
704
722
  )
@@ -706,12 +724,20 @@ export class RoleMappingGenerationComponent {
706
724
  if (!this.firstApiResponse) {
707
725
  this.firstApiResponse = data; // 👈 store first response
708
726
  console.log('First API response:', this.firstApiResponse);
709
- if (data && data?.status === 'FAILED') {
710
- this.apiLoading = false;
711
- this.loading = false;
712
- this.immediateFailureHandled = true; // takeWhile still forwards this same value to subscribe(); tell it to skip
727
+ if (data && data?.status === 'FAILED' && !data?.is_existing) {
728
+ // A previous generation failed: delete it and start a fresh one (once).
729
+ // takeWhile still forwards this value to subscribe(); tell it to skip.
730
+ this.immediateFailureHandled = true;
713
731
  this.destroy$.next(); // 🛑 stop polling
714
- this.regenerateRoleMappingAfterFailedAndDelete();
732
+ if (!this.retriedAfterFailure) {
733
+ this.retriedAfterFailure = true;
734
+ this.regenerateRoleMappingAfterFailedAndDelete();
735
+ }
736
+ else {
737
+ this.loading = false;
738
+ this.apiLoading = false;
739
+ this.showRoleMappingFailedPopup(data?.message);
740
+ }
715
741
  return;
716
742
  }
717
743
  }
@@ -723,15 +749,14 @@ export class RoleMappingGenerationComponent {
723
749
  ))
724
750
  .subscribe(data => {
725
751
  if (this.immediateFailureHandled) {
726
- this.immediateFailureHandled = false; // already handled in tap() above; avoid double-handling this same emission
752
+ this.immediateFailureHandled = false; // already handled in tap() above
727
753
  return;
728
754
  }
729
755
  console.log('role mapping data--', data);
730
756
  if (this.firstApiResponse?.is_existing) {
731
757
  this.showWorkAllocationOrderDocumentMissing = false;
732
758
  this.apiLoading = false;
733
- this.destroy$.next(); // 🛑 stop polling
734
- this.destroy$.complete();
759
+ this.destroy$.next(); // 🛑 stop polling (not completed, so later runs can still be stopped)
735
760
  const dialogRef = this.dialog.open(DeleteRoleMappingPopupComponent, {
736
761
  width: '400px',
737
762
  data: { documents: this.documents },
@@ -764,36 +789,15 @@ export class RoleMappingGenerationComponent {
764
789
  });
765
790
  }
766
791
  else if (result === 'button') {
767
- this.loading = false;
768
- // this.generateFinalRoleMapping()
769
- // this.router.navigate(['/']);
770
- const currentUrl = this.router.url;
771
- // this.router.navigateByUrl('/', { skipLocationChange: true }).then(() => {
772
- // this.router.navigateByUrl(currentUrl);
773
- // });
774
- this.sharedService.cbpPlanFinalObj['role_mapping_generation'] =
775
- data?.role_mappings;
776
- this.sharedService.roleMappingGenerationData = data?.role_mappings;
777
- localStorage.setItem('cbpPlanFinalObj', JSON.stringify(this.sharedService.cbpPlanFinalObj));
778
- this.successRoleMapping.emit(this.roleMappingForm);
779
- this.router.navigate(['/ai/list'], {
780
- onSameUrlNavigation: 'reload'
781
- });
782
- // window.location.reload()
792
+ this.viewExistingRoleMapping(data?.role_mappings);
783
793
  }
784
794
  else {
785
795
  this.loading = false;
786
796
  }
787
797
  });
788
798
  }
789
- else if (this.workAllocationOrderDocumentMissing) {
790
- this.destroy$.next();
791
- this.loading = false;
792
- this.apiLoading = false;
793
- this.showWorkAllocationOrderDocumentMissing = true;
794
- return;
795
- }
796
799
  else if (data?.status === 'COMPLETED') {
800
+ this.retriedAfterFailure = false;
797
801
  this.showWorkAllocationOrderDocumentMissing = false;
798
802
  this.loading = false;
799
803
  this.apiLoading = false;
@@ -810,13 +814,12 @@ export class RoleMappingGenerationComponent {
810
814
  this.router.navigate(['/ai/list']);
811
815
  }
812
816
  else if (data && data?.status === 'FAILED') {
817
+ // Failed after being in progress
813
818
  this.loading = false;
814
819
  this.apiLoading = false;
815
820
  this.destroy$.next(); // 🛑 stop polling
816
- this.snackBar.open('Generation failed please try again later', 'X', {
817
- duration: 3000,
818
- panelClass: ['snackbar-error']
819
- });
821
+ this.retriedAfterFailure = false;
822
+ this.showRoleMappingFailedPopup(data?.message);
820
823
  return;
821
824
  }
822
825
  });
@@ -1073,50 +1076,101 @@ export class RoleMappingGenerationComponent {
1073
1076
  goToUploadDocument() {
1074
1077
  this.router.navigate(['/ai/upload-documents']);
1075
1078
  }
1076
- regenerateRoleMappingAfterFailedAndDelete() {
1077
- const stateCenterId = this.roleMappingForm.value.ministry;
1078
- const departmentId = this.roleMappingForm.value.departments;
1079
- this.sharedService.getRoleMappingByStateCenterAndDepartment(stateCenterId, departmentId).subscribe({
1080
- next: (existingRoleMappings) => {
1081
- const roleMappingIds = (Array.isArray(existingRoleMappings) ? existingRoleMappings : [])
1082
- .map((roleMapping) => roleMapping?.id)
1083
- .filter(Boolean);
1084
- if (!roleMappingIds.length) {
1085
- this.loading = false;
1086
- this.firstApiResponse = null;
1087
- this.generateFinalRoleMapping();
1079
+ viewExistingRoleMapping(roleMappings) {
1080
+ this.loading = false;
1081
+ this.sharedService.cbpPlanFinalObj['role_mapping_generation'] = roleMappings;
1082
+ this.sharedService.roleMappingGenerationData = roleMappings;
1083
+ localStorage.setItem('cbpPlanFinalObj', JSON.stringify(this.sharedService.cbpPlanFinalObj));
1084
+ this.successRoleMapping.emit(this.roleMappingForm);
1085
+ this.router.navigate(['/ai/list'], {
1086
+ onSameUrlNavigation: 'reload'
1087
+ });
1088
+ }
1089
+ // Work Allocation Order is missing: never call generate. If a CBP already exists, show the
1090
+ // "CBP is already available" popup (Yes stays disabled there), otherwise show the upload note.
1091
+ showExistingRoleMappingWithoutWAO() {
1092
+ this.apiLoading = true;
1093
+ this.sharedService.getRoleMappingByStateCenterAndDepartment(this.roleMappingForm.value.ministry, this.roleMappingForm.value.departments).subscribe({
1094
+ next: (res) => {
1095
+ this.apiLoading = false;
1096
+ const roleMappings = Array.isArray(res) ? res : [];
1097
+ if (!roleMappings.length) {
1098
+ this.showWorkAllocationOrderDocumentMissingMessage();
1088
1099
  return;
1089
1100
  }
1090
- forkJoin(roleMappingIds.map((id) => this.sharedService.deleteCourseRecommendations(id).pipe(catchError((error) => {
1091
- // A 404 just means this designation had no course recommendations yet.
1092
- // Either way, one designation's delete failing shouldn't block the
1093
- // regenerate retry for the rest.
1094
- if (error?.status !== 404) {
1095
- console.error(`Failed to delete course recommendations for role mapping ${id}`, error);
1101
+ const dialogRef = this.dialog.open(DeleteRoleMappingPopupComponent, {
1102
+ width: '400px',
1103
+ data: { documents: this.documents },
1104
+ panelClass: 'view-cbp-plan-popup',
1105
+ minHeight: '300px',
1106
+ maxHeight: '80vh',
1107
+ disableClose: true
1108
+ });
1109
+ dialogRef.afterClosed().subscribe(result => {
1110
+ if (result === 'button') {
1111
+ this.viewExistingRoleMapping(roleMappings);
1096
1112
  }
1097
- return of(null);
1098
- })))).subscribe(() => {
1099
- this.loading = false;
1100
- this.firstApiResponse = null;
1101
- this.generateFinalRoleMapping();
1102
1113
  });
1103
1114
  },
1115
+ error: () => {
1116
+ this.apiLoading = false;
1117
+ this.showWorkAllocationOrderDocumentMissingMessage();
1118
+ }
1119
+ });
1120
+ }
1121
+ showWorkAllocationOrderDocumentMissingMessage() {
1122
+ this.showWorkAllocationOrderDocumentMissing = true;
1123
+ this.snackBar.open('Please upload the Work Allocation Order document to generate the Capacity Building Plan (CBP)', 'X', {
1124
+ duration: 3000,
1125
+ panelClass: ['snackbar-error']
1126
+ });
1127
+ }
1128
+ showRoleMappingFailedPopup(message) {
1129
+ const dialogRef = this.dialog.open(DeleteRoleMappingPopupComponent, {
1130
+ width: '400px',
1131
+ data: { documents: this.documents, from: 'roleMappingFailed', message },
1132
+ panelClass: 'view-cbp-plan-popup',
1133
+ minHeight: '300px',
1134
+ maxHeight: '80vh',
1135
+ disableClose: true // Optional: prevent closing with outside click
1136
+ });
1137
+ dialogRef.afterClosed().subscribe(result => {
1138
+ if (result === 'saved') {
1139
+ // Retry: delete the failed record, then generate again
1140
+ this.retriedAfterFailure = true;
1141
+ this.regenerateRoleMappingAfterFailedAndDelete();
1142
+ }
1143
+ else {
1144
+ this.loading = false;
1145
+ }
1146
+ });
1147
+ }
1148
+ regenerateRoleMappingAfterFailedAndDelete() {
1149
+ // keep the loader up between delete and the new generate call to avoid flicker
1150
+ this.apiLoading = true;
1151
+ this.sharedService.deleteRoleMappingByStateAndDepartment(this.roleMappingForm.value.ministry, this.roleMappingForm.value.departments).subscribe({
1152
+ next: (res) => {
1153
+ console.log('Deleted failed role mapping:', res);
1154
+ this.loading = false;
1155
+ this.generateFinalRoleMapping();
1156
+ },
1104
1157
  error: (error) => {
1105
- this.snackBar.open(error?.error?.detail, 'X', {
1158
+ this.snackBar.open(error?.error?.detail || 'Role mapping generation failed. Please try again later.', 'X', {
1106
1159
  duration: 3000,
1107
1160
  panelClass: ['snackbar-error']
1108
1161
  });
1109
1162
  this.loading = false;
1110
- this.firstApiResponse = null;
1163
+ this.apiLoading = false;
1164
+ this.retriedAfterFailure = false;
1111
1165
  }
1112
1166
  });
1113
1167
  }
1114
1168
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RoleMappingGenerationComponent, deps: [{ token: i1.EventService }, { token: i2.SharedService }, { token: i3.FormBuilder }, { token: i4.MatSnackBar }, { token: i5.MatDialog }, { token: i6.RoleMappingService }, { token: i7.Router }], target: i0.ɵɵFactoryTarget.Component }); }
1115
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RoleMappingGenerationComponent, selector: "app-role-mapping-generation", inputs: { loginStatusFlag: "loginStatusFlag" }, outputs: { successRoleMapping: "successRoleMapping", alreadyAvailableRoleMapping: "alreadyAvailableRoleMapping", loginSuccess: "loginSuccess" }, viewQueries: [{ propertyName: "pdfContent", first: true, predicate: ["pdfContent"], descendants: true }, { propertyName: "departmentSelect", first: true, predicate: ["departmentSelect"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"container\">\n <!-- <input class=\"btn-active\" type=\"button\" value=\"Download as PDF\" (click)=\"downloadPDF()\" /> -->\n <div class=\"logo-container\" *ngIf=\"login\">\n <div>\n <span class=\"ai-loader-icon-medium\"><img src=\"assets/icons/ai-loader.gif\"></span>\n </div>\n <div>\n <h2 class=\"highlight-ai\">\n <span>iGOT AI Driven CBP</span>\n </h2>\n </div>\n <!-- <div class=\"sub-heading\">\n <p>Build Your Capacity With Customized Role Mapping</p>\n </div> -->\n </div>\n <mat-card *ngIf=\"login && roleMappingForm\" class=\"mt-2\" [formGroup]=\"roleMappingForm\">\n <div class=\"depatment-container\">\n <!-- <div class=\"section-header\">-->\n <!-- <div class=\"sub-heading\">-->\n <!-- <p>Choose Your Department</p>-->\n <!-- </div>-->\n <!-- </div>-->\n\n <div class=\"radio-group mt-4\">\n <mat-radio-group class=\"radio-btn-group\" formControlName=\"ministryType\"\n [(ngModel)]=\"selectedMinistryType\" (change)=\"onMinistryTypeChange($event)\">\n\n <!-- Left radio button -->\n <mat-radio-button value=\"ministry\" class=\"radio-btn left-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'center'? 'checked-label':''\">domain</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'ministry'? 'checked-label':''\">Centre</span>\n </span>\n </mat-radio-button>\n\n <!-- Right radio button -->\n <mat-radio-button value=\"state\" class=\"radio-btn right-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">location_on</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">State</span>\n </span>\n </mat-radio-button>\n\n </mat-radio-group>\n </div>\n <div class=\"mt-4\">\n\n <label class=\"label\">\n <span *ngIf=\"selectedMinistryType === 'ministry'\">Ministry</span>\n <span *ngIf=\"selectedMinistryType === 'state'\">State</span>\n </label>\n <div class=\"mt-2 search-box-with-select\">\n\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n <mat-select panelClass=\"select-with-search\"\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministry\"\n style=\"border-radius: 25px; background: white; width:100%\"\n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <!-- [selected]=\"selectedMinistryId === item?.identifier\" -->\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredList\">{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"departmentData?.length\">\n <label class=\"label\">Department</label>\n <div class=\"mt-2\">\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;border: 1px solid #ccc;\">\n <mat-select #departmentSelect panelClass=\"select-with-search\" placeholder=\"Select Department\"\n formControlName=\"departments\" style=\"border-radius: 25px; background: white;\"\n (selectionChange)=\"onDepartmentChange()\" (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterDepartmentData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredDepartmentList\">{{item?.orgName}}</mat-option>\n <!-- selected department not present in the current search/page:\n kept rendered (hidden) so mat-select does not clear the selection -->\n <mat-option [value]=\"item?.identifier\" style=\"display: none\"\n *ngFor=\"let item of pinnedDepartmentOptions\">{{item?.orgName}}</mat-option>\n <mat-option disabled *ngIf=\"departmentLoading\">Loading...</mat-option>\n <mat-option disabled\n *ngIf=\"!departmentLoading && !filteredDepartmentList?.length\">No department found</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div>\n <!-- <div class=\"mt-4\">\n <label class=\"label\">Sector</label>\n <div>\n <mat-form-field appearance=\"fill\" style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select placeholder=\"Select Sector\" multiple formControlName=\"sectors\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"item?.value\"\n *ngFor=\"let item of sectorData\">{{item?.value}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <div class=\"mt-4 additional-details\">\n <textarea rows=\"5\" placeholder=\"Additional details\" formControlName=\"additionalDetails\"></textarea>\n </div>\n <div class=\"mt-4\">\n\n <button [ngClass]=\"disableUploadDocument ? 'btn-active-primary-disable':'btn-active-primary'\" class=\"\"\n [disabled]=\"disableUploadDocument\" mat-raised-button color=\"primary\" (click)=\"goToUploadDocument()\">\n <mat-icon>upload</mat-icon> Manage Documents\n </button>\n </div>\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-4 section\" >\n <div class=\"sub-heading\">\n <p>Upload Document (PDF)</p>\n </div>\n <div class=\"file-upload-wrapper\">\n <label for=\"uploadDoc\" class=\"file-upload-label\">\n <span class=\"file-upload-icon\">\uD83D\uDCCE</span>\n <span *ngIf=\"!uploadedFile || uploadedFile.length === 0\">\n Choose up to 3 files (PDF/TXT)\n </span>\n <div *ngIf=\"uploadedFile?.length > 0\" class=\"file-list\">\n <div *ngFor=\"let file of uploadedFile; let i = index\" class=\"file-item\">\n {{ file.name }}\n <span class=\"remove-file-icon\" (click)=\"removeFile(i);$event.preventDefault()\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </label>\n <input\n id=\"uploadDoc\"\n type=\"file\"\n multiple\n (change)=\"onFileChange($event)\"\n hidden\n /> \n\n <small class=\"file-upload-hint\">Max file size: {{maxFileSizeMB}}MB</small>\n\n <input id=\"uploadDoc\" multiple type=\"file\" (change)=\"onFileChange($event)\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt\" class=\"file-upload-input\" />\n\n <div *ngIf=\"uploadError\" class=\"error\">{{ uploadError }}</div>\n </div>\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-2 section\">\n <div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents. </p>\n </div>\n </div> -->\n <div class=\"mt-2\" *ngIf=\"documents?.length < 1 && !(roleMappingForm?.invalid) || showWorkAllocationOrderDocumentMissing\">\n <p><span style=\"font-size: .875rem;font-weight: bold;\">Note: </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity Building Plan (CBP)</span>\n </p>\n </div>\n <!-- <div class=\"mt-2\" *ngIf=\"documents?.length > 0\">\n <p *ngIf=\"workAllocationOrderDocumentMissing\"><span style=\"font-size: .875rem;font-weight: bold;\">Note:\n </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity\n Building Plan (CBP)</span>\n </p>\n </div> -->\n <div class=\"mt-4\">\n <input\n [disabled]=\"roleMappingForm?.invalid || loading || documents?.length < 1\"\n [ngClass]=\"\n roleMappingForm?.invalid || loading || documents?.length < 1\n ? 'btn-disable'\n : 'btn-active'\n \"\n type=\"button\"\n [value]=\"loading ? 'Generating CBP...' : 'Generate CBP'\"\n (click)=\"onGenerateRoleMapping()\"\n />\n</div>\n </div>\n </mat-card>\n\n</div>\n<!-- <div *ngIf=\"!login\">\n <app-login (success)=\"loginStatus($event)\"></app-login>\n </div> -->\n\n<div class=\"overlay-loader\" *ngIf=\"apiLoading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || 'Preparing CBP Plan generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"chunks.length > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" [style.width.%]=\"getDisplayProgressPercentage()\">\n </div>\n </div>\n <small class=\"progress-text\">{{ getDisplayProgressPercentage() }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time streaming in progress. This may take 2-3 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: [".container{width:40%}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.radio-btn-group{display:flex;justify-content:space-between;border-radius:8px;padding:12px 16px;align-items:center;max-width:600px;margin:0 auto;gap:20px}.radio-btn{flex:1;display:flex;align-items:center;justify-content:center;padding:10px;border-radius:6px;transition:background-color .3s ease}.radio-btn,.radio-btn:hover{background-color:#eef2f7}.radio-label{display:flex;align-items:center;gap:6px;font-weight:500;font-size:16px}.radio-icon{font-size:24px;color:gray}.radio-label{color:#000;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:18px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;border:none;outline:none;resize:none;box-shadow:none;border-radius:4px;border:1px solid #ccc}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:center}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:10px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex}.outside-layer{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:28px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:60px;height:60px;flex-shrink:0}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.overlay-loader .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;background:#fff;padding:2rem;border-radius:8px;box-shadow:0 4px 12px #00000026}.overlay-loader .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:300px}.overlay-loader .loading-content .loading-text .main-message{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.overlay-loader .loading-content .loading-text .progress-details{margin-top:16px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:12px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#2563eb);border-radius:4px;transition:width .5s ease-in-out}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:14px;font-weight:500;color:#1b4ca1;display:block;text-align:center}.overlay-loader .loading-content .loading-text .progress-details .time-estimate{color:#666;font-size:12px;font-style:italic;display:block;text-align:center;margin-top:8px}::ng-deep mat-option .mat-option-text{font-size:16px;color:#000;font-family:Lato}:host ::ng-deep mat-select .mat-select-placeholder{font-size:16px}:host mat-select .mat-select-value-text{font-size:16px!important}.logo-container{display:flex;justify-content:center;align-items:center;flex-direction:column}.depatment-container{background:#fff;border:1px solid rgba(27,76,161,.12);padding:5%;box-shadow:0 4px 6px #0000001a,0 8px 20px #00000026;border-radius:8px}.checked-label{color:#1b4ca1}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400}.mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}.mat-select-panel mat-option{padding-top:10px}::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}::ng-deep .select-with-search.mat-select-panel{padding-top:0;overflow:auto}::ng-deep .select-with-search .search-wrapper{position:sticky;top:0;z-index:10;background:#fff;padding:8px;border-bottom:1px solid #e0e0e0}::ng-deep .select-with-search .search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}::ng-deep .select-with-search mat-option:first-of-type{margin-top:4px}.btn-active-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i10.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i11.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.MatLegacyRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i13.MatLegacyRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i14.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i15.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i16.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
1169
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RoleMappingGenerationComponent, selector: "app-role-mapping-generation", inputs: { loginStatusFlag: "loginStatusFlag" }, outputs: { successRoleMapping: "successRoleMapping", alreadyAvailableRoleMapping: "alreadyAvailableRoleMapping", loginSuccess: "loginSuccess" }, viewQueries: [{ propertyName: "pdfContent", first: true, predicate: ["pdfContent"], descendants: true }, { propertyName: "departmentSelect", first: true, predicate: ["departmentSelect"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"container\">\n <!-- <input class=\"btn-active\" type=\"button\" value=\"Download as PDF\" (click)=\"downloadPDF()\" /> -->\n <div class=\"logo-container\" *ngIf=\"login\">\n <div>\n <span class=\"ai-loader-icon-medium\"><img src=\"assets/icons/ai-loader.gif\"></span>\n </div>\n <div>\n <h2 class=\"highlight-ai\">\n <span>iGOT AI Driven CBP</span>\n </h2>\n </div>\n <!-- <div class=\"sub-heading\">\n <p>Build Your Capacity With Customized Role Mapping</p>\n </div> -->\n </div>\n <mat-card *ngIf=\"login && roleMappingForm\" class=\"mt-2\" [formGroup]=\"roleMappingForm\">\n <div class=\"depatment-container\">\n <!-- <div class=\"section-header\">-->\n <!-- <div class=\"sub-heading\">-->\n <!-- <p>Choose Your Department</p>-->\n <!-- </div>-->\n <!-- </div>-->\n\n <div class=\"radio-group mt-4\">\n <mat-radio-group class=\"radio-btn-group\" formControlName=\"ministryType\"\n [(ngModel)]=\"selectedMinistryType\" (change)=\"onMinistryTypeChange($event)\">\n\n <!-- Left radio button -->\n <mat-radio-button value=\"ministry\" class=\"radio-btn left-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'center'? 'checked-label':''\">domain</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'ministry'? 'checked-label':''\">Centre</span>\n </span>\n </mat-radio-button>\n\n <!-- Right radio button -->\n <mat-radio-button value=\"state\" class=\"radio-btn right-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">location_on</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">State</span>\n </span>\n </mat-radio-button>\n\n </mat-radio-group>\n </div>\n <div class=\"mt-4\">\n\n <label class=\"label\">\n <span *ngIf=\"selectedMinistryType === 'ministry'\">Ministry</span>\n <span *ngIf=\"selectedMinistryType === 'state'\">State</span>\n </label>\n <div class=\"mt-2 search-box-with-select\">\n\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n <mat-select panelClass=\"select-with-search\"\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministry\"\n style=\"border-radius: 25px; background: white; width:100%\"\n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <!-- [selected]=\"selectedMinistryId === item?.identifier\" -->\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredList\">{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"departmentData?.length\">\n <label class=\"label\">Department</label>\n <div class=\"mt-2\">\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;border: 1px solid #ccc;\">\n <mat-select #departmentSelect panelClass=\"select-with-search\" placeholder=\"Select Department\"\n formControlName=\"departments\" style=\"border-radius: 25px; background: white;\"\n (selectionChange)=\"onDepartmentChange()\" (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterDepartmentData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredDepartmentList\">{{item?.orgName}}</mat-option>\n <!-- selected department not present in the current search/page:\n kept rendered (hidden) so mat-select does not clear the selection -->\n <mat-option [value]=\"item?.identifier\" style=\"display: none\"\n *ngFor=\"let item of pinnedDepartmentOptions\">{{item?.orgName}}</mat-option>\n <mat-option disabled *ngIf=\"departmentLoading\">Loading...</mat-option>\n <mat-option disabled\n *ngIf=\"!departmentLoading && !filteredDepartmentList?.length\">No department found</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div>\n <!-- <div class=\"mt-4\">\n <label class=\"label\">Sector</label>\n <div>\n <mat-form-field appearance=\"fill\" style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select placeholder=\"Select Sector\" multiple formControlName=\"sectors\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"item?.value\"\n *ngFor=\"let item of sectorData\">{{item?.value}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <div class=\"mt-4 additional-details\">\n <textarea rows=\"5\" placeholder=\"Additional details\" formControlName=\"additionalDetails\"></textarea>\n </div>\n <div class=\"mt-4\">\n\n <button [ngClass]=\"disableUploadDocument ? 'btn-active-primary-disable':'btn-active-primary'\" class=\"\"\n [disabled]=\"disableUploadDocument\" mat-raised-button color=\"primary\" (click)=\"goToUploadDocument()\">\n <mat-icon>upload</mat-icon> Manage Documents\n </button>\n </div>\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-4 section\" >\n <div class=\"sub-heading\">\n <p>Upload Document (PDF)</p>\n </div>\n <div class=\"file-upload-wrapper\">\n <label for=\"uploadDoc\" class=\"file-upload-label\">\n <span class=\"file-upload-icon\">\uD83D\uDCCE</span>\n <span *ngIf=\"!uploadedFile || uploadedFile.length === 0\">\n Choose up to 3 files (PDF/TXT)\n </span>\n <div *ngIf=\"uploadedFile?.length > 0\" class=\"file-list\">\n <div *ngFor=\"let file of uploadedFile; let i = index\" class=\"file-item\">\n {{ file.name }}\n <span class=\"remove-file-icon\" (click)=\"removeFile(i);$event.preventDefault()\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </label>\n <input\n id=\"uploadDoc\"\n type=\"file\"\n multiple\n (change)=\"onFileChange($event)\"\n hidden\n /> \n\n <small class=\"file-upload-hint\">Max file size: {{maxFileSizeMB}}MB</small>\n\n <input id=\"uploadDoc\" multiple type=\"file\" (change)=\"onFileChange($event)\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt\" class=\"file-upload-input\" />\n\n <div *ngIf=\"uploadError\" class=\"error\">{{ uploadError }}</div>\n </div>\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-2 section\">\n <div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents. </p>\n </div>\n </div> -->\n <div class=\"mt-2\" *ngIf=\"(documents?.length < 1 || workAllocationOrderDocumentMissing) && !(roleMappingForm?.invalid) || showWorkAllocationOrderDocumentMissing\">\n <p><span style=\"font-size: .875rem;font-weight: bold;\">Note: </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity Building Plan (CBP)</span>\n </p>\n </div>\n <!-- <div class=\"mt-2\" *ngIf=\"documents?.length > 0\">\n <p *ngIf=\"workAllocationOrderDocumentMissing\"><span style=\"font-size: .875rem;font-weight: bold;\">Note:\n </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity\n Building Plan (CBP)</span>\n </p>\n </div> -->\n <div class=\"mt-4\">\n <input\n [disabled]=\"roleMappingForm?.invalid || loading || documents?.length < 1\"\n [ngClass]=\"\n roleMappingForm?.invalid || loading || documents?.length < 1\n ? 'btn-disable'\n : 'btn-active'\n \"\n type=\"button\"\n [value]=\"loading ? 'Generating CBP...' : 'Generate CBP'\"\n (click)=\"onGenerateRoleMapping()\"\n />\n</div>\n </div>\n </mat-card>\n\n</div>\n<!-- <div *ngIf=\"!login\">\n <app-login (success)=\"loginStatus($event)\"></app-login>\n </div> -->\n\n<div class=\"overlay-loader\" *ngIf=\"apiLoading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || 'Preparing CBP Plan generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"chunks.length > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" [style.width.%]=\"getDisplayProgressPercentage()\">\n </div>\n </div>\n <small class=\"progress-text\">{{ getDisplayProgressPercentage() }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time streaming in progress. This may take 2-3 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: [".container{width:40%}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.radio-btn-group{display:flex;justify-content:space-between;border-radius:8px;padding:12px 16px;align-items:center;max-width:600px;margin:0 auto;gap:20px}.radio-btn{flex:1;display:flex;align-items:center;justify-content:center;padding:10px;border-radius:6px;transition:background-color .3s ease}.radio-btn,.radio-btn:hover{background-color:#eef2f7}.radio-label{display:flex;align-items:center;gap:6px;font-weight:500;font-size:16px}.radio-icon{font-size:24px;color:gray}.radio-label{color:#000;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:18px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;border:none;outline:none;resize:none;box-shadow:none;border-radius:4px;border:1px solid #ccc}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:center}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:10px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex}.outside-layer{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:28px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:60px;height:60px;flex-shrink:0}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.overlay-loader .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;background:#fff;padding:2rem;border-radius:8px;box-shadow:0 4px 12px #00000026}.overlay-loader .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:300px}.overlay-loader .loading-content .loading-text .main-message{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.overlay-loader .loading-content .loading-text .progress-details{margin-top:16px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:12px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#2563eb);border-radius:4px;transition:width .5s ease-in-out}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:14px;font-weight:500;color:#1b4ca1;display:block;text-align:center}.overlay-loader .loading-content .loading-text .progress-details .time-estimate{color:#666;font-size:12px;font-style:italic;display:block;text-align:center;margin-top:8px}::ng-deep mat-option .mat-option-text{font-size:16px;color:#000;font-family:Lato}:host ::ng-deep mat-select .mat-select-placeholder{font-size:16px}:host mat-select .mat-select-value-text{font-size:16px!important}.logo-container{display:flex;justify-content:center;align-items:center;flex-direction:column}.depatment-container{background:#fff;border:1px solid rgba(27,76,161,.12);padding:5%;box-shadow:0 4px 6px #0000001a,0 8px 20px #00000026;border-radius:8px}.checked-label{color:#1b4ca1}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400}.mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}.mat-select-panel mat-option{padding-top:10px}::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}::ng-deep .select-with-search.mat-select-panel{padding-top:0;overflow:auto}::ng-deep .select-with-search .search-wrapper{position:sticky;top:0;z-index:10;background:#fff;padding:8px;border-bottom:1px solid #e0e0e0}::ng-deep .select-with-search .search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}::ng-deep .select-with-search mat-option:first-of-type{margin-top:4px}.btn-active-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i10.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i11.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.MatLegacyRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i13.MatLegacyRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i14.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i15.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i16.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
1116
1170
  }
1117
1171
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RoleMappingGenerationComponent, decorators: [{
1118
1172
  type: Component,
1119
- args: [{ selector: 'app-role-mapping-generation', template: "<div class=\"container\">\n <!-- <input class=\"btn-active\" type=\"button\" value=\"Download as PDF\" (click)=\"downloadPDF()\" /> -->\n <div class=\"logo-container\" *ngIf=\"login\">\n <div>\n <span class=\"ai-loader-icon-medium\"><img src=\"assets/icons/ai-loader.gif\"></span>\n </div>\n <div>\n <h2 class=\"highlight-ai\">\n <span>iGOT AI Driven CBP</span>\n </h2>\n </div>\n <!-- <div class=\"sub-heading\">\n <p>Build Your Capacity With Customized Role Mapping</p>\n </div> -->\n </div>\n <mat-card *ngIf=\"login && roleMappingForm\" class=\"mt-2\" [formGroup]=\"roleMappingForm\">\n <div class=\"depatment-container\">\n <!-- <div class=\"section-header\">-->\n <!-- <div class=\"sub-heading\">-->\n <!-- <p>Choose Your Department</p>-->\n <!-- </div>-->\n <!-- </div>-->\n\n <div class=\"radio-group mt-4\">\n <mat-radio-group class=\"radio-btn-group\" formControlName=\"ministryType\"\n [(ngModel)]=\"selectedMinistryType\" (change)=\"onMinistryTypeChange($event)\">\n\n <!-- Left radio button -->\n <mat-radio-button value=\"ministry\" class=\"radio-btn left-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'center'? 'checked-label':''\">domain</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'ministry'? 'checked-label':''\">Centre</span>\n </span>\n </mat-radio-button>\n\n <!-- Right radio button -->\n <mat-radio-button value=\"state\" class=\"radio-btn right-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">location_on</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">State</span>\n </span>\n </mat-radio-button>\n\n </mat-radio-group>\n </div>\n <div class=\"mt-4\">\n\n <label class=\"label\">\n <span *ngIf=\"selectedMinistryType === 'ministry'\">Ministry</span>\n <span *ngIf=\"selectedMinistryType === 'state'\">State</span>\n </label>\n <div class=\"mt-2 search-box-with-select\">\n\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n <mat-select panelClass=\"select-with-search\"\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministry\"\n style=\"border-radius: 25px; background: white; width:100%\"\n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <!-- [selected]=\"selectedMinistryId === item?.identifier\" -->\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredList\">{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"departmentData?.length\">\n <label class=\"label\">Department</label>\n <div class=\"mt-2\">\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;border: 1px solid #ccc;\">\n <mat-select #departmentSelect panelClass=\"select-with-search\" placeholder=\"Select Department\"\n formControlName=\"departments\" style=\"border-radius: 25px; background: white;\"\n (selectionChange)=\"onDepartmentChange()\" (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterDepartmentData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredDepartmentList\">{{item?.orgName}}</mat-option>\n <!-- selected department not present in the current search/page:\n kept rendered (hidden) so mat-select does not clear the selection -->\n <mat-option [value]=\"item?.identifier\" style=\"display: none\"\n *ngFor=\"let item of pinnedDepartmentOptions\">{{item?.orgName}}</mat-option>\n <mat-option disabled *ngIf=\"departmentLoading\">Loading...</mat-option>\n <mat-option disabled\n *ngIf=\"!departmentLoading && !filteredDepartmentList?.length\">No department found</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div>\n <!-- <div class=\"mt-4\">\n <label class=\"label\">Sector</label>\n <div>\n <mat-form-field appearance=\"fill\" style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select placeholder=\"Select Sector\" multiple formControlName=\"sectors\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"item?.value\"\n *ngFor=\"let item of sectorData\">{{item?.value}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <div class=\"mt-4 additional-details\">\n <textarea rows=\"5\" placeholder=\"Additional details\" formControlName=\"additionalDetails\"></textarea>\n </div>\n <div class=\"mt-4\">\n\n <button [ngClass]=\"disableUploadDocument ? 'btn-active-primary-disable':'btn-active-primary'\" class=\"\"\n [disabled]=\"disableUploadDocument\" mat-raised-button color=\"primary\" (click)=\"goToUploadDocument()\">\n <mat-icon>upload</mat-icon> Manage Documents\n </button>\n </div>\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-4 section\" >\n <div class=\"sub-heading\">\n <p>Upload Document (PDF)</p>\n </div>\n <div class=\"file-upload-wrapper\">\n <label for=\"uploadDoc\" class=\"file-upload-label\">\n <span class=\"file-upload-icon\">\uD83D\uDCCE</span>\n <span *ngIf=\"!uploadedFile || uploadedFile.length === 0\">\n Choose up to 3 files (PDF/TXT)\n </span>\n <div *ngIf=\"uploadedFile?.length > 0\" class=\"file-list\">\n <div *ngFor=\"let file of uploadedFile; let i = index\" class=\"file-item\">\n {{ file.name }}\n <span class=\"remove-file-icon\" (click)=\"removeFile(i);$event.preventDefault()\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </label>\n <input\n id=\"uploadDoc\"\n type=\"file\"\n multiple\n (change)=\"onFileChange($event)\"\n hidden\n /> \n\n <small class=\"file-upload-hint\">Max file size: {{maxFileSizeMB}}MB</small>\n\n <input id=\"uploadDoc\" multiple type=\"file\" (change)=\"onFileChange($event)\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt\" class=\"file-upload-input\" />\n\n <div *ngIf=\"uploadError\" class=\"error\">{{ uploadError }}</div>\n </div>\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-2 section\">\n <div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents. </p>\n </div>\n </div> -->\n <div class=\"mt-2\" *ngIf=\"documents?.length < 1 && !(roleMappingForm?.invalid) || showWorkAllocationOrderDocumentMissing\">\n <p><span style=\"font-size: .875rem;font-weight: bold;\">Note: </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity Building Plan (CBP)</span>\n </p>\n </div>\n <!-- <div class=\"mt-2\" *ngIf=\"documents?.length > 0\">\n <p *ngIf=\"workAllocationOrderDocumentMissing\"><span style=\"font-size: .875rem;font-weight: bold;\">Note:\n </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity\n Building Plan (CBP)</span>\n </p>\n </div> -->\n <div class=\"mt-4\">\n <input\n [disabled]=\"roleMappingForm?.invalid || loading || documents?.length < 1\"\n [ngClass]=\"\n roleMappingForm?.invalid || loading || documents?.length < 1\n ? 'btn-disable'\n : 'btn-active'\n \"\n type=\"button\"\n [value]=\"loading ? 'Generating CBP...' : 'Generate CBP'\"\n (click)=\"onGenerateRoleMapping()\"\n />\n</div>\n </div>\n </mat-card>\n\n</div>\n<!-- <div *ngIf=\"!login\">\n <app-login (success)=\"loginStatus($event)\"></app-login>\n </div> -->\n\n<div class=\"overlay-loader\" *ngIf=\"apiLoading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || 'Preparing CBP Plan generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"chunks.length > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" [style.width.%]=\"getDisplayProgressPercentage()\">\n </div>\n </div>\n <small class=\"progress-text\">{{ getDisplayProgressPercentage() }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time streaming in progress. This may take 2-3 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: [".container{width:40%}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.radio-btn-group{display:flex;justify-content:space-between;border-radius:8px;padding:12px 16px;align-items:center;max-width:600px;margin:0 auto;gap:20px}.radio-btn{flex:1;display:flex;align-items:center;justify-content:center;padding:10px;border-radius:6px;transition:background-color .3s ease}.radio-btn,.radio-btn:hover{background-color:#eef2f7}.radio-label{display:flex;align-items:center;gap:6px;font-weight:500;font-size:16px}.radio-icon{font-size:24px;color:gray}.radio-label{color:#000;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:18px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;border:none;outline:none;resize:none;box-shadow:none;border-radius:4px;border:1px solid #ccc}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:center}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:10px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex}.outside-layer{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:28px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:60px;height:60px;flex-shrink:0}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.overlay-loader .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;background:#fff;padding:2rem;border-radius:8px;box-shadow:0 4px 12px #00000026}.overlay-loader .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:300px}.overlay-loader .loading-content .loading-text .main-message{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.overlay-loader .loading-content .loading-text .progress-details{margin-top:16px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:12px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#2563eb);border-radius:4px;transition:width .5s ease-in-out}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:14px;font-weight:500;color:#1b4ca1;display:block;text-align:center}.overlay-loader .loading-content .loading-text .progress-details .time-estimate{color:#666;font-size:12px;font-style:italic;display:block;text-align:center;margin-top:8px}::ng-deep mat-option .mat-option-text{font-size:16px;color:#000;font-family:Lato}:host ::ng-deep mat-select .mat-select-placeholder{font-size:16px}:host mat-select .mat-select-value-text{font-size:16px!important}.logo-container{display:flex;justify-content:center;align-items:center;flex-direction:column}.depatment-container{background:#fff;border:1px solid rgba(27,76,161,.12);padding:5%;box-shadow:0 4px 6px #0000001a,0 8px 20px #00000026;border-radius:8px}.checked-label{color:#1b4ca1}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400}.mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}.mat-select-panel mat-option{padding-top:10px}::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}::ng-deep .select-with-search.mat-select-panel{padding-top:0;overflow:auto}::ng-deep .select-with-search .search-wrapper{position:sticky;top:0;z-index:10;background:#fff;padding:8px;border-bottom:1px solid #e0e0e0}::ng-deep .select-with-search .search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}::ng-deep .select-with-search mat-option:first-of-type{margin-top:4px}.btn-active-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}\n"] }]
1173
+ args: [{ selector: 'app-role-mapping-generation', template: "<div class=\"container\">\n <!-- <input class=\"btn-active\" type=\"button\" value=\"Download as PDF\" (click)=\"downloadPDF()\" /> -->\n <div class=\"logo-container\" *ngIf=\"login\">\n <div>\n <span class=\"ai-loader-icon-medium\"><img src=\"assets/icons/ai-loader.gif\"></span>\n </div>\n <div>\n <h2 class=\"highlight-ai\">\n <span>iGOT AI Driven CBP</span>\n </h2>\n </div>\n <!-- <div class=\"sub-heading\">\n <p>Build Your Capacity With Customized Role Mapping</p>\n </div> -->\n </div>\n <mat-card *ngIf=\"login && roleMappingForm\" class=\"mt-2\" [formGroup]=\"roleMappingForm\">\n <div class=\"depatment-container\">\n <!-- <div class=\"section-header\">-->\n <!-- <div class=\"sub-heading\">-->\n <!-- <p>Choose Your Department</p>-->\n <!-- </div>-->\n <!-- </div>-->\n\n <div class=\"radio-group mt-4\">\n <mat-radio-group class=\"radio-btn-group\" formControlName=\"ministryType\"\n [(ngModel)]=\"selectedMinistryType\" (change)=\"onMinistryTypeChange($event)\">\n\n <!-- Left radio button -->\n <mat-radio-button value=\"ministry\" class=\"radio-btn left-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'center'? 'checked-label':''\">domain</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'ministry'? 'checked-label':''\">Centre</span>\n </span>\n </mat-radio-button>\n\n <!-- Right radio button -->\n <mat-radio-button value=\"state\" class=\"radio-btn right-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">location_on</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">State</span>\n </span>\n </mat-radio-button>\n\n </mat-radio-group>\n </div>\n <div class=\"mt-4\">\n\n <label class=\"label\">\n <span *ngIf=\"selectedMinistryType === 'ministry'\">Ministry</span>\n <span *ngIf=\"selectedMinistryType === 'state'\">State</span>\n </label>\n <div class=\"mt-2 search-box-with-select\">\n\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n <mat-select panelClass=\"select-with-search\"\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministry\"\n style=\"border-radius: 25px; background: white; width:100%\"\n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <!-- [selected]=\"selectedMinistryId === item?.identifier\" -->\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredList\">{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"departmentData?.length\">\n <label class=\"label\">Department</label>\n <div class=\"mt-2\">\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;border: 1px solid #ccc;\">\n <mat-select #departmentSelect panelClass=\"select-with-search\" placeholder=\"Select Department\"\n formControlName=\"departments\" style=\"border-radius: 25px; background: white;\"\n (selectionChange)=\"onDepartmentChange()\" (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterDepartmentData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredDepartmentList\">{{item?.orgName}}</mat-option>\n <!-- selected department not present in the current search/page:\n kept rendered (hidden) so mat-select does not clear the selection -->\n <mat-option [value]=\"item?.identifier\" style=\"display: none\"\n *ngFor=\"let item of pinnedDepartmentOptions\">{{item?.orgName}}</mat-option>\n <mat-option disabled *ngIf=\"departmentLoading\">Loading...</mat-option>\n <mat-option disabled\n *ngIf=\"!departmentLoading && !filteredDepartmentList?.length\">No department found</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div>\n <!-- <div class=\"mt-4\">\n <label class=\"label\">Sector</label>\n <div>\n <mat-form-field appearance=\"fill\" style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select placeholder=\"Select Sector\" multiple formControlName=\"sectors\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"item?.value\"\n *ngFor=\"let item of sectorData\">{{item?.value}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <div class=\"mt-4 additional-details\">\n <textarea rows=\"5\" placeholder=\"Additional details\" formControlName=\"additionalDetails\"></textarea>\n </div>\n <div class=\"mt-4\">\n\n <button [ngClass]=\"disableUploadDocument ? 'btn-active-primary-disable':'btn-active-primary'\" class=\"\"\n [disabled]=\"disableUploadDocument\" mat-raised-button color=\"primary\" (click)=\"goToUploadDocument()\">\n <mat-icon>upload</mat-icon> Manage Documents\n </button>\n </div>\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-4 section\" >\n <div class=\"sub-heading\">\n <p>Upload Document (PDF)</p>\n </div>\n <div class=\"file-upload-wrapper\">\n <label for=\"uploadDoc\" class=\"file-upload-label\">\n <span class=\"file-upload-icon\">\uD83D\uDCCE</span>\n <span *ngIf=\"!uploadedFile || uploadedFile.length === 0\">\n Choose up to 3 files (PDF/TXT)\n </span>\n <div *ngIf=\"uploadedFile?.length > 0\" class=\"file-list\">\n <div *ngFor=\"let file of uploadedFile; let i = index\" class=\"file-item\">\n {{ file.name }}\n <span class=\"remove-file-icon\" (click)=\"removeFile(i);$event.preventDefault()\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </label>\n <input\n id=\"uploadDoc\"\n type=\"file\"\n multiple\n (change)=\"onFileChange($event)\"\n hidden\n /> \n\n <small class=\"file-upload-hint\">Max file size: {{maxFileSizeMB}}MB</small>\n\n <input id=\"uploadDoc\" multiple type=\"file\" (change)=\"onFileChange($event)\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt\" class=\"file-upload-input\" />\n\n <div *ngIf=\"uploadError\" class=\"error\">{{ uploadError }}</div>\n </div>\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-2 section\">\n <div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents. </p>\n </div>\n </div> -->\n <div class=\"mt-2\" *ngIf=\"(documents?.length < 1 || workAllocationOrderDocumentMissing) && !(roleMappingForm?.invalid) || showWorkAllocationOrderDocumentMissing\">\n <p><span style=\"font-size: .875rem;font-weight: bold;\">Note: </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity Building Plan (CBP)</span>\n </p>\n </div>\n <!-- <div class=\"mt-2\" *ngIf=\"documents?.length > 0\">\n <p *ngIf=\"workAllocationOrderDocumentMissing\"><span style=\"font-size: .875rem;font-weight: bold;\">Note:\n </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity\n Building Plan (CBP)</span>\n </p>\n </div> -->\n <div class=\"mt-4\">\n <input\n [disabled]=\"roleMappingForm?.invalid || loading || documents?.length < 1\"\n [ngClass]=\"\n roleMappingForm?.invalid || loading || documents?.length < 1\n ? 'btn-disable'\n : 'btn-active'\n \"\n type=\"button\"\n [value]=\"loading ? 'Generating CBP...' : 'Generate CBP'\"\n (click)=\"onGenerateRoleMapping()\"\n />\n</div>\n </div>\n </mat-card>\n\n</div>\n<!-- <div *ngIf=\"!login\">\n <app-login (success)=\"loginStatus($event)\"></app-login>\n </div> -->\n\n<div class=\"overlay-loader\" *ngIf=\"apiLoading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || 'Preparing CBP Plan generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"chunks.length > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" [style.width.%]=\"getDisplayProgressPercentage()\">\n </div>\n </div>\n <small class=\"progress-text\">{{ getDisplayProgressPercentage() }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time streaming in progress. This may take 2-3 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: [".container{width:40%}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.radio-btn-group{display:flex;justify-content:space-between;border-radius:8px;padding:12px 16px;align-items:center;max-width:600px;margin:0 auto;gap:20px}.radio-btn{flex:1;display:flex;align-items:center;justify-content:center;padding:10px;border-radius:6px;transition:background-color .3s ease}.radio-btn,.radio-btn:hover{background-color:#eef2f7}.radio-label{display:flex;align-items:center;gap:6px;font-weight:500;font-size:16px}.radio-icon{font-size:24px;color:gray}.radio-label{color:#000;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:18px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;border:none;outline:none;resize:none;box-shadow:none;border-radius:4px;border:1px solid #ccc}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:center}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:10px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex}.outside-layer{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:28px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:60px;height:60px;flex-shrink:0}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.overlay-loader .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;background:#fff;padding:2rem;border-radius:8px;box-shadow:0 4px 12px #00000026}.overlay-loader .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:300px}.overlay-loader .loading-content .loading-text .main-message{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.overlay-loader .loading-content .loading-text .progress-details{margin-top:16px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:12px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#2563eb);border-radius:4px;transition:width .5s ease-in-out}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:14px;font-weight:500;color:#1b4ca1;display:block;text-align:center}.overlay-loader .loading-content .loading-text .progress-details .time-estimate{color:#666;font-size:12px;font-style:italic;display:block;text-align:center;margin-top:8px}::ng-deep mat-option .mat-option-text{font-size:16px;color:#000;font-family:Lato}:host ::ng-deep mat-select .mat-select-placeholder{font-size:16px}:host mat-select .mat-select-value-text{font-size:16px!important}.logo-container{display:flex;justify-content:center;align-items:center;flex-direction:column}.depatment-container{background:#fff;border:1px solid rgba(27,76,161,.12);padding:5%;box-shadow:0 4px 6px #0000001a,0 8px 20px #00000026;border-radius:8px}.checked-label{color:#1b4ca1}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400}.mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}.mat-select-panel mat-option{padding-top:10px}::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}::ng-deep .select-with-search.mat-select-panel{padding-top:0;overflow:auto}::ng-deep .select-with-search .search-wrapper{position:sticky;top:0;z-index:10;background:#fff;padding:8px;border-bottom:1px solid #e0e0e0}::ng-deep .select-with-search .search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}::ng-deep .select-with-search mat-option:first-of-type{margin-top:4px}.btn-active-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}\n"] }]
1120
1174
  }], ctorParameters: function () { return [{ type: i1.EventService }, { type: i2.SharedService }, { type: i3.FormBuilder }, { type: i4.MatSnackBar }, { type: i5.MatDialog }, { type: i6.RoleMappingService }, { type: i7.Router }]; }, propDecorators: { pdfContent: [{
1121
1175
  type: ViewChild,
1122
1176
  args: ['pdfContent', { static: false }]
@@ -1132,4 +1186,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1132
1186
  type: ViewChild,
1133
1187
  args: ['departmentSelect', { static: false }]
1134
1188
  }] } });
1135
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBdUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakYsT0FBTyxRQUFRLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGtFQUFrRSxDQUFDO0FBRW5ILE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQWlCLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVy9FLE1BQU0sT0FBTyw4QkFBOEI7SUFnR3pDLFlBQ1UsUUFBc0IsRUFDdkIs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IElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgaHRtbDJwZGYgZnJvbSAnaHRtbDJwZGYuanMnO1xuaW1wb3J0IHsgRGVsZXRlUm9sZU1hcHBpbmdQb3B1cENvbXBvbmVudCB9IGZyb20gJy4uL2RlbGV0ZS1yb2xlLW1hcHBpbmctcG9wdXAvZGVsZXRlLXJvbGUtbWFwcGluZy1wb3B1cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IGludGVydmFsLCBvZiwgY29uY2F0LCBmb3JrSm9pbiwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgc3dpdGNoTWFwLCB0YWtlV2hpbGUsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHRha2VVbnRpbCwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1hdFNlbGVjdCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcbmltcG9ydCB7IFJvbGVNYXBwaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3JvbGUtbWFwcGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL2V2ZW50LnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJvbGUtbWFwcGluZy1nZW5lcmF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JvbGUtbWFwcGluZy1nZW5lcmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBSb2xlTWFwcGluZ0dlbmVyYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgncGRmQ29udGVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwZGZDb250ZW50ITogRWxlbWVudFJlZjtcbiAgXG4gIEBJbnB1dCgpIGxvZ2luU3RhdHVzRmxhZyA9IGZhbHNlXG4gIHRpdGxlID0gJ3N1bmJpcmQtY2Itc3RhdGljd2ViJztcbiAgaXNNYWludGVuYW5jZVBhZ2U6IGFueVxuICBzZWxlY3RlZFZhbHVlID0gJydcbiAgc2VhcmNoVGV4dCA9ICcnXG4gIGRhdGFTb3VyY2U6IGFueVxuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFsnUmVxdWVzdElkJywgJ3RpdGxlJywgJ3JlcXVlc3RvcicsICdyZXF1ZXN0VHlwZScsXG4gICAgJ3JlcXVlc3RTdGF0dXMnLCAnYXNzaWduZWUnLCAncmVxdWVzdGVkT24nLCAnaW50ZXJlc3RzJywgJ2FjdGlvbiddXG4gIHNlbGVjdGVkTWluaXN0cnlUeXBlOiBzdHJpbmcgPSAnbWluaXN0cnknO1xuICBtaW5pc3RyeURhdGE6IGFueSA9IFtdXG4gIG1pbmlzdHJ5RnVsbERhdGE6IGFueSA9IFtdXG4gIHJvbGVNYXBwaW5nRm9ybSE6IEZvcm1Hcm91cDtcbiAgZGlzYWJsZUJ0biA9IHRydWVcbiAgc2VjdG9yRGF0YSA9IFtcbiAgICB7XG4gICAgICB2YWx1ZTogJ1dvbWVuIGFuZCBjaGlsZCBkZXZlbG9wbWVudCdcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiAnUnVyYWwgZGV2ZWxvcG1lbnQnXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogJ1VyYmFuIGRldmVsb3BtZW50J1xuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6ICdIZWFsdGhjYXJlJ1xuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6ICdBZ3JpY3VsdHVyZSdcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiAnT3RoZXJzJ1xuICAgIH1cblxuICBdXG4gIGRlcGFydG1lbnREYXRhOiBhbnlbXSA9IFtdXG4gIGxvYWRpbmcgPSBmYWxzZVxuICBtYXhGaWxlU2l6ZU1CID0gMjU7XG4gIGFsbG93ZWRUeXBlcyA9IFtcbiAgICAnYXBwbGljYXRpb24vcGRmJyxcbiAgICAnYXBwbGljYXRpb24vbXN3b3JkJyxcbiAgICAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQnLFxuICAgICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLFxuICAgICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsXG4gICAgJ3RleHQvcGxhaW4nXG4gIF07XG4gIHVwbG9hZEVycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgdXBsb2FkZWRGaWxlOiBGaWxlW10gfCBudWxsID0gbnVsbDtcbiAgbG9naW4gPSBmYWxzZVxuICBjYnBGaW5hbE9iajogYW55ID0ge31cbiAgc2VsZWN0ZWRNaW5pc3RyeUlkID0gJydcbiAgb3JpZ2luYWxGb3JtVmFsdWVzOiBhbnlcbiAgY2h1bmtzOiBzdHJpbmdbXSA9IFtdO1xuICBmdWxsSnNvbjogc3RyaW5nID0gJyc7XG4gIHBhcnNlZERhdGE6IGFueTtcbiAgY3VycmVudFByb2Nlc3NpbmdTdGFnZTogc3RyaW5nID0gJyc7XG4gIHByb2Nlc3NpbmdTdGFnZXMgPSBbXG4gICAgJ0luaXRpYWxpemluZyBDQlAgUGxhbiBnZW5lcmF0aW9uLi4uJyxcbiAgICAnQW5hbHl6aW5nIGRlcGFydG1lbnRhbCBjb21wZXRlbmN5IHJlcXVpcmVtZW50cy4uLicsXG4gICAgJ1Byb2Nlc3Npbmcgd29yayBvcmRlciBzcGVjaWZpY2F0aW9ucyBhbmQgcm9sZSBkZWZpbml0aW9ucy4uLicsXG4gICAgJ0dlbmVyYXRpbmcgZGV0YWlsZWQgcm9sZXMgJiByZXNwb3NpYmlsaXRpZXMuLi4nLFxuICAgICdHZW5lcmF0aW5nIGRldGFpbGVkIGNvbXBldGVuY2llcy4uLicsXG4gICAgJ1ZhbGlkYXRpbmcgcm9sZSBtYXBwaW5nICBhbmQgZmluYWxpemluZyB0aGUgQ0JQIFBsYW4nXG4gIF07XG4gIEBPdXRwdXQoKSBzdWNjZXNzUm9sZU1hcHBpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICBAT3V0cHV0KCkgYWxyZWFkeUF2YWlsYWJsZVJvbGVNYXBwaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KClcbiAgQE91dHB1dCgpIGxvZ2luU3VjY2VzcyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIHNlbGVjdGVkTWluaXN0cnlPYmo6IGFueSA9ICcnXG4gIGxvZ2luVXNlck9yZ0lkcyA9IFtdXG4gIHBhbmVsT3BlbiA9IGZhbHNlO1xuICBkZXBhcnRtZW50UGFuZWxPcGVuID0gZmFsc2VcbiAgZmlsdGVyZWRMaXN0ID0gW107XG4gIGZpbHRlcmVkRGVwYXJ0bWVudExpc3Q6IGFueVtdID0gW107XG4gIHNlbGVjdGVkRGVwYXJ0bWVudE9iajogYW55ID0gbnVsbFxuICBwaW5uZWREZXBhcnRtZW50T3B0aW9uczogYW55W10gPSBbXVxuICBAVmlld0NoaWxkKCdkZXBhcnRtZW50U2VsZWN0JywgeyBzdGF0aWM6IGZhbHNlIH0pIGRlcGFydG1lbnRTZWxlY3QhOiBNYXRTZWxlY3Q7XG4gIGRlcGFydG1lbnRQYWdlU2l6ZSA9IDUwXG4gIGRlcGFydG1lbnRPZmZzZXQgPSAwXG4gIGRlcGFydG1lbnRIYXNNb3JlID0gdHJ1ZVxuICBkZXBhcnRtZW50TG9hZGluZyA9IGZhbHNlXG4gIGRlcGFydG1lbnRTZWFyY2hRdWVyeSA9ICcnXG4gIGRlcGFydG1lbnRNaW5pc3RyeUlkID0gJydcbiAgcHJpdmF0ZSBkZXBhcnRtZW50U2VhcmNoU3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKVxuICBwcml2YXRlIGRlcGFydG1lbnRSZXF1ZXN0SWQgPSAwXG4gIG9yaWdpbmFsTWluaXN0cnlEYXRhID0gW11cbiAgYXBpTG9hZGluZyA9IGZhbHNlXG4gIGZpcnN0QXBpUmVzcG9uc2U6IGFueSA9IG51bGxcbiAgZG9jdW1lbnRzID0gW11cbiAgZGlzYWJsZVVwbG9hZERvY3VtZW50ID0gdHJ1ZVxuICBkaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgd29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IGZhbHNlXG4gIHNob3dXb3JrQWxsb2NhdGlvbk9yZGVyRG9jdW1lbnRNaXNzaW5nID0gZmFsc2VcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgaW1tZWRpYXRlRmFpbHVyZUhhbmRsZWQgPSBmYWxzZTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBldmVudFN2YzogRXZlbnRTZXJ2aWNlLFxuICAgIHB1YmxpYyBzaGFyZWRTZXJ2aWNlOiBTaGFyZWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwdWJsaWMgcm9sZU1hcHBpbmdTZXJ2aWNlOiBSb2xlTWFwcGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxuICApIHtcbiAgICB0aGlzLnJvdXRlci5yb3V0ZVJldXNlU3RyYXRlZ3kuc2hvdWxkUmV1c2VSb3V0ZSA9ICgpID0+IGZhbHNlO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihbXSlcbiAgICB0aGlzLmlzTWFpbnRlbmFuY2VQYWdlID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9tYWludGVuYW5jZScpXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcblxuICAgIHRoaXMuZGVwYXJ0bWVudFNlYXJjaFN1YmplY3QucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICkuc3Vic2NyaWJlKChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLmRlcGFydG1lbnRTZWFyY2hRdWVyeSA9IHF1ZXJ5XG4gICAgICB0aGlzLmxvYWREZXBhcnRtZW50cyh0cnVlKVxuICAgIH0pXG5cbiAgICB0aGlzLmxvZ2luID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrSWZMb2dpbigpXG5cbiAgICB0aGlzLmNicEZpbmFsT2JqID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldENCUFBsYW5Mb2NhbFN0b3JhZ2UoKVxuICAgIGlmICh0aGlzLmNicEZpbmFsT2JqICYmIHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5ICYmIHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5zYk9yZ1R5cGUpIHtcblxuXG4gICAgICB0aGlzLmVkaXRNaW5pc3RyeUZvcm0oKVxuICAgICAgLy8gdGhpcy5nZXRNaW5pc3RyeURhdGEoKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5sb2dpbikge1xuICAgICAgICB0aGlzLmdldE1pbmlzdHJ5RGF0YSgpXG4gICAgICB9XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBtaW5pc3RyeVR5cGU6IFsnbWluaXN0cnknLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgbWluaXN0cnk6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgc2VjdG9yczogW1tdXSxcbiAgICAgICAgZGVwYXJ0bWVudHM6IFsnJ10sIC8vIHNob3duIG9ubHkgaWYgbWluaXN0cnlUeXBlID09ICdzdGF0ZSdcbiAgICAgICAgYWRkaXRpb25hbERldGFpbHM6IFsnJ10sXG4gICAgICAgIGFkZGl0aW9uYWxfZG9jdW1lbnQ6IFtdXG4gICAgICB9KTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnc2VjdG9ycycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5VHlwZScpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHR5cGUgPT4ge1xuICAgICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5yZXNldCh7XG4gICAgICAgICAgbWluaXN0cnlUeXBlOiB0eXBlLCAvLyBLZWVwIHRoZSBjaGFuZ2VkIHZhbHVlXG4gICAgICAgICAgbWluaXN0cnk6IG51bGwsXG4gICAgICAgICAgc2VjdG9yczogW10sXG4gICAgICAgICAgZGVwYXJ0bWVudHM6IFtdLFxuICAgICAgICAgIGFkZGl0aW9uYWxEZXRhaWxzOiAnJyxcbiAgICAgICAgICBhZGRpdGlvbmFsX2RvY3VtZW50OiBbXVxuICAgICAgICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7IC8vIGF2b2lkIHJlLWVtaXR0aW5nIG1pbmlzdHJ5VHlwZSdzIG93biB2YWx1ZUNoYW5nZXMgYW5kIHJlY3Vyc2luZyBpbmZpbml0ZWx5XG4gICAgaWYgKHR5cGUgPT09ICdzdGF0ZScpIHtcbiAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5jbGVhclZhbGlkYXRvcnMoKTtcbiAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG59IGVsc2Uge1xuICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LmNsZWFyVmFsaWRhdG9ycygpO1xuICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LnNldFZhbHVlKFtdKTtcbiAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG59XG4gICAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoc3RhdHVzOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IGhhc1VwbG9hZERvY3VtZW50cyA9IGZhbHNlXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGhhc1VwbG9hZERvY3VtZW50cyA9XG4gICAgICAgICAgICB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy91cGxvYWQtZG9jdW1lbnRzJyk7XG5cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVXBsb2FkRG9jdW1lbnRzKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrUm9sZU1hcHBpbmdGb3JtVmFsaWRhdGlvbi5uZXh0KHN0YXR1cyk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdWQUxJRCcpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICB9KTtcbiAgICB9XG5cblxuXG5cblxuXG4gIH1cblxuICBnZXRVcGxvYWRlZERvY3VtZW50cygpIHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlO1xuICAgIHRoaXMuYXBpTG9hZGluZyA9IHRydWVcbiAgICBsZXQgcmVxQm9keSA9IHtcbiAgICAgIHN0YXRlX2NlbnRlcl9pZDogZm9ybURhdGEubWluaXN0cnksXG4gICAgICBpbmNsdWRlX3N1bW1hcnk6IHRydWUsXG4gICAgICBza2lwOiAwLFxuICAgICAgbGltaXQ6IDIwMFxuICAgIH1cbiAgICBpZiAodHlwZW9mIGZvcm1EYXRhPy5kZXBhcnRtZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJlcUJvZHlbJ2RlcGFydG1lbnRfaWQnXSA9IGZvcm1EYXRhPy5kZXBhcnRtZW50c1xuICAgIH1cbiAgICB0aGlzLmFwaUxvYWRpbmcgPSB0cnVlXG5cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0VXBsb2FkZWREb2N1bWVudHMocmVxQm9keSkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGlmIChyZXMgJiYgcmVzPy5pdGVtcyAmJiByZXM/Lml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IHdBT0NvdW50ID0gMFxuICAgICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLmRvY3VtZW50cyA9IHJlcz8uaXRlbXNcblxuICAgICAgICBjb25zb2xlLmxvZygndGhpcy5kb2N1bWVudHMnLCB0aGlzLmRvY3VtZW50cylcbiAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSBmYWxzZVxuICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudE9yaWdpbmFsID0gZmFsc2VcbiAgICAgICAgdGhpcy5kb2N1bWVudHMuZm9yRWFjaCgoaXRlbSk9PntcbiAgICAgICAgICBpZihpdGVtPy5kb2N1bWVudF90eXBlID09PSAnV29yayBBbGxvY2F0aW9uIE9yZGVyJykge1xuICAgICAgICAgICAgd0FPQ291bnQgPXdBT0NvdW50KzFcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYod0FPQ291bnQgPCAxKSB7XG4gICAgICAgICAgdGhpcy53b3JrQWxsb2NhdGlvbk9yZGVyRG9jdW1lbnRNaXNzaW5nID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMud29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRvY3VtZW50cy0tJywgdGhpcy5kb2N1bWVudHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRvY3VtZW50cyA9IFtdXG4gICAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50ID0gZmFsc2VcbiAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IGZhbHNlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGVkaXRNaW5pc3RyeUZvcm0oKSB7XG4gICAgaWYgKHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5LnNiT3JnVHlwZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5LnNiT3JnVHlwZVxuICAgICAgYXdhaXQgdGhpcy5nZXRNaW5pc3RyeURhdGEoKVxuICAgICAgaWYgKHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5zYk9yZ1R5cGUpIHtcbiAgICAgICAgdGhpcy5kZXBhcnRtZW50TWluaXN0cnlJZCA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyXG4gICAgICAgIHRoaXMubG9hZERlcGFydG1lbnRzKHRydWUpXG4gICAgICB9XG5cbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG1pbmlzdHJ5VHlwZTogW3RoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBtaW5pc3RyeTogW3RoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgc2VjdG9yczogW1tdXSxcbiAgICAgICAgZGVwYXJ0bWVudHM6IFt0aGlzLmNicEZpbmFsT2JqPy5kZXBhcnRtZW50c10sIC8vIHNob3duIG9ubHkgaWYgbWluaXN0cnlUeXBlID09ICdzdGF0ZSdcbiAgICAgICAgYWRkaXRpb25hbERldGFpbHM6IFsnJ11cbiAgICAgIH0pO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKHN0YXR1czogYW55KSA9PiB7XG4gICAgICAgIGxldCBoYXNVcGxvYWREb2N1bWVudHMgPSBmYWxzZVxuICAgICAgICB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBoYXNVcGxvYWREb2N1bWVudHMgPVxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCcvdXBsb2FkLWRvY3VtZW50cycpO1xuXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWhhc1VwbG9hZERvY3VtZW50cykge1xuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jaGVja1JvbGVNYXBwaW5nRm9ybVZhbGlkYXRpb24ubmV4dChzdGF0dXMpO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdHVzID09PSAnVkFMSUQnKSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50T3JpZ2luYWwgPSBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50ID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50T3JpZ2luYWwgPSB0cnVlXG4gICAgICAgIH1cblxuICAgICAgfSk7XG5cbiAgICAgIC8vIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnc2VjdG9ycycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICAvLyB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5VHlwZScpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHR5cGUgPT4ge1xuICAgICAgLy8gICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5yZXNldCh7XG4gICAgICAvLyAgICAgbWluaXN0cnlUeXBlOiB0eXBlLCAvLyBLZWVwIHRoZSBjaGFuZ2VkIHZhbHVlXG4gICAgICAvLyAgICAgbWluaXN0cnk6IG51bGwsXG4gICAgICAvLyAgICAgc2VjdG9yczogW10sXG4gICAgICAvLyAgICAgZGVwYXJ0bWVudHM6IFtdLFxuICAgICAgLy8gICAgIGFkZGl0aW9uYWxEZXRhaWxzOiAnJ1xuICAgICAgLy8gICB9KTtcbiAgICAgIC8vICAgaWYgKHR5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgIC8vICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgICAgIC8vICAgfSBlbHNlIHtcbiAgICAgIC8vICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsdWUoW10pO1xuICAgICAgLy8gICB9XG4gICAgICAvLyAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgLy8gfSk7XG5cbiAgICAgIGlmICh0aGlzLm1pbmlzdHJ5RGF0YSAmJiB0aGlzLm1pbmlzdHJ5RGF0YS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5SWQgPSB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uaWRlbnRpZmllclxuICAgICAgfVxuXG4gICAgICAvL3RoaXMub25HZW5lcmF0ZVJvbGVNYXBwaW5nKClcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5zYk9yZ1R5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPSB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlXG4gICAgICBhd2FpdCB0aGlzLmdldE1pbmlzdHJ5RGF0YSgpXG4gICAgICB0aGlzLmRlcGFydG1lbnRNaW5pc3RyeUlkID0gdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXJcbiAgICAgIHRoaXMubG9hZERlcGFydG1lbnRzKHRydWUpXG4gICAgICBpZiAodGhpcy5taW5pc3RyeURhdGEgJiYgdGhpcy5taW5pc3RyeURhdGEubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeUlkID0gdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXJcbiAgICAgIH1cbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG1pbmlzdHJ5VHlwZTogW3RoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBtaW5pc3RyeTogW3RoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgc2VjdG9yczogW1tdXSxcbiAgICAgICAgZGVwYXJ0bWVudHM6IFt0aGlzLmNicEZpbmFsT2JqPy5kZXBhcnRtZW50c10sIC8vIHNob3duIG9ubHkgaWYgbWluaXN0cnlUeXBlID09ICdzdGF0ZSdcbiAgICAgICAgYWRkaXRpb25hbERldGFpbHM6IFt0aGlzLmNicEZpbmFsT2JqPy5hZGRpdGlvbmFsRGV0YWlsc11cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoc3RhdHVzOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IGhhc1VwbG9hZERvY3VtZW50cyA9IGZhbHNlXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGhhc1VwbG9hZERvY3VtZW50cyA9XG4gICAgICAgICAgICB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy91cGxvYWQtZG9jdW1lbnRzJyk7XG5cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVXBsb2FkRG9jdW1lbnRzKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrUm9sZU1hcHBpbmdGb3JtVmFsaWRhdGlvbi5uZXh0KHN0YXR1cyk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdWQUxJRCcpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICB9KTtcblxuICAgICAgLy8gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIC8vIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnbWluaXN0cnlUeXBlJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodHlwZSA9PiB7XG4gICAgICAvLyAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnJlc2V0KHtcbiAgICAgIC8vICAgICBtaW5pc3RyeVR5cGU6IHR5cGUsIC8vIEtlZXAgdGhlIGNoYW5nZWQgdmFsdWVcbiAgICAgIC8vICAgICBtaW5pc3RyeTogbnVsbCxcbiAgICAgIC8vICAgICBzZWN0b3JzOiBbXSxcbiAgICAgIC8vICAgICBkZXBhcnRtZW50czogW10sXG4gICAgICAvLyAgICAgYWRkaXRpb25hbERldGFpbHM6ICcnXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gICBpZiAodHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAvLyAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAvLyB9KTtcbiAgICAgIGNvbnNvbGUubG9nKCd0aGlzLm1pbmlzdHJ5RGF0YScsIHRoaXMubWluaXN0cnlEYXRhKVxuICAgICAgaWYgKHRoaXMubWluaXN0cnlEYXRhICYmIHRoaXMubWluaXN0cnlEYXRhLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlJZCA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub3JpZ2luYWxGb3JtVmFsdWVzID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICB0aGlzLmdldFVwbG9hZGVkRG9jdW1lbnRzKClcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMubG9naW4gPSB0aGlzLmxvZ2luU3RhdHVzRmxhZ1xuXG4gIH1cblxuICBnZXRDaGFuZ2VkRmllbGRzKG9yaWdpbmFsOiBhbnksIGN1cnJlbnQ6IGFueSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjaGFuZ2VkS2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIG9yaWdpbmFsKSB7XG4gICAgICBpZiAoIW9yaWdpbmFsLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gb3JpZ2luYWxba2V5XTtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRba2V5XTtcblxuICAgICAgLy8gRm9yIGFycmF5cyBhbmQgb2JqZWN0cywgdXNlIEpTT04uc3RyaW5naWZ5IChvciBsb2Rhc2ggaXNFcXVhbCBmb3IgZGVlcCBjb21wYXJpc29uKVxuICAgICAgY29uc3QgaXNFcXVhbCA9XG4gICAgICAgIHR5cGVvZiBvcmlnaW5hbFZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkob3JpZ2luYWxWYWx1ZSkgPT09IEpTT04uc3RyaW5naWZ5KGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICA6IG9yaWdpbmFsVmFsdWUgPT09IGN1cnJlbnRWYWx1ZTtcblxuICAgICAgaWYgKCFpc0VxdWFsKSB7XG4gICAgICAgIGNoYW5nZWRLZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlZEtleXM7XG4gIH1cblxuICBvbkdlbmVyYXRlUm9sZU1hcHBpbmcoKTogYW55IHtcblxuICAgIGNvbnN0IGN1cnJlbnRGb3JtVmFsdWVzID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICBjb25zdCBmb3JtRGF0YTogYW55ID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICBmb3JtRGF0YS5hcHBlbmQoJ21pbmlzdHJ5VHlwZScsIGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5VHlwZSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdtaW5pc3RyeScsIGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5KTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ3NlY3RvcnMnLCBKU09OLnN0cmluZ2lmeShjdXJyZW50Rm9ybVZhbHVlcy5zZWN0b3JzKSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdkZXBhcnRtZW50cycsIEpTT04uc3RyaW5naWZ5KGN1cnJlbnRGb3JtVmFsdWVzLmRlcGFydG1lbnRzKSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdhZGRpdGlvbmFsRGV0YWlscycsIGN1cnJlbnRGb3JtVmFsdWVzLmFkZGl0aW9uYWxEZXRhaWxzIHx8ICcnKTtcbiAgICBjb25zdCBmaWxlOiBGaWxlID0gdGhpcy51cGxvYWRlZEZpbGUgfHwgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdhZGRpdGlvbmFsX2RvY3VtZW50Jyk/LnZhbHVlO1xuICAgIGNvbnNvbGUubG9nKCdmaWxlJywgZmlsZSlcbiAgICBpZiAoZmlsZSkge1xuICAgICAgZm9ybURhdGEuYXBwZW5kKCdhZGRpdGlvbmFsX2RvY3VtZW50JywgZmlsZSk7XG4gICAgfVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRzJ10gPSBjdXJyZW50Rm9ybVZhbHVlcz8uZGVwYXJ0bWVudHNcbiAgICBjb25zdCBkZXBhcnRtZW50TmFtZSA9IHRoaXMuZGVwYXJ0bWVudERhdGEuZmluZCh1ID0+IHUuaWRlbnRpZmllciA9PT0gY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpO1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gZGVwYXJ0bWVudE5hbWU/Lm9yZ05hbWVcbiAgICBjb25zdCBzZWxlY3RlZE1pbmlzdHJ5ID0gdGhpcy5taW5pc3RyeURhdGEuZmluZChpdGVtID0+XG4gICAgICBpdGVtLmlkZW50aWZpZXIgPT09IGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5XG4gICAgKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeU9iaiA9IHNlbGVjdGVkTWluaXN0cnk7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnknXSA9IHNlbGVjdGVkTWluaXN0cnlcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgY29uc29sZS5sb2coJ3RoaXMucm9sZU1hcHBpbmdGb3JtJywgdGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgY29uc29sZS5sb2coJ2Zvcm1EYXRhLS0nLCBmb3JtRGF0YSlcbiAgICBmb3IgKGNvbnN0IHBhaXIgb2YgZm9ybURhdGEuZW50cmllcygpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgJHtwYWlyWzBdfTpgLCBwYWlyWzFdKTtcbiAgICB9XG5cblxuICAgIGNvbnN0IGNoYW5nZWRGaWVsZHMgPSB0aGlzLmdldENoYW5nZWRGaWVsZHModGhpcy5vcmlnaW5hbEZvcm1WYWx1ZXMsIGN1cnJlbnRGb3JtVmFsdWVzKTtcblxuICAgIGlmIChjaGFuZ2VkRmllbGRzLmxlbmd0aCA+IDAgfHwgKGZpbGUgJiYgZmlsZS5zaXplID4gMCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdjaGFuZ2VkRmllbGRzJywgY2hhbmdlZEZpZWxkcylcbiAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VkIGZpZWxkczonLCBjaGFuZ2VkRmllbGRzKTtcbiAgICAgIGlmIChjaGFuZ2VkRmllbGRzLmluY2x1ZGVzKCdhZGRpdGlvbmFsRGV0YWlscycpICYmIHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLmFkZGl0aW9uYWxEZXRhaWxzPy50cmltKCkgfHwgKGZpbGUgJiYgZmlsZS5zaXplID4gMCkpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZWxldGVSb2xlTWFwcGluZ1BvcHVwQ29tcG9uZW50LCB7XG4gICAgICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICAgICAgZGF0YToge2RvY3VtZW50czogdGhpcy5kb2N1bWVudHN9LFxuICAgICAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgICAgIG1heEhlaWdodDogJzgwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgICAgICB9KTtcblxuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5kZWxldGVSb2xlTWFwcGluZ0J5U3RhdGVBbmREZXBhcnRtZW50KHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLm1pbmlzdHJ5LCB0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWx1ZS5kZXBhcnRtZW50cykuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCByZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdEFwaVJlc3BvbnNlID0gW11cbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBbXVxuICAgICAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvcj8uZXJyb3I/LmRldGFpbCwgJ1gnLCB7XG4gICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVGaW5hbFJvbGVNYXBwaW5nKClcbiAgICAgIGNvbnNvbGUubG9nKCdObyBjaGFuZ2VzIGRldGVjdGVkLicpO1xuICAgIH1cblxuICB9XG5cblxuICBnZXRNaW5pc3RyeURhdGEoKSB7XG4gICAgdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZVxuICAgIGNvbnN0IHJlcXVlc3RlZFR5cGUgPSB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0TWluaXN0cnlEYXRhKHJlcXVlc3RlZFR5cGUpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdkYXRhLS0nLCBkYXRhKVxuICAgICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAvLyBJZ25vcmUgc3RhbGUgcmVzcG9uc2VzIGZyb20gYSB0eXBlIHRoYXQgd2FzIGNoYW5nZWQgYWdhaW4gYmVmb3JlIHRoaXMgb25lIHJldHVybmVkXG4gICAgICAgIGlmIChyZXF1ZXN0ZWRUeXBlICE9PSB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5taW5pc3RyeUZ1bGxEYXRhID0gZGF0YVxuICAgICAgICB0aGlzLm1pbmlzdHJ5RGF0YSA9IFtdXG4gICAgICAgIGlmIChyZXF1ZXN0ZWRUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgICAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbT8uc2JPcmdUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgICAgICAgIHRoaXMubWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RlZFR5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtPy5zYk9yZ1R5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICAgICAgdGhpcy5taW5pc3RyeURhdGEucHVzaChpdGVtKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdldFVzZXJQcm9maWxlRGF0YShyZXF1ZXN0ZWRUeXBlLCByZXNvbHZlKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgb25NaW5pc3RyeVR5cGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBjb25zb2xlLmxvZygnZXZlbnQnLCBldmVudClcblxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ21pbmlzdHJ5VHlwZSddID0gZXZlbnQudmFsdWVcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID0gW11cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2Uucm9sZU1hcHBpbmdHZW5lcmF0aW9uRGF0YSA9IFtdXG4gICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9IGV2ZW50LnZhbHVlXG4gICAgdGhpcy5taW5pc3RyeURhdGEgPSBbXVxuXG4gICAgaWYgKHRoaXMubG9naW4pIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0TWluaXN0cnlEYXRhKClcbiAgICB9XG5cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgaWYgKGV2ZW50Py52YWx1ZSA9PT0gJ3N0YXRlJykge1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdtaW5pc3RyeScpPy5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnc2VjdG9ycycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LnNldFZhbHVlKFtdKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50Py52YWx1ZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdtaW5pc3RyeScpPy5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnc2VjdG9ycycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LnNldFZhbHVlKFtdKTtcbiAgICB9XG5cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydtaW5pc3RyeSddID0gJydcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50X25hbWUnXSA9ICcnXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnZGVwYXJ0bWVudHMnXSA9ICcnXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgIC8vIHRoaXMucm9sZU1hcHBpbmdGb3JtLnJlc2V0KClcbiAgICBpZiAoIXRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmo/Lm1pbmlzdHJ5KSB7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zZXRFcnJvcnMoeyBpbnZhbGlkOiB0cnVlIH0pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgLy8gIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50ID0gdHJ1ZVxuICAgICAgICAvLyAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50T3JpZ2luYWwgPSB0cnVlXG4gICAgICB9LCA1MDAwKVxuICAgIH1cbiAgfVxuXG4gIG9uTWluaXN0cnlDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHNlbGVjdGVkTWluaXN0cnlJZCA9IGV2ZW50LnZhbHVlO1xuICAgIGNvbnNvbGUubG9nKCdTZWxlY3RlZCBNaW5pc3RyeSBJRDonLCBzZWxlY3RlZE1pbmlzdHJ5SWQpO1xuICAgIHRoaXMuZGVwYXJ0bWVudERhdGEgPSBbXVxuICAgIC8vIFlvdSBjYW4gYWNjZXNzIHRoZSBzZWxlY3RlZCBvYmplY3QgaWYgbmVlZGVkXG4gICAgY29uc3Qgc2VsZWN0ZWRNaW5pc3RyeSA9IHRoaXMubWluaXN0cnlEYXRhLmZpbmQoaXRlbSA9PiBpdGVtLmlkZW50aWZpZXIgPT09IHNlbGVjdGVkTWluaXN0cnlJZCk7XG4gICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5T2JqID0gc2VsZWN0ZWRNaW5pc3RyeVxuICAgIGNvbnNvbGUubG9nKCdTZWxlY3RlZCBNaW5pc3RyeTonLCBzZWxlY3RlZE1pbmlzdHJ5KTsgYGBcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydtaW5pc3RyeSddID0gc2VsZWN0ZWRNaW5pc3RyeVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSBbXVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5yb2xlTWFwcGluZ0dlbmVyYXRpb25EYXRhID0gW11cbiAgICAvLyBTZWxlY3RpbmcgYSBkaWZmZXJlbnQgbWluaXN0cnkvc3RhdGUgaW52YWxpZGF0ZXMgYW55IHByZXZpb3VzbHkgc2VsZWN0ZWQgZGVwYXJ0bWVudFxuICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsdWUobnVsbCk7XG4gICAgdGhpcy5zZWxlY3RlZERlcGFydG1lbnRPYmogPSBudWxsXG4gICAgdGhpcy5waW5uZWREZXBhcnRtZW50T3B0aW9ucyA9IFtdXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnZGVwYXJ0bWVudF9uYW1lJ10gPSAnJ1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRzJ10gPSAnJ1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYnBQbGFuRmluYWxPYmonLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKSlcbiAgICBpZiAoc2VsZWN0ZWRNaW5pc3RyeUlkICYmICh0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnc3RhdGUnIHx8IHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdtaW5pc3RyeScpKSB7XG4gICAgICB0aGlzLmRlcGFydG1lbnRNaW5pc3RyeUlkID0gc2VsZWN0ZWRNaW5pc3RyeUlkXG4gICAgICB0aGlzLmRlcGFydG1lbnRTZWFyY2hRdWVyeSA9ICcnXG4gICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSBbXVxuICAgICAgdGhpcy5sb2FkRGVwYXJ0bWVudHModHJ1ZSlcbiAgICB9XG5cbiAgICB0aGlzLmdldFVwbG9hZGVkRG9jdW1lbnRzKClcbiAgICBjb25zb2xlLmxvZygnR2VuZXJhdGUgQ0JQIHZhbGlkYXRpb246Jywge1xuICBmb3JtVmFsaWQ6IHRoaXMucm9sZU1hcHBpbmdGb3JtPy52YWxpZCxcbiAgZm9ybUludmFsaWQ6IHRoaXMucm9sZU1hcHBpbmdGb3JtPy5pbnZhbGlkLFxuICBsb2FkaW5nOiB0aGlzLmxvYWRpbmcsXG4gIGRvY3VtZW50czogdGhpcy5kb2N1bWVudHMsXG4gIGRvY3VtZW50c0xlbmd0aDogdGhpcy5kb2N1bWVudHM/Lmxlbmd0aCxcbiAgZGlzYWJsZWQ6XG4gICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0/LmludmFsaWQgfHxcbiAgICB0aGlzLmxvYWRpbmcgfHxcbiAgICB0aGlzLmRvY3VtZW50cz8ubGVuZ3RoIDwgMVxufSk7XG4gIH1cblxuICBzZWFyY2hEYXRhKCkge1xuXG4gIH1cblxuICBhcHBseUZpbHRlcigpIHtcblxuICB9XG5cbiAgZG93bmxvYWRQREYoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMucGRmQ29udGVudC5uYXRpdmVFbGVtZW50O1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIG1hcmdpbjogMC41LFxuICAgICAgZmlsZW5hbWU6ICdDQlBfUGxhbi5wZGYnLFxuICAgICAgaW1hZ2U6IHsgdHlwZTogJ2pwZWcnLCBxdWFsaXR5OiAwLjk4IH0sXG4gICAgICBodG1sMmNhbnZhczoge1xuICAgICAgICBzY2FsZTogMixcbiAgICAgICAgdXNlQ09SUzogdHJ1ZSwgIC8vIEltcG9ydGFudCBmb3IgZXh0ZXJuYWwgaW1hZ2VzL2ljb25zXG4gICAgICB9LFxuICAgICAganNQREY6IHtcbiAgICAgICAgdW5pdDogJ2luJyxcbiAgICAgICAgZm9ybWF0OiAnYTQnLFxuICAgICAgICBvcmllbnRhdGlvbjogJ3BvcnRyYWl0J1xuICAgICAgfVxuICAgIH07XG5cbiAgICBodG1sMnBkZigpLmZyb20oZWxlbWVudCkuc2V0KG9wdGlvbnMpLnNhdmUoKTtcblxuICB9XG5cbiAgb25GaWxlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBmaWxlczogRmlsZUxpc3QgPSBldmVudC50YXJnZXQuZmlsZXM7XG4gICAgY29uc3QgbWF4RmlsZXMgPSAzO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2FkZGl0aW9uYWxfZG9jdW1lbnQnKTtcblxuICAgIC8vIEFsd2F5cyBjbGVhciBjb250cm9sIGZpcnN0IChwcmV2ZW50cyBvbGQgdmFsaWQgdmFsdWUpXG4gICAgY29udHJvbD8ucmVzZXQoKTtcbiAgICBjb250cm9sPy5zZXRFcnJvcnMobnVsbCk7XG4gICAgdGhpcy51cGxvYWRlZEZpbGUgPSBbXTtcbiAgICB0aGlzLnVwbG9hZEVycm9yID0gbnVsbDtcblxuICAgIGlmICghZmlsZXMgfHwgZmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAvLyBMaW1pdCBjaGVja1xuICAgIGlmIChmaWxlcy5sZW5ndGggPiBtYXhGaWxlcykge1xuICAgICAgdGhpcy51cGxvYWRFcnJvciA9IGBZb3UgY2FuIHVwbG9hZCBhIG1heGltdW0gb2YgJHttYXhGaWxlc30gZmlsZXNgO1xuICAgICAgY29udHJvbD8uc2V0RXJyb3JzKHsgbWF4RmlsZXM6IHRydWUgfSk7XG4gICAgICBjb250cm9sPy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgY29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xuICAgICAgY29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkRmlsZXM6IEZpbGVbXSA9IFtdO1xuICAgIGNvbnN0IGludmFsaWRGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBtYXhCeXRlcyA9IHRoaXMubWF4RmlsZVNpemVNQiAqIDEwMjQgKiAxMDI0O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZmlsZSA9IGZpbGVzW2ldO1xuXG4gICAgICAvLyBTaXplIGNoZWNrXG4gICAgICBpZiAoZmlsZS5zaXplID4gbWF4Qnl0ZXMpIHtcbiAgICAgICAgaW52YWxpZEZpbGVzLnB1c2goYCR7ZmlsZS5uYW1lfSAoZXhjZWVkcyAke3RoaXMubWF4RmlsZVNpemVNQn1NQilgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFR5cGUgY2hlY2tcbiAgICAgIGlmICghdGhpcy5hbGxvd2VkVHlwZXMuaW5jbHVkZXMoZmlsZS50eXBlKSkge1xuICAgICAgICBpbnZhbGlkRmlsZXMucHVzaChgJHtmaWxlLm5hbWV9IChpbnZhbGlkIHR5cGUpYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YWxpZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgfVxuXG4gICAgLy8g4p2MIE5PIHZhbGlkIGZpbGVzIOKGkiBmb3JtIE1VU1QgQkUgaW52YWxpZFxuICAgIGlmICh2YWxpZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy51cGxvYWRFcnJvciA9IGBJbnZhbGlkIGZpbGUocyk6ICR7aW52YWxpZEZpbGVzLmpvaW4oJywgJyl9YDtcblxuICAgICAgY29udHJvbD8uc2V0VmFsdWUobnVsbCk7XG4gICAgICBjb250cm9sPy5zZXRFcnJvcnMoeyBpbnZhbGlkRmlsZXM6IHRydWUgfSk7XG4gICAgICBjb250cm9sPy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgY29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xuICAgICAgY29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zZXRFcnJvcnMoeyBpbnZhbGlkOiB0cnVlIH0pO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIH0sIDUwMDApXG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDinJQgQXQgbGVhc3QgT05FIHZhbGlkIGZpbGUg4oaSIGZvcm0gc2hvdWxkIGJlIFZBTElEXG4gICAgdGhpcy51cGxvYWRlZEZpbGUgPSB2YWxpZEZpbGVzO1xuXG4gICAgaWYgKGludmFsaWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yID0gYFNvbWUgZmlsZXMgd2VyZSBza2lwcGVkOiAke2ludmFsaWRGaWxlcy5qb2luKCcsICcpfWA7XG4gICAgfVxuXG4gICAgY29udHJvbD8uc2V0VmFsdWUodmFsaWRGaWxlcyk7XG4gICAgY29udHJvbD8uc2V0RXJyb3JzKG51bGwpO1xuICAgIGNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XG4gICAgY29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xuICAgIGNvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICB9XG5cblxuXG5cblxuXG4gIGxvZ2luU3RhdHVzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICB0aGlzLmxvZ2luID0gdHJ1ZVxuICAgICAgdGhpcy5sb2dpblN1Y2Nlc3MuZW1pdCh0cnVlKVxuICAgICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9ICdtaW5pc3RyeSdcblxuICAgICAgdGhpcy5nZXRNaW5pc3RyeURhdGEoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZ2luID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKSB7XG4gICAgdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmltbWVkaWF0ZUZhaWx1cmVIYW5kbGVkID0gZmFsc2VcblxuICAgIGlmICghdGhpcy5yb2xlTWFwcGluZ0Zvcm0udmFsaWQpIHtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50Rm9ybVZhbHVlcyA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldFJhd1ZhbHVlKCk7XG4gICAgbGV0IGZvcm1VcGxvYWREYXRhID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICAvLyBNaW5pc3RyeSBzZWxlY3Rpb25cbiAgICBjb25zdCBzZWxlY3RlZE1pbmlzdHJ5ID0gdGhpcy5taW5pc3RyeURhdGEuZmluZChpdGVtID0+XG4gICAgICBpdGVtLmlkZW50aWZpZXIgPT09IGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5XG4gICAgKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeU9iaiA9IHNlbGVjdGVkTWluaXN0cnk7XG5cbiAgICAvLyBBcHBlbmQgYmFzZSBmaWVsZHNcbiAgICBmb3JtVXBsb2FkRGF0YS5hcHBlbmQoJ3N0YXRlX2NlbnRlcl9pZCcsIGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5IHx8ICcnKTtcbiAgICBmb3JtVXBsb2FkRGF0YS5hcHBlbmQoJ3N0YXRlX2NlbnRlcl9uYW1lJywgc2VsZWN0ZWRNaW5pc3RyeT8ub3JnTmFtZSB8fCAnJyk7XG5cbiAgICBpZiAoY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpIHtcbiAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnZGVwYXJ0bWVudF9pZCcsIGN1cnJlbnRGb3JtVmFsdWVzLmRlcGFydG1lbnRzKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudEZvcm1WYWx1ZXMuYWRkaXRpb25hbERldGFpbHMpIHtcbiAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnaW5zdHJ1Y3Rpb24nLCBjdXJyZW50Rm9ybVZhbHVlcy5hZGRpdGlvbmFsRGV0YWlscyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHVwbG9hZGVkIGZpbGUocylcbiAgICBjb25zdCBmaWxlczogRmlsZSB8IEZpbGVbXSA9XG4gICAgICB0aGlzLnVwbG9hZGVkRmlsZSB8fCB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2FkZGl0aW9uYWxfZG9jdW1lbnQnKT8udmFsdWU7XG5cbiAgICBjb25zb2xlLmxvZygnRmlsZXMgc2VsZWN0ZWQ6JywgZmlsZXMpO1xuXG4gICAgLy8gQXBwZW5kIHNpbmdsZSBvciBtdWx0aXBsZSBmaWxlc1xuICAgIGlmIChmaWxlcykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsZXMpKSB7XG4gICAgICAgIGZpbGVzLmZvckVhY2goKGZpbGU6IEZpbGUpID0+IHtcbiAgICAgICAgICBmb3JtVXBsb2FkRGF0YS5hcHBlbmQoJ2FkZGl0aW9uYWxfZG9jdW1lbnQnLCBmaWxlLCBmaWxlLm5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnYWRkaXRpb25hbF9kb2N1bWVudCcsIGZpbGVzLCBmaWxlcy5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWJ1ZzogcHJpbnQgRm9ybURhdGFcbiAgICBjb25zb2xlLmxvZyhcIkZvcm1EYXRhIERlYnVnOlwiKTtcbiAgICBmb3JtVXBsb2FkRGF0YS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2tleX06IEZJTEUgLT4gJHt2YWx1ZS5uYW1lfSAoJHt2YWx1ZS5zaXplfSBieXRlcylgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2tleX06ICR7dmFsdWV9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cblxuICAgIC8vIEJ1aWxkIHJlcXVlc3QgYm9keSBmb3IgcG9sbGluZyBBUElcbiAgICBsZXQgcmVxOiBhbnkgPSB7XG4gICAgICBzdGF0ZV9jZW50ZXJfaWQ6IGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5LFxuICAgICAgaW5zdHJ1Y3Rpb246IGN1cnJlbnRGb3JtVmFsdWVzLmFkZGl0aW9uYWxEZXRhaWxzLFxuICAgICAgc3RhdGVfY2VudGVyX25hbWU6IHNlbGVjdGVkTWluaXN0cnk/Lm9yZ05hbWVcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdzdGF0ZScgfHwgY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpIHtcbiAgICAgIGNvbnN0IGRlcGFydG1lbnROYW1lID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maW5kKFxuICAgICAgICBkID0+IGQuaWRlbnRpZmllciA9PT0gY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHNcbiAgICAgICk7XG5cbiAgICAgIHJlcS5kZXBhcnRtZW50X2lkID0gY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMgfHwgJyc7XG4gICAgICByZXEuZGVwYXJ0bWVudF9uYW1lID0gZGVwYXJ0bWVudE5hbWU/Lm9yZ05hbWUgfHwgJyc7XG4gICAgfVxuXG5cblxuICAgIC8vIFBvbGxpbmcgQVBJXG4gICAgY29uY2F0KFxuICAgICAgb2YobnVsbCksICAgICAgICAgICAgICAvLyDwn5SlIGltbWVkaWF0ZSBmaXJzdCBlbWlzc2lvblxuICAgICAgaW50ZXJ2YWwoNTAwMCkgICAgICAgICAvLyDij7Egc3Vic2VxdWVudCBwb2xsaW5nIGV2ZXJ5IDVzXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuc2hhcmVkU2VydmljZS5nZW5lcmF0ZVJvbGVNYXBwaW5nKHJlcSwgZmlsZXMpKSxcbiAgICAgICAgdGFwKGRhdGEgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5maXJzdEFwaVJlc3BvbnNlKSB7XG4gICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBkYXRhOyAvLyDwn5GIIHN0b3JlIGZpcnN0IHJlc3BvbnNlXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmlyc3QgQVBJIHJlc3BvbnNlOicsIHRoaXMuZmlyc3RBcGlSZXNwb25zZSk7XG4gICAgICAgICAgICBpZihkYXRhICYmIGRhdGE/LnN0YXR1cyA9PT0gJ0ZBSUxFRCcpIHtcbiAgICAgICAgICAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgICB0aGlzLmltbWVkaWF0ZUZhaWx1cmVIYW5kbGVkID0gdHJ1ZSAvLyB0YWtlV2hpbGUgc3RpbGwgZm9yd2FyZHMgdGhpcyBzYW1lIHZhbHVlIHRvIHN1YnNjcmliZSgpOyB0ZWxsIGl0IHRvIHNraXBcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTsgICAvLyDwn5uRIHN0b3AgcG9sbGluZ1xuICAgICAgICAgICAgICAgIHRoaXMucmVnZW5lcmF0ZVJvbGVNYXBwaW5nQWZ0ZXJGYWlsZWRBbmREZWxldGUoKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVdoaWxlKFxuICAoZGF0YTogYW55KSA9PlxuICAgIGRhdGE/LnN0YXR1cyAhPT0gJ0NPTVBMRVRFRCcgJiZcbiAgICBkYXRhPy5zdGF0dXMgIT09ICdGQUlMRUQnLFxuICB0cnVlIC8vIGVtaXQgdGhlIGZpbmFsIENPTVBMRVRFRC9GQUlMRUQgcmVzcG9uc2VcbilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmltbWVkaWF0ZUZhaWx1cmVIYW5kbGVkKSB7XG4gICAgICAgICAgdGhpcy5pbW1lZGlhdGVGYWlsdXJlSGFuZGxlZCA9IGZhbHNlIC8vIGFscmVhZHkgaGFuZGxlZCBpbiB0YXAoKSBhYm92ZTsgYXZvaWQgZG91YmxlLWhhbmRsaW5nIHRoaXMgc2FtZSBlbWlzc2lvblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdyb2xlIG1hcHBpbmcgZGF0YS0tJywgZGF0YSlcbiAgICAgICAgaWYgKHRoaXMuZmlyc3RBcGlSZXNwb25zZT8uaXNfZXhpc3RpbmcpIHtcbiAgICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICB0aGlzLnNob3dXb3JrQWxsb2NhdGlvbk9yZGVyRG9jdW1lbnRNaXNzaW5nID0gZmFsc2VcbiAgICAgICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTsgICAvLyDwn5uRIHN0b3AgcG9sbGluZ1xuICAgICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERlbGV0ZVJvbGVNYXBwaW5nUG9wdXBDb21wb25lbnQsIHtcbiAgICAgICAgICAgIHdpZHRoOiAnNDAwcHgnLFxuICAgICAgICAgICAgZGF0YToge2RvY3VtZW50czogdGhpcy5kb2N1bWVudHN9LFxuICAgICAgICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgICAgICAgbWluSGVpZ2h0OiAnMzAwcHgnLCAgICAgICAgICAvLyBTZXQgbWluaW11bSBoZWlnaHRcbiAgICAgICAgICAgIG1heEhlaWdodDogJzgwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NoYW5nZXMgc2F2ZWQhJyk7XG5cbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZGVsZXRlUm9sZU1hcHBpbmdCeVN0YXRlQW5kRGVwYXJ0bWVudCh0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWx1ZS5taW5pc3RyeSwgdGhpcy5yb2xlTWFwcGluZ0Zvcm0udmFsdWUuZGVwYXJ0bWVudHMpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gU3VjY2VzcyBoYW5kbGluZ1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1N1Y2Nlc3M6JywgcmVzKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBbXVxuICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKGVycm9yPy5lcnJvcj8uZGV0YWlsLCAnWCcsIHtcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBbXVxuICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2VuZXJhdGVGaW5hbFJvbGVNYXBwaW5nKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT09ICdidXR0b24nKSB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgIC8vIHRoaXMuZ2VuZXJhdGVGaW5hbFJvbGVNYXBwaW5nKClcbiAgICAgICAgICAgICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pO1xuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VXJsID0gdGhpcy5yb3V0ZXIudXJsO1xuXG4gICAgICAgICAgICAgIC8vIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoJy8nLCB7IHNraXBMb2NhdGlvbkNoYW5nZTogdHJ1ZSB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgLy8gICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGN1cnJlbnRVcmwpO1xuICAgICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsncm9sZV9tYXBwaW5nX2dlbmVyYXRpb24nXSA9XG4gICAgICAgICAgICAgICAgZGF0YT8ucm9sZV9tYXBwaW5ncztcbiAgICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnJvbGVNYXBwaW5nR2VuZXJhdGlvbkRhdGEgPSBkYXRhPy5yb2xlX21hcHBpbmdzO1xuICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICAgICAnY2JwUGxhbkZpbmFsT2JqJyxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHRoaXMuc3VjY2Vzc1JvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pO1xuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9haS9saXN0J10sIHtcbiAgICAgICAgICAgICAgICBvblNhbWVVcmxOYXZpZ2F0aW9uOiAncmVsb2FkJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgLy8gd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICBcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLndvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcpIHtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5zaG93V29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IHRydWVcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YT8uc3RhdHVzID09PSAnQ09NUExFVEVEJykge1xuICAgICAgICAgIHRoaXMuc2hvd1dvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsncm9sZV9tYXBwaW5nX2dlbmVyYXRpb24nXSA9XG4gICAgICAgICAgICBkYXRhPy5yb2xlX21hcHBpbmdzO1xuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5yb2xlTWFwcGluZ0dlbmVyYXRpb25EYXRhID0gZGF0YT8ucm9sZV9tYXBwaW5ncztcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICdjYnBQbGFuRmluYWxPYmonLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iailcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5zdWNjZXNzUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSk7XG5cbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0NCUCBQbGFuIGdlbmVyYXRlZCBzdWNjZXNzZnVsbHkhJywgJ1gnLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9haS9saXN0J10pO1xuICAgICAgICB9IGVsc2UgaWYoZGF0YSAmJiBkYXRhPy5zdGF0dXMgPT09ICdGQUlMRUQnKSB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTsgICAvLyDwn5uRIHN0b3AgcG9sbGluZ1xuICAgICAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignR2VuZXJhdGlvbiBmYWlsZWQgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcicsICdYJywge1xuICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlUHJvY2Vzc2luZ1N0YWdlKCkge1xuICAgIGNvbnN0IGNodW5rQ291bnQgPSB0aGlzLmNodW5rcy5sZW5ndGg7XG4gICAgbGV0IHN0YWdlSW5kZXggPSAwO1xuXG4gICAgLy8gTXVjaCBzbG93ZXIgc3RhZ2UgcHJvZ3Jlc3Npb24gLSBzdGFnZXMgc3RheSBtdWNoIGxvbmdlclxuICAgIGlmIChjaHVua0NvdW50IDw9IDgpIHtcbiAgICAgIHN0YWdlSW5kZXggPSAwOyAvLyBJbml0aWFsaXppbmcgLSBzdGF5cyBmb3IgZmlyc3QgOCBjaHVua3NcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gMjApIHtcbiAgICAgIHN0YWdlSW5kZXggPSAxOyAvLyBBbmFseXppbmcgY29tcGV0ZW5jeSByZXF1aXJlbWVudHMgLSAxMiBjaHVua3NcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gMzUpIHtcbiAgICAgIHN0YWdlSW5kZXggPSAyOyAvLyBQcm9jZXNzaW5nIHdvcmsgb3JkZXIgLSAxNSBjaHVua3NcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gNTUpIHtcbiAgICAgIHN0YWdlSW5kZXggPSAzOyAvLyBHZW5lcmF0aW5nIHJvbGUgbWFwcGluZ3MgLSAyMCBjaHVua3NcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gNzUpIHtcbiAgICAgIHN0YWdlSW5kZXggPSA0OyAvLyBDb21wdXRpbmcgZmluYWwgcmVjb21tZW5kYXRpb25zIC0gMjAgY2h1bmtzXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YWdlSW5kZXggPSA1OyAvLyBGaW5hbGl6aW5nIENCUCBQbGFuIC0gNzUrIGNodW5rc1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9IHRoaXMucHJvY2Vzc2luZ1N0YWdlc1tzdGFnZUluZGV4XTtcbiAgfVxuXG4gIGdldFByb2dyZXNzUGVyY2VudGFnZSgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNodW5rQ291bnQgPSB0aGlzLmNodW5rcy5sZW5ndGg7XG4gICAgaWYgKGNodW5rQ291bnQgPT09IDApIHJldHVybiAwO1xuXG4gICAgLy8gTXVjaCBzbG93ZXIgYW5kIHNtb290aGVyIHByb2dyZXNzIGNhbGN1bGF0aW9uXG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xuXG4gICAgaWYgKGNodW5rQ291bnQgPD0gMTUpIHtcbiAgICAgIC8vIEZpcnN0IDE1IGNodW5rcyA9IDAtMjUlICh2ZXJ5IHNsb3cgc3RhcnQpXG4gICAgICBwZXJjZW50YWdlID0gKGNodW5rQ291bnQgLyAxNSkgKiAyNTtcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gMzUpIHtcbiAgICAgIC8vIE5leHQgMjAgY2h1bmtzID0gMjUtNTAlIChzbG93IGVhcmx5IHByb2dyZXNzKVxuICAgICAgcGVyY2VudGFnZSA9IDI1ICsgKChjaHVua0NvdW50IC0gMTUpIC8gMjApICogMjU7XG4gICAgfSBlbHNlIGlmIChjaHVua0NvdW50IDw9IDYwKSB7XG4gICAgICAvLyBOZXh0IDI1IGNodW5rcyA9IDUwLTc1JSAoc3RlYWR5IG1pZGRsZSBwcm9ncmVzcylcbiAgICAgIHBlcmNlbnRhZ2UgPSA1MCArICgoY2h1bmtDb3VudCAtIDM1KSAvIDI1KSAqIDI1O1xuICAgIH0gZWxzZSBpZiAoY2h1bmtDb3VudCA8PSAxMDApIHtcbiAgICAgIC8vIE5leHQgNDAgY2h1bmtzID0gNzUtOTAlIChzbG93ZXIgZmluYWwgYXBwcm9hY2gpXG4gICAgICBwZXJjZW50YWdlID0gNzUgKyAoKGNodW5rQ291bnQgLSA2MCkgLyA0MCkgKiAxNTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQmV5b25kIDEwMCBjaHVua3MgPSA5MC05NSUgKHZlcnkgc2xvdyBmaW5hbCBwcm9ncmVzc2lvbilcbiAgICAgIHBlcmNlbnRhZ2UgPSA5MCArIE1hdGgubWluKCgoY2h1bmtDb3VudCAtIDEwMCkgLyA1MCkgKiA1LCA1KTtcbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5yb3VuZChwZXJjZW50YWdlKTtcbiAgfVxuXG4gIG9uU3RyZWFtRW5kKCkge1xuICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICdDb21wbGV0aW5nIENCUCBQbGFuIGdlbmVyYXRpb24uLi4nO1xuXG4gICAgLy8gU2hvdyAxMDAlIGNvbXBsZXRpb24gYnJpZWZseSBiZWZvcmUgZmluaXNoaW5nXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmZ1bGxKc29uID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgICBjb25zdCBjbGVhbmVkID0gdGhpcy5mdWxsSnNvbi5yZXBsYWNlKC9eYGBganNvblxcbi8sICcnKS5yZXBsYWNlKC9gYGAkLywgJycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5wYXJzZWREYXRhID0gSlNPTi5wYXJzZShjbGVhbmVkKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1BhcnNlZCBkYXRhOicsIHRoaXMucGFyc2VkRGF0YSk7XG5cbiAgICAgICAgLy8gSGFuZGxlIHN1Y2Nlc3NmdWwgY29tcGxldGlvblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsncm9sZV9tYXBwaW5nX2dlbmVyYXRpb24nXSA9IHRoaXMucGFyc2VkRGF0YTtcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnJvbGVNYXBwaW5nR2VuZXJhdGlvbkRhdGEgPSB0aGlzLnBhcnNlZERhdGE7XG5cbiAgICAgICAgdGhpcy5zdWNjZXNzUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSk7XG5cbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdDQlAgUGxhbiBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5IScsICdYJywge1xuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdKU09OIHBhcnNlIGVycm9yOicsIGUpO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQ0JQIFBsYW4uIFBsZWFzZSB0cnkgYWdhaW4uJywgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIDUwMCk7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBwcm9ncmVzcyBwZXJjZW50YWdlIGluY2x1ZGluZyBjb21wbGV0aW9uIHN0YXRlXG4gIGdldERpc3BsYXlQcm9ncmVzc1BlcmNlbnRhZ2UoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID09PSAnQ29tcGxldGluZyBDQlAgUGxhbiBnZW5lcmF0aW9uLi4uJykge1xuICAgICAgcmV0dXJuIDEwMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvZ3Jlc3NQZXJjZW50YWdlKCk7XG4gIH1cblxuIFxuICByZW1vdmVGaWxlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudXBsb2FkZWRGaWxlIHx8IHRoaXMudXBsb2FkZWRGaWxlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gUmVtb3ZlIG9uZSBmaWxlIGF0IHRoZSBnaXZlbiBpbmRleFxuICAgIHRoaXMudXBsb2FkZWRGaWxlLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlXG4gICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdhZGRpdGlvbmFsX2RvY3VtZW50Jyk/LnNldFZhbHVlKHRoaXMudXBsb2FkZWRGaWxlKTtcbiAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2FkZGl0aW9uYWxfZG9jdW1lbnQnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuXG4gICAgLy8gQ2xlYXIgZXJyb3JzIGlmIG5vIGZpbGVzIGxlZnRcbiAgICBpZiAodGhpcy51cGxvYWRlZEZpbGUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yID0gJyc7XG4gICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWREb2MnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgaWYgKGlucHV0KSBpbnB1dC52YWx1ZSA9ICcnO1xuICAgIH1cbiAgfVxuXG5cbiAgZ2V0VXNlclByb2ZpbGVEYXRhKHJlcXVlc3RlZFR5cGU/OiBzdHJpbmcsIGRvbmU/OiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFVzZXJQcm9maWxlKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnZGF0YS0tJywgZGF0YSlcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd1c2VyUHJvZmlsZScsIEpTT04uc3RyaW5naWZ5KGRhdGEpKVxuICAgICAgdGhpcy5sb2dpblVzZXJPcmdJZHMgPSBkYXRhPy5vcmdhbml6YXRpb25faWRzXG4gICAgICAvLyBJZ25vcmUgc3RhbGUgcmVzcG9uc2VzIGZyb20gYSB0eXBlIHRoYXQgd2FzIGNoYW5nZWQgYWdhaW4gYmVmb3JlIHRoaXMgb25lIHJldHVybmVkXG4gICAgICBpZiAocmVxdWVzdGVkVHlwZSAmJiByZXF1ZXN0ZWRUeXBlICE9PSB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlKSB7XG4gICAgICAgIGRvbmU/LigpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgbGV0IGZpbHRlcmVkTWluaXN0cnlEYXRhID0gW11cbiAgICAgIHRoaXMubWluaXN0cnlGdWxsRGF0YS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMubG9naW5Vc2VyT3JnSWRzLmluZGV4T2YoaXRlbT8uaWRlbnRpZmllcikgPiAtMSAmJiBpdGVtPy5zYk9yZ1R5cGUgPT09IChyZXF1ZXN0ZWRUeXBlIHx8IHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUpKSB7XG4gICAgICAgICAgZmlsdGVyZWRNaW5pc3RyeURhdGEucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICB0aGlzLm1pbmlzdHJ5RGF0YSA9IGZpbHRlcmVkTWluaXN0cnlEYXRhXG4gICAgICB0aGlzLm9yaWdpbmFsTWluaXN0cnlEYXRhID0gZmlsdGVyZWRNaW5pc3RyeURhdGFcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gZmlsdGVyZWRNaW5pc3RyeURhdGE7XG4gICAgICBkb25lPy4oKVxuICAgIH0pXG4gIH1cblxuICBvbk9wZW5lZChvcGVuZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnBhbmVsT3BlbiA9IG9wZW5lZDtcbiAgfVxuXG4gIG9uT3BlbmVkRGVwYXJ0bWVudChvcGVuZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRlcGFydG1lbnRQYW5lbE9wZW4gPSBvcGVuZWRcbiAgICBpZiAob3BlbmVkKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGVwYXJ0bWVudFNlbGVjdCAmJiB0aGlzLmRlcGFydG1lbnRTZWxlY3QucGFuZWwgJiYgdGhpcy5kZXBhcnRtZW50U2VsZWN0LnBhbmVsLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLmRlcGFydG1lbnRTZWxlY3QucGFuZWwubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uRGVwYXJ0bWVudFNjcm9sbClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGVwYXJ0bWVudFNlYXJjaFF1ZXJ5KSB7XG4gICAgICAvLyBwYW5lbCBjbG9zZWQgd2l0aCBhbiBhY3RpdmUgc2VhcmNoOiByZXNldCBzbyB0aGUgbGlzdCBtYXRjaGVzIHRoZSBjbGVhcmVkIHNlYXJjaCBib3ggb24gcmVvcGVuXG4gICAgICB0aGlzLmRlcGFydG1lbnRTZWFyY2hTdWJqZWN0Lm5leHQoJycpXG4gICAgfVxuICB9XG5cbiAgb25EZXBhcnRtZW50U2Nyb2xsID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICBjb25zdCBwYW5lbCA9IGV2ZW50LnRhcmdldFxuICAgIGlmIChwYW5lbC5zY3JvbGxUb3AgKyBwYW5lbC5jbGllbnRIZWlnaHQgPj0gcGFuZWwuc2Nyb2xsSGVpZ2h0IC0gNjApIHtcbiAgICAgIHRoaXMubG9hZERlcGFydG1lbnRzKClcbiAgICB9XG4gIH1cblxuICBsb2FkRGVwYXJ0bWVudHMocmVzZXQgPSBmYWxzZSkge1xuICAgIGlmICghdGhpcy5kZXBhcnRtZW50TWluaXN0cnlJZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghcmVzZXQgJiYgKHRoaXMuZGVwYXJ0bWVudExvYWRpbmcgfHwgIXRoaXMuZGVwYXJ0bWVudEhhc01vcmUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHJlc2V0KSB7XG4gICAgICB0aGlzLmRlcGFydG1lbnRPZmZzZXQgPSAwXG4gICAgICB0aGlzLmRlcGFydG1lbnRIYXNNb3JlID0gdHJ1ZVxuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0SWQgPSArK3RoaXMuZGVwYXJ0bWVudFJlcXVlc3RJZFxuICAgIHRoaXMuZGVwYXJ0bWVudExvYWRpbmcgPSB0cnVlXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGxpbWl0OiB0aGlzLmRlcGFydG1lbnRQYWdlU2l6ZSxcbiAgICAgIG9mZnNldDogdGhpcy5kZXBhcnRtZW50T2Zmc2V0LFxuICAgICAgcXVlcnk6IHRoaXMuZGVwYXJ0bWVudFNlYXJjaFF1ZXJ5XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnbWluaXN0cnknXG4gICAgICA/IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDZW50ZXJCYXNlZERlcGFydG1lbnQodGhpcy5kZXBhcnRtZW50TWluaXN0cnlJZCwgb3B0aW9ucylcbiAgICAgIDogdGhpcy5zaGFyZWRTZXJ2aWNlLmdldERlcGFydG1lbnRMaXN0KHRoaXMuZGVwYXJ0bWVudE1pbmlzdHJ5SWQsIG9wdGlvbnMpXG4gICAgcmVxdWVzdC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICBpZiAocmVxdWVzdElkICE9PSB0aGlzLmRlcGFydG1lbnRSZXF1ZXN0SWQpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlcGFydG1lbnRMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5pc0FycmF5KHJlcykgPyByZXMgOiAocmVzPy5pdGVtcyB8fCByZXM/LmRhdGEgfHwgW10pXG4gICAgICAgIHRoaXMuZGVwYXJ0bWVudEhhc01vcmUgPSBpdGVtcy5sZW5ndGggPT09IHRoaXMuZGVwYXJ0bWVudFBhZ2VTaXplXG4gICAgICAgIHRoaXMuZGVwYXJ0bWVudE9mZnNldCArPSBpdGVtcy5sZW5ndGhcbiAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5kZXBhcnRtZW50RGF0YS5zb21lKGQgPT4gZD8uaWRlbnRpZmllciA9PT0gaXRlbT8uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHRoaXMuZGVwYXJ0bWVudERhdGEucHVzaChpdGVtKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5maWx0ZXJlZERlcGFydG1lbnRMaXN0ID0gcmVzZXQgPyBpdGVtcyA6IFsuLi50aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QsIC4uLml0ZW1zXVxuICAgICAgICB0aGlzLmVuc3VyZVNlbGVjdGVkRGVwYXJ0bWVudE9wdGlvbigpXG4gICAgICAgIGlmIChyZXNldCAmJiAhaXRlbXMubGVuZ3RoICYmICF0aGlzLmRlcGFydG1lbnRTZWFyY2hRdWVyeSAmJiB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdObyBEZXBhcnRtZW50IEZvdW5kIGZvciBTZWxlY3RlZCBNaW5pc3RyeScsICdYJywge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50X25hbWUnXSA9ICcnXG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnZGVwYXJ0bWVudHMnXSA9ICcnXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgaWYgKHJlcXVlc3RJZCAhPT0gdGhpcy5kZXBhcnRtZW50UmVxdWVzdElkKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXBhcnRtZW50TG9hZGluZyA9IGZhbHNlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIG1hdC1zZWxlY3Qgb25seSBkaXNwbGF5cyBhIHNlbGVjdGlvbiB3aGlsZSBhIG1hdC1vcHRpb24gd2l0aCB0aGF0IHZhbHVlIGlzXG4gIC8vIHJlbmRlcmVkOyB3aGVuIHRoZSBjdXJyZW50IHNlYXJjaC9wYWdlIGZyb20gdGhlIHNlcnZlciBkb2VzIG5vdCBpbmNsdWRlIHRoZVxuICAvLyBzZWxlY3RlZCBkZXBhcnRtZW50LCBpdCBpcyByZW5kZXJlZCBhcyBhIGhpZGRlbiBvcHRpb24gaW5zdGVhZCBvZiBpbiB0aGUgbGlzdFxuICBlbnN1cmVTZWxlY3RlZERlcGFydG1lbnRPcHRpb24oKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJZCA9IHRoaXMucm9sZU1hcHBpbmdGb3JtPy5nZXQoJ2RlcGFydG1lbnRzJyk/LnZhbHVlXG4gICAgaWYgKCFzZWxlY3RlZElkIHx8IEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRJZClcbiAgICAgIHx8IHRoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdC5zb21lKGQgPT4gZD8uaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRJZCkpIHtcbiAgICAgIHRoaXMucGlubmVkRGVwYXJ0bWVudE9wdGlvbnMgPSBbXVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maW5kKGQgPT4gZD8uaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRJZClcbiAgICAgIHx8ICh0aGlzLnNlbGVjdGVkRGVwYXJ0bWVudE9iaj8uaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRJZCA/IHRoaXMuc2VsZWN0ZWREZXBhcnRtZW50T2JqIDogbnVsbClcbiAgICAgIHx8ICh0aGlzLmNicEZpbmFsT2JqPy5kZXBhcnRtZW50X25hbWUgPyB7IGlkZW50aWZpZXI6IHNlbGVjdGVkSWQsIG9yZ05hbWU6IHRoaXMuY2JwRmluYWxPYmouZGVwYXJ0bWVudF9uYW1lIH0gOiBudWxsKVxuICAgIHRoaXMucGlubmVkRGVwYXJ0bWVudE9wdGlvbnMgPSBzZWxlY3RlZCA/IFtzZWxlY3RlZF0gOiBbXVxuICB9XG5cbiAgZmlsdGVyRGF0YShldmVudCkge1xuICAgIGlmIChldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnZhbHVlKSB7XG4gICAgICBjb25zdCBzID0gZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5taW5pc3RyeURhdGEuZmlsdGVyKHggPT5cbiAgICAgICAgeC5vcmdOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocylcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5taW5pc3RyeURhdGFcbiAgICB9XG5cbiAgfVxuXG4gIGZpbHRlckRlcGFydG1lbnREYXRhKGV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnZhbHVlID8gZXZlbnQudGFyZ2V0LnZhbHVlIDogJydcbiAgICB0aGlzLmRlcGFydG1lbnRTZWFyY2hTdWJqZWN0Lm5leHQodmFsdWUudHJpbSgpKVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5SWQgPSAnJ1xuICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnJlc2V0KClcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKVxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKVxuICB9XG5cbiAgb25EZXBhcnRtZW50Q2hhbmdlKCkge1xuICAgIGNvbnN0IGZvcm1EYXRhID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0udmFsdWU7XG5cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gZm9ybURhdGEuZGVwYXJ0bWVudHMgPyBmb3JtRGF0YS5kZXBhcnRtZW50cyA6ICcnXG4gICAgdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKClcbiAgICBpZiAodGhpcy5jYnBGaW5hbE9iaiAmJiB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeSAmJiB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlKSB7XG4gICAgICB0aGlzLmNicEZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gZm9ybURhdGEuZGVwYXJ0bWVudHMgPyBmb3JtRGF0YS5kZXBhcnRtZW50cyA6ICcnXG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRNaW5pc3RyeSA9IHRoaXMubWluaXN0cnlEYXRhLmZpbmQoaXRlbSA9PiBpdGVtLmlkZW50aWZpZXIgPT09IGZvcm1EYXRhLm1pbmlzdHJ5KTtcblxuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnknXSA9IHNlbGVjdGVkTWluaXN0cnlcblxuICAgIGNvbnN0IGRlcGFydG1lbnROYW1lID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maW5kKHUgPT4gdS5pZGVudGlmaWVyID09PSBmb3JtRGF0YS5kZXBhcnRtZW50cyk7XG4gICAgaWYgKGRlcGFydG1lbnROYW1lKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGVwYXJ0bWVudE9iaiA9IGRlcGFydG1lbnROYW1lXG4gICAgfVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gZGVwYXJ0bWVudE5hbWU/Lm9yZ05hbWVcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgdGhpcy5nZXRVcGxvYWRlZERvY3VtZW50cygpXG4gIH1cblxuICAgZ29Ub1VwbG9hZERvY3VtZW50KCkge1xuICAgXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYWkvdXBsb2FkLWRvY3VtZW50cyddKTtcbiAgICBcbiAgfVxuXG4gICAgICByZWdlbmVyYXRlUm9sZU1hcHBpbmdBZnRlckZhaWxlZEFuZERlbGV0ZSgpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVDZW50ZXJJZCA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLm1pbmlzdHJ5XG4gICAgICAgIGNvbnN0IGRlcGFydG1lbnRJZCA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLmRlcGFydG1lbnRzXG5cbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnQoc3RhdGVDZW50ZXJJZCwgZGVwYXJ0bWVudElkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChleGlzdGluZ1JvbGVNYXBwaW5nczogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByb2xlTWFwcGluZ0lkcyA9IChBcnJheS5pc0FycmF5KGV4aXN0aW5nUm9sZU1hcHBpbmdzKSA/IGV4aXN0aW5nUm9sZU1hcHBpbmdzIDogW10pXG4gICAgICAgICAgICAgIC5tYXAoKHJvbGVNYXBwaW5nOiBhbnkpID0+IHJvbGVNYXBwaW5nPy5pZClcbiAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuXG4gICAgICAgICAgICBpZiAoIXJvbGVNYXBwaW5nSWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBudWxsXG4gICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGaW5hbFJvbGVNYXBwaW5nKClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcmtKb2luKFxuICAgICAgICAgICAgICByb2xlTWFwcGluZ0lkcy5tYXAoKGlkOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmRlbGV0ZUNvdXJzZVJlY29tbWVuZGF0aW9ucyhpZCkucGlwZShcbiAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgNDA0IGp1c3QgbWVhbnMgdGhpcyBkZXNpZ25hdGlvbiBoYWQgbm8gY291cnNlIHJlY29tbWVuZGF0aW9ucyB5ZXQuXG4gICAgICAgICAgICAgICAgICAgIC8vIEVpdGhlciB3YXksIG9uZSBkZXNpZ25hdGlvbidzIGRlbGV0ZSBmYWlsaW5nIHNob3VsZG4ndCBibG9jayB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSByZXRyeSBmb3IgdGhlIHJlc3QuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcj8uc3RhdHVzICE9PSA0MDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgZm9yIHJvbGUgbWFwcGluZyAke2lkfWAsIGVycm9yKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihudWxsKVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBudWxsXG4gICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZXJyb3I/LmVycm9yPy5kZXRhaWwsICdYJywge1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgfVxuXG5cblxufVxuXG5cblxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgIDwhLS0gPGlucHV0IGNsYXNzPVwiYnRuLWFjdGl2ZVwiIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIkRvd25sb2FkIGFzIFBERlwiIChjbGljayk9XCJkb3dubG9hZFBERigpXCIgLz4gLS0+XG4gICAgPGRpdiBjbGFzcz1cImxvZ28tY29udGFpbmVyXCIgKm5nSWY9XCJsb2dpblwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvbi1tZWRpdW1cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxoMiBjbGFzcz1cImhpZ2hsaWdodC1haVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPmlHT1QgQUkgRHJpdmVuIENCUDwvc3Bhbj5cbiAgICAgICAgICAgIDwvaDI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgPHA+QnVpbGQgWW91ciBDYXBhY2l0eSBXaXRoIEN1c3RvbWl6ZWQgUm9sZSBNYXBwaW5nPC9wPlxuICAgICAgICA8L2Rpdj4gLS0+XG4gICAgPC9kaXY+XG4gICAgPG1hdC1jYXJkICpuZ0lmPVwibG9naW4gJiYgcm9sZU1hcHBpbmdGb3JtXCIgY2xhc3M9XCJtdC0yXCIgW2Zvcm1Hcm91cF09XCJyb2xlTWFwcGluZ0Zvcm1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRlcGF0bWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDwhLS0gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIj4tLT5cbiAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+LS0+XG4gICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICA8cD5DaG9vc2UgWW91ciBEZXBhcnRtZW50PC9wPi0tPlxuICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICA8L2Rpdj4tLT5cbiAgICAgICAgICAgIDwhLS0gICAgICAgICAgICA8L2Rpdj4tLT5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLWdyb3VwIG10LTRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIGNsYXNzPVwicmFkaW8tYnRuLWdyb3VwXCIgZm9ybUNvbnRyb2xOYW1lPVwibWluaXN0cnlUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZVwiIChjaGFuZ2UpPVwib25NaW5pc3RyeVR5cGVDaGFuZ2UoJGV2ZW50KVwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTGVmdCByYWRpbyBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwibWluaXN0cnlcIiBjbGFzcz1cInJhZGlvLWJ0biBsZWZ0LXJhZGlvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhZGlvLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWljb24gY2xhc3M9XCJyYWRpby1pY29uXCIgW25nQ2xhc3NdPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdjZW50ZXInPyAnY2hlY2tlZC1sYWJlbCc6JydcIj5kb21haW48L21hdC1pY29uPiAgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdtaW5pc3RyeSc/ICdjaGVja2VkLWxhYmVsJzonJ1wiPkNlbnRyZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUmlnaHQgcmFkaW8gYnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cInN0YXRlXCIgY2xhc3M9XCJyYWRpby1idG4gcmlnaHQtcmFkaW9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmFkaW8tbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtaWNvbiBjbGFzcz1cInJhZGlvLWljb25cIiBbbmdDbGFzc109XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJz8gJ2NoZWNrZWQtbGFiZWwnOicnXCI+bG9jYXRpb25fb248L21hdC1pY29uPiAgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdzdGF0ZSc/ICdjaGVja2VkLWxhYmVsJzonJ1wiPlN0YXRlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdtaW5pc3RyeSdcIj5NaW5pc3RyeTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJ1wiPlN0YXRlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgc2VhcmNoLWJveC13aXRoLXNlbGVjdFwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IHdoaXRlOyBib3JkZXItcmFkaXVzOiAyNXB4OyBwYWRkaW5nOiAwIDEycHg7IGJvcmRlcjogMXB4IHNvbGlkICNjY2M7d2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBwYW5lbENsYXNzPVwic2VsZWN0LXdpdGgtc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdtaW5pc3RyeScgPyAnU2VsZWN0IE1pbmlzdHJ5LyBEZXBhcnRtZW50JzonU2VsZWN0IFN0YXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1pbmlzdHJ5Q2hhbmdlKCRldmVudClcIiBmb3JtQ29udHJvbE5hbWU9XCJtaW5pc3RyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXItcmFkaXVzOiAyNXB4OyBiYWNrZ3JvdW5kOiB3aGl0ZTsgd2lkdGg6MTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZW5lZENoYW5nZSk9XCJvbk9wZW5lZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC13cmFwcGVyXCIgKm5nSWY9XCJwYW5lbE9wZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiAoaW5wdXQpPVwiZmlsdGVyRGF0YSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VhcmNoLWlucHV0XCIgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gW3NlbGVjdGVkXT1cInNlbGVjdGVkTWluaXN0cnlJZCA9PT0gaXRlbT8uaWRlbnRpZmllclwiIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtPy5pZGVudGlmaWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRMaXN0XCI+e3tpdGVtPy5vcmdOYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJkZXBhcnRtZW50RGF0YT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIj5EZXBhcnRtZW50PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogMjVweDsgcGFkZGluZzogMCAxMnB4O2JvcmRlcjogMXB4IHNvbGlkICNjY2M7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCAjZGVwYXJ0bWVudFNlbGVjdCBwYW5lbENsYXNzPVwic2VsZWN0LXdpdGgtc2VhcmNoXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgRGVwYXJ0bWVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGVwYXJ0bWVudHNcIiBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDI1cHg7IGJhY2tncm91bmQ6IHdoaXRlO1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkRlcGFydG1lbnRDaGFuZ2UoKVwiIChvcGVuZWRDaGFuZ2UpPVwib25PcGVuZWREZXBhcnRtZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLXdyYXBwZXJcIiAqbmdJZj1cImRlcGFydG1lbnRQYW5lbE9wZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiAoaW5wdXQpPVwiZmlsdGVyRGVwYXJ0bWVudERhdGEoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbT8uaWRlbnRpZmllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkRGVwYXJ0bWVudExpc3RcIj57e2l0ZW0/Lm9yZ05hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHNlbGVjdGVkIGRlcGFydG1lbnQgbm90IHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgc2VhcmNoL3BhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXB0IHJlbmRlcmVkIChoaWRkZW4pIHNvIG1hdC1zZWxlY3QgZG9lcyBub3QgY2xlYXIgdGhlIHNlbGVjdGlvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbT8uaWRlbnRpZmllclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHBpbm5lZERlcGFydG1lbnRPcHRpb25zXCI+e3tpdGVtPy5vcmdOYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gZGlzYWJsZWQgKm5nSWY9XCJkZXBhcnRtZW50TG9hZGluZ1wiPkxvYWRpbmcuLi48L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZGVwYXJ0bWVudExvYWRpbmcgJiYgIWZpbHRlcmVkRGVwYXJ0bWVudExpc3Q/Lmxlbmd0aFwiPk5vIGRlcGFydG1lbnQgZm91bmQ8L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiPlNlY3RvcjwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIHN0eWxlPVwiYmFja2dyb3VuZDogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDI1cHg7IHBhZGRpbmc6IDAgMTJweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJTZWxlY3QgU2VjdG9yXCIgbXVsdGlwbGUgZm9ybUNvbnRyb2xOYW1lPVwic2VjdG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDI1cHg7IGJhY2tncm91bmQ6IHdoaXRlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW0/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWN0b3JEYXRhXCI+e3tpdGVtPy52YWx1ZX19PC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgPCEtLSAqbmdJZj1cInJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5VHlwZScpPy52YWx1ZSA9PT0gJ3N0YXRlJ1wiIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTQgYWRkaXRpb25hbC1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9XCI1XCIgcGxhY2Vob2xkZXI9XCJBZGRpdGlvbmFsIGRldGFpbHNcIiBmb3JtQ29udHJvbE5hbWU9XCJhZGRpdGlvbmFsRGV0YWlsc1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIFtuZ0NsYXNzXT1cImRpc2FibGVVcGxvYWREb2N1bWVudCA/ICdidG4tYWN0aXZlLXByaW1hcnktZGlzYWJsZSc6J2J0bi1hY3RpdmUtcHJpbWFyeSdcIiBjbGFzcz1cIlwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlVXBsb2FkRG9jdW1lbnRcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZ29Ub1VwbG9hZERvY3VtZW50KClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnVwbG9hZDwvbWF0LWljb24+IE1hbmFnZSBEb2N1bWVudHNcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSAqbmdJZj1cInJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5VHlwZScpPy52YWx1ZSA9PT0gJ3N0YXRlJ1wiIC0tPlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibXQtNCBzZWN0aW9uXCIgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8cD5VcGxvYWQgRG9jdW1lbnQgKFBERik8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtdXBsb2FkLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInVwbG9hZERvY1wiIGNsYXNzPVwiZmlsZS11cGxvYWQtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZS11cGxvYWQtaWNvblwiPvCfk448L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF1cGxvYWRlZEZpbGUgfHwgdXBsb2FkZWRGaWxlLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9vc2UgdXAgdG8gMyBmaWxlcyAoUERGL1RYVClcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1cGxvYWRlZEZpbGU/Lmxlbmd0aCA+IDBcIiBjbGFzcz1cImZpbGUtbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWxlIG9mIHVwbG9hZGVkRmlsZTsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZmlsZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsZS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZW1vdmUtZmlsZS1pY29uXCIgKGNsaWNrKT1cInJlbW92ZUZpbGUoaSk7JGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInVwbG9hZERvY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAvPiAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJmaWxlLXVwbG9hZC1oaW50XCI+TWF4IGZpbGUgc2l6ZToge3ttYXhGaWxlU2l6ZU1CfX1NQjwvc21hbGw+XG5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwidXBsb2FkRG9jXCIgbXVsdGlwbGUgdHlwZT1cImZpbGVcIiAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdD1cIi5wZGYsLmRvYywuZG9jeCwueGxzLC54bHN4LC50eHRcIiBjbGFzcz1cImZpbGUtdXBsb2FkLWlucHV0XCIgLz5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXBsb2FkRXJyb3JcIiBjbGFzcz1cImVycm9yXCI+e3sgdXBsb2FkRXJyb3IgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwhLS0gKm5nSWY9XCJyb2xlTWFwcGluZ0Zvcm0uZ2V0KCdtaW5pc3RyeVR5cGUnKT8udmFsdWUgPT09ICdzdGF0ZSdcIiAtLT5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm10LTIgc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNjbGFpbWVyLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHA+RGlzY2xhaW1lcjogUGxlYXNlIGRvIG5vdCB1cGxvYWQgYW55IGNvbmZpZGVudGlhbCBkb2N1bWVudHMuIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJkb2N1bWVudHM/Lmxlbmd0aCA8IDEgJiYgIShyb2xlTWFwcGluZ0Zvcm0/LmludmFsaWQpICB8fCBzaG93V29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZ1wiPlxuICAgICAgICAgICAgICAgIDxwPjxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAuODc1cmVtO2ZvbnQtd2VpZ2h0OiBib2xkO1wiPk5vdGU6IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiPlBsZWFzZSB1cGxvYWQgdGhlIFdvcmsgQWxsb2NhdGlvbiBPcmRlciBkb2N1bWVudCB0byBnZW5lcmF0ZSB0aGUgQ2FwYWNpdHkgQnVpbGRpbmcgUGxhbiAoQ0JQKTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJkb2N1bWVudHM/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIndvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmdcIj48c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogLjg3NXJlbTtmb250LXdlaWdodDogYm9sZDtcIj5Ob3RlOlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIj5QbGVhc2UgdXBsb2FkIHRoZSBXb3JrIEFsbG9jYXRpb24gT3JkZXIgZG9jdW1lbnQgdG8gZ2VuZXJhdGUgdGhlIENhcGFjaXR5XG4gICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGluZyBQbGFuIChDQlApPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cbiAgPGlucHV0XG4gICAgW2Rpc2FibGVkXT1cInJvbGVNYXBwaW5nRm9ybT8uaW52YWxpZCB8fCBsb2FkaW5nIHx8IGRvY3VtZW50cz8ubGVuZ3RoIDwgMVwiXG4gICAgW25nQ2xhc3NdPVwiXG4gICAgICByb2xlTWFwcGluZ0Zvcm0/LmludmFsaWQgfHwgbG9hZGluZyB8fCBkb2N1bWVudHM/Lmxlbmd0aCA8IDFcbiAgICAgICAgPyAnYnRuLWRpc2FibGUnXG4gICAgICAgIDogJ2J0bi1hY3RpdmUnXG4gICAgXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBbdmFsdWVdPVwibG9hZGluZyA/ICdHZW5lcmF0aW5nIENCUC4uLicgOiAnR2VuZXJhdGUgQ0JQJ1wiXG4gICAgKGNsaWNrKT1cIm9uR2VuZXJhdGVSb2xlTWFwcGluZygpXCJcbiAgLz5cbjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L21hdC1jYXJkPlxuXG48L2Rpdj5cbjwhLS0gPGRpdiAqbmdJZj1cIiFsb2dpblwiPlxuICAgICAgICA8YXBwLWxvZ2luIChzdWNjZXNzKT1cImxvZ2luU3RhdHVzKCRldmVudClcIj48L2FwcC1sb2dpbj5cbiAgICA8L2Rpdj4gLS0+XG5cbjxkaXYgY2xhc3M9XCJvdmVybGF5LWxvYWRlclwiICpuZ0lmPVwiYXBpTG9hZGluZ1wiPlxuICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjUwXCI+PC9tYXQtc3Bpbm5lcj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwib3ZlcmxheS1sb2FkZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy1jb250ZW50XCI+XG4gICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjUwXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctdGV4dCBtdC0zXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1haW4tbWVzc2FnZVwiPnt7IGN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgfHwgJ1ByZXBhcmluZyBDQlAgUGxhbiBnZW5lcmF0aW9uLi4uJyB9fTwvcD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWluZGljYXRvclwiICpuZ0lmPVwiY2h1bmtzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBbc3R5bGUud2lkdGguJV09XCJnZXREaXNwbGF5UHJvZ3Jlc3NQZXJjZW50YWdlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwicHJvZ3Jlc3MtdGV4dFwiPnt7IGdldERpc3BsYXlQcm9ncmVzc1BlcmNlbnRhZ2UoKSB9fSUgQ29tcGxldGU8L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRpbWUtZXN0aW1hdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgUmVhbC10aW1lIHN0cmVhbWluZyBpbiBwcm9ncmVzcy4gVGhpcyBtYXkgdGFrZSAyLTMgbWludXRlcy5cbiAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
1189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBdUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakYsT0FBTyxRQUFRLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGtFQUFrRSxDQUFDO0FBRW5ILE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBaUIsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVcvRSxNQUFNLE9BQU8sOEJBQThCO0lBaUd6QyxZQUNVLFFBQXNCLEVBQ3ZCLGFBQTRCLEVBQzNCLEVBQWUsRUFDZixRQUFxQixFQUN0QixNQUFpQixFQUNqQixrQkFBc0MsRUFDckMsTUFBYztRQU5kLGFBQVEsR0FBUixRQUFRLENBQWM7UUFDdkIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDM0IsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGFBQVEsR0FBUixRQUFRLENBQWE7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3JDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFyR2Ysb0JBQWUsR0FBRyxLQUFLLENBQUE7UUFDaEMsVUFBSyxHQUFHLHNCQUFzQixDQUFDO1FBRS9CLGtCQUFhLEdBQUcsRUFBRSxDQUFBO1FBQ2xCLGVBQVUsR0FBRyxFQUFFLENBQUE7UUFFZixxQkFBZ0IsR0FBYSxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWE7WUFDNUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3BFLHlCQUFvQixHQUFXLFVBQVUsQ0FBQztRQUMxQyxpQkFBWSxHQUFRLEVBQUUsQ0FBQTtRQUN0QixxQkFBZ0IsR0FBUSxFQUFFLENBQUE7UUFFMUIsZUFBVSxHQUFHLElBQUksQ0FBQTtRQUNqQixlQUFVLEdBQUc7WUFDWDtnQkFDRSxLQUFLLEVBQUUsNkJBQTZCO2FBQ3JDO1lBQ0Q7Z0JBQ0UsS0FBSyxFQUFFLG1CQUFtQjthQUMzQjtZQUNEO2dCQUNFLEtBQUssRUFBRSxtQkFBbUI7YUFDM0I7WUFDRDtnQkFDRSxLQUFLLEVBQUUsWUFBWTthQUNwQjtZQUNEO2dCQUNFLEtBQUssRUFBRSxhQUFhO2FBQ3JCO1lBQ0Q7Z0JBQ0UsS0FBSyxFQUFFLFFBQVE7YUFDaEI7U0FFRixDQUFBO1FBQ0QsbUJBQWMsR0FBVSxFQUFFLENBQUE7UUFDMUIsWUFBTyxHQUFHLEtBQUssQ0FBQTtRQUNmLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLGlCQUFZLEdBQUc7WUFDYixpQkFBaUI7WUFDakIsb0JBQW9CO1lBQ3BCLHlFQUF5RTtZQUN6RSwwQkFBMEI7WUFDMUIsbUVBQW1FO1lBQ25FLFlBQVk7U0FDYixDQUFDO1FBQ0YsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO1FBQ2xDLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxVQUFLLEdBQUcsS0FBSyxDQUFBO1FBQ2IsZ0JBQVcsR0FBUSxFQUFFLENBQUE7UUFDckIsdUJBQWtCLEdBQUcsRUFBRSxDQUFBO1FBRXZCLFdBQU0sR0FBYSxFQUFFLENBQUM7UUFDdEIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUV0QiwyQkFBc0IsR0FBVyxFQUFFLENBQUM7UUFDcEMscUJBQWdCLEdBQUc7WUFDakIscUNBQXFDO1lBQ3JDLG1EQUFtRDtZQUNuRCw4REFBOEQ7WUFDOUQsZ0RBQWdEO1lBQ2hELHFDQUFxQztZQUNyQyxzREFBc0Q7U0FDdkQsQ0FBQztRQUNRLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUE7UUFDNUMsZ0NBQTJCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQTtRQUNyRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUE7UUFDaEQsd0JBQW1CLEdBQVEsRUFBRSxDQUFBO1FBQzdCLG9CQUFlLEdBQUcsRUFBRSxDQUFBO1FBQ3BCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsd0JBQW1CLEdBQUcsS0FBSyxDQUFBO1FBQzNCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLDJCQUFzQixHQUFVLEVBQUUsQ0FBQztRQUNuQywwQkFBcUIsR0FBUSxJQUFJLENBQUE7UUFDakMsNEJBQXVCLEdBQVUsRUFBRSxDQUFBO1FBRW5DLHVCQUFrQixHQUFHLEVBQUUsQ0FBQTtRQUN2QixxQkFBZ0IsR0FBRyxDQUFDLENBQUE7UUFDcEIsc0JBQWlCLEdBQUcsSUFBSSxDQUFBO1FBQ3hCLHNCQUFpQixHQUFHLEtBQUssQ0FBQTtRQUN6QiwwQkFBcUIsR0FBRyxFQUFFLENBQUE7UUFDMUIseUJBQW9CLEdBQUcsRUFBRSxDQUFBO1FBQ2pCLDRCQUF1QixHQUFHLElBQUksT0FBTyxFQUFVLENBQUE7UUFDL0Msd0JBQW1CLEdBQUcsQ0FBQyxDQUFBO1FBQy9CLHlCQUFvQixHQUFHLEVBQUUsQ0FBQTtRQUN6QixlQUFVLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLHFCQUFnQixHQUFRLElBQUksQ0FBQTtRQUM1QixjQUFTLEdBQUcsRUFBRSxDQUFBO1FBQ2QsMEJBQXFCLEdBQUcsSUFBSSxDQUFBO1FBQzVCLGtDQUE2QixHQUFHLElBQUksQ0FBQTtRQUNwQyx1Q0FBa0MsR0FBRyxLQUFLLENBQUE7UUFDMUMsMkNBQXNDLEdBQUcsS0FBSyxDQUFBO1FBQ3RDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQy9CLDRCQUF1QixHQUFHLEtBQUssQ0FBQztRQUNoQyx3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUEyOUJwQyx1QkFBa0IsR0FBRyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ2xDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUE7WUFDMUIsSUFBSSxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLFlBQVksR0FBRyxFQUFFLEVBQUU7Z0JBQ25FLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTthQUN2QjtRQUNILENBQUMsQ0FBQTtRQXQ5QkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDOUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGtCQUFrQixDQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ2pELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUE7SUFDeEUsQ0FBQztJQUVELFFBQVE7UUFFTixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUMvQixZQUFZLENBQUMsR0FBRyxDQUFDLEVBQ2pCLG9CQUFvQixFQUFFLEVBQ3RCLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3pCLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQTtZQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzVCLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBRTlDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO1FBQzlELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7WUFHM0YsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFDdkIseUJBQXlCO1NBQzFCO2FBQU07WUFDTCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO2FBQ3ZCO1lBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbkMsWUFBWSxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7Z0JBQy9DLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO2dCQUNyQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2IsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNqQixpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsbUJBQW1CLEVBQUUsRUFBRTthQUN4QixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDdEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7b0JBQ3pCLFlBQVksRUFBRSxJQUFJO29CQUNsQixRQUFRLEVBQUUsSUFBSTtvQkFDZCxPQUFPLEVBQUUsRUFBRTtvQkFDWCxXQUFXLEVBQUUsRUFBRTtvQkFDZixpQkFBaUIsRUFBRSxFQUFFO29CQUNyQixtQkFBbUIsRUFBRSxFQUFFO2lCQUN4QixFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyw2RUFBNkU7Z0JBQzNHLElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRTtvQkFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUM7b0JBQzNELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLHNCQUFzQixFQUFFLENBQUM7aUJBQ25FO3FCQUFNO29CQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDO29CQUMzRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3RELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLHNCQUFzQixFQUFFLENBQUM7aUJBQ25FO2dCQUNPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLHNCQUFzQixFQUFFLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtnQkFDM0QsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUE7Z0JBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQ2hDLGtCQUFrQjt3QkFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBRWxELENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxrQkFBa0IsRUFBRTtvQkFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBRWhFO2dCQUVELElBQUksTUFBTSxLQUFLLE9BQU8sRUFBRTtvQkFDdEIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQTtvQkFDbEMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLEtBQUssQ0FBQTtpQkFDM0M7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQTtvQkFDakMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQTtpQkFDMUM7WUFFSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBT0gsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztRQUM1QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQTtRQUN0QixJQUFJLE9BQU8sR0FBRztZQUNaLGVBQWUsRUFBRSxRQUFRLENBQUMsUUFBUTtZQUNsQyxlQUFlLEVBQUUsSUFBSTtZQUNyQixJQUFJLEVBQUUsQ0FBQztZQUNQLEtBQUssRUFBRSxHQUFHO1NBQ1gsQ0FBQTtRQUNELElBQUksT0FBTyxRQUFRLEVBQUUsV0FBVyxLQUFLLFFBQVEsRUFBRTtZQUM3QyxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsUUFBUSxFQUFFLFdBQVcsQ0FBQTtTQUNqRDtRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO1FBRXRCLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDakUsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEtBQUssSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtnQkFDM0MsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFBO2dCQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQTtnQkFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLEVBQUUsS0FBSyxDQUFBO2dCQUUzQixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtnQkFDN0MsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQTtnQkFDbEMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLEtBQUssQ0FBQTtnQkFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUMsRUFBRTtvQkFDN0IsSUFBRyxJQUFJLEVBQUUsYUFBYSxLQUFLLHVCQUF1QixFQUFFO3dCQUNsRCxRQUFRLEdBQUUsUUFBUSxHQUFDLENBQUMsQ0FBQTtxQkFDckI7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7Z0JBRUYsSUFBRyxRQUFRLEdBQUcsQ0FBQyxFQUFFO29CQUNmLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxJQUFJLENBQUE7aUJBQy9DO3FCQUFNO29CQUNMLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxLQUFLLENBQUE7aUJBQ2hEO2dCQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO2FBQ2hEO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFBO2dCQUNuQixJQUFJLENBQUMsa0NBQWtDLEdBQUcsSUFBSSxDQUFBO2dCQUM5QyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQTtnQkFDdkIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQTtnQkFDbEMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLEtBQUssQ0FBQTthQUMzQztRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUFFO1lBQ3ZELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUE7WUFDaEUsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7WUFDNUIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUE7Z0JBQ2xFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUE7YUFDM0I7WUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDOUQsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3ZFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDYixXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztnQkFDNUMsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUM7YUFDeEIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7Z0JBQzNELElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFBO2dCQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO29CQUNoQyxrQkFBa0I7d0JBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUVsRCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsa0JBQWtCLEVBQUU7b0JBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUVoRTtnQkFFRCxJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUU7b0JBQ3RCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUE7b0JBQ2xDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxLQUFLLENBQUE7aUJBQzNDO3FCQUFNO29CQUNMLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUE7b0JBQ2pDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUE7aUJBQzFDO1lBRUgsQ0FBQyxDQUFDLENBQUM7WUFFSCxxREFBcUQ7WUFDckQsNkVBQTZFO1lBQzdFLGlDQUFpQztZQUNqQyxvREFBb0Q7WUFDcEQsc0JBQXNCO1lBQ3RCLG1CQUFtQjtZQUNuQix1QkFBdUI7WUFDdkIsNEJBQTRCO1lBQzVCLFFBQVE7WUFDUiw0QkFBNEI7WUFDNUIscUZBQXFGO1lBQ3JGLGFBQWE7WUFDYixrRUFBa0U7WUFDbEUsNkRBQTZEO1lBQzdELE1BQU07WUFDTix1RUFBdUU7WUFDdkUsTUFBTTtZQUVOLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtnQkFDakQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQTthQUNqRTtZQUVELDhCQUE4QjtTQUMvQjthQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsU0FBUyxLQUFLLE9BQU8sRUFBRTtZQUM1RCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFBO1lBQ2pFLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO1lBQzVCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUE7WUFDbEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMxQixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUE7YUFDakU7WUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDOUQsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3ZFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDYixXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztnQkFDNUMsaUJBQWlCLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDO2FBQ3pELENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO2dCQUMzRCxJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQTtnQkFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDaEMsa0JBQWtCO3dCQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFFbEQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGtCQUFrQixFQUFFO29CQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFFaEU7Z0JBRUQsSUFBSSxNQUFNLEtBQUssT0FBTyxFQUFFO29CQUN0QixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFBO29CQUNsQyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsS0FBSyxDQUFBO2lCQUMzQztxQkFBTTtvQkFDTCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFBO29CQUNqQyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFBO2lCQUMxQztZQUVILENBQUMsQ0FBQyxDQUFDO1lBRUgscURBQXFEO1lBQ3JELDZFQUE2RTtZQUM3RSxpQ0FBaUM7WUFDakMsb0RBQW9EO1lBQ3BELHNCQUFzQjtZQUN0QixtQkFBbUI7WUFDbkIsdUJBQXVCO1lBQ3ZCLDRCQUE0QjtZQUM1QixRQUFRO1lBQ1IsNEJBQTRCO1lBQzVCLHFGQUFxRjtZQUNyRixhQUFhO1lBQ2Isa0VBQWtFO1lBQ2xFLDZEQUE2RDtZQUM3RCxNQUFNO1lBQ04sdUVBQXVFO1lBQ3ZFLE1BQU07WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUNuRCxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUE7YUFDakU7U0FDRjtRQUNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO0lBQzdCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFBO0lBRW5DLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFhLEVBQUUsT0FBWTtRQUMxQyxNQUFNLFdBQVcsR0FBYSxFQUFFLENBQUM7UUFFakMsS0FBSyxNQUFNLEdBQUcsSUFBSSxRQUFRLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO2dCQUFFLFNBQVM7WUFFNUMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVsQyxxRkFBcUY7WUFDckYsTUFBTSxPQUFPLEdBQ1gsT0FBTyxhQUFhLEtBQUssUUFBUTtnQkFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7Z0JBQ2hFLENBQUMsQ0FBQyxhQUFhLEtBQUssWUFBWSxDQUFDO1lBRXJDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN2QjtTQUNGO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixpR0FBaUc7UUFDakcsOERBQThEO1FBQzlELElBQUksSUFBSSxDQUFDLGtDQUFrQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFBO1lBQ3hDLE9BQU07U0FDUDtRQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUE7UUFFaEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELE1BQU0sUUFBUSxHQUFRLElBQUksUUFBUSxFQUFFLENBQUM7UUFFckMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLFFBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM5RSxRQUFRLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sSUFBSSxHQUFTLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDL0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDekIsSUFBSSxJQUFJLEVBQUU7WUFDUixRQUFRLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEdBQUcsaUJBQWlCLEVBQUUsV0FBVyxDQUFBO1FBQ2xGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLGNBQWMsRUFBRSxPQUFPLENBQUE7UUFDL0UsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNyRCxJQUFJLENBQUMsVUFBVSxLQUFLLGlCQUFpQixDQUFDLFFBQVEsQ0FDL0MsQ0FBQztRQUVGLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQztRQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQTtRQUNqRSxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFBO1FBQzNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQ3pELE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ25DLEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNyQztRQUdELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUV4RixJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUE7WUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUM5QyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNsSSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsRUFBRTtvQkFDbEUsS0FBSyxFQUFFLE9BQU87b0JBQ2QsSUFBSSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUM7b0JBQ2pDLFVBQVUsRUFBRSxxQkFBcUI7b0JBQ2pDLFNBQVMsRUFBRSxPQUFPO29CQUNsQixTQUFTLEVBQUUsTUFBTTtvQkFDakIsWUFBWSxFQUFFLElBQUksQ0FBQywrQ0FBK0M7aUJBQ25FLENBQUMsQ0FBQztnQkFFSCxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUN6QyxJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUU7d0JBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzt3QkFDOUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7d0JBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMscUNBQXFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQzs0QkFDOUksSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0NBQ1osbUJBQW1CO2dDQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQ0FDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7Z0NBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUE7Z0NBQzFCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFBOzRCQUNqQyxDQUFDOzRCQUNELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dDQUNmLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUE7Z0NBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRTtvQ0FDNUMsUUFBUSxFQUFFLElBQUk7b0NBQ2QsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7aUNBQy9CLENBQUMsQ0FBQztnQ0FDSCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtnQ0FDcEIsa0NBQWtDOzRCQUNwQyxDQUFDO3lCQUNGLENBQUMsQ0FBQztxQkFDSjt5QkFBTTt3QkFDTCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtxQkFDaEM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTthQUNoQztTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7U0FDckM7SUFFSCxDQUFDO0lBR0QsZUFBZTtRQUNiLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO1FBQ3RCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQTtRQUMvQyxPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ3hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO2dCQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQTtnQkFDdkIscUZBQXFGO2dCQUNyRixJQUFJLGFBQWEsS0FBSyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7b0JBQy9DLE9BQU8sRUFBRSxDQUFBO29CQUNULE9BQU07aUJBQ1A7Z0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQTtnQkFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUE7Z0JBQ3RCLElBQUksYUFBYSxLQUFLLFVBQVUsRUFBRTtvQkFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO3dCQUNwQixJQUFJLElBQUksRUFBRSxTQUFTLEtBQUssVUFBVSxFQUFFOzRCQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTt5QkFDN0I7b0JBQ0gsQ0FBQyxDQUFDLENBQUE7aUJBQ0g7cUJBQU0sSUFBSSxhQUFhLEtBQUssT0FBTyxFQUFFO29CQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ3BCLElBQUksSUFBSSxFQUFFLFNBQVMsS0FBSyxPQUFPLEVBQUU7NEJBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO3lCQUM3QjtvQkFDSCxDQUFDLENBQUMsQ0FBQTtpQkFDSDtnQkFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQ2pELENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEtBQUs7UUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFFM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQTtRQUNoRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUNsRSxJQUFJLENBQUMsYUFBYSxDQUFDLHlCQUF5QixHQUFHLEVBQUUsQ0FBQTtRQUNqRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQTtRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQTtRQUV0QixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZCxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTtTQUM3QjtRQUVELFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUE7UUFDM0YsSUFBSSxLQUFLLEVBQUUsS0FBSyxLQUFLLE9BQU8sRUFBRTtZQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN2RDthQUFNLElBQUksS0FBSyxFQUFFLEtBQUssS0FBSyxVQUFVLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdkQ7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDbkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDMUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ3RELFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUE7UUFDM0YsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUU7WUFDakQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNsRCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFDOUMscUNBQXFDO2dCQUNyQyw4Q0FBOEM7WUFDaEQsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO1NBQ1Q7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBVTtRQUN6QixNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFBO1FBQ3hCLCtDQUErQztRQUMvQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQTtRQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFBQyxFQUFFLENBQUE7UUFDdkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsZ0JBQWdCLENBQUE7UUFDakUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMseUJBQXlCLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDbEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUE7UUFDakQsc0ZBQXNGO1FBQ3RGLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFBO1FBQ2pDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUE7UUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDMUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ3RELFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUE7UUFDM0YsSUFBSSxrQkFBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLFVBQVUsQ0FBQyxFQUFFO1lBQzdHLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxrQkFBa0IsQ0FBQTtZQUM5QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFBO1lBQy9CLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUE7WUFDaEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUMzQjtRQUVELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO1FBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLEVBQUU7WUFDMUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSztZQUN0QyxXQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxPQUFPO1lBQzFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsZUFBZSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTTtZQUN2QyxRQUFRLEVBQ04sSUFBSSxDQUFDLGVBQWUsRUFBRSxPQUFPO2dCQUM3QixJQUFJLENBQUMsT0FBTztnQkFDWixJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sR0FBRyxDQUFDO1NBQzdCLENBQUMsQ0FBQztJQUNELENBQUM7SUFFRCxVQUFVO0lBRVYsQ0FBQztJQUVELFdBQVc7SUFFWCxDQUFDO0lBRUQsV0FBVztRQUNULE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBRTlDLE1BQU0sT0FBTyxHQUFHO1lBQ2QsTUFBTSxFQUFFLEdBQUc7WUFDWCxRQUFRLEVBQUUsY0FBYztZQUN4QixLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7WUFDdEMsV0FBVyxFQUFFO2dCQUNYLEtBQUssRUFBRSxDQUFDO2dCQUNSLE9BQU8sRUFBRSxJQUFJLEVBQUcsc0NBQXNDO2FBQ3ZEO1lBQ0QsS0FBSyxFQUFFO2dCQUNMLElBQUksRUFBRSxJQUFJO2dCQUNWLE1BQU0sRUFBRSxJQUFJO2dCQUNaLFdBQVcsRUFBRSxVQUFVO2FBQ3hCO1NBQ0YsQ0FBQztRQUVGLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFL0MsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFVO1FBQ3JCLE1BQU0sS0FBSyxHQUFhLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNuQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRWhFLHdEQUF3RDtRQUN4RCxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDakIsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUV4QixJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFFekMsY0FBYztRQUNkLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxRQUFRLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRywrQkFBK0IsUUFBUSxRQUFRLENBQUM7WUFDbkUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDekIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLENBQUM7WUFDbEMsT0FBTztTQUNSO1FBRUQsTUFBTSxVQUFVLEdBQVcsRUFBRSxDQUFDO1FBQzlCLE1BQU0sWUFBWSxHQUFhLEVBQUUsQ0FBQztRQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7UUFFbEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXRCLGFBQWE7WUFDYixJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxFQUFFO2dCQUN4QixZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksYUFBYSxJQUFJLENBQUMsYUFBYSxLQUFLLENBQUMsQ0FBQztnQkFDcEUsU0FBUzthQUNWO1lBRUQsYUFBYTtZQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNqRCxTQUFTO2FBQ1Y7WUFFRCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3ZCO1FBRUQsMENBQTBDO1FBQzFDLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBRWpFLE9BQU8sRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEIsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDekIsT0FBTyxFQUFFLHNCQUFzQixDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNyRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNoRCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFFUixPQUFPO1NBQ1I7UUFFRCxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUM7UUFFL0IsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLDRCQUE0QixZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7U0FDMUU7UUFFRCxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlCLE9BQU8sRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztRQUN6QixPQUFPLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFPRCxXQUFXLENBQUMsS0FBSztRQUNmLElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUE7WUFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDNUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFVBQVUsQ0FBQTtZQUV0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7U0FDdkI7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1NBQ25CO0lBQ0gsQ0FBQztJQUVELHdCQUF3QjtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUU7WUFDL0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hDLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLGtDQUFrQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO1lBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFBO1lBQ3ZCLElBQUksQ0FBQyxzQ0FBc0MsR0FBRyxJQUFJLENBQUE7WUFDbEQsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLHNDQUFzQyxHQUFHLEtBQUssQ0FBQTtRQUVuRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0QsSUFBSSxjQUFjLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUVwQyxxQkFBcUI7UUFDckIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNyRCxJQUFJLENBQUMsVUFBVSxLQUFLLGlCQUFpQixDQUFDLFFBQVEsQ0FDL0MsQ0FBQztRQUVGLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQztRQUU1QyxxQkFBcUI7UUFDckIsY0FBYyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0UsY0FBYyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFFNUUsSUFBSSxpQkFBaUIsQ0FBQyxXQUFXLEVBQUU7WUFDakMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDdkU7UUFFRCxJQUFJLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFO1lBQ3ZDLGNBQWMsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDM0U7UUFFRCx1QkFBdUI7UUFDdkIsTUFBTSxLQUFLLEdBQ1QsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUU5RSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXRDLGtDQUFrQztRQUNsQyxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDeEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVUsRUFBRSxFQUFFO29CQUMzQixjQUFjLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hFLENBQUMsQ0FBQyxDQUFDO2FBQ0o7aUJBQU07Z0JBQ0wsY0FBYyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pFO1NBQ0Y7UUFFRCx3QkFBd0I7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQy9CLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDcEMsSUFBSSxLQUFLLFlBQVksSUFBSSxFQUFFO2dCQUN6QixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxhQUFhLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUM7YUFDcEU7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ2pDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFHSCxxQ0FBcUM7UUFDckMsSUFBSSxHQUFHLEdBQVE7WUFDYixlQUFlLEVBQUUsaUJBQWlCLENBQUMsUUFBUTtZQUMzQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCO1lBQ2hELGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE9BQU87U0FDN0MsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxXQUFXLEVBQUU7WUFDMUUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQzdDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxpQkFBaUIsQ0FBQyxXQUFXLENBQ3BELENBQUM7WUFFRixHQUFHLENBQUMsYUFBYSxHQUFHLGlCQUFpQixDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDeEQsR0FBRyxDQUFDLGVBQWUsR0FBRyxjQUFjLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztTQUNyRDtRQUlELGNBQWM7UUFDZCx5RUFBeUU7UUFDekUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQTtRQUM1QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFBO1FBQ3BDLE1BQU0sQ0FDSixFQUFFLENBQUMsSUFBSSxDQUFDLEVBQWUsOEJBQThCO1FBQ3JELFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBUyxnQ0FBZ0M7U0FDeEQ7YUFDRSxJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEIsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQ25FLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNULElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQywwQkFBMEI7Z0JBQ3hELE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzFELElBQUcsSUFBSSxJQUFJLElBQUksRUFBRSxNQUFNLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtvQkFDMUQsd0VBQXdFO29CQUN4RSx1RUFBdUU7b0JBQ3ZFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUE7b0JBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBRyxrQkFBa0I7b0JBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7d0JBQzdCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUE7d0JBQy9CLElBQUksQ0FBQyx5Q0FBeUMsRUFBRSxDQUFBO3FCQUNqRDt5QkFBTTt3QkFDTCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTt3QkFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUE7d0JBQ3ZCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7cUJBQy9DO29CQUNELE9BQU87aUJBQ1I7YUFDRjtpQkFBTTtnQkFFTCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTthQUNwQjtRQUNILENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FDZixDQUFDLElBQVMsRUFBRSxFQUFFLENBQ1osSUFBSSxFQUFFLE1BQU0sS0FBSyxXQUFXO1lBQzVCLElBQUksRUFBRSxNQUFNLEtBQUssUUFBUSxFQUMzQixJQUFJLENBQUMsMkNBQTJDO1NBQ2pELENBQ007YUFDQSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEIsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUEsQ0FBQyxpQ0FBaUM7Z0JBQ3RFLE9BQU07YUFDUDtZQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDeEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFO2dCQUdsQyxJQUFJLENBQUMsc0NBQXNDLEdBQUcsS0FBSyxDQUFBO2dCQUN2RCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFHLHNFQUFzRTtnQkFDOUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUU7b0JBQ2xFLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFDO29CQUNqQyxVQUFVLEVBQUUscUJBQXFCO29CQUNqQyxTQUFTLEVBQUUsT0FBTztvQkFDbEIsU0FBUyxFQUFFLE1BQU07b0JBQ2pCLFlBQVksRUFBRSxJQUFJLENBQUMsK0NBQStDO2lCQUNuRSxDQUFDLENBQUM7Z0JBRUgsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDekMsSUFBSSxNQUFNLEtBQUssT0FBTyxFQUFFO3dCQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7d0JBRTlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO3dCQUNuQixJQUFJLENBQUMsYUFBYSxDQUFDLHFDQUFxQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUM7NEJBQzlJLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dDQUNaLG1CQUFtQjtnQ0FDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0NBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO2dDQUNwQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFBO2dDQUMxQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTs0QkFDakMsQ0FBQzs0QkFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQ0FDZixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7b0NBQzVDLFFBQVEsRUFBRSxJQUFJO29DQUNkLFVBQVUsRUFBRSxDQUFDLGdCQUFnQixDQUFDO2lDQUMvQixDQUFDLENBQUM7Z0NBQ0gsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQTtnQ0FDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7Z0NBQ3BCLGtDQUFrQzs0QkFDcEMsQ0FBQzt5QkFDRixDQUFDLENBQUM7cUJBQ0o7eUJBQU0sSUFBSSxNQUFNLEtBQUssUUFBUSxFQUFFO3dCQUM5QixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFBO3FCQUNsRDt5QkFBTTt3QkFDTCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtxQkFDckI7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFHSjtpQkFDSSxJQUFJLElBQUksRUFBRSxNQUFNLEtBQUssV0FBVyxFQUFFO2dCQUNyQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFBO2dCQUNoQyxJQUFJLENBQUMsc0NBQXNDLEdBQUcsS0FBSyxDQUFBO2dCQUNuRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUE7Z0JBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLHlCQUF5QixDQUFDO29CQUMzRCxJQUFJLEVBQUUsYUFBYSxDQUFDO2dCQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLHlCQUF5QixHQUFHLElBQUksRUFBRSxhQUFhLENBQUM7Z0JBQ25FLFlBQVksQ0FBQyxPQUFPLENBQ2xCLGlCQUFpQixFQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQ25ELENBQUM7Z0JBRUYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBRW5ELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsRUFBRTtvQkFDMUQsUUFBUSxFQUFFLElBQUk7b0JBQ2QsVUFBVSxFQUFFLENBQUMsa0JBQWtCLENBQUM7aUJBQ2pDLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7YUFDcEM7aUJBQU0sSUFBRyxJQUFJLElBQUksSUFBSSxFQUFFLE1BQU0sS0FBSyxRQUFRLEVBQUU7Z0JBQ3ZDLGlDQUFpQztnQkFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUcsa0JBQWtCO2dCQUMxQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFBO2dCQUNoQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO2dCQUM5QyxPQUFPO2FBQ1Y7UUFFUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDdEMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLDBEQUEwRDtRQUMxRCxJQUFJLFVBQVUsSUFBSSxDQUFDLEVBQUU7WUFDbkIsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLDBDQUEwQztTQUMzRDthQUFNLElBQUksVUFBVSxJQUFJLEVBQUUsRUFBRTtZQUMzQixVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsZ0RBQWdEO1NBQ2pFO2FBQU0sSUFBSSxVQUFVLElBQUksRUFBRSxFQUFFO1lBQzNCLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxvQ0FBb0M7U0FDckQ7YUFBTSxJQUFJLFVBQVUsSUFBSSxFQUFFLEVBQUU7WUFDM0IsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLHVDQUF1QztTQUN4RDthQUFNLElBQUksVUFBVSxJQUFJLEVBQUUsRUFBRTtZQUMzQixVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsOENBQThDO1NBQy9EO2FBQU07WUFDTCxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUNBQW1DO1NBQ3BEO1FBRUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3RDLElBQUksVUFBVSxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUUvQixnREFBZ0Q7UUFDaEQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLElBQUksVUFBVSxJQUFJLEVBQUUsRUFBRTtZQUNwQiw0Q0FBNEM7WUFDNUMsVUFBVSxHQUFHLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNyQzthQUFNLElBQUksVUFBVSxJQUFJLEVBQUUsRUFBRTtZQUMzQixnREFBZ0Q7WUFDaEQsVUFBVSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNqRDthQUFNLElBQUksVUFBVSxJQUFJLEVBQUUsRUFBRTtZQUMzQixtREFBbUQ7WUFDbkQsVUFBVSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNqRDthQUFNLElBQUksVUFBVSxJQUFJLEdBQUcsRUFBRTtZQUM1QixrREFBa0Q7WUFDbEQsVUFBVSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNqRDthQUFNO1lBQ0wsMkRBQTJEO1lBQzNELFVBQVUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUM5RDtRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxzQkFBc0IsR0FBRyxtQ0FBbUMsQ0FBQztRQUVsRSxnREFBZ0Q7UUFDaEQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUUsSUFBSTtnQkFDRixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFN0MsK0JBQStCO2dCQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMseUJBQXlCLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUNoRixJQUFJLENBQUMsYUFBYSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBRS9ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUVuRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7b0JBQzFELFFBQVEsRUFBRSxJQUFJO29CQUNkLFVBQVUsRUFBRSxDQUFDLGtCQUFrQixDQUFDO2lCQUNqQyxDQUFDLENBQUM7YUFDSjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnREFBZ0QsRUFBRSxHQUFHLEVBQUU7b0JBQ3hFLFFBQVEsRUFBRSxJQUFJO29CQUNkLFVBQVUsRUFBRSxDQUFDLGdCQUFnQixDQUFDO2lCQUMvQixDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsNEJBQTRCO1FBQzFCLElBQUksSUFBSSxDQUFDLHNCQUFzQixLQUFLLG1DQUFtQyxFQUFFO1lBQ3ZFLE9BQU8sR0FBRyxDQUFDO1NBQ1o7UUFDRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFHRCxVQUFVLENBQUMsS0FBYTtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUVqRSxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRW5DLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsRUFBRSxzQkFBc0IsRUFBRSxDQUFDO1FBRTFFLGdDQUFnQztRQUNoQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUN0QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBcUIsQ0FBQztZQUN2RSxJQUFJLEtBQUs7Z0JBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBR0Qsa0JBQWtCLENBQUMsYUFBc0IsRUFBRSxJQUFpQjtRQUMxRCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQzNCLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtZQUN6RCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksRUFBRSxnQkFBZ0IsQ0FBQTtZQUM3QyxxRkFBcUY7WUFDckYsSUFBSSxhQUFhLElBQUksYUFBYSxLQUFLLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDaEUsSUFBSSxFQUFFLEVBQUUsQ0FBQTtnQkFDUixPQUFNO2FBQ1A7WUFDRCxJQUFJLG9CQUFvQixHQUFHLEVBQUUsQ0FBQTtZQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2pDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxTQUFTLEtBQUssQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUU7b0JBQzNILG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtpQkFDaEM7WUFDSCxDQUFDLENBQUMsQ0FBQTtZQUVGLElBQUksQ0FBQyxZQUFZLEdBQUcsb0JBQW9CLENBQUE7WUFDeEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFBO1lBQ2hELElBQUksQ0FBQyxZQUFZLEdBQUcsb0JBQW9CLENBQUM7WUFDekMsSUFBSSxFQUFFLEVBQUUsQ0FBQTtRQUNWLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFlO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO0lBQzFCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxNQUFlO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUE7UUFDakMsSUFBSSxNQUFNLEVBQUU7WUFDVixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUU7b0JBQ3JHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtpQkFDOUY7WUFDSCxDQUFDLENBQUMsQ0FBQTtTQUNIO2FBQU0sSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDckMsaUdBQWlHO1lBQ2pHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7U0FDdEM7SUFDSCxDQUFDO0lBU0QsZUFBZSxDQUFDLEtBQUssR0FBRyxLQUFLO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDOUIsT0FBTTtTQUNQO1FBQ0QsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQ2pFLE9BQU07U0FDUDtRQUNELElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtZQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFBO1NBQzlCO1FBQ0QsTUFBTSxTQUFTLEdBQUcsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUE7UUFDNUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtRQUM3QixNQUFNLE9BQU8sR0FBRztZQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtCO1lBQzlCLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQzdCLEtBQUssRUFBRSxJQUFJLENBQUMscUJBQXFCO1NBQ2xDLENBQUE7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLEtBQUssVUFBVTtZQUN0RCxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDO1lBQ2pGLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUM1RSxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQ2hCLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNaLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtvQkFDMUMsT0FBTTtpQkFDUDtnQkFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFBO2dCQUM5QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFBO2dCQUN4RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQUE7Z0JBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFBO2dCQUNyQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLEtBQUssSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFO3dCQUN0RSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtxQkFDL0I7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUE7Z0JBQ3hGLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFBO2dCQUNyQyxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLFVBQVUsRUFBRTtvQkFDckcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsMkNBQTJDLEVBQUUsR0FBRyxFQUFFO3dCQUNuRSxRQUFRLEVBQUUsSUFBSTt3QkFDZCxVQUFVLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztxQkFDL0IsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFBO29CQUMxRCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUE7b0JBQ3RELFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUE7aUJBQzVGO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFDLG1CQUFtQixFQUFFO29CQUMxQyxPQUFNO2lCQUNQO2dCQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUE7WUFDaEMsQ0FBQztTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsOEVBQThFO0lBQzlFLGdGQUFnRjtJQUNoRiw4QkFBOEI7UUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxDQUFBO1FBQ2xFLElBQUksQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7ZUFDdkMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLEtBQUssVUFBVSxDQUFDLEVBQUU7WUFDeEUsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEVBQUUsQ0FBQTtZQUNqQyxPQUFNO1NBQ1A7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLEtBQUssVUFBVSxDQUFDO2VBQ3ZFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLFVBQVUsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2VBQzNGLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdkgsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQzNELENBQUM7SUFFRCxVQUFVLENBQUMsS0FBSztRQUNkLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDL0MsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUMvQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FDcEMsQ0FBQztTQUNIO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUE7U0FDdEM7SUFFSCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBSztRQUN4QixNQUFNLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUNuRixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ2pELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQTtRQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1FBRTVDLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUNwRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtRQUM5RCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFO1lBQzNGLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1NBQ25GO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRy9GLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxHQUFHLGdCQUFnQixDQUFBO1FBRWpFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUYsSUFBSSxjQUFjLEVBQUU7WUFDbEIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLGNBQWMsQ0FBQTtTQUM1QztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsY0FBYyxFQUFFLE9BQU8sQ0FBQTtRQUMvRSxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFBO1FBQzNGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO0lBQzdCLENBQUM7SUFFQSxrQkFBa0I7UUFFakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7SUFFakQsQ0FBQztJQUVELHVCQUF1QixDQUFDLFlBQVk7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7UUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMseUJBQXlCLENBQUMsR0FBRyxZQUFZLENBQUM7UUFDN0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsR0FBRyxZQUFZLENBQUM7UUFDNUQsWUFBWSxDQUFDLE9BQU8sQ0FDbEIsaUJBQWlCLEVBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FDbkQsQ0FBQztRQUVGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDakMsbUJBQW1CLEVBQUUsUUFBUTtTQUM5QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsMkZBQTJGO0lBQzNGLCtGQUErRjtJQUMvRixpQ0FBaUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyx3Q0FBd0MsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2pKLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQTtnQkFDdkIsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7Z0JBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO29CQUN4QixJQUFJLENBQUMsNkNBQTZDLEVBQUUsQ0FBQTtvQkFDcEQsT0FBTTtpQkFDUDtnQkFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsRUFBRTtvQkFDbEUsS0FBSyxFQUFFLE9BQU87b0JBQ2QsSUFBSSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUM7b0JBQ2pDLFVBQVUsRUFBRSxxQkFBcUI7b0JBQ2pDLFNBQVMsRUFBRSxPQUFPO29CQUNsQixTQUFTLEVBQUUsTUFBTTtvQkFDakIsWUFBWSxFQUFFLElBQUk7aUJBQ25CLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUN6QyxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUU7d0JBQ3ZCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtxQkFDM0M7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDVixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQTtnQkFDdkIsSUFBSSxDQUFDLDZDQUE2QyxFQUFFLENBQUE7WUFDdEQsQ0FBQztTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCw2Q0FBNkM7UUFDM0MsSUFBSSxDQUFDLHNDQUFzQyxHQUFHLElBQUksQ0FBQTtRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQywrRkFBK0YsRUFBRSxHQUFHLEVBQUU7WUFDdkgsUUFBUSxFQUFFLElBQUk7WUFDZCxVQUFVLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztTQUMvQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsMEJBQTBCLENBQUMsT0FBZ0I7UUFDekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUU7WUFDOUQsS0FBSyxFQUFFLE9BQU87WUFDZCxJQUFJLEVBQUUsRUFBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFDO1lBQ3JFLFVBQVUsRUFBRSxxQkFBcUI7WUFDakMsU0FBUyxFQUFFLE9BQU87WUFDbEIsU0FBUyxFQUFFLE1BQU07WUFDakIsWUFBWSxFQUFFLElBQUksQ0FBQywrQ0FBK0M7U0FDbkUsQ0FBQyxDQUFDO1FBRUQsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN6QyxJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUU7Z0JBQ3RCLHVEQUF1RDtnQkFDdkQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQTtnQkFDL0IsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLENBQUE7YUFDakQ7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7YUFDckI7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNWLENBQUM7SUFFRCx5Q0FBeUM7UUFDdkMsK0VBQStFO1FBQy9FLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO1FBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMscUNBQXFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNySSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWixPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtnQkFDcEIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUE7WUFDakMsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxJQUFJLHlEQUF5RCxFQUFFLEdBQUcsRUFBRTtvQkFDekcsUUFBUSxFQUFFLElBQUk7b0JBQ2QsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7aUJBQy9CLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtnQkFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUE7Z0JBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUE7WUFDbEMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNmLENBQUM7K0dBaHlDVSw4QkFBOEI7bUdBQTlCLDhCQUE4QiwwZUNwQjNDLDJwWUErTk07OzRGRDNNTyw4QkFBOEI7a0JBTDFDLFNBQVM7K0JBQ0UsNkJBQTZCO2lRQUtLLFVBQVU7c0JBQXJELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFakMsZUFBZTtzQkFBdkIsS0FBSztnQkErREksa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLDJCQUEyQjtzQkFBcEMsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQVMyQyxnQkFBZ0I7c0JBQWpFLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgaHRtbDJwZGYgZnJvbSAnaHRtbDJwZGYuanMnO1xuaW1wb3J0IHsgRGVsZXRlUm9sZU1hcHBpbmdQb3B1cENvbXBvbmVudCB9IGZyb20gJy4uL2RlbGV0ZS1yb2xlLW1hcHBpbmctcG9wdXAvZGVsZXRlLXJvbGUtbWFwcGluZy1wb3B1cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IGludGVydmFsLCBvZiwgY29uY2F0LCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRha2VXaGlsZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWF0U2VsZWN0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTaGFyZWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kdWxlcy9zaGFyZWQvc2VydmljZXMvc2hhcmVkLnNlcnZpY2UnO1xuaW1wb3J0IHsgUm9sZU1hcHBpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kdWxlcy9zaGFyZWQvc2VydmljZXMvcm9sZS1tYXBwaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kdWxlcy9zaGFyZWQvc2VydmljZXMvZXZlbnQuc2VydmljZSc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yb2xlLW1hcHBpbmctZ2VuZXJhdGlvbi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJvbGVNYXBwaW5nR2VuZXJhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdwZGZDb250ZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pIHBkZkNvbnRlbnQhOiBFbGVtZW50UmVmO1xuICBcbiAgQElucHV0KCkgbG9naW5TdGF0dXNGbGFnID0gZmFsc2VcbiAgdGl0bGUgPSAnc3VuYmlyZC1jYi1zdGF0aWN3ZWInO1xuICBpc01haW50ZW5hbmNlUGFnZTogYW55XG4gIHNlbGVjdGVkVmFsdWUgPSAnJ1xuICBzZWFyY2hUZXh0ID0gJydcbiAgZGF0YVNvdXJjZTogYW55XG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gWydSZXF1ZXN0SWQnLCAndGl0bGUnLCAncmVxdWVzdG9yJywgJ3JlcXVlc3RUeXBlJyxcbiAgICAncmVxdWVzdFN0YXR1cycsICdhc3NpZ25lZScsICdyZXF1ZXN0ZWRPbicsICdpbnRlcmVzdHMnLCAnYWN0aW9uJ11cbiAgc2VsZWN0ZWRNaW5pc3RyeVR5cGU6IHN0cmluZyA9ICdtaW5pc3RyeSc7XG4gIG1pbmlzdHJ5RGF0YTogYW55ID0gW11cbiAgbWluaXN0cnlGdWxsRGF0YTogYW55ID0gW11cbiAgcm9sZU1hcHBpbmdGb3JtITogRm9ybUdyb3VwO1xuICBkaXNhYmxlQnRuID0gdHJ1ZVxuICBzZWN0b3JEYXRhID0gW1xuICAgIHtcbiAgICAgIHZhbHVlOiAnV29tZW4gYW5kIGNoaWxkIGRldmVsb3BtZW50J1xuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6ICdSdXJhbCBkZXZlbG9wbWVudCdcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiAnVXJiYW4gZGV2ZWxvcG1lbnQnXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogJ0hlYWx0aGNhcmUnXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogJ0FncmljdWx0dXJlJ1xuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6ICdPdGhlcnMnXG4gICAgfVxuXG4gIF1cbiAgZGVwYXJ0bWVudERhdGE6IGFueVtdID0gW11cbiAgbG9hZGluZyA9IGZhbHNlXG4gIG1heEZpbGVTaXplTUIgPSAyNTtcbiAgYWxsb3dlZFR5cGVzID0gW1xuICAgICdhcHBsaWNhdGlvbi9wZGYnLFxuICAgICdhcHBsaWNhdGlvbi9tc3dvcmQnLFxuICAgICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsXG4gICAgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcsXG4gICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0JyxcbiAgICAndGV4dC9wbGFpbidcbiAgXTtcbiAgdXBsb2FkRXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICB1cGxvYWRlZEZpbGU6IEZpbGVbXSB8IG51bGwgPSBudWxsO1xuICBsb2dpbiA9IGZhbHNlXG4gIGNicEZpbmFsT2JqOiBhbnkgPSB7fVxuICBzZWxlY3RlZE1pbmlzdHJ5SWQgPSAnJ1xuICBvcmlnaW5hbEZvcm1WYWx1ZXM6IGFueVxuICBjaHVua3M6IHN0cmluZ1tdID0gW107XG4gIGZ1bGxKc29uOiBzdHJpbmcgPSAnJztcbiAgcGFyc2VkRGF0YTogYW55O1xuICBjdXJyZW50UHJvY2Vzc2luZ1N0YWdlOiBzdHJpbmcgPSAnJztcbiAgcHJvY2Vzc2luZ1N0YWdlcyA9IFtcbiAgICAnSW5pdGlhbGl6aW5nIENCUCBQbGFuIGdlbmVyYXRpb24uLi4nLFxuICAgICdBbmFseXppbmcgZGVwYXJ0bWVudGFsIGNvbXBldGVuY3kgcmVxdWlyZW1lbnRzLi4uJyxcbiAgICAnUHJvY2Vzc2luZyB3b3JrIG9yZGVyIHNwZWNpZmljYXRpb25zIGFuZCByb2xlIGRlZmluaXRpb25zLi4uJyxcbiAgICAnR2VuZXJhdGluZyBkZXRhaWxlZCByb2xlcyAmIHJlc3Bvc2liaWxpdGllcy4uLicsXG4gICAgJ0dlbmVyYXRpbmcgZGV0YWlsZWQgY29tcGV0ZW5jaWVzLi4uJyxcbiAgICAnVmFsaWRhdGluZyByb2xlIG1hcHBpbmcgIGFuZCBmaW5hbGl6aW5nIHRoZSBDQlAgUGxhbidcbiAgXTtcbiAgQE91dHB1dCgpIHN1Y2Nlc3NSb2xlTWFwcGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBPdXRwdXQoKSBhbHJlYWR5QXZhaWxhYmxlUm9sZU1hcHBpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICBAT3V0cHV0KCkgbG9naW5TdWNjZXNzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KClcbiAgc2VsZWN0ZWRNaW5pc3RyeU9iajogYW55ID0gJydcbiAgbG9naW5Vc2VyT3JnSWRzID0gW11cbiAgcGFuZWxPcGVuID0gZmFsc2U7XG4gIGRlcGFydG1lbnRQYW5lbE9wZW4gPSBmYWxzZVxuICBmaWx0ZXJlZExpc3QgPSBbXTtcbiAgZmlsdGVyZWREZXBhcnRtZW50TGlzdDogYW55W10gPSBbXTtcbiAgc2VsZWN0ZWREZXBhcnRtZW50T2JqOiBhbnkgPSBudWxsXG4gIHBpbm5lZERlcGFydG1lbnRPcHRpb25zOiBhbnlbXSA9IFtdXG4gIEBWaWV3Q2hpbGQoJ2RlcGFydG1lbnRTZWxlY3QnLCB7IHN0YXRpYzogZmFsc2UgfSkgZGVwYXJ0bWVudFNlbGVjdCE6IE1hdFNlbGVjdDtcbiAgZGVwYXJ0bWVudFBhZ2VTaXplID0gNTBcbiAgZGVwYXJ0bWVudE9mZnNldCA9IDBcbiAgZGVwYXJ0bWVudEhhc01vcmUgPSB0cnVlXG4gIGRlcGFydG1lbnRMb2FkaW5nID0gZmFsc2VcbiAgZGVwYXJ0bWVudFNlYXJjaFF1ZXJ5ID0gJydcbiAgZGVwYXJ0bWVudE1pbmlzdHJ5SWQgPSAnJ1xuICBwcml2YXRlIGRlcGFydG1lbnRTZWFyY2hTdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpXG4gIHByaXZhdGUgZGVwYXJ0bWVudFJlcXVlc3RJZCA9IDBcbiAgb3JpZ2luYWxNaW5pc3RyeURhdGEgPSBbXVxuICBhcGlMb2FkaW5nID0gZmFsc2VcbiAgZmlyc3RBcGlSZXNwb25zZTogYW55ID0gbnVsbFxuICBkb2N1bWVudHMgPSBbXVxuICBkaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gIGRpc2FibGVVcGxvYWREb2N1bWVudE9yaWdpbmFsID0gdHJ1ZVxuICB3b3JrQWxsb2NhdGlvbk9yZGVyRG9jdW1lbnRNaXNzaW5nID0gZmFsc2VcbiAgc2hvd1dvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcgPSBmYWxzZVxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBpbW1lZGlhdGVGYWlsdXJlSGFuZGxlZCA9IGZhbHNlO1xuICBwcml2YXRlIHJldHJpZWRBZnRlckZhaWx1cmUgPSBmYWxzZTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBldmVudFN2YzogRXZlbnRTZXJ2aWNlLFxuICAgIHB1YmxpYyBzaGFyZWRTZXJ2aWNlOiBTaGFyZWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwdWJsaWMgcm9sZU1hcHBpbmdTZXJ2aWNlOiBSb2xlTWFwcGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxuICApIHtcbiAgICB0aGlzLnJvdXRlci5yb3V0ZVJldXNlU3RyYXRlZ3kuc2hvdWxkUmV1c2VSb3V0ZSA9ICgpID0+IGZhbHNlO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihbXSlcbiAgICB0aGlzLmlzTWFpbnRlbmFuY2VQYWdlID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9tYWludGVuYW5jZScpXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcblxuICAgIHRoaXMuZGVwYXJ0bWVudFNlYXJjaFN1YmplY3QucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICkuc3Vic2NyaWJlKChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLmRlcGFydG1lbnRTZWFyY2hRdWVyeSA9IHF1ZXJ5XG4gICAgICB0aGlzLmxvYWREZXBhcnRtZW50cyh0cnVlKVxuICAgIH0pXG5cbiAgICB0aGlzLmxvZ2luID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrSWZMb2dpbigpXG5cbiAgICB0aGlzLmNicEZpbmFsT2JqID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldENCUFBsYW5Mb2NhbFN0b3JhZ2UoKVxuICAgIGlmICh0aGlzLmNicEZpbmFsT2JqICYmIHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5ICYmIHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5zYk9yZ1R5cGUpIHtcblxuXG4gICAgICB0aGlzLmVkaXRNaW5pc3RyeUZvcm0oKVxuICAgICAgLy8gdGhpcy5nZXRNaW5pc3RyeURhdGEoKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5sb2dpbikge1xuICAgICAgICB0aGlzLmdldE1pbmlzdHJ5RGF0YSgpXG4gICAgICB9XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBtaW5pc3RyeVR5cGU6IFsnbWluaXN0cnknLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgbWluaXN0cnk6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgc2VjdG9yczogW1tdXSxcbiAgICAgICAgZGVwYXJ0bWVudHM6IFsnJ10sIC8vIHNob3duIG9ubHkgaWYgbWluaXN0cnlUeXBlID09ICdzdGF0ZSdcbiAgICAgICAgYWRkaXRpb25hbERldGFpbHM6IFsnJ10sXG4gICAgICAgIGFkZGl0aW9uYWxfZG9jdW1lbnQ6IFtdXG4gICAgICB9KTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnc2VjdG9ycycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5VHlwZScpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHR5cGUgPT4ge1xuICAgICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5yZXNldCh7XG4gICAgICAgICAgbWluaXN0cnlUeXBlOiB0eXBlLCAvLyBLZWVwIHRoZSBjaGFuZ2VkIHZhbHVlXG4gICAgICAgICAgbWluaXN0cnk6IG51bGwsXG4gICAgICAgICAgc2VjdG9yczogW10sXG4gICAgICAgICAgZGVwYXJ0bWVudHM6IFtdLFxuICAgICAgICAgIGFkZGl0aW9uYWxEZXRhaWxzOiAnJyxcbiAgICAgICAgICBhZGRpdGlvbmFsX2RvY3VtZW50OiBbXVxuICAgICAgICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7IC8vIGF2b2lkIHJlLWVtaXR0aW5nIG1pbmlzdHJ5VHlwZSdzIG93biB2YWx1ZUNoYW5nZXMgYW5kIHJlY3Vyc2luZyBpbmZpbml0ZWx5XG4gICAgaWYgKHR5cGUgPT09ICdzdGF0ZScpIHtcbiAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5jbGVhclZhbGlkYXRvcnMoKTtcbiAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG59IGVsc2Uge1xuICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LmNsZWFyVmFsaWRhdG9ycygpO1xuICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LnNldFZhbHVlKFtdKTtcbiAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG59XG4gICAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoc3RhdHVzOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IGhhc1VwbG9hZERvY3VtZW50cyA9IGZhbHNlXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGhhc1VwbG9hZERvY3VtZW50cyA9XG4gICAgICAgICAgICB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy91cGxvYWQtZG9jdW1lbnRzJyk7XG5cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVXBsb2FkRG9jdW1lbnRzKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrUm9sZU1hcHBpbmdGb3JtVmFsaWRhdGlvbi5uZXh0KHN0YXR1cyk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdWQUxJRCcpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICB9KTtcbiAgICB9XG5cblxuXG5cblxuXG4gIH1cblxuICBnZXRVcGxvYWRlZERvY3VtZW50cygpIHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlO1xuICAgIHRoaXMuYXBpTG9hZGluZyA9IHRydWVcbiAgICBsZXQgcmVxQm9keSA9IHtcbiAgICAgIHN0YXRlX2NlbnRlcl9pZDogZm9ybURhdGEubWluaXN0cnksXG4gICAgICBpbmNsdWRlX3N1bW1hcnk6IHRydWUsXG4gICAgICBza2lwOiAwLFxuICAgICAgbGltaXQ6IDIwMFxuICAgIH1cbiAgICBpZiAodHlwZW9mIGZvcm1EYXRhPy5kZXBhcnRtZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJlcUJvZHlbJ2RlcGFydG1lbnRfaWQnXSA9IGZvcm1EYXRhPy5kZXBhcnRtZW50c1xuICAgIH1cbiAgICB0aGlzLmFwaUxvYWRpbmcgPSB0cnVlXG5cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0VXBsb2FkZWREb2N1bWVudHMocmVxQm9keSkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGlmIChyZXMgJiYgcmVzPy5pdGVtcyAmJiByZXM/Lml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IHdBT0NvdW50ID0gMFxuICAgICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLmRvY3VtZW50cyA9IHJlcz8uaXRlbXNcblxuICAgICAgICBjb25zb2xlLmxvZygndGhpcy5kb2N1bWVudHMnLCB0aGlzLmRvY3VtZW50cylcbiAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSBmYWxzZVxuICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudE9yaWdpbmFsID0gZmFsc2VcbiAgICAgICAgdGhpcy5kb2N1bWVudHMuZm9yRWFjaCgoaXRlbSk9PntcbiAgICAgICAgICBpZihpdGVtPy5kb2N1bWVudF90eXBlID09PSAnV29yayBBbGxvY2F0aW9uIE9yZGVyJykge1xuICAgICAgICAgICAgd0FPQ291bnQgPXdBT0NvdW50KzFcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYod0FPQ291bnQgPCAxKSB7XG4gICAgICAgICAgdGhpcy53b3JrQWxsb2NhdGlvbk9yZGVyRG9jdW1lbnRNaXNzaW5nID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMud29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRvY3VtZW50cy0tJywgdGhpcy5kb2N1bWVudHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRvY3VtZW50cyA9IFtdXG4gICAgICAgIHRoaXMud29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IHRydWVcbiAgICAgICAgdGhpcy5hcGlMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSBmYWxzZVxuICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudE9yaWdpbmFsID0gZmFsc2VcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgZWRpdE1pbmlzdHJ5Rm9ybSgpIHtcbiAgICBpZiAodGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnkuc2JPcmdUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID0gdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnkuc2JPcmdUeXBlXG4gICAgICBhd2FpdCB0aGlzLmdldE1pbmlzdHJ5RGF0YSgpXG4gICAgICBpZiAodGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LnNiT3JnVHlwZSkge1xuICAgICAgICB0aGlzLmRlcGFydG1lbnRNaW5pc3RyeUlkID0gdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXJcbiAgICAgICAgdGhpcy5sb2FkRGVwYXJ0bWVudHModHJ1ZSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbWluaXN0cnlUeXBlOiBbdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIG1pbmlzdHJ5OiBbdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBzZWN0b3JzOiBbW11dLFxuICAgICAgICBkZXBhcnRtZW50czogW3RoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzXSwgLy8gc2hvd24gb25seSBpZiBtaW5pc3RyeVR5cGUgPT0gJ3N0YXRlJ1xuICAgICAgICBhZGRpdGlvbmFsRGV0YWlsczogWycnXVxuICAgICAgfSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoc3RhdHVzOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IGhhc1VwbG9hZERvY3VtZW50cyA9IGZhbHNlXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGhhc1VwbG9hZERvY3VtZW50cyA9XG4gICAgICAgICAgICB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy91cGxvYWQtZG9jdW1lbnRzJyk7XG5cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVXBsb2FkRG9jdW1lbnRzKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrUm9sZU1hcHBpbmdGb3JtVmFsaWRhdGlvbi5uZXh0KHN0YXR1cyk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdWQUxJRCcpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICB9KTtcblxuICAgICAgLy8gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIC8vIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnbWluaXN0cnlUeXBlJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodHlwZSA9PiB7XG4gICAgICAvLyAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnJlc2V0KHtcbiAgICAgIC8vICAgICBtaW5pc3RyeVR5cGU6IHR5cGUsIC8vIEtlZXAgdGhlIGNoYW5nZWQgdmFsdWVcbiAgICAgIC8vICAgICBtaW5pc3RyeTogbnVsbCxcbiAgICAgIC8vICAgICBzZWN0b3JzOiBbXSxcbiAgICAgIC8vICAgICBkZXBhcnRtZW50czogW10sXG4gICAgICAvLyAgICAgYWRkaXRpb25hbERldGFpbHM6ICcnXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gICBpZiAodHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAvLyAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAvLyB9KTtcblxuICAgICAgaWYgKHRoaXMubWluaXN0cnlEYXRhICYmIHRoaXMubWluaXN0cnlEYXRhLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlJZCA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyXG4gICAgICB9XG5cbiAgICAgIC8vdGhpcy5vbkdlbmVyYXRlUm9sZU1hcHBpbmcoKVxuICAgIH0gZWxzZSBpZiAodGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LnNiT3JnVHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5zYk9yZ1R5cGVcbiAgICAgIGF3YWl0IHRoaXMuZ2V0TWluaXN0cnlEYXRhKClcbiAgICAgIHRoaXMuZGVwYXJ0bWVudE1pbmlzdHJ5SWQgPSB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uaWRlbnRpZmllclxuICAgICAgdGhpcy5sb2FkRGVwYXJ0bWVudHModHJ1ZSlcbiAgICAgIGlmICh0aGlzLm1pbmlzdHJ5RGF0YSAmJiB0aGlzLm1pbmlzdHJ5RGF0YS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5SWQgPSB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uaWRlbnRpZmllclxuICAgICAgfVxuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbWluaXN0cnlUeXBlOiBbdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIG1pbmlzdHJ5OiBbdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBzZWN0b3JzOiBbW11dLFxuICAgICAgICBkZXBhcnRtZW50czogW3RoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzXSwgLy8gc2hvd24gb25seSBpZiBtaW5pc3RyeVR5cGUgPT0gJ3N0YXRlJ1xuICAgICAgICBhZGRpdGlvbmFsRGV0YWlsczogW3RoaXMuY2JwRmluYWxPYmo/LmFkZGl0aW9uYWxEZXRhaWxzXVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKChzdGF0dXM6IGFueSkgPT4ge1xuICAgICAgICBsZXQgaGFzVXBsb2FkRG9jdW1lbnRzID0gZmFsc2VcbiAgICAgICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaGFzVXBsb2FkRG9jdW1lbnRzID1cbiAgICAgICAgICAgIHRoaXMucm91dGVyLnVybC5pbmNsdWRlcygnL3VwbG9hZC1kb2N1bWVudHMnKTtcblxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFoYXNVcGxvYWREb2N1bWVudHMpIHtcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2hlY2tSb2xlTWFwcGluZ0Zvcm1WYWxpZGF0aW9uLm5leHQoc3RhdHVzKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ1ZBTElEJykge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50ID0gZmFsc2VcbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudE9yaWdpbmFsID0gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudCA9IHRydWVcbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudE9yaWdpbmFsID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ3NlY3RvcnMnKT8uc2V0VmFsdWUoW10pO1xuICAgICAgLy8gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdtaW5pc3RyeVR5cGUnKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh0eXBlID0+IHtcbiAgICAgIC8vICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0ucmVzZXQoe1xuICAgICAgLy8gICAgIG1pbmlzdHJ5VHlwZTogdHlwZSwgLy8gS2VlcCB0aGUgY2hhbmdlZCB2YWx1ZVxuICAgICAgLy8gICAgIG1pbmlzdHJ5OiBudWxsLFxuICAgICAgLy8gICAgIHNlY3RvcnM6IFtdLFxuICAgICAgLy8gICAgIGRlcGFydG1lbnRzOiBbXSxcbiAgICAgIC8vICAgICBhZGRpdGlvbmFsRGV0YWlsczogJydcbiAgICAgIC8vICAgfSk7XG4gICAgICAvLyAgIGlmICh0eXBlID09PSAnc3RhdGUnKSB7XG4gICAgICAvLyAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgICAvLyAgIH0gZWxzZSB7XG4gICAgICAvLyAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgIC8vICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIC8vIH0pO1xuICAgICAgY29uc29sZS5sb2coJ3RoaXMubWluaXN0cnlEYXRhJywgdGhpcy5taW5pc3RyeURhdGEpXG4gICAgICBpZiAodGhpcy5taW5pc3RyeURhdGEgJiYgdGhpcy5taW5pc3RyeURhdGEubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeUlkID0gdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXJcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vcmlnaW5hbEZvcm1WYWx1ZXMgPSB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgIHRoaXMuZ2V0VXBsb2FkZWREb2N1bWVudHMoKVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5sb2dpbiA9IHRoaXMubG9naW5TdGF0dXNGbGFnXG5cbiAgfVxuXG4gIGdldENoYW5nZWRGaWVsZHMob3JpZ2luYWw6IGFueSwgY3VycmVudDogYW55KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNoYW5nZWRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3JpZ2luYWwpIHtcbiAgICAgIGlmICghb3JpZ2luYWwuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSBvcmlnaW5hbFtrZXldO1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gY3VycmVudFtrZXldO1xuXG4gICAgICAvLyBGb3IgYXJyYXlzIGFuZCBvYmplY3RzLCB1c2UgSlNPTi5zdHJpbmdpZnkgKG9yIGxvZGFzaCBpc0VxdWFsIGZvciBkZWVwIGNvbXBhcmlzb24pXG4gICAgICBjb25zdCBpc0VxdWFsID1cbiAgICAgICAgdHlwZW9mIG9yaWdpbmFsVmFsdWUgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShvcmlnaW5hbFZhbHVlKSA9PT0gSlNPTi5zdHJpbmdpZnkoY3VycmVudFZhbHVlKVxuICAgICAgICAgIDogb3JpZ2luYWxWYWx1ZSA9PT0gY3VycmVudFZhbHVlO1xuXG4gICAgICBpZiAoIWlzRXF1YWwpIHtcbiAgICAgICAgY2hhbmdlZEtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2VkS2V5cztcbiAgfVxuXG4gIG9uR2VuZXJhdGVSb2xlTWFwcGluZygpOiBhbnkge1xuICAgIC8vIEdlbmVyYXRpb24gbXVzdCBub3Qgc3RhcnQgKGFuZCBubyBleGlzdGluZyByZWNvcmQgYmUgZGVsZXRlZCkgd2l0aG91dCBhIFdvcmsgQWxsb2NhdGlvbiBPcmRlci5cbiAgICAvLyBPbmx5IGxvb2sgdXAgYW4gZXhpc3RpbmcgQ0JQIHNvIHRoZSB1c2VyIGNhbiBzdGlsbCB2aWV3IGl0LlxuICAgIGlmICh0aGlzLndvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcpIHtcbiAgICAgIHRoaXMuc2hvd0V4aXN0aW5nUm9sZU1hcHBpbmdXaXRob3V0V0FPKClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnJldHJpZWRBZnRlckZhaWx1cmUgPSBmYWxzZVxuXG4gICAgY29uc3QgY3VycmVudEZvcm1WYWx1ZXMgPSB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgIGNvbnN0IGZvcm1EYXRhOiBhbnkgPSBuZXcgRm9ybURhdGEoKTtcblxuICAgIGZvcm1EYXRhLmFwcGVuZCgnbWluaXN0cnlUeXBlJywgY3VycmVudEZvcm1WYWx1ZXMubWluaXN0cnlUeXBlKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ21pbmlzdHJ5JywgY3VycmVudEZvcm1WYWx1ZXMubWluaXN0cnkpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnc2VjdG9ycycsIEpTT04uc3RyaW5naWZ5KGN1cnJlbnRGb3JtVmFsdWVzLnNlY3RvcnMpKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2RlcGFydG1lbnRzJywgSlNPTi5zdHJpbmdpZnkoY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2FkZGl0aW9uYWxEZXRhaWxzJywgY3VycmVudEZvcm1WYWx1ZXMuYWRkaXRpb25hbERldGFpbHMgfHwgJycpO1xuICAgIGNvbnN0IGZpbGU6IEZpbGUgPSB0aGlzLnVwbG9hZGVkRmlsZSB8fCB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2FkZGl0aW9uYWxfZG9jdW1lbnQnKT8udmFsdWU7XG4gICAgY29uc29sZS5sb2coJ2ZpbGUnLCBmaWxlKVxuICAgIGlmIChmaWxlKSB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2FkZGl0aW9uYWxfZG9jdW1lbnQnLCBmaWxlKTtcbiAgICB9XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnZGVwYXJ0bWVudHMnXSA9IGN1cnJlbnRGb3JtVmFsdWVzPy5kZXBhcnRtZW50c1xuICAgIGNvbnN0IGRlcGFydG1lbnROYW1lID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maW5kKHUgPT4gdS5pZGVudGlmaWVyID09PSBjdXJyZW50Rm9ybVZhbHVlcy5kZXBhcnRtZW50cyk7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnZGVwYXJ0bWVudF9uYW1lJ10gPSBkZXBhcnRtZW50TmFtZT8ub3JnTmFtZVxuICAgIGNvbnN0IHNlbGVjdGVkTWluaXN0cnkgPSB0aGlzLm1pbmlzdHJ5RGF0YS5maW5kKGl0ZW0gPT5cbiAgICAgIGl0ZW0uaWRlbnRpZmllciA9PT0gY3VycmVudEZvcm1WYWx1ZXMubWluaXN0cnlcbiAgICApO1xuXG4gICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5T2JqID0gc2VsZWN0ZWRNaW5pc3RyeTtcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydtaW5pc3RyeSddID0gc2VsZWN0ZWRNaW5pc3RyeVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYnBQbGFuRmluYWxPYmonLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKSlcbiAgICBjb25zb2xlLmxvZygndGhpcy5yb2xlTWFwcGluZ0Zvcm0nLCB0aGlzLnJvbGVNYXBwaW5nRm9ybSlcbiAgICBjb25zb2xlLmxvZygnZm9ybURhdGEtLScsIGZvcm1EYXRhKVxuICAgIGZvciAoY29uc3QgcGFpciBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAke3BhaXJbMF19OmAsIHBhaXJbMV0pO1xuICAgIH1cblxuXG4gICAgY29uc3QgY2hhbmdlZEZpZWxkcyA9IHRoaXMuZ2V0Q2hhbmdlZEZpZWxkcyh0aGlzLm9yaWdpbmFsRm9ybVZhbHVlcywgY3VycmVudEZvcm1WYWx1ZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRGaWVsZHMubGVuZ3RoID4gMCB8fCAoZmlsZSAmJiBmaWxlLnNpemUgPiAwKSkge1xuICAgICAgY29uc29sZS5sb2coJ2NoYW5nZWRGaWVsZHMnLCBjaGFuZ2VkRmllbGRzKVxuICAgICAgY29uc29sZS5sb2coJ0NoYW5nZWQgZmllbGRzOicsIGNoYW5nZWRGaWVsZHMpO1xuICAgICAgaWYgKGNoYW5nZWRGaWVsZHMuaW5jbHVkZXMoJ2FkZGl0aW9uYWxEZXRhaWxzJykgJiYgdGhpcy5yb2xlTWFwcGluZ0Zvcm0udmFsdWUuYWRkaXRpb25hbERldGFpbHM/LnRyaW0oKSB8fCAoZmlsZSAmJiBmaWxlLnNpemUgPiAwKSkge1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERlbGV0ZVJvbGVNYXBwaW5nUG9wdXBDb21wb25lbnQsIHtcbiAgICAgICAgICB3aWR0aDogJzQwMHB4JyxcbiAgICAgICAgICBkYXRhOiB7ZG9jdW1lbnRzOiB0aGlzLmRvY3VtZW50c30sXG4gICAgICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgICAgIG1pbkhlaWdodDogJzMwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICAgICAgbWF4SGVpZ2h0OiAnODB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmRlbGV0ZVJvbGVNYXBwaW5nQnlTdGF0ZUFuZERlcGFydG1lbnQodGhpcy5yb2xlTWFwcGluZ0Zvcm0udmFsdWUubWluaXN0cnksIHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLmRlcGFydG1lbnRzKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gU3VjY2VzcyBoYW5kbGluZ1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzOicsIHJlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBbXVxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGaW5hbFJvbGVNYXBwaW5nKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IFtdXG4gICAgICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKGVycm9yPy5lcnJvcj8uZGV0YWlsLCAnWCcsIHtcbiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVGaW5hbFJvbGVNYXBwaW5nKClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgY29uc29sZS5sb2coJ05vIGNoYW5nZXMgZGV0ZWN0ZWQuJyk7XG4gICAgfVxuXG4gIH1cblxuXG4gIGdldE1pbmlzdHJ5RGF0YSgpIHtcbiAgICB0aGlzLmFwaUxvYWRpbmcgPSB0cnVlXG4gICAgY29uc3QgcmVxdWVzdGVkVHlwZSA9IHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGVcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRNaW5pc3RyeURhdGEocmVxdWVzdGVkVHlwZSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2RhdGEtLScsIGRhdGEpXG4gICAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIC8vIElnbm9yZSBzdGFsZSByZXNwb25zZXMgZnJvbSBhIHR5cGUgdGhhdCB3YXMgY2hhbmdlZCBhZ2FpbiBiZWZvcmUgdGhpcyBvbmUgcmV0dXJuZWRcbiAgICAgICAgaWYgKHJlcXVlc3RlZFR5cGUgIT09IHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUpIHtcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1pbmlzdHJ5RnVsbERhdGEgPSBkYXRhXG4gICAgICAgIHRoaXMubWluaXN0cnlEYXRhID0gW11cbiAgICAgICAgaWYgKHJlcXVlc3RlZFR5cGUgPT09ICdtaW5pc3RyeScpIHtcbiAgICAgICAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtPy5zYk9yZ1R5cGUgPT09ICdtaW5pc3RyeScpIHtcbiAgICAgICAgICAgICAgdGhpcy5taW5pc3RyeURhdGEucHVzaChpdGVtKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdGVkVHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0/LnNiT3JnVHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgICAgICAgICB0aGlzLm1pbmlzdHJ5RGF0YS5wdXNoKGl0ZW0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2V0VXNlclByb2ZpbGVEYXRhKHJlcXVlc3RlZFR5cGUsIHJlc29sdmUpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBvbk1pbmlzdHJ5VHlwZUNoYW5nZShldmVudCkge1xuICAgIGNvbnNvbGUubG9nKCdldmVudCcsIGV2ZW50KVxuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnlUeXBlJ10gPSBldmVudC52YWx1ZVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSBbXVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5yb2xlTWFwcGluZ0dlbmVyYXRpb25EYXRhID0gW11cbiAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID0gZXZlbnQudmFsdWVcbiAgICB0aGlzLm1pbmlzdHJ5RGF0YSA9IFtdXG5cbiAgICBpZiAodGhpcy5sb2dpbikge1xuICAgICAgYXdhaXQgdGhpcy5nZXRNaW5pc3RyeURhdGEoKVxuICAgIH1cblxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYnBQbGFuRmluYWxPYmonLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKSlcbiAgICBpZiAoZXZlbnQ/LnZhbHVlID09PSAnc3RhdGUnKSB7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5Jyk/LnNldFZhbHVlKG51bGwpO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsdWUoW10pO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQ/LnZhbHVlID09PSAnbWluaXN0cnknKSB7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5Jyk/LnNldFZhbHVlKG51bGwpO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsdWUoW10pO1xuICAgIH1cblxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ21pbmlzdHJ5J10gPSAnJ1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gJydcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gJydcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgLy8gdGhpcy5yb2xlTWFwcGluZ0Zvcm0ucmVzZXQoKVxuICAgIGlmICghdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnkpIHtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnNldEVycm9ycyh7IGludmFsaWQ6IHRydWUgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAvLyAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gICAgICAgIC8vICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgICAgIH0sIDUwMDApXG4gICAgfVxuICB9XG5cbiAgb25NaW5pc3RyeUNoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRNaW5pc3RyeUlkID0gZXZlbnQudmFsdWU7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIE1pbmlzdHJ5IElEOicsIHNlbGVjdGVkTWluaXN0cnlJZCk7XG4gICAgdGhpcy5kZXBhcnRtZW50RGF0YSA9IFtdXG4gICAgLy8gWW91IGNhbiBhY2Nlc3MgdGhlIHNlbGVjdGVkIG9iamVjdCBpZiBuZWVkZWRcbiAgICBjb25zdCBzZWxlY3RlZE1pbmlzdHJ5ID0gdGhpcy5taW5pc3RyeURhdGEuZmluZChpdGVtID0+IGl0ZW0uaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRNaW5pc3RyeUlkKTtcbiAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlPYmogPSBzZWxlY3RlZE1pbmlzdHJ5XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIE1pbmlzdHJ5OicsIHNlbGVjdGVkTWluaXN0cnkpOyBgYFxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ21pbmlzdHJ5J10gPSBzZWxlY3RlZE1pbmlzdHJ5XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsncm9sZV9tYXBwaW5nX2dlbmVyYXRpb24nXSA9IFtdXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnJvbGVNYXBwaW5nR2VuZXJhdGlvbkRhdGEgPSBbXVxuICAgIC8vIFNlbGVjdGluZyBhIGRpZmZlcmVudCBtaW5pc3RyeS9zdGF0ZSBpbnZhbGlkYXRlcyBhbnkgcHJldmlvdXNseSBzZWxlY3RlZCBkZXBhcnRtZW50XG4gICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5zZXRWYWx1ZShudWxsKTtcbiAgICB0aGlzLnNlbGVjdGVkRGVwYXJ0bWVudE9iaiA9IG51bGxcbiAgICB0aGlzLnBpbm5lZERlcGFydG1lbnRPcHRpb25zID0gW11cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50X25hbWUnXSA9ICcnXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnZGVwYXJ0bWVudHMnXSA9ICcnXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgIGlmIChzZWxlY3RlZE1pbmlzdHJ5SWQgJiYgKHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdzdGF0ZScgfHwgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5JykpIHtcbiAgICAgIHRoaXMuZGVwYXJ0bWVudE1pbmlzdHJ5SWQgPSBzZWxlY3RlZE1pbmlzdHJ5SWRcbiAgICAgIHRoaXMuZGVwYXJ0bWVudFNlYXJjaFF1ZXJ5ID0gJydcbiAgICAgIHRoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdCA9IFtdXG4gICAgICB0aGlzLmxvYWREZXBhcnRtZW50cyh0cnVlKVxuICAgIH1cblxuICAgIHRoaXMuZ2V0VXBsb2FkZWREb2N1bWVudHMoKVxuICAgIGNvbnNvbGUubG9nKCdHZW5lcmF0ZSBDQlAgdmFsaWRhdGlvbjonLCB7XG4gIGZvcm1WYWxpZDogdGhpcy5yb2xlTWFwcGluZ0Zvcm0/LnZhbGlkLFxuICBmb3JtSW52YWxpZDogdGhpcy5yb2xlTWFwcGluZ0Zvcm0/LmludmFsaWQsXG4gIGxvYWRpbmc6IHRoaXMubG9hZGluZyxcbiAgZG9jdW1lbnRzOiB0aGlzLmRvY3VtZW50cyxcbiAgZG9jdW1lbnRzTGVuZ3RoOiB0aGlzLmRvY3VtZW50cz8ubGVuZ3RoLFxuICBkaXNhYmxlZDpcbiAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybT8uaW52YWxpZCB8fFxuICAgIHRoaXMubG9hZGluZyB8fFxuICAgIHRoaXMuZG9jdW1lbnRzPy5sZW5ndGggPCAxXG59KTtcbiAgfVxuXG4gIHNlYXJjaERhdGEoKSB7XG5cbiAgfVxuXG4gIGFwcGx5RmlsdGVyKCkge1xuXG4gIH1cblxuICBkb3dubG9hZFBERigpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wZGZDb250ZW50Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgbWFyZ2luOiAwLjUsXG4gICAgICBmaWxlbmFtZTogJ0NCUF9QbGFuLnBkZicsXG4gICAgICBpbWFnZTogeyB0eXBlOiAnanBlZycsIHF1YWxpdHk6IDAuOTggfSxcbiAgICAgIGh0bWwyY2FudmFzOiB7XG4gICAgICAgIHNjYWxlOiAyLFxuICAgICAgICB1c2VDT1JTOiB0cnVlLCAgLy8gSW1wb3J0YW50IGZvciBleHRlcm5hbCBpbWFnZXMvaWNvbnNcbiAgICAgIH0sXG4gICAgICBqc1BERjoge1xuICAgICAgICB1bml0OiAnaW4nLFxuICAgICAgICBmb3JtYXQ6ICdhNCcsXG4gICAgICAgIG9yaWVudGF0aW9uOiAncG9ydHJhaXQnXG4gICAgICB9XG4gICAgfTtcblxuICAgIGh0bWwycGRmKCkuZnJvbShlbGVtZW50KS5zZXQob3B0aW9ucykuc2F2ZSgpO1xuXG4gIH1cblxuICBvbkZpbGVDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGVzOiBGaWxlTGlzdCA9IGV2ZW50LnRhcmdldC5maWxlcztcbiAgICBjb25zdCBtYXhGaWxlcyA9IDM7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnYWRkaXRpb25hbF9kb2N1bWVudCcpO1xuXG4gICAgLy8gQWx3YXlzIGNsZWFyIGNvbnRyb2wgZmlyc3QgKHByZXZlbnRzIG9sZCB2YWxpZCB2YWx1ZSlcbiAgICBjb250cm9sPy5yZXNldCgpO1xuICAgIGNvbnRyb2w/LnNldEVycm9ycyhudWxsKTtcbiAgICB0aGlzLnVwbG9hZGVkRmlsZSA9IFtdO1xuICAgIHRoaXMudXBsb2FkRXJyb3IgPSBudWxsO1xuXG4gICAgaWYgKCFmaWxlcyB8fCBmaWxlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIExpbWl0IGNoZWNrXG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IG1heEZpbGVzKSB7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yID0gYFlvdSBjYW4gdXBsb2FkIGEgbWF4aW11bSBvZiAke21heEZpbGVzfSBmaWxlc2A7XG4gICAgICBjb250cm9sPy5zZXRFcnJvcnMoeyBtYXhGaWxlczogdHJ1ZSB9KTtcbiAgICAgIGNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XG4gICAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICBjb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRGaWxlczogRmlsZVtdID0gW107XG4gICAgY29uc3QgaW52YWxpZEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG1heEJ5dGVzID0gdGhpcy5tYXhGaWxlU2l6ZU1CICogMTAyNCAqIDEwMjQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBmaWxlID0gZmlsZXNbaV07XG5cbiAgICAgIC8vIFNpemUgY2hlY2tcbiAgICAgIGlmIChmaWxlLnNpemUgPiBtYXhCeXRlcykge1xuICAgICAgICBpbnZhbGlkRmlsZXMucHVzaChgJHtmaWxlLm5hbWV9IChleGNlZWRzICR7dGhpcy5tYXhGaWxlU2l6ZU1CfU1CKWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVHlwZSBjaGVja1xuICAgICAgaWYgKCF0aGlzLmFsbG93ZWRUeXBlcy5pbmNsdWRlcyhmaWxlLnR5cGUpKSB7XG4gICAgICAgIGludmFsaWRGaWxlcy5wdXNoKGAke2ZpbGUubmFtZX0gKGludmFsaWQgdHlwZSlgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhbGlkRmlsZXMucHVzaChmaWxlKTtcbiAgICB9XG5cbiAgICAvLyDinYwgTk8gdmFsaWQgZmlsZXMg4oaSIGZvcm0gTVVTVCBCRSBpbnZhbGlkXG4gICAgaWYgKHZhbGlkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yID0gYEludmFsaWQgZmlsZShzKTogJHtpbnZhbGlkRmlsZXMuam9pbignLCAnKX1gO1xuXG4gICAgICBjb250cm9sPy5zZXRWYWx1ZShudWxsKTtcbiAgICAgIGNvbnRyb2w/LnNldEVycm9ycyh7IGludmFsaWRGaWxlczogdHJ1ZSB9KTtcbiAgICAgIGNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XG4gICAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICBjb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnNldEVycm9ycyh7IGludmFsaWQ6IHRydWUgfSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSwgNTAwMClcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOKclCBBdCBsZWFzdCBPTkUgdmFsaWQgZmlsZSDihpIgZm9ybSBzaG91bGQgYmUgVkFMSURcbiAgICB0aGlzLnVwbG9hZGVkRmlsZSA9IHZhbGlkRmlsZXM7XG5cbiAgICBpZiAoaW52YWxpZEZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudXBsb2FkRXJyb3IgPSBgU29tZSBmaWxlcyB3ZXJlIHNraXBwZWQ6ICR7aW52YWxpZEZpbGVzLmpvaW4oJywgJyl9YDtcbiAgICB9XG5cbiAgICBjb250cm9sPy5zZXRWYWx1ZSh2YWxpZEZpbGVzKTtcbiAgICBjb250cm9sPy5zZXRFcnJvcnMobnVsbCk7XG4gICAgY29udHJvbD8ubWFya0FzRGlydHkoKTtcbiAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgY29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gIH1cblxuXG5cblxuXG5cbiAgbG9naW5TdGF0dXMoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHRoaXMubG9naW4gPSB0cnVlXG4gICAgICB0aGlzLmxvZ2luU3VjY2Vzcy5lbWl0KHRydWUpXG4gICAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID0gJ21pbmlzdHJ5J1xuXG4gICAgICB0aGlzLmdldE1pbmlzdHJ5RGF0YSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9naW4gPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpIHtcbiAgICBpZiAoIXRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbGlkKSB7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMud29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZykge1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlXG4gICAgICB0aGlzLnNob3dXb3JrQWxsb2NhdGlvbk9yZGVyRG9jdW1lbnRNaXNzaW5nID0gdHJ1ZVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYXBpTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5zaG93V29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IGZhbHNlXG5cbiAgICBjb25zdCBjdXJyZW50Rm9ybVZhbHVlcyA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldFJhd1ZhbHVlKCk7XG4gICAgbGV0IGZvcm1VcGxvYWREYXRhID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICAvLyBNaW5pc3RyeSBzZWxlY3Rpb25cbiAgICBjb25zdCBzZWxlY3RlZE1pbmlzdHJ5ID0gdGhpcy5taW5pc3RyeURhdGEuZmluZChpdGVtID0+XG4gICAgICBpdGVtLmlkZW50aWZpZXIgPT09IGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5XG4gICAgKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeU9iaiA9IHNlbGVjdGVkTWluaXN0cnk7XG5cbiAgICAvLyBBcHBlbmQgYmFzZSBmaWVsZHNcbiAgICBmb3JtVXBsb2FkRGF0YS5hcHBlbmQoJ3N0YXRlX2NlbnRlcl9pZCcsIGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5IHx8ICcnKTtcbiAgICBmb3JtVXBsb2FkRGF0YS5hcHBlbmQoJ3N0YXRlX2NlbnRlcl9uYW1lJywgc2VsZWN0ZWRNaW5pc3RyeT8ub3JnTmFtZSB8fCAnJyk7XG5cbiAgICBpZiAoY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpIHtcbiAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnZGVwYXJ0bWVudF9pZCcsIGN1cnJlbnRGb3JtVmFsdWVzLmRlcGFydG1lbnRzKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudEZvcm1WYWx1ZXMuYWRkaXRpb25hbERldGFpbHMpIHtcbiAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnaW5zdHJ1Y3Rpb24nLCBjdXJyZW50Rm9ybVZhbHVlcy5hZGRpdGlvbmFsRGV0YWlscyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHVwbG9hZGVkIGZpbGUocylcbiAgICBjb25zdCBmaWxlczogRmlsZSB8IEZpbGVbXSA9XG4gICAgICB0aGlzLnVwbG9hZGVkRmlsZSB8fCB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2FkZGl0aW9uYWxfZG9jdW1lbnQnKT8udmFsdWU7XG5cbiAgICBjb25zb2xlLmxvZygnRmlsZXMgc2VsZWN0ZWQ6JywgZmlsZXMpO1xuXG4gICAgLy8gQXBwZW5kIHNpbmdsZSBvciBtdWx0aXBsZSBmaWxlc1xuICAgIGlmIChmaWxlcykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsZXMpKSB7XG4gICAgICAgIGZpbGVzLmZvckVhY2goKGZpbGU6IEZpbGUpID0+IHtcbiAgICAgICAgICBmb3JtVXBsb2FkRGF0YS5hcHBlbmQoJ2FkZGl0aW9uYWxfZG9jdW1lbnQnLCBmaWxlLCBmaWxlLm5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnYWRkaXRpb25hbF9kb2N1bWVudCcsIGZpbGVzLCBmaWxlcy5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWJ1ZzogcHJpbnQgRm9ybURhdGFcbiAgICBjb25zb2xlLmxvZyhcIkZvcm1EYXRhIERlYnVnOlwiKTtcbiAgICBmb3JtVXBsb2FkRGF0YS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2tleX06IEZJTEUgLT4gJHt2YWx1ZS5uYW1lfSAoJHt2YWx1ZS5zaXplfSBieXRlcylgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2tleX06ICR7dmFsdWV9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cblxuICAgIC8vIEJ1aWxkIHJlcXVlc3QgYm9keSBmb3IgcG9sbGluZyBBUElcbiAgICBsZXQgcmVxOiBhbnkgPSB7XG4gICAgICBzdGF0ZV9jZW50ZXJfaWQ6IGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5LFxuICAgICAgaW5zdHJ1Y3Rpb246IGN1cnJlbnRGb3JtVmFsdWVzLmFkZGl0aW9uYWxEZXRhaWxzLFxuICAgICAgc3RhdGVfY2VudGVyX25hbWU6IHNlbGVjdGVkTWluaXN0cnk/Lm9yZ05hbWVcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdzdGF0ZScgfHwgY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpIHtcbiAgICAgIGNvbnN0IGRlcGFydG1lbnROYW1lID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maW5kKFxuICAgICAgICBkID0+IGQuaWRlbnRpZmllciA9PT0gY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHNcbiAgICAgICk7XG5cbiAgICAgIHJlcS5kZXBhcnRtZW50X2lkID0gY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMgfHwgJyc7XG4gICAgICByZXEuZGVwYXJ0bWVudF9uYW1lID0gZGVwYXJ0bWVudE5hbWU/Lm9yZ05hbWUgfHwgJyc7XG4gICAgfVxuXG5cblxuICAgIC8vIFBvbGxpbmcgQVBJXG4gICAgLy8gUmVzZXQgcGVyLXJ1biBzdGF0ZSBzbyBhIHByZXZpb3VzIHJ1bidzIGZpcnN0IHJlc3BvbnNlIGlzIG5ldmVyIHJldXNlZFxuICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IG51bGxcbiAgICB0aGlzLmltbWVkaWF0ZUZhaWx1cmVIYW5kbGVkID0gZmFsc2VcbiAgICBjb25jYXQoXG4gICAgICBvZihudWxsKSwgICAgICAgICAgICAgIC8vIPCflKUgaW1tZWRpYXRlIGZpcnN0IGVtaXNzaW9uXG4gICAgICBpbnRlcnZhbCg1MDAwKSAgICAgICAgIC8vIOKPsSBzdWJzZXF1ZW50IHBvbGxpbmcgZXZlcnkgNXNcbiAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zaGFyZWRTZXJ2aWNlLmdlbmVyYXRlUm9sZU1hcHBpbmcocmVxLCBmaWxlcykpLFxuICAgICAgICB0YXAoZGF0YSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLmZpcnN0QXBpUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IGRhdGE7IC8vIPCfkYggc3RvcmUgZmlyc3QgcmVzcG9uc2VcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGaXJzdCBBUEkgcmVzcG9uc2U6JywgdGhpcy5maXJzdEFwaVJlc3BvbnNlKTtcbiAgICAgICAgICAgIGlmKGRhdGEgJiYgZGF0YT8uc3RhdHVzID09PSAnRkFJTEVEJyAmJiAhZGF0YT8uaXNfZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgLy8gQSBwcmV2aW91cyBnZW5lcmF0aW9uIGZhaWxlZDogZGVsZXRlIGl0IGFuZCBzdGFydCBhIGZyZXNoIG9uZSAob25jZSkuXG4gICAgICAgICAgICAgIC8vIHRha2VXaGlsZSBzdGlsbCBmb3J3YXJkcyB0aGlzIHZhbHVlIHRvIHN1YnNjcmliZSgpOyB0ZWxsIGl0IHRvIHNraXAuXG4gICAgICAgICAgICAgIHRoaXMuaW1tZWRpYXRlRmFpbHVyZUhhbmRsZWQgPSB0cnVlXG4gICAgICAgICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpOyAgIC8vIPCfm5Egc3RvcCBwb2xsaW5nXG4gICAgICAgICAgICAgIGlmICghdGhpcy5yZXRyaWVkQWZ0ZXJGYWlsdXJlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXRyaWVkQWZ0ZXJGYWlsdXJlID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHRoaXMucmVnZW5lcmF0ZVJvbGVNYXBwaW5nQWZ0ZXJGYWlsZWRBbmREZWxldGUoKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5hcGlMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dSb2xlTWFwcGluZ0ZhaWxlZFBvcHVwKGRhdGE/Lm1lc3NhZ2UpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlV2hpbGUoXG4gIChkYXRhOiBhbnkpID0+XG4gICAgZGF0YT8uc3RhdHVzICE9PSAnQ09NUExFVEVEJyAmJlxuICAgIGRhdGE/LnN0YXR1cyAhPT0gJ0ZBSUxFRCcsXG4gIHRydWUgLy8gZW1pdCB0aGUgZmluYWwgQ09NUExFVEVEL0ZBSUxFRCByZXNwb25zZVxuKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW1tZWRpYXRlRmFpbHVyZUhhbmRsZWQpIHtcbiAgICAgICAgICB0aGlzLmltbWVkaWF0ZUZhaWx1cmVIYW5kbGVkID0gZmFsc2UgLy8gYWxyZWFkeSBoYW5kbGVkIGluIHRhcCgpIGFib3ZlXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ3JvbGUgbWFwcGluZyBkYXRhLS0nLCBkYXRhKVxuICAgICAgICBpZiAodGhpcy5maXJzdEFwaVJlc3BvbnNlPy5pc19leGlzdGluZykge1xuXG5cbiAgICAgICAgICAgICAgdGhpcy5zaG93V29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5hcGlMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7ICAgLy8g8J+bkSBzdG9wIHBvbGxpbmcgKG5vdCBjb21wbGV0ZWQsIHNvIGxhdGVyIHJ1bnMgY2FuIHN0aWxsIGJlIHN0b3BwZWQpXG4gICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZWxldGVSb2xlTWFwcGluZ1BvcHVwQ29tcG9uZW50LCB7XG4gICAgICAgICAgICB3aWR0aDogJzQwMHB4JyxcbiAgICAgICAgICAgIGRhdGE6IHtkb2N1bWVudHM6IHRoaXMuZG9jdW1lbnRzfSxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgICAgICAgIG1pbkhlaWdodDogJzMwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICAgICAgICBtYXhIZWlnaHQ6ICc4MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuXG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmRlbGV0ZVJvbGVNYXBwaW5nQnlTdGF0ZUFuZERlcGFydG1lbnQodGhpcy5yb2xlTWFwcGluZ0Zvcm0udmFsdWUubWluaXN0cnksIHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLmRlcGFydG1lbnRzKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzOicsIHJlcyk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgdGhpcy5maXJzdEFwaVJlc3BvbnNlID0gW11cbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGaW5hbFJvbGVNYXBwaW5nKClcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvcj8uZXJyb3I/LmRldGFpbCwgJ1gnLCB7XG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdGhpcy5maXJzdEFwaVJlc3BvbnNlID0gW11cbiAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAvLyB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSAnYnV0dG9uJykge1xuICAgICAgICAgICAgICB0aGlzLnZpZXdFeGlzdGluZ1JvbGVNYXBwaW5nKGRhdGE/LnJvbGVfbWFwcGluZ3MpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YT8uc3RhdHVzID09PSAnQ09NUExFVEVEJykge1xuICAgICAgICAgIHRoaXMucmV0cmllZEFmdGVyRmFpbHVyZSA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5zaG93V29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5hcGlMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID1cbiAgICAgICAgICAgIGRhdGE/LnJvbGVfbWFwcGluZ3M7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnJvbGVNYXBwaW5nR2VuZXJhdGlvbkRhdGEgPSBkYXRhPy5yb2xlX21hcHBpbmdzO1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgJ2NicFBsYW5GaW5hbE9iaicsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLnN1Y2Nlc3NSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKTtcblxuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignQ0JQIFBsYW4gZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseSEnLCAnWCcsIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1zdWNjZXNzJ11cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FpL2xpc3QnXSk7XG4gICAgICAgIH0gZWxzZSBpZihkYXRhICYmIGRhdGE/LnN0YXR1cyA9PT0gJ0ZBSUxFRCcpIHtcbiAgICAgICAgICAgICAgLy8gRmFpbGVkIGFmdGVyIGJlaW5nIGluIHByb2dyZXNzXG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTsgICAvLyDwn5uRIHN0b3AgcG9sbGluZ1xuICAgICAgICAgICAgICAgIHRoaXMucmV0cmllZEFmdGVyRmFpbHVyZSA9IGZhbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Um9sZU1hcHBpbmdGYWlsZWRQb3B1cChkYXRhPy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlUHJvY2Vzc2luZ1N0YWdlKCkge1xuICAgIGNvbnN0IGNodW5rQ291bnQgPSB0aGlzLmNodW5rcy5sZW5ndGg7XG4gICAgbGV0IHN0YWdlSW5kZXggPSAwO1xuXG4gICAgLy8gTXVjaCBzbG93ZXIgc3RhZ2UgcHJvZ3Jlc3Npb24gLSBzdGFnZXMgc3RheSBtdWNoIGxvbmdlclxuICAgIGlmIChjaHVua0NvdW50IDw9IDgpIHtcbiAgICAgIHN0YWdlSW5kZXggPSAwOyAvLyBJbml0aWFsaXppbmcgLSBzdGF5cyBmb3IgZmlyc3QgOCBjaHVua3NcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gMjApIHtcbiAgICAgIHN0YWdlSW5kZXggPSAxOyAvLyBBbmFseXppbmcgY29tcGV0ZW5jeSByZXF1aXJlbWVudHMgLSAxMiBjaHVua3NcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gMzUpIHtcbiAgICAgIHN0YWdlSW5kZXggPSAyOyAvLyBQcm9jZXNzaW5nIHdvcmsgb3JkZXIgLSAxNSBjaHVua3NcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gNTUpIHtcbiAgICAgIHN0YWdlSW5kZXggPSAzOyAvLyBHZW5lcmF0aW5nIHJvbGUgbWFwcGluZ3MgLSAyMCBjaHVua3NcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gNzUpIHtcbiAgICAgIHN0YWdlSW5kZXggPSA0OyAvLyBDb21wdXRpbmcgZmluYWwgcmVjb21tZW5kYXRpb25zIC0gMjAgY2h1bmtzXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YWdlSW5kZXggPSA1OyAvLyBGaW5hbGl6aW5nIENCUCBQbGFuIC0gNzUrIGNodW5rc1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9IHRoaXMucHJvY2Vzc2luZ1N0YWdlc1tzdGFnZUluZGV4XTtcbiAgfVxuXG4gIGdldFByb2dyZXNzUGVyY2VudGFnZSgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNodW5rQ291bnQgPSB0aGlzLmNodW5rcy5sZW5ndGg7XG4gICAgaWYgKGNodW5rQ291bnQgPT09IDApIHJldHVybiAwO1xuXG4gICAgLy8gTXVjaCBzbG93ZXIgYW5kIHNtb290aGVyIHByb2dyZXNzIGNhbGN1bGF0aW9uXG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xuXG4gICAgaWYgKGNodW5rQ291bnQgPD0gMTUpIHtcbiAgICAgIC8vIEZpcnN0IDE1IGNodW5rcyA9IDAtMjUlICh2ZXJ5IHNsb3cgc3RhcnQpXG4gICAgICBwZXJjZW50YWdlID0gKGNodW5rQ291bnQgLyAxNSkgKiAyNTtcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gMzUpIHtcbiAgICAgIC8vIE5leHQgMjAgY2h1bmtzID0gMjUtNTAlIChzbG93IGVhcmx5IHByb2dyZXNzKVxuICAgICAgcGVyY2VudGFnZSA9IDI1ICsgKChjaHVua0NvdW50IC0gMTUpIC8gMjApICogMjU7XG4gICAgfSBlbHNlIGlmIChjaHVua0NvdW50IDw9IDYwKSB7XG4gICAgICAvLyBOZXh0IDI1IGNodW5rcyA9IDUwLTc1JSAoc3RlYWR5IG1pZGRsZSBwcm9ncmVzcylcbiAgICAgIHBlcmNlbnRhZ2UgPSA1MCArICgoY2h1bmtDb3VudCAtIDM1KSAvIDI1KSAqIDI1O1xuICAgIH0gZWxzZSBpZiAoY2h1bmtDb3VudCA8PSAxMDApIHtcbiAgICAgIC8vIE5leHQgNDAgY2h1bmtzID0gNzUtOTAlIChzbG93ZXIgZmluYWwgYXBwcm9hY2gpXG4gICAgICBwZXJjZW50YWdlID0gNzUgKyAoKGNodW5rQ291bnQgLSA2MCkgLyA0MCkgKiAxNTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQmV5b25kIDEwMCBjaHVua3MgPSA5MC05NSUgKHZlcnkgc2xvdyBmaW5hbCBwcm9ncmVzc2lvbilcbiAgICAgIHBlcmNlbnRhZ2UgPSA5MCArIE1hdGgubWluKCgoY2h1bmtDb3VudCAtIDEwMCkgLyA1MCkgKiA1LCA1KTtcbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5yb3VuZChwZXJjZW50YWdlKTtcbiAgfVxuXG4gIG9uU3RyZWFtRW5kKCkge1xuICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICdDb21wbGV0aW5nIENCUCBQbGFuIGdlbmVyYXRpb24uLi4nO1xuXG4gICAgLy8gU2hvdyAxMDAlIGNvbXBsZXRpb24gYnJpZWZseSBiZWZvcmUgZmluaXNoaW5nXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmZ1bGxKc29uID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgICBjb25zdCBjbGVhbmVkID0gdGhpcy5mdWxsSnNvbi5yZXBsYWNlKC9eYGBganNvblxcbi8sICcnKS5yZXBsYWNlKC9gYGAkLywgJycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5wYXJzZWREYXRhID0gSlNPTi5wYXJzZShjbGVhbmVkKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1BhcnNlZCBkYXRhOicsIHRoaXMucGFyc2VkRGF0YSk7XG5cbiAgICAgICAgLy8gSGFuZGxlIHN1Y2Nlc3NmdWwgY29tcGxldGlvblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsncm9sZV9tYXBwaW5nX2dlbmVyYXRpb24nXSA9IHRoaXMucGFyc2VkRGF0YTtcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnJvbGVNYXBwaW5nR2VuZXJhdGlvbkRhdGEgPSB0aGlzLnBhcnNlZERhdGE7XG5cbiAgICAgICAgdGhpcy5zdWNjZXNzUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSk7XG5cbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdDQlAgUGxhbiBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5IScsICdYJywge1xuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdKU09OIHBhcnNlIGVycm9yOicsIGUpO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQ0JQIFBsYW4uIFBsZWFzZSB0cnkgYWdhaW4uJywgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIDUwMCk7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBwcm9ncmVzcyBwZXJjZW50YWdlIGluY2x1ZGluZyBjb21wbGV0aW9uIHN0YXRlXG4gIGdldERpc3BsYXlQcm9ncmVzc1BlcmNlbnRhZ2UoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID09PSAnQ29tcGxldGluZyBDQlAgUGxhbiBnZW5lcmF0aW9uLi4uJykge1xuICAgICAgcmV0dXJuIDEwMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvZ3Jlc3NQZXJjZW50YWdlKCk7XG4gIH1cblxuIFxuICByZW1vdmVGaWxlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudXBsb2FkZWRGaWxlIHx8IHRoaXMudXBsb2FkZWRGaWxlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gUmVtb3ZlIG9uZSBmaWxlIGF0IHRoZSBnaXZlbiBpbmRleFxuICAgIHRoaXMudXBsb2FkZWRGaWxlLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlXG4gICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdhZGRpdGlvbmFsX2RvY3VtZW50Jyk/LnNldFZhbHVlKHRoaXMudXBsb2FkZWRGaWxlKTtcbiAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2FkZGl0aW9uYWxfZG9jdW1lbnQnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuXG4gICAgLy8gQ2xlYXIgZXJyb3JzIGlmIG5vIGZpbGVzIGxlZnRcbiAgICBpZiAodGhpcy51cGxvYWRlZEZpbGUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yID0gJyc7XG4gICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWREb2MnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgaWYgKGlucHV0KSBpbnB1dC52YWx1ZSA9ICcnO1xuICAgIH1cbiAgfVxuXG5cbiAgZ2V0VXNlclByb2ZpbGVEYXRhKHJlcXVlc3RlZFR5cGU/OiBzdHJpbmcsIGRvbmU/OiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFVzZXJQcm9maWxlKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnZGF0YS0tJywgZGF0YSlcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd1c2VyUHJvZmlsZScsIEpTT04uc3RyaW5naWZ5KGRhdGEpKVxuICAgICAgdGhpcy5sb2dpblVzZXJPcmdJZHMgPSBkYXRhPy5vcmdhbml6YXRpb25faWRzXG4gICAgICAvLyBJZ25vcmUgc3RhbGUgcmVzcG9uc2VzIGZyb20gYSB0eXBlIHRoYXQgd2FzIGNoYW5nZWQgYWdhaW4gYmVmb3JlIHRoaXMgb25lIHJldHVybmVkXG4gICAgICBpZiAocmVxdWVzdGVkVHlwZSAmJiByZXF1ZXN0ZWRUeXBlICE9PSB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlKSB7XG4gICAgICAgIGRvbmU/LigpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgbGV0IGZpbHRlcmVkTWluaXN0cnlEYXRhID0gW11cbiAgICAgIHRoaXMubWluaXN0cnlGdWxsRGF0YS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMubG9naW5Vc2VyT3JnSWRzLmluZGV4T2YoaXRlbT8uaWRlbnRpZmllcikgPiAtMSAmJiBpdGVtPy5zYk9yZ1R5cGUgPT09IChyZXF1ZXN0ZWRUeXBlIHx8IHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUpKSB7XG4gICAgICAgICAgZmlsdGVyZWRNaW5pc3RyeURhdGEucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICB0aGlzLm1pbmlzdHJ5RGF0YSA9IGZpbHRlcmVkTWluaXN0cnlEYXRhXG4gICAgICB0aGlzLm9yaWdpbmFsTWluaXN0cnlEYXRhID0gZmlsdGVyZWRNaW5pc3RyeURhdGFcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gZmlsdGVyZWRNaW5pc3RyeURhdGE7XG4gICAgICBkb25lPy4oKVxuICAgIH0pXG4gIH1cblxuICBvbk9wZW5lZChvcGVuZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnBhbmVsT3BlbiA9IG9wZW5lZDtcbiAgfVxuXG4gIG9uT3BlbmVkRGVwYXJ0bWVudChvcGVuZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRlcGFydG1lbnRQYW5lbE9wZW4gPSBvcGVuZWRcbiAgICBpZiAob3BlbmVkKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGVwYXJ0bWVudFNlbGVjdCAmJiB0aGlzLmRlcGFydG1lbnRTZWxlY3QucGFuZWwgJiYgdGhpcy5kZXBhcnRtZW50U2VsZWN0LnBhbmVsLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLmRlcGFydG1lbnRTZWxlY3QucGFuZWwubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uRGVwYXJ0bWVudFNjcm9sbClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGVwYXJ0bWVudFNlYXJjaFF1ZXJ5KSB7XG4gICAgICAvLyBwYW5lbCBjbG9zZWQgd2l0aCBhbiBhY3RpdmUgc2VhcmNoOiByZXNldCBzbyB0aGUgbGlzdCBtYXRjaGVzIHRoZSBjbGVhcmVkIHNlYXJjaCBib3ggb24gcmVvcGVuXG4gICAgICB0aGlzLmRlcGFydG1lbnRTZWFyY2hTdWJqZWN0Lm5leHQoJycpXG4gICAgfVxuICB9XG5cbiAgb25EZXBhcnRtZW50U2Nyb2xsID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICBjb25zdCBwYW5lbCA9IGV2ZW50LnRhcmdldFxuICAgIGlmIChwYW5lbC5zY3JvbGxUb3AgKyBwYW5lbC5jbGllbnRIZWlnaHQgPj0gcGFuZWwuc2Nyb2xsSGVpZ2h0IC0gNjApIHtcbiAgICAgIHRoaXMubG9hZERlcGFydG1lbnRzKClcbiAgICB9XG4gIH1cblxuICBsb2FkRGVwYXJ0bWVudHMocmVzZXQgPSBmYWxzZSkge1xuICAgIGlmICghdGhpcy5kZXBhcnRtZW50TWluaXN0cnlJZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghcmVzZXQgJiYgKHRoaXMuZGVwYXJ0bWVudExvYWRpbmcgfHwgIXRoaXMuZGVwYXJ0bWVudEhhc01vcmUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHJlc2V0KSB7XG4gICAgICB0aGlzLmRlcGFydG1lbnRPZmZzZXQgPSAwXG4gICAgICB0aGlzLmRlcGFydG1lbnRIYXNNb3JlID0gdHJ1ZVxuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0SWQgPSArK3RoaXMuZGVwYXJ0bWVudFJlcXVlc3RJZFxuICAgIHRoaXMuZGVwYXJ0bWVudExvYWRpbmcgPSB0cnVlXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGxpbWl0OiB0aGlzLmRlcGFydG1lbnRQYWdlU2l6ZSxcbiAgICAgIG9mZnNldDogdGhpcy5kZXBhcnRtZW50T2Zmc2V0LFxuICAgICAgcXVlcnk6IHRoaXMuZGVwYXJ0bWVudFNlYXJjaFF1ZXJ5XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnbWluaXN0cnknXG4gICAgICA/IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDZW50ZXJCYXNlZERlcGFydG1lbnQodGhpcy5kZXBhcnRtZW50TWluaXN0cnlJZCwgb3B0aW9ucylcbiAgICAgIDogdGhpcy5zaGFyZWRTZXJ2aWNlLmdldERlcGFydG1lbnRMaXN0KHRoaXMuZGVwYXJ0bWVudE1pbmlzdHJ5SWQsIG9wdGlvbnMpXG4gICAgcmVxdWVzdC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICBpZiAocmVxdWVzdElkICE9PSB0aGlzLmRlcGFydG1lbnRSZXF1ZXN0SWQpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlcGFydG1lbnRMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5pc0FycmF5KHJlcykgPyByZXMgOiAocmVzPy5pdGVtcyB8fCByZXM/LmRhdGEgfHwgW10pXG4gICAgICAgIHRoaXMuZGVwYXJ0bWVudEhhc01vcmUgPSBpdGVtcy5sZW5ndGggPT09IHRoaXMuZGVwYXJ0bWVudFBhZ2VTaXplXG4gICAgICAgIHRoaXMuZGVwYXJ0bWVudE9mZnNldCArPSBpdGVtcy5sZW5ndGhcbiAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5kZXBhcnRtZW50RGF0YS5zb21lKGQgPT4gZD8uaWRlbnRpZmllciA9PT0gaXRlbT8uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHRoaXMuZGVwYXJ0bWVudERhdGEucHVzaChpdGVtKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5maWx0ZXJlZERlcGFydG1lbnRMaXN0ID0gcmVzZXQgPyBpdGVtcyA6IFsuLi50aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QsIC4uLml0ZW1zXVxuICAgICAgICB0aGlzLmVuc3VyZVNlbGVjdGVkRGVwYXJ0bWVudE9wdGlvbigpXG4gICAgICAgIGlmIChyZXNldCAmJiAhaXRlbXMubGVuZ3RoICYmICF0aGlzLmRlcGFydG1lbnRTZWFyY2hRdWVyeSAmJiB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdObyBEZXBhcnRtZW50IEZvdW5kIGZvciBTZWxlY3RlZCBNaW5pc3RyeScsICdYJywge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50X25hbWUnXSA9ICcnXG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnZGVwYXJ0bWVudHMnXSA9ICcnXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgaWYgKHJlcXVlc3RJZCAhPT0gdGhpcy5kZXBhcnRtZW50UmVxdWVzdElkKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXBhcnRtZW50TG9hZGluZyA9IGZhbHNlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIG1hdC1zZWxlY3Qgb25seSBkaXNwbGF5cyBhIHNlbGVjdGlvbiB3aGlsZSBhIG1hdC1vcHRpb24gd2l0aCB0aGF0IHZhbHVlIGlzXG4gIC8vIHJlbmRlcmVkOyB3aGVuIHRoZSBjdXJyZW50IHNlYXJjaC9wYWdlIGZyb20gdGhlIHNlcnZlciBkb2VzIG5vdCBpbmNsdWRlIHRoZVxuICAvLyBzZWxlY3RlZCBkZXBhcnRtZW50LCBpdCBpcyByZW5kZXJlZCBhcyBhIGhpZGRlbiBvcHRpb24gaW5zdGVhZCBvZiBpbiB0aGUgbGlzdFxuICBlbnN1cmVTZWxlY3RlZERlcGFydG1lbnRPcHRpb24oKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJZCA9IHRoaXMucm9sZU1hcHBpbmdGb3JtPy5nZXQoJ2RlcGFydG1lbnRzJyk/LnZhbHVlXG4gICAgaWYgKCFzZWxlY3RlZElkIHx8IEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRJZClcbiAgICAgIHx8IHRoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdC5zb21lKGQgPT4gZD8uaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRJZCkpIHtcbiAgICAgIHRoaXMucGlubmVkRGVwYXJ0bWVudE9wdGlvbnMgPSBbXVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maW5kKGQgPT4gZD8uaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRJZClcbiAgICAgIHx8ICh0aGlzLnNlbGVjdGVkRGVwYXJ0bWVudE9iaj8uaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRJZCA/IHRoaXMuc2VsZWN0ZWREZXBhcnRtZW50T2JqIDogbnVsbClcbiAgICAgIHx8ICh0aGlzLmNicEZpbmFsT2JqPy5kZXBhcnRtZW50X25hbWUgPyB7IGlkZW50aWZpZXI6IHNlbGVjdGVkSWQsIG9yZ05hbWU6IHRoaXMuY2JwRmluYWxPYmouZGVwYXJ0bWVudF9uYW1lIH0gOiBudWxsKVxuICAgIHRoaXMucGlubmVkRGVwYXJ0bWVudE9wdGlvbnMgPSBzZWxlY3RlZCA/IFtzZWxlY3RlZF0gOiBbXVxuICB9XG5cbiAgZmlsdGVyRGF0YShldmVudCkge1xuICAgIGlmIChldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnZhbHVlKSB7XG4gICAgICBjb25zdCBzID0gZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5taW5pc3RyeURhdGEuZmlsdGVyKHggPT5cbiAgICAgICAgeC5vcmdOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocylcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5taW5pc3RyeURhdGFcbiAgICB9XG5cbiAgfVxuXG4gIGZpbHRlckRlcGFydG1lbnREYXRhKGV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnZhbHVlID8gZXZlbnQudGFyZ2V0LnZhbHVlIDogJydcbiAgICB0aGlzLmRlcGFydG1lbnRTZWFyY2hTdWJqZWN0Lm5leHQodmFsdWUudHJpbSgpKVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5SWQgPSAnJ1xuICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnJlc2V0KClcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKVxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKVxuICB9XG5cbiAgb25EZXBhcnRtZW50Q2hhbmdlKCkge1xuICAgIGNvbnN0IGZvcm1EYXRhID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0udmFsdWU7XG5cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gZm9ybURhdGEuZGVwYXJ0bWVudHMgPyBmb3JtRGF0YS5kZXBhcnRtZW50cyA6ICcnXG4gICAgdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKClcbiAgICBpZiAodGhpcy5jYnBGaW5hbE9iaiAmJiB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeSAmJiB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlKSB7XG4gICAgICB0aGlzLmNicEZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gZm9ybURhdGEuZGVwYXJ0bWVudHMgPyBmb3JtRGF0YS5kZXBhcnRtZW50cyA6ICcnXG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRNaW5pc3RyeSA9IHRoaXMubWluaXN0cnlEYXRhLmZpbmQoaXRlbSA9PiBpdGVtLmlkZW50aWZpZXIgPT09IGZvcm1EYXRhLm1pbmlzdHJ5KTtcblxuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnknXSA9IHNlbGVjdGVkTWluaXN0cnlcblxuICAgIGNvbnN0IGRlcGFydG1lbnROYW1lID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maW5kKHUgPT4gdS5pZGVudGlmaWVyID09PSBmb3JtRGF0YS5kZXBhcnRtZW50cyk7XG4gICAgaWYgKGRlcGFydG1lbnROYW1lKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGVwYXJ0bWVudE9iaiA9IGRlcGFydG1lbnROYW1lXG4gICAgfVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gZGVwYXJ0bWVudE5hbWU/Lm9yZ05hbWVcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgdGhpcy5nZXRVcGxvYWRlZERvY3VtZW50cygpXG4gIH1cblxuICAgZ29Ub1VwbG9hZERvY3VtZW50KCkge1xuICAgXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYWkvdXBsb2FkLWRvY3VtZW50cyddKTtcbiAgICBcbiAgfVxuXG4gIHZpZXdFeGlzdGluZ1JvbGVNYXBwaW5nKHJvbGVNYXBwaW5ncykge1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsncm9sZV9tYXBwaW5nX2dlbmVyYXRpb24nXSA9IHJvbGVNYXBwaW5ncztcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2Uucm9sZU1hcHBpbmdHZW5lcmF0aW9uRGF0YSA9IHJvbGVNYXBwaW5ncztcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICdjYnBQbGFuRmluYWxPYmonLFxuICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iailcbiAgICApO1xuXG4gICAgdGhpcy5zdWNjZXNzUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSk7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYWkvbGlzdCddLCB7XG4gICAgICBvblNhbWVVcmxOYXZpZ2F0aW9uOiAncmVsb2FkJ1xuICAgIH0pO1xuICB9XG5cbiAgLy8gV29yayBBbGxvY2F0aW9uIE9yZGVyIGlzIG1pc3Npbmc6IG5ldmVyIGNhbGwgZ2VuZXJhdGUuIElmIGEgQ0JQIGFscmVhZHkgZXhpc3RzLCBzaG93IHRoZVxuICAvLyBcIkNCUCBpcyBhbHJlYWR5IGF2YWlsYWJsZVwiIHBvcHVwIChZZXMgc3RheXMgZGlzYWJsZWQgdGhlcmUpLCBvdGhlcndpc2Ugc2hvdyB0aGUgdXBsb2FkIG5vdGUuXG4gIHNob3dFeGlzdGluZ1JvbGVNYXBwaW5nV2l0aG91dFdBTygpIHtcbiAgICB0aGlzLmFwaUxvYWRpbmcgPSB0cnVlXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnQodGhpcy5yb2xlTWFwcGluZ0Zvcm0udmFsdWUubWluaXN0cnksIHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLmRlcGFydG1lbnRzKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIGNvbnN0IHJvbGVNYXBwaW5ncyA9IEFycmF5LmlzQXJyYXkocmVzKSA/IHJlcyA6IFtdXG4gICAgICAgIGlmICghcm9sZU1hcHBpbmdzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuc2hvd1dvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmdNZXNzYWdlKClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERlbGV0ZVJvbGVNYXBwaW5nUG9wdXBDb21wb25lbnQsIHtcbiAgICAgICAgICB3aWR0aDogJzQwMHB4JyxcbiAgICAgICAgICBkYXRhOiB7ZG9jdW1lbnRzOiB0aGlzLmRvY3VtZW50c30sXG4gICAgICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgICAgIG1pbkhlaWdodDogJzMwMHB4JyxcbiAgICAgICAgICBtYXhIZWlnaHQ6ICc4MHZoJyxcbiAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09ICdidXR0b24nKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdFeGlzdGluZ1JvbGVNYXBwaW5nKHJvbGVNYXBwaW5ncylcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5hcGlMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy5zaG93V29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZ01lc3NhZ2UoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBzaG93V29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZ01lc3NhZ2UoKSB7XG4gICAgdGhpcy5zaG93V29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IHRydWVcbiAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ1BsZWFzZSB1cGxvYWQgdGhlIFdvcmsgQWxsb2NhdGlvbiBPcmRlciBkb2N1bWVudCB0byBnZW5lcmF0ZSB0aGUgQ2FwYWNpdHkgQnVpbGRpbmcgUGxhbiAoQ0JQKScsICdYJywge1xuICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICB9KTtcbiAgfVxuXG4gIHNob3dSb2xlTWFwcGluZ0ZhaWxlZFBvcHVwKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERlbGV0ZVJvbGVNYXBwaW5nUG9wdXBDb21wb25lbnQsIHtcbiAgICAgICAgICB3aWR0aDogJzQwMHB4JyxcbiAgICAgICAgICBkYXRhOiB7ZG9jdW1lbnRzOiB0aGlzLmRvY3VtZW50cywgZnJvbTogJ3JvbGVNYXBwaW5nRmFpbGVkJywgbWVzc2FnZX0sXG4gICAgICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLCAgICAgICAgICBcbiAgICAgICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgICAgIG1heEhlaWdodDogJzgwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgICAgICB9KTtcbiAgICBcbiAgICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgICAgICAgICAgLy8gUmV0cnk6IGRlbGV0ZSB0aGUgZmFpbGVkIHJlY29yZCwgdGhlbiBnZW5lcmF0ZSBhZ2FpblxuICAgICAgICAgICAgICB0aGlzLnJldHJpZWRBZnRlckZhaWx1cmUgPSB0cnVlXG4gICAgICAgICAgICAgIHRoaXMucmVnZW5lcmF0ZVJvbGVNYXBwaW5nQWZ0ZXJGYWlsZWRBbmREZWxldGUoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICB9XG5cbiAgcmVnZW5lcmF0ZVJvbGVNYXBwaW5nQWZ0ZXJGYWlsZWRBbmREZWxldGUoKSB7XG4gICAgLy8ga2VlcCB0aGUgbG9hZGVyIHVwIGJldHdlZW4gZGVsZXRlIGFuZCB0aGUgbmV3IGdlbmVyYXRlIGNhbGwgdG8gYXZvaWQgZmxpY2tlclxuICAgIHRoaXMuYXBpTG9hZGluZyA9IHRydWVcbiAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmRlbGV0ZVJvbGVNYXBwaW5nQnlTdGF0ZUFuZERlcGFydG1lbnQodGhpcy5yb2xlTWFwcGluZ0Zvcm0udmFsdWUubWluaXN0cnksIHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLmRlcGFydG1lbnRzKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGVkIGZhaWxlZCByb2xlIG1hcHBpbmc6JywgcmVzKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZXJyb3I/LmVycm9yPy5kZXRhaWwgfHwgJ1JvbGUgbWFwcGluZyBnZW5lcmF0aW9uIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nLCAnWCcsIHtcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgdGhpcy5hcGlMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgIHRoaXMucmV0cmllZEFmdGVyRmFpbHVyZSA9IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgfVxuXG5cblxufVxuXG5cblxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgIDwhLS0gPGlucHV0IGNsYXNzPVwiYnRuLWFjdGl2ZVwiIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIkRvd25sb2FkIGFzIFBERlwiIChjbGljayk9XCJkb3dubG9hZFBERigpXCIgLz4gLS0+XG4gICAgPGRpdiBjbGFzcz1cImxvZ28tY29udGFpbmVyXCIgKm5nSWY9XCJsb2dpblwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvbi1tZWRpdW1cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxoMiBjbGFzcz1cImhpZ2hsaWdodC1haVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPmlHT1QgQUkgRHJpdmVuIENCUDwvc3Bhbj5cbiAgICAgICAgICAgIDwvaDI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgPHA+QnVpbGQgWW91ciBDYXBhY2l0eSBXaXRoIEN1c3RvbWl6ZWQgUm9sZSBNYXBwaW5nPC9wPlxuICAgICAgICA8L2Rpdj4gLS0+XG4gICAgPC9kaXY+XG4gICAgPG1hdC1jYXJkICpuZ0lmPVwibG9naW4gJiYgcm9sZU1hcHBpbmdGb3JtXCIgY2xhc3M9XCJtdC0yXCIgW2Zvcm1Hcm91cF09XCJyb2xlTWFwcGluZ0Zvcm1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRlcGF0bWVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDwhLS0gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIj4tLT5cbiAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+LS0+XG4gICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICA8cD5DaG9vc2UgWW91ciBEZXBhcnRtZW50PC9wPi0tPlxuICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICA8L2Rpdj4tLT5cbiAgICAgICAgICAgIDwhLS0gICAgICAgICAgICA8L2Rpdj4tLT5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLWdyb3VwIG10LTRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIGNsYXNzPVwicmFkaW8tYnRuLWdyb3VwXCIgZm9ybUNvbnRyb2xOYW1lPVwibWluaXN0cnlUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZVwiIChjaGFuZ2UpPVwib25NaW5pc3RyeVR5cGVDaGFuZ2UoJGV2ZW50KVwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTGVmdCByYWRpbyBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwibWluaXN0cnlcIiBjbGFzcz1cInJhZGlvLWJ0biBsZWZ0LXJhZGlvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhZGlvLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWljb24gY2xhc3M9XCJyYWRpby1pY29uXCIgW25nQ2xhc3NdPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdjZW50ZXInPyAnY2hlY2tlZC1sYWJlbCc6JydcIj5kb21haW48L21hdC1pY29uPiAgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdtaW5pc3RyeSc/ICdjaGVja2VkLWxhYmVsJzonJ1wiPkNlbnRyZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUmlnaHQgcmFkaW8gYnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cInN0YXRlXCIgY2xhc3M9XCJyYWRpby1idG4gcmlnaHQtcmFkaW9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmFkaW8tbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtaWNvbiBjbGFzcz1cInJhZGlvLWljb25cIiBbbmdDbGFzc109XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJz8gJ2NoZWNrZWQtbGFiZWwnOicnXCI+bG9jYXRpb25fb248L21hdC1pY29uPiAgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdzdGF0ZSc/ICdjaGVja2VkLWxhYmVsJzonJ1wiPlN0YXRlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cblxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdtaW5pc3RyeSdcIj5NaW5pc3RyeTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJ1wiPlN0YXRlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgc2VhcmNoLWJveC13aXRoLXNlbGVjdFwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IHdoaXRlOyBib3JkZXItcmFkaXVzOiAyNXB4OyBwYWRkaW5nOiAwIDEycHg7IGJvcmRlcjogMXB4IHNvbGlkICNjY2M7d2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBwYW5lbENsYXNzPVwic2VsZWN0LXdpdGgtc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdtaW5pc3RyeScgPyAnU2VsZWN0IE1pbmlzdHJ5LyBEZXBhcnRtZW50JzonU2VsZWN0IFN0YXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1pbmlzdHJ5Q2hhbmdlKCRldmVudClcIiBmb3JtQ29udHJvbE5hbWU9XCJtaW5pc3RyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXItcmFkaXVzOiAyNXB4OyBiYWNrZ3JvdW5kOiB3aGl0ZTsgd2lkdGg6MTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZW5lZENoYW5nZSk9XCJvbk9wZW5lZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC13cmFwcGVyXCIgKm5nSWY9XCJwYW5lbE9wZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiAoaW5wdXQpPVwiZmlsdGVyRGF0YSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VhcmNoLWlucHV0XCIgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gW3NlbGVjdGVkXT1cInNlbGVjdGVkTWluaXN0cnlJZCA9PT0gaXRlbT8uaWRlbnRpZmllclwiIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtPy5pZGVudGlmaWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRMaXN0XCI+e3tpdGVtPy5vcmdOYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJkZXBhcnRtZW50RGF0YT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIj5EZXBhcnRtZW50PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogMjVweDsgcGFkZGluZzogMCAxMnB4O2JvcmRlcjogMXB4IHNvbGlkICNjY2M7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCAjZGVwYXJ0bWVudFNlbGVjdCBwYW5lbENsYXNzPVwic2VsZWN0LXdpdGgtc2VhcmNoXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgRGVwYXJ0bWVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGVwYXJ0bWVudHNcIiBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDI1cHg7IGJhY2tncm91bmQ6IHdoaXRlO1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkRlcGFydG1lbnRDaGFuZ2UoKVwiIChvcGVuZWRDaGFuZ2UpPVwib25PcGVuZWREZXBhcnRtZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLXdyYXBwZXJcIiAqbmdJZj1cImRlcGFydG1lbnRQYW5lbE9wZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiAoaW5wdXQpPVwiZmlsdGVyRGVwYXJ0bWVudERhdGEoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbT8uaWRlbnRpZmllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkRGVwYXJ0bWVudExpc3RcIj57e2l0ZW0/Lm9yZ05hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHNlbGVjdGVkIGRlcGFydG1lbnQgbm90IHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgc2VhcmNoL3BhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXB0IHJlbmRlcmVkIChoaWRkZW4pIHNvIG1hdC1zZWxlY3QgZG9lcyBub3QgY2xlYXIgdGhlIHNlbGVjdGlvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbT8uaWRlbnRpZmllclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHBpbm5lZERlcGFydG1lbnRPcHRpb25zXCI+e3tpdGVtPy5vcmdOYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gZGlzYWJsZWQgKm5nSWY9XCJkZXBhcnRtZW50TG9hZGluZ1wiPkxvYWRpbmcuLi48L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZGVwYXJ0bWVudExvYWRpbmcgJiYgIWZpbHRlcmVkRGVwYXJ0bWVudExpc3Q/Lmxlbmd0aFwiPk5vIGRlcGFydG1lbnQgZm91bmQ8L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiPlNlY3RvcjwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIHN0eWxlPVwiYmFja2dyb3VuZDogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDI1cHg7IHBhZGRpbmc6IDAgMTJweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJTZWxlY3QgU2VjdG9yXCIgbXVsdGlwbGUgZm9ybUNvbnRyb2xOYW1lPVwic2VjdG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDI1cHg7IGJhY2tncm91bmQ6IHdoaXRlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW0/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWN0b3JEYXRhXCI+e3tpdGVtPy52YWx1ZX19PC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgPCEtLSAqbmdJZj1cInJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5VHlwZScpPy52YWx1ZSA9PT0gJ3N0YXRlJ1wiIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTQgYWRkaXRpb25hbC1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9XCI1XCIgcGxhY2Vob2xkZXI9XCJBZGRpdGlvbmFsIGRldGFpbHNcIiBmb3JtQ29udHJvbE5hbWU9XCJhZGRpdGlvbmFsRGV0YWlsc1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIFtuZ0NsYXNzXT1cImRpc2FibGVVcGxvYWREb2N1bWVudCA/ICdidG4tYWN0aXZlLXByaW1hcnktZGlzYWJsZSc6J2J0bi1hY3RpdmUtcHJpbWFyeSdcIiBjbGFzcz1cIlwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlVXBsb2FkRG9jdW1lbnRcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZ29Ub1VwbG9hZERvY3VtZW50KClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnVwbG9hZDwvbWF0LWljb24+IE1hbmFnZSBEb2N1bWVudHNcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSAqbmdJZj1cInJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5VHlwZScpPy52YWx1ZSA9PT0gJ3N0YXRlJ1wiIC0tPlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibXQtNCBzZWN0aW9uXCIgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8cD5VcGxvYWQgRG9jdW1lbnQgKFBERik8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtdXBsb2FkLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInVwbG9hZERvY1wiIGNsYXNzPVwiZmlsZS11cGxvYWQtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZS11cGxvYWQtaWNvblwiPvCfk448L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF1cGxvYWRlZEZpbGUgfHwgdXBsb2FkZWRGaWxlLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9vc2UgdXAgdG8gMyBmaWxlcyAoUERGL1RYVClcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1cGxvYWRlZEZpbGU/Lmxlbmd0aCA+IDBcIiBjbGFzcz1cImZpbGUtbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWxlIG9mIHVwbG9hZGVkRmlsZTsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZmlsZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsZS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZW1vdmUtZmlsZS1pY29uXCIgKGNsaWNrKT1cInJlbW92ZUZpbGUoaSk7JGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInVwbG9hZERvY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAvPiAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJmaWxlLXVwbG9hZC1oaW50XCI+TWF4IGZpbGUgc2l6ZToge3ttYXhGaWxlU2l6ZU1CfX1NQjwvc21hbGw+XG5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwidXBsb2FkRG9jXCIgbXVsdGlwbGUgdHlwZT1cImZpbGVcIiAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdD1cIi5wZGYsLmRvYywuZG9jeCwueGxzLC54bHN4LC50eHRcIiBjbGFzcz1cImZpbGUtdXBsb2FkLWlucHV0XCIgLz5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXBsb2FkRXJyb3JcIiBjbGFzcz1cImVycm9yXCI+e3sgdXBsb2FkRXJyb3IgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwhLS0gKm5nSWY9XCJyb2xlTWFwcGluZ0Zvcm0uZ2V0KCdtaW5pc3RyeVR5cGUnKT8udmFsdWUgPT09ICdzdGF0ZSdcIiAtLT5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm10LTIgc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNjbGFpbWVyLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHA+RGlzY2xhaW1lcjogUGxlYXNlIGRvIG5vdCB1cGxvYWQgYW55IGNvbmZpZGVudGlhbCBkb2N1bWVudHMuIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCIoZG9jdW1lbnRzPy5sZW5ndGggPCAxIHx8IHdvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcpICYmICEocm9sZU1hcHBpbmdGb3JtPy5pbnZhbGlkKSAgfHwgc2hvd1dvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmdcIj5cbiAgICAgICAgICAgICAgICA8cD48c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogLjg3NXJlbTtmb250LXdlaWdodDogYm9sZDtcIj5Ob3RlOiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIj5QbGVhc2UgdXBsb2FkIHRoZSBXb3JrIEFsbG9jYXRpb24gT3JkZXIgZG9jdW1lbnQgdG8gZ2VuZXJhdGUgdGhlIENhcGFjaXR5IEJ1aWxkaW5nIFBsYW4gKENCUCk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwiZG9jdW1lbnRzPy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJ3b3JrQWxsb2NhdGlvbk9yZGVyRG9jdW1lbnRNaXNzaW5nXCI+PHNwYW4gc3R5bGU9XCJmb250LXNpemU6IC44NzVyZW07Zm9udC13ZWlnaHQ6IGJvbGQ7XCI+Tm90ZTpcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCI+UGxlYXNlIHVwbG9hZCB0aGUgV29yayBBbGxvY2F0aW9uIE9yZGVyIGRvY3VtZW50IHRvIGdlbmVyYXRlIHRoZSBDYXBhY2l0eVxuICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRpbmcgUGxhbiAoQ0JQKTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gIDxpbnB1dFxuICAgIFtkaXNhYmxlZF09XCJyb2xlTWFwcGluZ0Zvcm0/LmludmFsaWQgfHwgbG9hZGluZyB8fCBkb2N1bWVudHM/Lmxlbmd0aCA8IDFcIlxuICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgcm9sZU1hcHBpbmdGb3JtPy5pbnZhbGlkIHx8IGxvYWRpbmcgfHwgZG9jdW1lbnRzPy5sZW5ndGggPCAxXG4gICAgICAgID8gJ2J0bi1kaXNhYmxlJ1xuICAgICAgICA6ICdidG4tYWN0aXZlJ1xuICAgIFwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgW3ZhbHVlXT1cImxvYWRpbmcgPyAnR2VuZXJhdGluZyBDQlAuLi4nIDogJ0dlbmVyYXRlIENCUCdcIlxuICAgIChjbGljayk9XCJvbkdlbmVyYXRlUm9sZU1hcHBpbmcoKVwiXG4gIC8+XG48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9tYXQtY2FyZD5cblxuPC9kaXY+XG48IS0tIDxkaXYgKm5nSWY9XCIhbG9naW5cIj5cbiAgICAgICAgPGFwcC1sb2dpbiAoc3VjY2Vzcyk9XCJsb2dpblN0YXR1cygkZXZlbnQpXCI+PC9hcHAtbG9naW4+XG4gICAgPC9kaXY+IC0tPlxuXG48ZGl2IGNsYXNzPVwib3ZlcmxheS1sb2FkZXJcIiAqbmdJZj1cImFwaUxvYWRpbmdcIj5cbiAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cIm92ZXJsYXktbG9hZGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGVudFwiPlxuICAgICAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXRleHQgbXQtM1wiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYWluLW1lc3NhZ2VcIj57eyBjdXJyZW50UHJvY2Vzc2luZ1N0YWdlIHx8ICdQcmVwYXJpbmcgQ0JQIFBsYW4gZ2VuZXJhdGlvbi4uLicgfX08L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1pbmRpY2F0b3JcIiAqbmdJZj1cImNodW5rcy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgW3N0eWxlLndpZHRoLiVdPVwiZ2V0RGlzcGxheVByb2dyZXNzUGVyY2VudGFnZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInByb2dyZXNzLXRleHRcIj57eyBnZXREaXNwbGF5UHJvZ3Jlc3NQZXJjZW50YWdlKCkgfX0lIENvbXBsZXRlPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0aW1lLWVzdGltYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIFJlYWwtdGltZSBzdHJlYW1pbmcgaW4gcHJvZ3Jlc3MuIFRoaXMgbWF5IHRha2UgMi0zIG1pbnV0ZXMuXG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==