@sunbird-cb/cbp-ai 0.1.79 → 0.1.80

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.
@@ -314,11 +314,12 @@ export class RoleMappingListComponent {
314
314
  console.log('Changes saved!');
315
315
  // Refresh data or show a toast here
316
316
  console.log(this.sharedService.cbpPlanFinalObj);
317
- if (this.sharedService.cbpPlanFinalObj && this.sharedService.cbpPlanFinalObj.ministry && this.sharedService.cbpPlanFinalObj.ministry.id) {
318
- this.sharedService.getRoleMappingByStateCenter(this.sharedService.cbpPlanFinalObj.ministry.id).subscribe((res) => {
317
+ if (this.sharedService.cbpPlanFinalObj && this.sharedService.cbpPlanFinalObj.ministry && this.sharedService.cbpPlanFinalObj.ministry.identifier) {
318
+ this.sharedService.getRoleMappingByStateCenter(this.sharedService.cbpPlanFinalObj.ministry.identifier).subscribe((res) => {
319
319
  console.log('res', res);
320
320
  this.dataSource = new MatTableDataSource(res);
321
321
  this.dataSource.paginator = this.paginator;
322
+ this.loadRoleMappingList();
322
323
  this.originalData = res;
323
324
  console.log('this.dataSource', this.dataSource);
324
325
  });
@@ -745,12 +746,23 @@ export class RoleMappingListComponent {
745
746
  this.loadRoleMappingList();
746
747
  });
747
748
  }
749
+ getActivateCbpPlan(row) {
750
+ let found = false;
751
+ if (row?.cbp_plans && row?.cbp_plans?.length) {
752
+ row.cbp_plans.forEach(element => {
753
+ if (element?.selected_courses && element?.selected_courses?.length) {
754
+ found = true;
755
+ }
756
+ });
757
+ }
758
+ return !found;
759
+ }
748
760
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RoleMappingListComponent, deps: [{ token: i1.SharedService }, { token: i2.MatDialog }, { token: i3.Router }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
749
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RoleMappingListComponent, selector: "app-role-mapping-list", inputs: { formData: "formData" }, outputs: { moveToInitialScreen: "moveToInitialScreen" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }], ngImport: i0, template: "<div class=\"role-mapping-container\">\n <div class=\"container-fluid\">\n\n <mat-card class=\"mt-0 pt-0\">\n <div class=\"section-header\">\n\n </div>\n <div class=\"edit-section mt-4\">\n <div class=\"select-map-route-container\">\n <div class=\"select-map-flex-container\">\n <div class=\"select-map-flex\">\n <div class=\"selected-mapping-route\">\n <p>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span\n *ngIf=\"sharedService?.cbpPlanFinalObj?.department_name\">\n / {{sharedService?.cbpPlanFinalObj?.department_name}}</span>\n </p>\n </div>\n <div class=\"edit-plan cursor-pointer\" (click)=\"moveToInitialScreenLayout('edit')\">\n <mat-icon>edit</mat-icon>Edit\n </div>\n <!-- <div class=\"cursor-pointer ml-10\">-->\n <!-- <button class=\"btn-active cursor-pointer\" (click)=\"moveToInitialScreenLayout('add')\">-->\n <!-- <mat-icon>add</mat-icon>-->\n <!-- Create New CBP-->\n <!-- </button>-->\n <!-- </div>-->\n </div>\n <div>\n <div class=\"view-final-cbp-plan\">\n <!-- <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('cbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div> -->\n\n <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('acbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div>\n\n </div>\n\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"search-filter-section mt-2\">\n <div class=\"search flex margin-right-m search-flex\">\n <div class=\"mt-2\">\n <div class=\"search-container\">\n <div class=\"rsearch\">\n <mat-icon\n class=\"color-60 search-icon mat-icon notranslate material-icons mat-icon-no-color\">search</mat-icon>\n <input class=\"sinput color-60 w-full\" [(ngModel)]=\"searchText\" label=\"\"\n (input)=\"applyFilter()\" placeholder=\"Search by designation name\" type=\"Standard\">\n <mat-icon *ngIf=\"searchText.trim().length > 0\"\n class=\"color-60 clear-icon mat-icon notranslate material-icons mat-icon-no-color cursor-pointer\"\n (click)=\"clearSearch()\">clear</mat-icon>\n </div>\n <div class=\"pl-2 mt-2\">\n <input [disabled]=\"searchText.trim()?.length === 0\"\n [ngClass]=\"searchText.trim()?.length === 0 ? 'btn-disable':'btn-active'\"\n type=\"button\" value=\"Search\" (click)=\"applyFilter()\" />\n </div>\n </div>\n\n\n </div>\n\n\n </div>\n <div class=\"filter-section flex margin-top-15\">\n <!-- <div>\n <label class=\"label\">Filter by competency type</label>\n <div>\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select [(value)]=\"selectedValue\" placeholder=\"Select Ministry\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"'test'\">Test</mat-option>\n <mat-option [value]=\"'another'\">Another</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div> -->\n <div class=\"btn-group\">\n <div class=\"ml-2\">\n <input class=\"btn-active\" type=\"button\" value=\"Add More Designation\"\n (click)=\"addMoreDesignation()\" />\n </div>\n <div class=\"ml-2\" *ngIf=\"activeTab === 'matched'\">\n <button\n [ngClass]=\"selection.selected.length ? 'btn-active-outline' : 'btn-active-outline-disable'\"\n (click)=\"sendForApprovalForm()\">\n <mat-icon>send</mat-icon>\n Send For Approval\n <span *ngIf=\"selection.selected.length\">({{selection.selected.length}})</span>\n </button>\n </div>\n\n\n </div>\n </div>\n </div>\n <div class=\"role-mapping-tabs mt-3\">\n <button class=\"role-tab\" [class.active]=\"activeTab === 'matched'\" (click)=\"setDataSoure('matched')\">\n <span class=\"dot\"></span>\n Matched role mappings\n <span class=\"badge blue\">{{matchedRoleMapping}}</span>\n </button>\n\n <button class=\"role-tab table-body-unmatched\" [class.active]=\"activeTab === 'unmatched'\"\n (click)=\"setDataSoure('unmatched')\">\n <span class=\"dot red\"></span>\n Unmatched role mapping\n <span class=\"badge red\">{{unMatchedRoleMapping}}</span>\n </button>\n </div>\n <div class=\"nav-container\">\n <div class=\"sidenav-content\">\n <div class=\"table-class\">\n <ng-container *ngIf=\"dataSource?.filteredData?.length > 0\">\n <!-- <table mat-table [dataSource]=\"dataSource\">\n <ng-container matColumnDef=\"RequestId\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request ID </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.demand_id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Title </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.title}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestor\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requestor </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.ownerName}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestType\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Type </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.requestType}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestStatus\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Status </th>\n\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <span [ngClass]=\"getStatusClass(element?.status)\">{{element?.status ===\n statusKey.fullfill ? 'Fulfilled'\n : element?.status}}</span>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"assignee\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Assignee </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n {{element?.assignedProvider ?\n element?.assignedProvider : 'Not Assigned' }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestedOn\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requested On </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.createdOn |\n date}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"interests\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Interests</th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <a class=\"action-btn-view\" *ngIf=\"element?.interestCount!== 0\"\n href=\"javascript:void(0)\" [ngStyle]=\"getPointerEventsStyle(element)\">\n <span (click)=\"handleClick(element)\">\n {{element?.interestCount}}\n </span></a>\n <a class=\"\" *ngIf=\"element?.interestCount === 0\"\n href=\"javascript:void(0)\">{{element?.requestType ==\n 'Single' ? 'N/A' : element?.interestCount}}</a>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Details</th>\n <td mat-cell *matCellDef=\"let element\">\n <mat-icon (click)=\"navigateToDetails(element?.demand_id)\"\n class=\"cursor-pointer\">visibility</mat-icon>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\"></th>\n <td mat-cell *matCellDef=\"let element\">\n\n\n <span>\n <button mat-icon-button [matMenuTriggerFor]=\"menu\"\n aria-label=\"Example icon-button with a menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"onClickMenu(element,'viewContent')\">\n <span>View</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Unassigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid \"\n mat-menu-item (click)=\"onClickMenu(element,'invalidContent')\">\n <span>Mark as invalid</span>\n </button>\n <button mat-menu-item\n *ngIf=\"element?.status!== statusKey.Assigned && element?.interestCount >0 && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill\"\n (click)=\"onClickMenu(element,'assignContent')\">\n <span>Assign</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Assigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill \"\n mat-menu-item (click)=\"onClickMenu(element,'reAssignContent')\">\n <span> Re-Assign</span>\n </button>\n <button mat-menu-item (click)=\"onClickMenu(element,'copyContent')\">\n <span>Copy</span>\n </button>\n </mat-menu>\n </span>\n </td>\n\n\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\" class=\"table-row-data\"></tr>\n <tr mat-row *matRowDef=\"let row;columns:displayedColumns\"></tr>\n\n\n </table> -->\n <div class=\"table-container mt-4\" style=\"overflow: auto;\">\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z1\"\n [ngClass]=\"activeTab === 'matched'? 'table-body': 'table-body-unmatched'\">\n <!-- Selection Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [hidden]=\"activeTab !== 'matched'\">\n <mat-checkbox class=\"radio-style-checkbox\" (change)=\"toggleAllRows($event)\"\n [checked]=\"isAllSelected()\" [indeterminate]=\"isSomeSelected()\"\n [disabled]=\"!hasSelectableRows()\">\n </mat-checkbox>\n </th>\n\n <td mat-cell *matCellDef=\"let row\" [hidden]=\"activeTab !== 'matched'\">\n <span matTooltip=\"Please generate & save course recommendation to select. Course recommendation generation & save is pending.\"\n [matTooltipDisabled]=\"row?.cbp_plans?.length > 0\">\n <mat-checkbox class=\"radio-style-checkbox\"\n (click)=\"$event.stopPropagation()\" (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [disabled]=\"!row?.cbp_plans?.length\" [ngClass]=\"!row?.cbp_plans?.length ? 'grayd-disable':''\">\n </mat-checkbox>\n </span>\n </td>\n </ng-container>\n <!-- Designation Name -->\n <ng-container matColumnDef=\"designation_name\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Designation\n </th>\n <td class=\"cursor-pointer\" mat-cell *matCellDef=\"let element\"\n (click)=\"viewCBPPlan(element)\">\n <div\n [ngClass]=\"activeTab === 'matched'? 'designation-text': 'designation-text-unmatched'\">\n <p class=\"designation\">{{ element?.designation_name }} </p>\n <p class=\"wing-text mt-2\">Wing/Division - {{\n element?.wing_division_section }} </p>\n </div>\n\n </td>\n </ng-container>\n\n <!-- Role & Responsibilities -->\n <ng-container matColumnDef=\"role_responsibilities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Role &\n Responsibilities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let role of (isResponisbilityExpanded(element.id) ? element.role_responsibilities : element.role_responsibilities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ role }}</li>\n <li *ngIf=\"element.role_responsibilities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'role_responsibilities')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n <!-- {{ isResponisbilityExpanded(element.id) ? 'View Less' : 'View More' }} -->\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n <!-- Activities -->\n <ng-container matColumnDef=\"activities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Activities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let activity of (isActivityExpanded(element.id) ? element.activities : element.activities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ activity }}</li>\n <li *ngIf=\"element.activities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'activity')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Behavioral Competencies -->\n <ng-container matColumnDef=\"behavioral\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Behavioral\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of getCompetenciesByType(element.competencies, 'Behavioral')\">\n <span class=\"competency-text-behavioral\"> {{ comp.theme }} - {{\n comp.sub_theme }} </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Functional Competencies -->\n <ng-container matColumnDef=\"functional\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Functional\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of getCompetenciesByType(element.competencies, 'Functional')\">\n <span class=\"competency-text-functional\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Domain Competencies -->\n <ng-container matColumnDef=\"domain\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Domain\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of getCompetenciesByType(element.competencies, 'Domain')\">\n <span class=\"competency-text-domain\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Actions -->\n <ng-container matColumnDef=\"action\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let element\">\n <button mat-icon-button [matMenuTriggerFor]=\"actionMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editRoleMapping(element)\">\n <mat-icon>edit</mat-icon>\n <span>Edit Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"viewCBPPlan(element)\">\n <mat-icon>visibility</mat-icon>\n <span>View Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"generateCourseRecommendation(element)\">\n <mat-icon>school</mat-icon>\n <span>Generate Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"viewCourseRecommendation(element)\">\n <mat-icon>preview</mat-icon>\n <span>View Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"deleteRoleMapping(element)\">\n <mat-icon>delete</mat-icon>\n <span>Delete Role Mapping</span>\n </button>\n <button *ngIf=\"activeTab !== 'matched'\" mat-menu-item (click)=\"sendForDesignationNameApproval(element)\">\n <mat-icon>send</mat-icon>\n <span>Send for Designation Name Approval</span>\n </button>\n </mat-menu>\n </td>\n </ng-container>\n\n <!-- Header & Rows -->\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <!-- Pagination -->\n <mat-paginator [length]=\"dataSource?.data?.length || 0\" [pageSize]=\"5\"\n [pageSizeOptions]=\"[5, 10, 20]\" showFirstLastButtons>\n </mat-paginator>\n </div>\n\n </ng-container>\n\n <div class=\"no-cbp-data\" *ngIf=\"dataSource?.filteredData?.length === 0\">\n <!-- <div><img src=\"/mdo-assets/images/no-content-data.svg\" alt=\"no-content\"></div> -->\n <div class=\"sub-heading mt-4\">\n <p>No role mappings available in this category</p>\n </div>\n <!-- <div class=\" margin-top-m no-content-create\">\n <button mat-button type=\"button\" class=\"search-btns\"\n [routerLink]=\"['/app/home/create-request-form']\">Request Content</button>\n </div> -->\n\n </div>\n\n <!-- <mat-paginator *ngIf=\"dataSource?.filteredData?.length > 0\" [pageSize]=\"pageSize\"\n [length]=\"this.requestCount\" [pageSizeOptions]=\"[10,20,40]\"\n (page)=\"onChangePage($event)\"></mat-paginator> -->\n\n\n </div>\n\n\n\n </div>\n </div>\n </mat-card>\n </div>\n</div>\n\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:18px;font-style:normal;font-weight:700;line-height:150%}:host ::ng-deep input.mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}:host ::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}:host ::ng-deep .mat-select-panel{background-color:#fff!important}:host ::ng-deep .mat-select-panel .mat-option{border-radius:0!important}:host ::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;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.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 .clear-icon{position:absolute;top:15px;font-size:20px;right:10px;color:#666}.search .clear-icon:hover{color:#333}.search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:600px}.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 10px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:17px;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:24px;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:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.competency-list{display:flex;flex-direction:row;gap:0px;flex-wrap:wrap}.competency-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.designation{color:#1b4ca1;font-family:Lato;font-size:17px;font-style:normal;font-weight:700;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.wing-text{color:#000000e0;font-family:Lato;font-size:15px;font-style:normal;font-weight:400;line-height:normal}.role-item{color:#000000e0;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:1.75}.view-final-cbp-plan{display:flex;justify-content:end;align-items:center;gap:8px}.view-final-cbp-plan-text{padding:4px 16px;border-radius:24px;border:2px solid #F3962F;background:var(--white-kb-white-100, #FFF);box-shadow:0 1px 10px #276de599;color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Lato;font-size:16px;font-style:normal;font-weight:700;line-height:normal}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.cursor-pointer{cursor:pointer}.ml-10{margin-left:10px}.table-container{border-top-left-radius:16px;border-top-right-radius:16px;overflow:auto;background:#fff;max-height:70vh}:host ::ng-deep .mat-mdc-header-row{position:sticky;top:0;background:#fff;box-shadow:0 2px 4px #0000001a}:host ::ng-deep .mat-mdc-header-cell{background:#fff;font-weight:600;border-bottom:2px solid #e0e0e0}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child){position:relative;border-right:none}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child):after{content:\"\";position:absolute;top:12px;bottom:12px;right:0;width:1px;background-color:#e0e0e0}.table-header{font-size:16px;font-weight:600;background:#fff!important;color:#333}.table-header-unmatched{font-size:16px;font-weight:600;background:#f4dcde!important;color:#b42318}.table-body{background-color:#fff!important}.table-body-unmatched{background-color:#faf6f7!important}.designation-text-unmatched p{color:#b42318!important}.select-map-flex-container{display:flex;flex-direction:row;justify-content:space-between;width:100%}.select-map-flex{display:flex}.search-container-flex{display:flex;flex-direction:row;width:100%;justify-content:space-between;align-items:flex-start}.mt-6{margin-top:1.7rem}.mat-elevation-z1 .mat-mdc-cell{vertical-align:top!important;padding-top:8px;padding-bottom:8px}::ng-deep .radio-style-checkbox .mat-checkbox-frame{border-radius:50%}::ng-deep .radio-style-checkbox .mat-checkbox-background{border-radius:50%}.search-flex{display:flex;flex-direction:row;width:100%}.margin-top-15{margin-top:15px}.btn-active-outline{border-radius:10px;opacity:1;color:#1b4ca1;border:1px solid #1B4CA1!important;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;width:240px;border:none;background-color:transparent;cursor:pointer}.btn-active-outline-disable{border-radius:10px;opacity:.5;color:#1b4ca1;border:1px solid #1B4CA1!important;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;width:auto;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:240px;background-color:transparent;cursor:not-allowed}.role-mapping-tabs{display:flex;gap:16px;align-items:center;font-family:Inter,sans-serif}.role-tab{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:24px;border:1px solid #d0d5dd;background-color:#f9fafb;cursor:pointer;font-size:14px;font-weight:500;transition:all .2s ease-in-out}.role-tab.active{border-color:#1b4ca1;background-color:#eff6ff;color:#1b4ca1}.dot{width:10px;height:10px;border-radius:50%;background-color:#1b4ca1}.dot.red{background-color:#b42318}.badge{font-size:12px;font-weight:600;padding:2px 8px;border-radius:12px}.badge.blue{background-color:#dbeafe;color:#1b4ca1}.badge.red{background-color:#fee2e2;color:#b42318}.grayd-disable{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.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: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i11.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i11.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i11.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i11.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i11.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i11.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i11.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i11.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i11.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i11.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i12.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i13.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i13.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i13.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] }); }
761
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RoleMappingListComponent, selector: "app-role-mapping-list", inputs: { formData: "formData" }, outputs: { moveToInitialScreen: "moveToInitialScreen" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }], ngImport: i0, template: "<div class=\"role-mapping-container\">\n <div class=\"container-fluid\">\n\n <mat-card class=\"mt-0 pt-0\">\n <div class=\"section-header\">\n\n </div>\n <div class=\"edit-section mt-4\">\n <div class=\"select-map-route-container\">\n <div class=\"select-map-flex-container\">\n <div class=\"select-map-flex\">\n <div class=\"selected-mapping-route\">\n <p>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span\n *ngIf=\"sharedService?.cbpPlanFinalObj?.department_name\">\n / {{sharedService?.cbpPlanFinalObj?.department_name}}</span>\n </p>\n </div>\n <div class=\"edit-plan cursor-pointer\" (click)=\"moveToInitialScreenLayout('edit')\">\n <mat-icon>edit</mat-icon>Edit\n </div>\n <!-- <div class=\"cursor-pointer ml-10\">-->\n <!-- <button class=\"btn-active cursor-pointer\" (click)=\"moveToInitialScreenLayout('add')\">-->\n <!-- <mat-icon>add</mat-icon>-->\n <!-- Create New CBP-->\n <!-- </button>-->\n <!-- </div>-->\n </div>\n <div>\n <div class=\"view-final-cbp-plan\">\n <!-- <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('cbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div> -->\n\n <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('acbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div>\n\n </div>\n\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"search-filter-section mt-2\">\n <div class=\"search flex margin-right-m search-flex\">\n <div class=\"mt-2\">\n <div class=\"search-container\">\n <div class=\"rsearch\">\n <mat-icon\n class=\"color-60 search-icon mat-icon notranslate material-icons mat-icon-no-color\">search</mat-icon>\n <input class=\"sinput color-60 w-full\" [(ngModel)]=\"searchText\" label=\"\"\n (input)=\"applyFilter()\" placeholder=\"Search by designation name\" type=\"Standard\">\n <mat-icon *ngIf=\"searchText.trim().length > 0\"\n class=\"color-60 clear-icon mat-icon notranslate material-icons mat-icon-no-color cursor-pointer\"\n (click)=\"clearSearch()\">clear</mat-icon>\n </div>\n <div class=\"pl-2 mt-2\">\n <input [disabled]=\"searchText.trim()?.length === 0\"\n [ngClass]=\"searchText.trim()?.length === 0 ? 'btn-disable':'btn-active'\"\n type=\"button\" value=\"Search\" (click)=\"applyFilter()\" />\n </div>\n </div>\n\n\n </div>\n\n\n </div>\n <div class=\"filter-section flex margin-top-15\">\n <!-- <div>\n <label class=\"label\">Filter by competency type</label>\n <div>\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select [(value)]=\"selectedValue\" placeholder=\"Select Ministry\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"'test'\">Test</mat-option>\n <mat-option [value]=\"'another'\">Another</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div> -->\n <div class=\"btn-group\">\n <div class=\"ml-2\">\n <input class=\"btn-active\" type=\"button\" value=\"Add More Designation\"\n (click)=\"addMoreDesignation()\" />\n </div>\n <div class=\"ml-2\" *ngIf=\"activeTab === 'matched'\">\n <button\n [ngClass]=\"selection.selected.length ? 'btn-active-outline' : 'btn-active-outline-disable'\"\n (click)=\"sendForApprovalForm()\">\n <mat-icon>send</mat-icon>\n Send For Approval\n <span *ngIf=\"selection.selected.length\">({{selection.selected.length}})</span>\n </button>\n </div>\n\n\n </div>\n </div>\n </div>\n <div class=\"role-mapping-tabs mt-3\">\n <button class=\"role-tab\" [class.active]=\"activeTab === 'matched'\" (click)=\"setDataSoure('matched')\">\n <span class=\"dot\"></span>\n Matched role mappings\n <span class=\"badge blue\">{{matchedRoleMapping}}</span>\n </button>\n\n <button class=\"role-tab table-body-unmatched\" [class.active]=\"activeTab === 'unmatched'\"\n (click)=\"setDataSoure('unmatched')\">\n <span class=\"dot red\"></span>\n Unmatched role mapping\n <span class=\"badge red\">{{unMatchedRoleMapping}}</span>\n </button>\n </div>\n <div class=\"nav-container\">\n <div class=\"sidenav-content\">\n <div class=\"table-class\">\n <ng-container *ngIf=\"dataSource?.filteredData?.length > 0\">\n <!-- <table mat-table [dataSource]=\"dataSource\">\n <ng-container matColumnDef=\"RequestId\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request ID </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.demand_id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Title </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.title}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestor\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requestor </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.ownerName}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestType\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Type </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.requestType}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestStatus\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Status </th>\n\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <span [ngClass]=\"getStatusClass(element?.status)\">{{element?.status ===\n statusKey.fullfill ? 'Fulfilled'\n : element?.status}}</span>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"assignee\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Assignee </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n {{element?.assignedProvider ?\n element?.assignedProvider : 'Not Assigned' }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestedOn\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requested On </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.createdOn |\n date}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"interests\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Interests</th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <a class=\"action-btn-view\" *ngIf=\"element?.interestCount!== 0\"\n href=\"javascript:void(0)\" [ngStyle]=\"getPointerEventsStyle(element)\">\n <span (click)=\"handleClick(element)\">\n {{element?.interestCount}}\n </span></a>\n <a class=\"\" *ngIf=\"element?.interestCount === 0\"\n href=\"javascript:void(0)\">{{element?.requestType ==\n 'Single' ? 'N/A' : element?.interestCount}}</a>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Details</th>\n <td mat-cell *matCellDef=\"let element\">\n <mat-icon (click)=\"navigateToDetails(element?.demand_id)\"\n class=\"cursor-pointer\">visibility</mat-icon>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\"></th>\n <td mat-cell *matCellDef=\"let element\">\n\n\n <span>\n <button mat-icon-button [matMenuTriggerFor]=\"menu\"\n aria-label=\"Example icon-button with a menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"onClickMenu(element,'viewContent')\">\n <span>View</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Unassigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid \"\n mat-menu-item (click)=\"onClickMenu(element,'invalidContent')\">\n <span>Mark as invalid</span>\n </button>\n <button mat-menu-item\n *ngIf=\"element?.status!== statusKey.Assigned && element?.interestCount >0 && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill\"\n (click)=\"onClickMenu(element,'assignContent')\">\n <span>Assign</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Assigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill \"\n mat-menu-item (click)=\"onClickMenu(element,'reAssignContent')\">\n <span> Re-Assign</span>\n </button>\n <button mat-menu-item (click)=\"onClickMenu(element,'copyContent')\">\n <span>Copy</span>\n </button>\n </mat-menu>\n </span>\n </td>\n\n\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\" class=\"table-row-data\"></tr>\n <tr mat-row *matRowDef=\"let row;columns:displayedColumns\"></tr>\n\n\n </table> -->\n <div class=\"table-container mt-4\" style=\"overflow: auto;\">\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z1\"\n [ngClass]=\"activeTab === 'matched'? 'table-body': 'table-body-unmatched'\">\n <!-- Selection Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [hidden]=\"activeTab !== 'matched'\">\n <mat-checkbox class=\"radio-style-checkbox\" (change)=\"toggleAllRows($event)\"\n [checked]=\"isAllSelected()\" [indeterminate]=\"isSomeSelected()\"\n [disabled]=\"!hasSelectableRows()\">\n </mat-checkbox>\n </th>\n\n <td mat-cell *matCellDef=\"let row\" [hidden]=\"activeTab !== 'matched'\">\n <span matTooltip=\"Please generate & save course recommendation to select. Course recommendation generation & save is pending.\"\n [matTooltipDisabled]=\"!getActivateCbpPlan(row)\">\n <mat-checkbox class=\"radio-style-checkbox\"\n (click)=\"$event.stopPropagation()\" (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [disabled]=\"getActivateCbpPlan(row)\" [ngClass]=\" getActivateCbpPlan(row)? 'grayd-disable':''\">\n </mat-checkbox>\n </span>\n </td>\n </ng-container>\n <!-- Designation Name -->\n <ng-container matColumnDef=\"designation_name\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Designation\n </th>\n <td class=\"cursor-pointer\" mat-cell *matCellDef=\"let element\"\n (click)=\"viewCBPPlan(element)\">\n <div\n [ngClass]=\"activeTab === 'matched'? 'designation-text': 'designation-text-unmatched'\">\n <p class=\"designation\">{{ element?.designation_name }} </p>\n <p class=\"wing-text mt-2\">Wing/Division - {{\n element?.wing_division_section }} </p>\n </div>\n\n </td>\n </ng-container>\n\n <!-- Role & Responsibilities -->\n <ng-container matColumnDef=\"role_responsibilities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Role &\n Responsibilities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let role of (isResponisbilityExpanded(element.id) ? element.role_responsibilities : element.role_responsibilities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ role }}</li>\n <li *ngIf=\"element.role_responsibilities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'role_responsibilities')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n <!-- {{ isResponisbilityExpanded(element.id) ? 'View Less' : 'View More' }} -->\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n <!-- Activities -->\n <ng-container matColumnDef=\"activities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Activities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let activity of (isActivityExpanded(element.id) ? element.activities : element.activities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ activity }}</li>\n <li *ngIf=\"element.activities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'activity')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Behavioral Competencies -->\n <ng-container matColumnDef=\"behavioral\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Behavioral\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of getCompetenciesByType(element.competencies, 'Behavioral')\">\n <span class=\"competency-text-behavioral\"> {{ comp.theme }} - {{\n comp.sub_theme }} </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Functional Competencies -->\n <ng-container matColumnDef=\"functional\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Functional\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of getCompetenciesByType(element.competencies, 'Functional')\">\n <span class=\"competency-text-functional\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Domain Competencies -->\n <ng-container matColumnDef=\"domain\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Domain\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of getCompetenciesByType(element.competencies, 'Domain')\">\n <span class=\"competency-text-domain\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Actions -->\n <ng-container matColumnDef=\"action\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let element\">\n <button mat-icon-button [matMenuTriggerFor]=\"actionMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editRoleMapping(element)\">\n <mat-icon>edit</mat-icon>\n <span>Edit Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"viewCBPPlan(element)\">\n <mat-icon>visibility</mat-icon>\n <span>View Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"generateCourseRecommendation(element)\">\n <mat-icon>school</mat-icon>\n <span>Generate Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"viewCourseRecommendation(element)\">\n <mat-icon>preview</mat-icon>\n <span>View Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"deleteRoleMapping(element)\">\n <mat-icon>delete</mat-icon>\n <span>Delete Role Mapping</span>\n </button>\n <button *ngIf=\"activeTab !== 'matched'\" mat-menu-item (click)=\"sendForDesignationNameApproval(element)\">\n <mat-icon>send</mat-icon>\n <span>Send for Designation Name Approval</span>\n </button>\n </mat-menu>\n </td>\n </ng-container>\n\n <!-- Header & Rows -->\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <!-- Pagination -->\n <mat-paginator [length]=\"dataSource?.data?.length || 0\" [pageSize]=\"5\"\n [pageSizeOptions]=\"[5, 10, 20]\" showFirstLastButtons>\n </mat-paginator>\n </div>\n\n </ng-container>\n\n <div class=\"no-cbp-data\" *ngIf=\"dataSource?.filteredData?.length === 0\">\n <!-- <div><img src=\"/mdo-assets/images/no-content-data.svg\" alt=\"no-content\"></div> -->\n <div class=\"sub-heading mt-4\">\n <p>No role mappings available in this category</p>\n </div>\n <!-- <div class=\" margin-top-m no-content-create\">\n <button mat-button type=\"button\" class=\"search-btns\"\n [routerLink]=\"['/app/home/create-request-form']\">Request Content</button>\n </div> -->\n\n </div>\n\n <!-- <mat-paginator *ngIf=\"dataSource?.filteredData?.length > 0\" [pageSize]=\"pageSize\"\n [length]=\"this.requestCount\" [pageSizeOptions]=\"[10,20,40]\"\n (page)=\"onChangePage($event)\"></mat-paginator> -->\n\n\n </div>\n\n\n\n </div>\n </div>\n </mat-card>\n </div>\n</div>\n\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:18px;font-style:normal;font-weight:700;line-height:150%}:host ::ng-deep input.mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}:host ::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}:host ::ng-deep .mat-select-panel{background-color:#fff!important}:host ::ng-deep .mat-select-panel .mat-option{border-radius:0!important}:host ::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;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.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 .clear-icon{position:absolute;top:15px;font-size:20px;right:10px;color:#666}.search .clear-icon:hover{color:#333}.search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:600px}.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 10px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:17px;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:24px;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:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.competency-list{display:flex;flex-direction:row;gap:0px;flex-wrap:wrap}.competency-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.designation{color:#1b4ca1;font-family:Lato;font-size:17px;font-style:normal;font-weight:700;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.wing-text{color:#000000e0;font-family:Lato;font-size:15px;font-style:normal;font-weight:400;line-height:normal}.role-item{color:#000000e0;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:1.75}.view-final-cbp-plan{display:flex;justify-content:end;align-items:center;gap:8px}.view-final-cbp-plan-text{padding:4px 16px;border-radius:24px;border:2px solid #F3962F;background:var(--white-kb-white-100, #FFF);box-shadow:0 1px 10px #276de599;color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Lato;font-size:16px;font-style:normal;font-weight:700;line-height:normal}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.cursor-pointer{cursor:pointer}.ml-10{margin-left:10px}.table-container{border-top-left-radius:16px;border-top-right-radius:16px;overflow:auto;background:#fff;max-height:70vh}:host ::ng-deep .mat-mdc-header-row{position:sticky;top:0;background:#fff;box-shadow:0 2px 4px #0000001a}:host ::ng-deep .mat-mdc-header-cell{background:#fff;font-weight:600;border-bottom:2px solid #e0e0e0}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child){position:relative;border-right:none}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child):after{content:\"\";position:absolute;top:12px;bottom:12px;right:0;width:1px;background-color:#e0e0e0}.table-header{font-size:16px;font-weight:600;background:#fff!important;color:#333}.table-header-unmatched{font-size:16px;font-weight:600;background:#f4dcde!important;color:#b42318}.table-body{background-color:#fff!important}.table-body-unmatched{background-color:#faf6f7!important}.designation-text-unmatched p{color:#b42318!important}.select-map-flex-container{display:flex;flex-direction:row;justify-content:space-between;width:100%}.select-map-flex{display:flex}.search-container-flex{display:flex;flex-direction:row;width:100%;justify-content:space-between;align-items:flex-start}.mt-6{margin-top:1.7rem}.mat-elevation-z1 .mat-mdc-cell{vertical-align:top!important;padding-top:8px;padding-bottom:8px}::ng-deep .radio-style-checkbox .mat-checkbox-frame{border-radius:50%}::ng-deep .radio-style-checkbox .mat-checkbox-background{border-radius:50%}.search-flex{display:flex;flex-direction:row;width:100%}.margin-top-15{margin-top:15px}.btn-active-outline{border-radius:10px;opacity:1;color:#1b4ca1;border:1px solid #1B4CA1!important;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;width:240px;border:none;background-color:transparent;cursor:pointer}.btn-active-outline-disable{border-radius:10px;opacity:.5;color:#1b4ca1;border:1px solid #1B4CA1!important;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;width:auto;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:240px;background-color:transparent;cursor:not-allowed}.role-mapping-tabs{display:flex;gap:16px;align-items:center;font-family:Inter,sans-serif}.role-tab{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:24px;border:1px solid #d0d5dd;background-color:#f9fafb;cursor:pointer;font-size:14px;font-weight:500;transition:all .2s ease-in-out}.role-tab.active{border-color:#1b4ca1;background-color:#eff6ff;color:#1b4ca1}.dot{width:10px;height:10px;border-radius:50%;background-color:#1b4ca1}.dot.red{background-color:#b42318}.badge{font-size:12px;font-weight:600;padding:2px 8px;border-radius:12px}.badge.blue{background-color:#dbeafe;color:#1b4ca1}.badge.red{background-color:#fee2e2;color:#b42318}.grayd-disable{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.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: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i11.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i11.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i11.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i11.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i11.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i11.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i11.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i11.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i11.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i11.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i12.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i13.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i13.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i13.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] }); }
750
762
  }
751
763
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RoleMappingListComponent, decorators: [{
752
764
  type: Component,
753
- args: [{ selector: 'app-role-mapping-list', template: "<div class=\"role-mapping-container\">\n <div class=\"container-fluid\">\n\n <mat-card class=\"mt-0 pt-0\">\n <div class=\"section-header\">\n\n </div>\n <div class=\"edit-section mt-4\">\n <div class=\"select-map-route-container\">\n <div class=\"select-map-flex-container\">\n <div class=\"select-map-flex\">\n <div class=\"selected-mapping-route\">\n <p>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span\n *ngIf=\"sharedService?.cbpPlanFinalObj?.department_name\">\n / {{sharedService?.cbpPlanFinalObj?.department_name}}</span>\n </p>\n </div>\n <div class=\"edit-plan cursor-pointer\" (click)=\"moveToInitialScreenLayout('edit')\">\n <mat-icon>edit</mat-icon>Edit\n </div>\n <!-- <div class=\"cursor-pointer ml-10\">-->\n <!-- <button class=\"btn-active cursor-pointer\" (click)=\"moveToInitialScreenLayout('add')\">-->\n <!-- <mat-icon>add</mat-icon>-->\n <!-- Create New CBP-->\n <!-- </button>-->\n <!-- </div>-->\n </div>\n <div>\n <div class=\"view-final-cbp-plan\">\n <!-- <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('cbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div> -->\n\n <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('acbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div>\n\n </div>\n\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"search-filter-section mt-2\">\n <div class=\"search flex margin-right-m search-flex\">\n <div class=\"mt-2\">\n <div class=\"search-container\">\n <div class=\"rsearch\">\n <mat-icon\n class=\"color-60 search-icon mat-icon notranslate material-icons mat-icon-no-color\">search</mat-icon>\n <input class=\"sinput color-60 w-full\" [(ngModel)]=\"searchText\" label=\"\"\n (input)=\"applyFilter()\" placeholder=\"Search by designation name\" type=\"Standard\">\n <mat-icon *ngIf=\"searchText.trim().length > 0\"\n class=\"color-60 clear-icon mat-icon notranslate material-icons mat-icon-no-color cursor-pointer\"\n (click)=\"clearSearch()\">clear</mat-icon>\n </div>\n <div class=\"pl-2 mt-2\">\n <input [disabled]=\"searchText.trim()?.length === 0\"\n [ngClass]=\"searchText.trim()?.length === 0 ? 'btn-disable':'btn-active'\"\n type=\"button\" value=\"Search\" (click)=\"applyFilter()\" />\n </div>\n </div>\n\n\n </div>\n\n\n </div>\n <div class=\"filter-section flex margin-top-15\">\n <!-- <div>\n <label class=\"label\">Filter by competency type</label>\n <div>\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select [(value)]=\"selectedValue\" placeholder=\"Select Ministry\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"'test'\">Test</mat-option>\n <mat-option [value]=\"'another'\">Another</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div> -->\n <div class=\"btn-group\">\n <div class=\"ml-2\">\n <input class=\"btn-active\" type=\"button\" value=\"Add More Designation\"\n (click)=\"addMoreDesignation()\" />\n </div>\n <div class=\"ml-2\" *ngIf=\"activeTab === 'matched'\">\n <button\n [ngClass]=\"selection.selected.length ? 'btn-active-outline' : 'btn-active-outline-disable'\"\n (click)=\"sendForApprovalForm()\">\n <mat-icon>send</mat-icon>\n Send For Approval\n <span *ngIf=\"selection.selected.length\">({{selection.selected.length}})</span>\n </button>\n </div>\n\n\n </div>\n </div>\n </div>\n <div class=\"role-mapping-tabs mt-3\">\n <button class=\"role-tab\" [class.active]=\"activeTab === 'matched'\" (click)=\"setDataSoure('matched')\">\n <span class=\"dot\"></span>\n Matched role mappings\n <span class=\"badge blue\">{{matchedRoleMapping}}</span>\n </button>\n\n <button class=\"role-tab table-body-unmatched\" [class.active]=\"activeTab === 'unmatched'\"\n (click)=\"setDataSoure('unmatched')\">\n <span class=\"dot red\"></span>\n Unmatched role mapping\n <span class=\"badge red\">{{unMatchedRoleMapping}}</span>\n </button>\n </div>\n <div class=\"nav-container\">\n <div class=\"sidenav-content\">\n <div class=\"table-class\">\n <ng-container *ngIf=\"dataSource?.filteredData?.length > 0\">\n <!-- <table mat-table [dataSource]=\"dataSource\">\n <ng-container matColumnDef=\"RequestId\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request ID </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.demand_id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Title </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.title}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestor\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requestor </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.ownerName}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestType\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Type </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.requestType}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestStatus\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Status </th>\n\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <span [ngClass]=\"getStatusClass(element?.status)\">{{element?.status ===\n statusKey.fullfill ? 'Fulfilled'\n : element?.status}}</span>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"assignee\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Assignee </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n {{element?.assignedProvider ?\n element?.assignedProvider : 'Not Assigned' }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestedOn\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requested On </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.createdOn |\n date}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"interests\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Interests</th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <a class=\"action-btn-view\" *ngIf=\"element?.interestCount!== 0\"\n href=\"javascript:void(0)\" [ngStyle]=\"getPointerEventsStyle(element)\">\n <span (click)=\"handleClick(element)\">\n {{element?.interestCount}}\n </span></a>\n <a class=\"\" *ngIf=\"element?.interestCount === 0\"\n href=\"javascript:void(0)\">{{element?.requestType ==\n 'Single' ? 'N/A' : element?.interestCount}}</a>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Details</th>\n <td mat-cell *matCellDef=\"let element\">\n <mat-icon (click)=\"navigateToDetails(element?.demand_id)\"\n class=\"cursor-pointer\">visibility</mat-icon>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\"></th>\n <td mat-cell *matCellDef=\"let element\">\n\n\n <span>\n <button mat-icon-button [matMenuTriggerFor]=\"menu\"\n aria-label=\"Example icon-button with a menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"onClickMenu(element,'viewContent')\">\n <span>View</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Unassigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid \"\n mat-menu-item (click)=\"onClickMenu(element,'invalidContent')\">\n <span>Mark as invalid</span>\n </button>\n <button mat-menu-item\n *ngIf=\"element?.status!== statusKey.Assigned && element?.interestCount >0 && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill\"\n (click)=\"onClickMenu(element,'assignContent')\">\n <span>Assign</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Assigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill \"\n mat-menu-item (click)=\"onClickMenu(element,'reAssignContent')\">\n <span> Re-Assign</span>\n </button>\n <button mat-menu-item (click)=\"onClickMenu(element,'copyContent')\">\n <span>Copy</span>\n </button>\n </mat-menu>\n </span>\n </td>\n\n\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\" class=\"table-row-data\"></tr>\n <tr mat-row *matRowDef=\"let row;columns:displayedColumns\"></tr>\n\n\n </table> -->\n <div class=\"table-container mt-4\" style=\"overflow: auto;\">\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z1\"\n [ngClass]=\"activeTab === 'matched'? 'table-body': 'table-body-unmatched'\">\n <!-- Selection Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [hidden]=\"activeTab !== 'matched'\">\n <mat-checkbox class=\"radio-style-checkbox\" (change)=\"toggleAllRows($event)\"\n [checked]=\"isAllSelected()\" [indeterminate]=\"isSomeSelected()\"\n [disabled]=\"!hasSelectableRows()\">\n </mat-checkbox>\n </th>\n\n <td mat-cell *matCellDef=\"let row\" [hidden]=\"activeTab !== 'matched'\">\n <span matTooltip=\"Please generate & save course recommendation to select. Course recommendation generation & save is pending.\"\n [matTooltipDisabled]=\"row?.cbp_plans?.length > 0\">\n <mat-checkbox class=\"radio-style-checkbox\"\n (click)=\"$event.stopPropagation()\" (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [disabled]=\"!row?.cbp_plans?.length\" [ngClass]=\"!row?.cbp_plans?.length ? 'grayd-disable':''\">\n </mat-checkbox>\n </span>\n </td>\n </ng-container>\n <!-- Designation Name -->\n <ng-container matColumnDef=\"designation_name\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Designation\n </th>\n <td class=\"cursor-pointer\" mat-cell *matCellDef=\"let element\"\n (click)=\"viewCBPPlan(element)\">\n <div\n [ngClass]=\"activeTab === 'matched'? 'designation-text': 'designation-text-unmatched'\">\n <p class=\"designation\">{{ element?.designation_name }} </p>\n <p class=\"wing-text mt-2\">Wing/Division - {{\n element?.wing_division_section }} </p>\n </div>\n\n </td>\n </ng-container>\n\n <!-- Role & Responsibilities -->\n <ng-container matColumnDef=\"role_responsibilities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Role &\n Responsibilities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let role of (isResponisbilityExpanded(element.id) ? element.role_responsibilities : element.role_responsibilities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ role }}</li>\n <li *ngIf=\"element.role_responsibilities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'role_responsibilities')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n <!-- {{ isResponisbilityExpanded(element.id) ? 'View Less' : 'View More' }} -->\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n <!-- Activities -->\n <ng-container matColumnDef=\"activities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Activities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let activity of (isActivityExpanded(element.id) ? element.activities : element.activities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ activity }}</li>\n <li *ngIf=\"element.activities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'activity')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Behavioral Competencies -->\n <ng-container matColumnDef=\"behavioral\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Behavioral\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of getCompetenciesByType(element.competencies, 'Behavioral')\">\n <span class=\"competency-text-behavioral\"> {{ comp.theme }} - {{\n comp.sub_theme }} </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Functional Competencies -->\n <ng-container matColumnDef=\"functional\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Functional\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of getCompetenciesByType(element.competencies, 'Functional')\">\n <span class=\"competency-text-functional\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Domain Competencies -->\n <ng-container matColumnDef=\"domain\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Domain\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of getCompetenciesByType(element.competencies, 'Domain')\">\n <span class=\"competency-text-domain\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Actions -->\n <ng-container matColumnDef=\"action\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let element\">\n <button mat-icon-button [matMenuTriggerFor]=\"actionMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editRoleMapping(element)\">\n <mat-icon>edit</mat-icon>\n <span>Edit Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"viewCBPPlan(element)\">\n <mat-icon>visibility</mat-icon>\n <span>View Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"generateCourseRecommendation(element)\">\n <mat-icon>school</mat-icon>\n <span>Generate Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"viewCourseRecommendation(element)\">\n <mat-icon>preview</mat-icon>\n <span>View Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"deleteRoleMapping(element)\">\n <mat-icon>delete</mat-icon>\n <span>Delete Role Mapping</span>\n </button>\n <button *ngIf=\"activeTab !== 'matched'\" mat-menu-item (click)=\"sendForDesignationNameApproval(element)\">\n <mat-icon>send</mat-icon>\n <span>Send for Designation Name Approval</span>\n </button>\n </mat-menu>\n </td>\n </ng-container>\n\n <!-- Header & Rows -->\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <!-- Pagination -->\n <mat-paginator [length]=\"dataSource?.data?.length || 0\" [pageSize]=\"5\"\n [pageSizeOptions]=\"[5, 10, 20]\" showFirstLastButtons>\n </mat-paginator>\n </div>\n\n </ng-container>\n\n <div class=\"no-cbp-data\" *ngIf=\"dataSource?.filteredData?.length === 0\">\n <!-- <div><img src=\"/mdo-assets/images/no-content-data.svg\" alt=\"no-content\"></div> -->\n <div class=\"sub-heading mt-4\">\n <p>No role mappings available in this category</p>\n </div>\n <!-- <div class=\" margin-top-m no-content-create\">\n <button mat-button type=\"button\" class=\"search-btns\"\n [routerLink]=\"['/app/home/create-request-form']\">Request Content</button>\n </div> -->\n\n </div>\n\n <!-- <mat-paginator *ngIf=\"dataSource?.filteredData?.length > 0\" [pageSize]=\"pageSize\"\n [length]=\"this.requestCount\" [pageSizeOptions]=\"[10,20,40]\"\n (page)=\"onChangePage($event)\"></mat-paginator> -->\n\n\n </div>\n\n\n\n </div>\n </div>\n </mat-card>\n </div>\n</div>\n\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:18px;font-style:normal;font-weight:700;line-height:150%}:host ::ng-deep input.mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}:host ::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}:host ::ng-deep .mat-select-panel{background-color:#fff!important}:host ::ng-deep .mat-select-panel .mat-option{border-radius:0!important}:host ::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;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.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 .clear-icon{position:absolute;top:15px;font-size:20px;right:10px;color:#666}.search .clear-icon:hover{color:#333}.search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:600px}.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 10px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:17px;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:24px;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:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.competency-list{display:flex;flex-direction:row;gap:0px;flex-wrap:wrap}.competency-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.designation{color:#1b4ca1;font-family:Lato;font-size:17px;font-style:normal;font-weight:700;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.wing-text{color:#000000e0;font-family:Lato;font-size:15px;font-style:normal;font-weight:400;line-height:normal}.role-item{color:#000000e0;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:1.75}.view-final-cbp-plan{display:flex;justify-content:end;align-items:center;gap:8px}.view-final-cbp-plan-text{padding:4px 16px;border-radius:24px;border:2px solid #F3962F;background:var(--white-kb-white-100, #FFF);box-shadow:0 1px 10px #276de599;color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Lato;font-size:16px;font-style:normal;font-weight:700;line-height:normal}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.cursor-pointer{cursor:pointer}.ml-10{margin-left:10px}.table-container{border-top-left-radius:16px;border-top-right-radius:16px;overflow:auto;background:#fff;max-height:70vh}:host ::ng-deep .mat-mdc-header-row{position:sticky;top:0;background:#fff;box-shadow:0 2px 4px #0000001a}:host ::ng-deep .mat-mdc-header-cell{background:#fff;font-weight:600;border-bottom:2px solid #e0e0e0}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child){position:relative;border-right:none}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child):after{content:\"\";position:absolute;top:12px;bottom:12px;right:0;width:1px;background-color:#e0e0e0}.table-header{font-size:16px;font-weight:600;background:#fff!important;color:#333}.table-header-unmatched{font-size:16px;font-weight:600;background:#f4dcde!important;color:#b42318}.table-body{background-color:#fff!important}.table-body-unmatched{background-color:#faf6f7!important}.designation-text-unmatched p{color:#b42318!important}.select-map-flex-container{display:flex;flex-direction:row;justify-content:space-between;width:100%}.select-map-flex{display:flex}.search-container-flex{display:flex;flex-direction:row;width:100%;justify-content:space-between;align-items:flex-start}.mt-6{margin-top:1.7rem}.mat-elevation-z1 .mat-mdc-cell{vertical-align:top!important;padding-top:8px;padding-bottom:8px}::ng-deep .radio-style-checkbox .mat-checkbox-frame{border-radius:50%}::ng-deep .radio-style-checkbox .mat-checkbox-background{border-radius:50%}.search-flex{display:flex;flex-direction:row;width:100%}.margin-top-15{margin-top:15px}.btn-active-outline{border-radius:10px;opacity:1;color:#1b4ca1;border:1px solid #1B4CA1!important;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;width:240px;border:none;background-color:transparent;cursor:pointer}.btn-active-outline-disable{border-radius:10px;opacity:.5;color:#1b4ca1;border:1px solid #1B4CA1!important;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;width:auto;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:240px;background-color:transparent;cursor:not-allowed}.role-mapping-tabs{display:flex;gap:16px;align-items:center;font-family:Inter,sans-serif}.role-tab{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:24px;border:1px solid #d0d5dd;background-color:#f9fafb;cursor:pointer;font-size:14px;font-weight:500;transition:all .2s ease-in-out}.role-tab.active{border-color:#1b4ca1;background-color:#eff6ff;color:#1b4ca1}.dot{width:10px;height:10px;border-radius:50%;background-color:#1b4ca1}.dot.red{background-color:#b42318}.badge{font-size:12px;font-weight:600;padding:2px 8px;border-radius:12px}.badge.blue{background-color:#dbeafe;color:#1b4ca1}.badge.red{background-color:#fee2e2;color:#b42318}.grayd-disable{color:#d3d3d3!important}\n"] }]
765
+ args: [{ selector: 'app-role-mapping-list', template: "<div class=\"role-mapping-container\">\n <div class=\"container-fluid\">\n\n <mat-card class=\"mt-0 pt-0\">\n <div class=\"section-header\">\n\n </div>\n <div class=\"edit-section mt-4\">\n <div class=\"select-map-route-container\">\n <div class=\"select-map-flex-container\">\n <div class=\"select-map-flex\">\n <div class=\"selected-mapping-route\">\n <p>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span\n *ngIf=\"sharedService?.cbpPlanFinalObj?.department_name\">\n / {{sharedService?.cbpPlanFinalObj?.department_name}}</span>\n </p>\n </div>\n <div class=\"edit-plan cursor-pointer\" (click)=\"moveToInitialScreenLayout('edit')\">\n <mat-icon>edit</mat-icon>Edit\n </div>\n <!-- <div class=\"cursor-pointer ml-10\">-->\n <!-- <button class=\"btn-active cursor-pointer\" (click)=\"moveToInitialScreenLayout('add')\">-->\n <!-- <mat-icon>add</mat-icon>-->\n <!-- Create New CBP-->\n <!-- </button>-->\n <!-- </div>-->\n </div>\n <div>\n <div class=\"view-final-cbp-plan\">\n <!-- <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('cbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div> -->\n\n <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('acbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div>\n\n </div>\n\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"search-filter-section mt-2\">\n <div class=\"search flex margin-right-m search-flex\">\n <div class=\"mt-2\">\n <div class=\"search-container\">\n <div class=\"rsearch\">\n <mat-icon\n class=\"color-60 search-icon mat-icon notranslate material-icons mat-icon-no-color\">search</mat-icon>\n <input class=\"sinput color-60 w-full\" [(ngModel)]=\"searchText\" label=\"\"\n (input)=\"applyFilter()\" placeholder=\"Search by designation name\" type=\"Standard\">\n <mat-icon *ngIf=\"searchText.trim().length > 0\"\n class=\"color-60 clear-icon mat-icon notranslate material-icons mat-icon-no-color cursor-pointer\"\n (click)=\"clearSearch()\">clear</mat-icon>\n </div>\n <div class=\"pl-2 mt-2\">\n <input [disabled]=\"searchText.trim()?.length === 0\"\n [ngClass]=\"searchText.trim()?.length === 0 ? 'btn-disable':'btn-active'\"\n type=\"button\" value=\"Search\" (click)=\"applyFilter()\" />\n </div>\n </div>\n\n\n </div>\n\n\n </div>\n <div class=\"filter-section flex margin-top-15\">\n <!-- <div>\n <label class=\"label\">Filter by competency type</label>\n <div>\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select [(value)]=\"selectedValue\" placeholder=\"Select Ministry\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"'test'\">Test</mat-option>\n <mat-option [value]=\"'another'\">Another</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div> -->\n <div class=\"btn-group\">\n <div class=\"ml-2\">\n <input class=\"btn-active\" type=\"button\" value=\"Add More Designation\"\n (click)=\"addMoreDesignation()\" />\n </div>\n <div class=\"ml-2\" *ngIf=\"activeTab === 'matched'\">\n <button\n [ngClass]=\"selection.selected.length ? 'btn-active-outline' : 'btn-active-outline-disable'\"\n (click)=\"sendForApprovalForm()\">\n <mat-icon>send</mat-icon>\n Send For Approval\n <span *ngIf=\"selection.selected.length\">({{selection.selected.length}})</span>\n </button>\n </div>\n\n\n </div>\n </div>\n </div>\n <div class=\"role-mapping-tabs mt-3\">\n <button class=\"role-tab\" [class.active]=\"activeTab === 'matched'\" (click)=\"setDataSoure('matched')\">\n <span class=\"dot\"></span>\n Matched role mappings\n <span class=\"badge blue\">{{matchedRoleMapping}}</span>\n </button>\n\n <button class=\"role-tab table-body-unmatched\" [class.active]=\"activeTab === 'unmatched'\"\n (click)=\"setDataSoure('unmatched')\">\n <span class=\"dot red\"></span>\n Unmatched role mapping\n <span class=\"badge red\">{{unMatchedRoleMapping}}</span>\n </button>\n </div>\n <div class=\"nav-container\">\n <div class=\"sidenav-content\">\n <div class=\"table-class\">\n <ng-container *ngIf=\"dataSource?.filteredData?.length > 0\">\n <!-- <table mat-table [dataSource]=\"dataSource\">\n <ng-container matColumnDef=\"RequestId\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request ID </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.demand_id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Title </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.title}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestor\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requestor </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.ownerName}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestType\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Type </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.requestType}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestStatus\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Status </th>\n\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <span [ngClass]=\"getStatusClass(element?.status)\">{{element?.status ===\n statusKey.fullfill ? 'Fulfilled'\n : element?.status}}</span>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"assignee\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Assignee </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n {{element?.assignedProvider ?\n element?.assignedProvider : 'Not Assigned' }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestedOn\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requested On </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.createdOn |\n date}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"interests\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Interests</th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <a class=\"action-btn-view\" *ngIf=\"element?.interestCount!== 0\"\n href=\"javascript:void(0)\" [ngStyle]=\"getPointerEventsStyle(element)\">\n <span (click)=\"handleClick(element)\">\n {{element?.interestCount}}\n </span></a>\n <a class=\"\" *ngIf=\"element?.interestCount === 0\"\n href=\"javascript:void(0)\">{{element?.requestType ==\n 'Single' ? 'N/A' : element?.interestCount}}</a>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Details</th>\n <td mat-cell *matCellDef=\"let element\">\n <mat-icon (click)=\"navigateToDetails(element?.demand_id)\"\n class=\"cursor-pointer\">visibility</mat-icon>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\"></th>\n <td mat-cell *matCellDef=\"let element\">\n\n\n <span>\n <button mat-icon-button [matMenuTriggerFor]=\"menu\"\n aria-label=\"Example icon-button with a menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"onClickMenu(element,'viewContent')\">\n <span>View</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Unassigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid \"\n mat-menu-item (click)=\"onClickMenu(element,'invalidContent')\">\n <span>Mark as invalid</span>\n </button>\n <button mat-menu-item\n *ngIf=\"element?.status!== statusKey.Assigned && element?.interestCount >0 && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill\"\n (click)=\"onClickMenu(element,'assignContent')\">\n <span>Assign</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Assigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill \"\n mat-menu-item (click)=\"onClickMenu(element,'reAssignContent')\">\n <span> Re-Assign</span>\n </button>\n <button mat-menu-item (click)=\"onClickMenu(element,'copyContent')\">\n <span>Copy</span>\n </button>\n </mat-menu>\n </span>\n </td>\n\n\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\" class=\"table-row-data\"></tr>\n <tr mat-row *matRowDef=\"let row;columns:displayedColumns\"></tr>\n\n\n </table> -->\n <div class=\"table-container mt-4\" style=\"overflow: auto;\">\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z1\"\n [ngClass]=\"activeTab === 'matched'? 'table-body': 'table-body-unmatched'\">\n <!-- Selection Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [hidden]=\"activeTab !== 'matched'\">\n <mat-checkbox class=\"radio-style-checkbox\" (change)=\"toggleAllRows($event)\"\n [checked]=\"isAllSelected()\" [indeterminate]=\"isSomeSelected()\"\n [disabled]=\"!hasSelectableRows()\">\n </mat-checkbox>\n </th>\n\n <td mat-cell *matCellDef=\"let row\" [hidden]=\"activeTab !== 'matched'\">\n <span matTooltip=\"Please generate & save course recommendation to select. Course recommendation generation & save is pending.\"\n [matTooltipDisabled]=\"!getActivateCbpPlan(row)\">\n <mat-checkbox class=\"radio-style-checkbox\"\n (click)=\"$event.stopPropagation()\" (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [disabled]=\"getActivateCbpPlan(row)\" [ngClass]=\" getActivateCbpPlan(row)? 'grayd-disable':''\">\n </mat-checkbox>\n </span>\n </td>\n </ng-container>\n <!-- Designation Name -->\n <ng-container matColumnDef=\"designation_name\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Designation\n </th>\n <td class=\"cursor-pointer\" mat-cell *matCellDef=\"let element\"\n (click)=\"viewCBPPlan(element)\">\n <div\n [ngClass]=\"activeTab === 'matched'? 'designation-text': 'designation-text-unmatched'\">\n <p class=\"designation\">{{ element?.designation_name }} </p>\n <p class=\"wing-text mt-2\">Wing/Division - {{\n element?.wing_division_section }} </p>\n </div>\n\n </td>\n </ng-container>\n\n <!-- Role & Responsibilities -->\n <ng-container matColumnDef=\"role_responsibilities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Role &\n Responsibilities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let role of (isResponisbilityExpanded(element.id) ? element.role_responsibilities : element.role_responsibilities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ role }}</li>\n <li *ngIf=\"element.role_responsibilities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'role_responsibilities')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n <!-- {{ isResponisbilityExpanded(element.id) ? 'View Less' : 'View More' }} -->\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n <!-- Activities -->\n <ng-container matColumnDef=\"activities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Activities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let activity of (isActivityExpanded(element.id) ? element.activities : element.activities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ activity }}</li>\n <li *ngIf=\"element.activities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'activity')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Behavioral Competencies -->\n <ng-container matColumnDef=\"behavioral\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Behavioral\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of getCompetenciesByType(element.competencies, 'Behavioral')\">\n <span class=\"competency-text-behavioral\"> {{ comp.theme }} - {{\n comp.sub_theme }} </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Functional Competencies -->\n <ng-container matColumnDef=\"functional\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Functional\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of getCompetenciesByType(element.competencies, 'Functional')\">\n <span class=\"competency-text-functional\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Domain Competencies -->\n <ng-container matColumnDef=\"domain\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Domain\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of getCompetenciesByType(element.competencies, 'Domain')\">\n <span class=\"competency-text-domain\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Actions -->\n <ng-container matColumnDef=\"action\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let element\">\n <button mat-icon-button [matMenuTriggerFor]=\"actionMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editRoleMapping(element)\">\n <mat-icon>edit</mat-icon>\n <span>Edit Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"viewCBPPlan(element)\">\n <mat-icon>visibility</mat-icon>\n <span>View Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"generateCourseRecommendation(element)\">\n <mat-icon>school</mat-icon>\n <span>Generate Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"viewCourseRecommendation(element)\">\n <mat-icon>preview</mat-icon>\n <span>View Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"deleteRoleMapping(element)\">\n <mat-icon>delete</mat-icon>\n <span>Delete Role Mapping</span>\n </button>\n <button *ngIf=\"activeTab !== 'matched'\" mat-menu-item (click)=\"sendForDesignationNameApproval(element)\">\n <mat-icon>send</mat-icon>\n <span>Send for Designation Name Approval</span>\n </button>\n </mat-menu>\n </td>\n </ng-container>\n\n <!-- Header & Rows -->\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <!-- Pagination -->\n <mat-paginator [length]=\"dataSource?.data?.length || 0\" [pageSize]=\"5\"\n [pageSizeOptions]=\"[5, 10, 20]\" showFirstLastButtons>\n </mat-paginator>\n </div>\n\n </ng-container>\n\n <div class=\"no-cbp-data\" *ngIf=\"dataSource?.filteredData?.length === 0\">\n <!-- <div><img src=\"/mdo-assets/images/no-content-data.svg\" alt=\"no-content\"></div> -->\n <div class=\"sub-heading mt-4\">\n <p>No role mappings available in this category</p>\n </div>\n <!-- <div class=\" margin-top-m no-content-create\">\n <button mat-button type=\"button\" class=\"search-btns\"\n [routerLink]=\"['/app/home/create-request-form']\">Request Content</button>\n </div> -->\n\n </div>\n\n <!-- <mat-paginator *ngIf=\"dataSource?.filteredData?.length > 0\" [pageSize]=\"pageSize\"\n [length]=\"this.requestCount\" [pageSizeOptions]=\"[10,20,40]\"\n (page)=\"onChangePage($event)\"></mat-paginator> -->\n\n\n </div>\n\n\n\n </div>\n </div>\n </mat-card>\n </div>\n</div>\n\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:18px;font-style:normal;font-weight:700;line-height:150%}:host ::ng-deep input.mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}:host ::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}:host ::ng-deep .mat-select-panel{background-color:#fff!important}:host ::ng-deep .mat-select-panel .mat-option{border-radius:0!important}:host ::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;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.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 .clear-icon{position:absolute;top:15px;font-size:20px;right:10px;color:#666}.search .clear-icon:hover{color:#333}.search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:600px}.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 10px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:17px;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:24px;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:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.competency-list{display:flex;flex-direction:row;gap:0px;flex-wrap:wrap}.competency-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.designation{color:#1b4ca1;font-family:Lato;font-size:17px;font-style:normal;font-weight:700;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.wing-text{color:#000000e0;font-family:Lato;font-size:15px;font-style:normal;font-weight:400;line-height:normal}.role-item{color:#000000e0;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:1.75}.view-final-cbp-plan{display:flex;justify-content:end;align-items:center;gap:8px}.view-final-cbp-plan-text{padding:4px 16px;border-radius:24px;border:2px solid #F3962F;background:var(--white-kb-white-100, #FFF);box-shadow:0 1px 10px #276de599;color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Lato;font-size:16px;font-style:normal;font-weight:700;line-height:normal}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.cursor-pointer{cursor:pointer}.ml-10{margin-left:10px}.table-container{border-top-left-radius:16px;border-top-right-radius:16px;overflow:auto;background:#fff;max-height:70vh}:host ::ng-deep .mat-mdc-header-row{position:sticky;top:0;background:#fff;box-shadow:0 2px 4px #0000001a}:host ::ng-deep .mat-mdc-header-cell{background:#fff;font-weight:600;border-bottom:2px solid #e0e0e0}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child){position:relative;border-right:none}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child):after{content:\"\";position:absolute;top:12px;bottom:12px;right:0;width:1px;background-color:#e0e0e0}.table-header{font-size:16px;font-weight:600;background:#fff!important;color:#333}.table-header-unmatched{font-size:16px;font-weight:600;background:#f4dcde!important;color:#b42318}.table-body{background-color:#fff!important}.table-body-unmatched{background-color:#faf6f7!important}.designation-text-unmatched p{color:#b42318!important}.select-map-flex-container{display:flex;flex-direction:row;justify-content:space-between;width:100%}.select-map-flex{display:flex}.search-container-flex{display:flex;flex-direction:row;width:100%;justify-content:space-between;align-items:flex-start}.mt-6{margin-top:1.7rem}.mat-elevation-z1 .mat-mdc-cell{vertical-align:top!important;padding-top:8px;padding-bottom:8px}::ng-deep .radio-style-checkbox .mat-checkbox-frame{border-radius:50%}::ng-deep .radio-style-checkbox .mat-checkbox-background{border-radius:50%}.search-flex{display:flex;flex-direction:row;width:100%}.margin-top-15{margin-top:15px}.btn-active-outline{border-radius:10px;opacity:1;color:#1b4ca1;border:1px solid #1B4CA1!important;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;width:240px;border:none;background-color:transparent;cursor:pointer}.btn-active-outline-disable{border-radius:10px;opacity:.5;color:#1b4ca1;border:1px solid #1B4CA1!important;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;width:auto;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:240px;background-color:transparent;cursor:not-allowed}.role-mapping-tabs{display:flex;gap:16px;align-items:center;font-family:Inter,sans-serif}.role-tab{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:24px;border:1px solid #d0d5dd;background-color:#f9fafb;cursor:pointer;font-size:14px;font-weight:500;transition:all .2s ease-in-out}.role-tab.active{border-color:#1b4ca1;background-color:#eff6ff;color:#1b4ca1}.dot{width:10px;height:10px;border-radius:50%;background-color:#1b4ca1}.dot.red{background-color:#b42318}.badge{font-size:12px;font-weight:600;padding:2px 8px;border-radius:12px}.badge.blue{background-color:#dbeafe;color:#1b4ca1}.badge.red{background-color:#fee2e2;color:#b42318}.grayd-disable{color:#d3d3d3!important}\n"] }]
754
766
  }], ctorParameters: function () { return [{ type: i1.SharedService }, { type: i2.MatDialog }, { type: i3.Router }, { type: i3.ActivatedRoute }]; }, propDecorators: { formData: [{
755
767
  type: Input
756
768
  }], paginator: [{
@@ -759,4 +771,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
759
771
  }], moveToInitialScreen: [{
760
772
  type: Output
761
773
  }] } });
762
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWxpc3Qvcm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWxpc3Qvcm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDRFQUE0RSxDQUFDO0FBQ25JLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLG9FQUFvRSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSww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Q0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxFQUFFO1lBQzFFLEtBQUssRUFBRSxPQUFPO1lBQ2QsSUFBSSxFQUFFLE9BQU87WUFDYixVQUFVLEVBQUUscUJBQXFCO1lBQ2pDLFNBQVMsRUFBRSxPQUFPO1lBQ2xCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLFlBQVksRUFBRSxJQUFJLENBQUMsK0NBQStDO1NBQ25FLENBQUMsQ0FBQztRQUVILFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDekMsNEJBQTRCO1lBQzVCLG1DQUFtQztZQUNuQyx5Q0FBeUM7WUFFekMsSUFBSTtZQUNKLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBRUwsQ0FBQzsrR0ExMUJVLHdCQUF3QjttR0FBeEIsd0JBQXdCLG1NQW9CeEIsWUFBWSxnREMxQ3pCLDh6N0JBNGJNOzs0RkR0YU8sd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHVCQUF1Qjs4S0FLeEIsUUFBUTtzQkFBaEIsS0FBSztnQkFtQm1CLFNBQVM7c0JBQWpDLFNBQVM7dUJBQUMsWUFBWTtnQkFZYixtQkFBbUI7c0JBQTVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IFZpZXdDYnBQbGFuQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy1jYnAtcGxhbi92aWV3LWNicC1wbGFuLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFZGl0Q2JwUGxhbkNvbXBvbmVudCB9IGZyb20gJy4uL2VkaXQtY2JwLXBsYW4vZWRpdC1jYnAtcGxhbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VuZXJhdGVDb3Vyc2VSZWNvbW1lbmRhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2dlbmVyYXRlLWNvdXJzZS1yZWNvbW1lbmRhdGlvbi9nZW5lcmF0ZS1jb3Vyc2UtcmVjb21tZW5kYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IERlbGV0ZVJvbGVNYXBwaW5nQ29tcG9uZW50IH0gZnJvbSAnLi4vZGVsZXRlLXJvbGUtbWFwcGluZy9kZWxldGUtcm9sZS1tYXBwaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWaWV3Q291cnNlUmVjb21tZW5kYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi92aWV3LWNvdXJzZS1yZWNvbW1lbmRhdGlvbi92aWV3LWNvdXJzZS1yZWNvbW1lbmRhdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmlld0ZpbmFsQ2JwUGxhbkNvbXBvbmVudCB9IGZyb20gJy4uL3ZpZXctZmluYWwtY2JwLXBsYW4vdmlldy1maW5hbC1jYnAtcGxhbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlzdFBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi4vbGlzdC1wb3B1cC9saXN0LXBvcHVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBZGREZXNpZ25hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2FkZC1kZXNpZ25hdGlvbi9hZGQtZGVzaWduYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IEFwcHJvdmFsUmVxdWVzdEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9hcHByb3ZhbC1yZXF1ZXN0LWZvcm0vYXBwcm92YWwtcmVxdWVzdC1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTaGFyZWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kdWxlcy9zaGFyZWQvc2VydmljZXMvc2hhcmVkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGVzaWduYXRpb25BcHByb3ZhbFJlcXVlc3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZGVzaWduYXRpb24tYXBwcm92YWwtcmVxdWVzdC1mb3JtL2Rlc2lnbmF0aW9uLWFwcHJvdmFsLXJlcXVlc3QtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcm9sZS1tYXBwaW5nLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vcm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yb2xlLW1hcHBpbmctbGlzdC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJvbGVNYXBwaW5nTGlzdENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGZvcm1EYXRhOiBhbnkgPSB7fVxuICBzZWFyY2hUZXh0ID0gJydcbiAgc2VsZWN0ZWRWYWx1ZSA9ICcnXG4gIC8vJ3NlbGVjdCdcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbXG4gICAgJ3NlbGVjdCcsXG4gICAgJ2Rlc2lnbmF0aW9uX25hbWUnLFxuICAgICdyb2xlX3Jlc3BvbnNpYmlsaXRpZXMnLFxuICAgICdhY3Rpdml0aWVzJyxcbiAgICAnYmVoYXZpb3JhbCcsXG4gICAgJ2Z1bmN0aW9uYWwnLFxuICAgICdkb21haW4nLFxuICAgICdhY3Rpb24nXG4gIF07XG4gIGRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oW10pO1xuICBvcmlnaW5hbERhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oW10pO1xuICBmaWx0ZXJlZERhdGEgPSBbXTtcbiAgb3JpZ2luYWxEYXRhOiBhbnlbXSA9IFtdO1xuICBzZWFyY2hSZXN1bHRzOiBhbnlbXSA9IFtdOyAvLyBTdG9yZSBzZWFyY2ggcmVzdWx0cyBmb3IgcGFnaW5hdGlvblxuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvcikgcGFnaW5hdG9yITogTWF0UGFnaW5hdG9yO1xuICBleHBhbmRlZFJlc3BvbnNpYmlsaXR5Um93czogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICBleHBhbmRlZEFjdGl2aXR5Um93czogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICBhY3RpdmVSb3dFbGVtZW50OiBhbnlcbiAgY2JwRmluYWxPYmo6IGFueSA9IHt9XG4gIGxvYWRpbmcgPSBmYWxzZVxuICBzZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0cnVlLCBbXSk7IC8vIHRydWUgPSBtdWx0aS1zZWxlY3RcbiAgbWF0Y2hlZFJvbGVNYXBwaW5nID0gMFxuICB1bk1hdGNoZWRSb2xlTWFwcGluZyA9IDBcbiAgbWF0Y2hlZFJvbGVNYXBwaW5nSWRzID0gW11cbiAgbWF0Y2hlZERlc2lnbmF0aW9uTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIHBvcnRhbERhdGE6YW55ID0ge31cbiAgQE91dHB1dCgpIG1vdmVUb0luaXRpYWxTY3JlZW4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICBhY3RpdmVUYWI6ICdtYXRjaGVkJyB8ICd1bm1hdGNoZWQnID0gJ21hdGNoZWQnO1xuXG4gIG1hdGNoZWREZXNpZ25hdGlvblNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBtYXN0ZXJEYXRhOiBhbnlbXSA9IFtdO1xuICB0YWJGaWx0ZXJlZERhdGE6IGFueVtdID0gW107ICAgLy8gYWZ0ZXIgbWF0Y2hlZC91bm1hdGNoZWQgZmlsdGVyXG4gIG1hdGNoZWRSb2xlTWFwcGluZ0RhdGE6IGFueVtdID0gW107XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzaGFyZWRTZXJ2aWNlOiBTaGFyZWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXG4pIHtcblxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAvLyB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuXG4gIHRoaXMucG9ydGFsRGF0YSA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QuZGF0YVsncGFyZW50RGF0YSddXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrUm9sZU1hcHBpbmdGb3JtVmFsaWRhdGlvbi5uZXh0KHRydWUpXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnVwZGF0ZURlc2lnbmF0aW9uSGllcmFyY2h5U3ViamVjdC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmKHRoaXMucG9ydGFsRGF0YSAmJiB0aGlzLnBvcnRhbERhdGE/LnBhcmVudEFwcERhdGEgJiYgdGhpcy5wb3J0YWxEYXRhPy5wYXJlbnRBcHBEYXRhPy5mcm9tUG9ydGFsICYmIFxuICAgICAgdGhpcy5wb3J0YWxEYXRhPy5wYXJlbnRBcHBEYXRhPy5mcm9tUG9ydGFsID09PSAnbWRvJ1xuICAgICl7IFxuXG4gICAgfSBlbHNlIHsgIFxuICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KClcbiAgICB9XG4gIH1cbiAgICAgIFxuICAgIH0pXG4gICAgaWYodGhpcy5wb3J0YWxEYXRhICYmIHRoaXMucG9ydGFsRGF0YT8ucGFyZW50QXBwRGF0YSAmJiB0aGlzLnBvcnRhbERhdGE/LnBhcmVudEFwcERhdGE/LmZyb21Qb3J0YWwgJiYgXG4gICAgICB0aGlzLnBvcnRhbERhdGE/LnBhcmVudEFwcERhdGE/LmZyb21Qb3J0YWwgPT09ICdtZG8nXG4gICAgKXsgXG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KClcbiAgICB9XG4gICAgXG5cblxuICB9XG5cbiAgZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKGNvbXBldGVuY2llczogYW55W10sIHR5cGU6IHN0cmluZyk6IGFueVtdIHtcbiAgICByZXR1cm4gY29tcGV0ZW5jaWVzPy5maWx0ZXIoYyA9PiBjLnR5cGUgPT09IHR5cGUpIHx8IFtdO1xuICB9XG5cbiAgdmlld0RldGFpbHMoZWxlbWVudDogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1ZpZXcgY2xpY2tlZDonLCBlbGVtZW50KTtcblxuICB9XG5cbiAgZGVsZXRlSXRlbShlbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnRGVsZXRlIGNsaWNrZWQ6JywgZWxlbWVudCk7XG4gICAgLy8gT3B0aW9uYWxseSByZW1vdmUgZnJvbSBkYXRhU291cmNlXG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkICE9PSBlbGVtZW50LmlkKTtcbiAgfVxuXG4gIHNlYXJjaERhdGEoKSB7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXIoKSB7XG4gICAgLy8gaWYgKHRoaXMuc2VhcmNoVGV4dC50cmltKCkpIHtcbiAgICAvLyAgIC8vIFNlYXJjaCBvbmx5IGluIGRlc2lnbmF0aW9uIG5hbWVzXG4gICAgLy8gICB0aGlzLnNlYXJjaFJlc3VsdHMgPSB0aGlzLmZpbHRlckJ5RGVzaWduYXRpb25OYW1lKHRoaXMuc2VhcmNoVGV4dCk7XG4gICAgLy8gICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMuc2VhcmNoUmVzdWx0cyk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgIC8vIElmIHNlYXJjaCBpcyBjbGVhcmVkLCByZXN0b3JlIG9yaWdpbmFsIGRhdGFcbiAgICAvLyAgIHRoaXMuc2VhcmNoUmVzdWx0cyA9IFtdO1xuICAgIC8vICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLm9yaWdpbmFsRGF0YSk7XG4gICAgLy8gfVxuXG4gICAgLy8gLy8gU2V0IHVwIHBhZ2luYXRpb24gZm9yIGZpbHRlcmVkIHJlc3VsdHNcbiAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAvLyAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgIC8vICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgLy8gICAgIHRoaXMucGFnaW5hdG9yLmZpcnN0UGFnZSgpO1xuICAgIC8vICAgfVxuICAgIC8vIH0sIDEwMCk7XG4gICAgdGhpcy5hcHBseUFsbEZpbHRlcnMoKTtcbiAgfVxuXG4gIGNsZWFyU2VhcmNoKCkge1xuICAgIC8vIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xuICAgIC8vIHRoaXMuc2VhcmNoUmVzdWx0cyA9IFtdO1xuICAgIC8vIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5vcmlnaW5hbERhdGEpO1xuXG4gICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAvLyAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIC8vICAgICB0aGlzLnBhZ2luYXRvci5maXJzdFBhZ2UoKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9LCAxMDApO1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xuICAgIHRoaXMuYXBwbHlBbGxGaWx0ZXJzKCk7XG4gIH1cblxuICByZWZyZXNoUm9sZU1hcHBpbmdEYXRhKCkge1xuICAgIGNvbnNvbGUubG9nKCdSZWZyZXNoaW5nIHJvbGUgbWFwcGluZyBkYXRhLi4uJyk7XG4gICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmogJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeSAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IG1pbmlzdHJ5VHlwZSA9IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuc2JPcmdUeXBlO1xuICAgICAgY29uc3QgbWluaXN0cnlJZCA9IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllcjtcblxuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKG1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cykge1xuICAgICAgICAgIGNvbnN0IGRlcGFydG1lbnRJZCA9IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHM7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnQobWluaXN0cnlJZCwgZGVwYXJ0bWVudElkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1N0YXRlIHJvbGUgbWFwcGluZyBkYXRhIHJlZnJlc2hlZDonLCByZXMpO1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURhdGFTb3VyY2UocmVzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWZyZXNoaW5nIHN0YXRlIHJvbGUgbWFwcGluZyBkYXRhOicsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyKG1pbmlzdHJ5SWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ2VudGVyIHJvbGUgbWFwcGluZyBkYXRhIHJlZnJlc2hlZDonLCByZXMpO1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURhdGFTb3VyY2UocmVzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWZyZXNoaW5nIGNlbnRlciByb2xlIG1hcHBpbmcgZGF0YTonLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmIChtaW5pc3RyeVR5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgY29uc3QgZGVwYXJ0bWVudElkID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cztcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnQobWluaXN0cnlJZCwgZGVwYXJ0bWVudElkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1N0YXRlIHJvbGUgbWFwcGluZyBkYXRhIHJlZnJlc2hlZDonLCByZXMpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXRhU291cmNlKHJlcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlZnJlc2hpbmcgc3RhdGUgcm9sZSBtYXBwaW5nIGRhdGE6JywgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURhdGFTb3VyY2UocmVzOiBhbnlbXSkge1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSByZXM7XG4gICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZXMpO1xuICAgIHRoaXMub3JpZ2luYWxEYXRhID0gcmVzO1xuICAgIHRoaXMuc2VhcmNoUmVzdWx0cyA9IFtdOyAvLyBDbGVhciBzZWFyY2ggcmVzdWx0cyB3aGVuIGRhdGEgaXMgdXBkYXRlZFxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgfSwgMTAwKTtcbiAgICBjb25zb2xlLmxvZygnRGF0YVNvdXJjZSB1cGRhdGVkOicsIHRoaXMuZGF0YVNvdXJjZSk7XG4gIH1cblxuICBlZGl0Um9sZU1hcHBpbmcoZWxlbWVudDogYW55KSB7XG4gICAgdGhpcy5hY3RpdmVSb3dFbGVtZW50ID0gZWxlbWVudFxuICAgIGNvbnNvbGUubG9nKCdFZGl0IFJvbGUgTWFwcGluZyBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgLy8gTmF2aWdhdGUgb3Igb3BlbiBtb2RhbFxuICAgIGNvbnNvbGUubG9nKCdWaWV3IENCUCBQbGFuIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEVkaXRDYnBQbGFuQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzEwMDBweCcsXG4gICAgICBkYXRhOiBlbGVtZW50LFxuICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgbWluSGVpZ2h0OiAnMzAwcHgnLCAgICAgICAgICAvLyBTZXQgbWluaW11bSBoZWlnaHRcbiAgICAgIG1heEhlaWdodDogJzgwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIC8vIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgIC8vICAgY29uc29sZS5sb2coJ0NoYW5nZXMgc2F2ZWQhJyk7XG4gICAgICAvLyAgIC8vIFJlZnJlc2ggZGF0YSBvciBzaG93IGEgdG9hc3QgaGVyZVxuXG4gICAgICAvLyB9XG4gICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZpZXdDQlBQbGFuKGVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMuYWN0aXZlUm93RWxlbWVudCA9IGVsZW1lbnRcbiAgICBjb25zb2xlLmxvZygnVmlldyBDQlAgUGxhbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihWaWV3Q2JwUGxhbkNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMDAwcHgnLFxuICAgICAgZGF0YTogZWxlbWVudCxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzMwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc4MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdlbmVyYXRlQ291cnNlUmVjb21tZW5kYXRpb24oZWxlbWVudDogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ0dlbmVyYXRlIENvdXJzZSBSZWNvbW1lbmRhdGlvbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgdGhpcy5hY3RpdmVSb3dFbGVtZW50ID0gZWxlbWVudFxuICAgIGNvbnNvbGUubG9nKCdFZGl0IFJvbGUgTWFwcGluZyBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgLy8gTmF2aWdhdGUgb3Igb3BlbiBtb2RhbFxuICAgIGNvbnNvbGUubG9nKCdWaWV3IENCUCBQbGFuIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEdlbmVyYXRlQ291cnNlUmVjb21tZW5kYXRpb25Db21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnMTEwMHB4JyxcbiAgICAgIGRhdGE6IGVsZW1lbnQsXG4gICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICBtaW5IZWlnaHQ6ICc0MDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgLy8gUmVmcmVzaCBkYXRhIG9yIHNob3cgYSB0b2FzdCBoZXJlXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopXG5cbiAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmogJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeSAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIpIHtcbiAgICAgICAgICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cykge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlcih0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyZXMnLCByZXMpXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgICAgICAgIHRoaXMubG9hZFJvbGVNYXBwaW5nTGlzdCgpXG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyQW5kRGVwYXJ0bWVudCh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIsIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHMpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyZXMnLCByZXMpXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgICAgICAgIHRoaXMubG9hZFJvbGVNYXBwaW5nTGlzdCgpXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRhdGFTb3VyY2UnLCB0aGlzLmRhdGFTb3VyY2UpXG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaiAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5ICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllciAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnQodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyLCB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICAgICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKVxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGhpcy5kYXRhU291cmNlJywgdGhpcy5kYXRhU291cmNlKVxuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdmlld0NvdXJzZVJlY29tbWVuZGF0aW9uKGVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdWaWV3IENvdXJzZSBSZWNvbW1lbmRhdGlvbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgdGhpcy5hY3RpdmVSb3dFbGVtZW50ID0gZWxlbWVudFxuICAgIGNvbnNvbGUubG9nKCdFZGl0IFJvbGUgTWFwcGluZyBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgLy8gTmF2aWdhdGUgb3Igb3BlbiBtb2RhbFxuICAgIGNvbnNvbGUubG9nKCdWaWV3IENCUCBQbGFuIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFZpZXdDb3Vyc2VSZWNvbW1lbmRhdGlvbkNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMDAwcHgnLFxuICAgICAgZGF0YTogZWxlbWVudCxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzQwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iailcbiAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmogJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeSAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlcih0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzKVxuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygndGhpcy5kYXRhU291cmNlJywgdGhpcy5kYXRhU291cmNlKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGRhdGEgYnkgZGVzaWduYXRpb24gbmFtZSBvbmx5XG4gICAqIFN1cHBvcnRzIHNpbmdsZSBhbmQgbXVsdGlwbGUgd29yZCBzZWFyY2hlc1xuICAgKi9cbiAgZmlsdGVyQnlEZXNpZ25hdGlvbk5hbWUoc2VhcmNoVGV4dDogc3RyaW5nKTogYW55W10ge1xuICAgIGNvbnN0IHNlYXJjaFRlcm1zID0gc2VhcmNoVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuXG4gICAgcmV0dXJuIHRoaXMub3JpZ2luYWxEYXRhLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IGRlc2lnbmF0aW9uTmFtZSA9IChpdGVtLmRlc2lnbmF0aW9uX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGFsbCBzZWFyY2ggdGVybXMgYXJlIGZvdW5kIGluIHRoZSBkZXNpZ25hdGlvbiBuYW1lXG4gICAgICByZXR1cm4gc2VhcmNoVGVybXMuZXZlcnkodGVybSA9PiBkZXNpZ25hdGlvbk5hbWUuaW5jbHVkZXModGVybSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZmxhdHRlbk9iamVjdFRvU3RyaW5nKG9iajogYW55KTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlc3VsdCArPSAnICcgKyB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICcgJyArIHZhbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJyAnICsgdGhpcy5mbGF0dGVuT2JqZWN0VG9TdHJpbmcodmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdCArPSAnICcgKyB0aGlzLmZsYXR0ZW5PYmplY3RUb1N0cmluZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldFNlY3RvcnMoc2VjdG9yKSB7XG4gICAgaWYgKHNlY3RvciAmJiBzZWN0b3IubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShzZWN0b3IpID8gc2VjdG9yLmpvaW4oJy8gJykgOiAnJ1xuICAgIH1cblxuICB9XG5cbiAgdG9nZ2xlUmVzcG9uc2liaWxpdHlFeHBhbmQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRSZXNwb25zaWJpbGl0eVJvd3NbaWRdID0gIXRoaXMuZXhwYW5kZWRSZXNwb25zaWJpbGl0eVJvd3NbaWRdO1xuICB9XG5cbiAgaXNSZXNwb25pc2JpbGl0eUV4cGFuZGVkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcblxuXG4gICAgLy8gY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihMaXN0UG9wdXBDb21wb25lbnQsIHtcbiAgICAvLyAgIHdpZHRoOiAnMTAwMHB4JyxcbiAgICAvLyAgIGRhdGE6IHRoaXMuYWN0aXZlUm93RWxlbWVudCxcbiAgICAvLyAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgLy8gICBtaW5IZWlnaHQ6ICc0MDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgIC8vICAgbWF4SGVpZ2h0OiAnOTB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgLy8gICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICAvLyB9KTtcblxuICAgIC8vIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgIC8vICAgcmV0dXJuIGZhbHNlXG4gICAgLy8gfSk7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRSZXNwb25zaWJpbGl0eVJvd3NbaWRdO1xuICB9XG5cbiAgdG9nZ2xlQWN0aXZpdHlFeHBhbmQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRBY3Rpdml0eVJvd3NbaWRdID0gIXRoaXMuZXhwYW5kZWRBY3Rpdml0eVJvd3NbaWRdO1xuICB9XG5cbiAgaXNBY3Rpdml0eUV4cGFuZGVkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZEFjdGl2aXR5Um93c1tpZF07XG4gIH1cblxuXG5cbiAgYWRkTW9yZURlc2lnbmF0aW9uKCkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQWRkRGVzaWduYXRpb25Db21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNjAwcHgnLFxuICAgICAgZGF0YTogeyBzdGF0ZV9jZW50ZXJfaWQ6ICcnLCBtYXRjaGVkX3JvbGVfbWFwcGluZ3M6IHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nRGF0YSB9LFxuICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgbWluSGVpZ2h0OiAnMzAwcHgnLCAgICAgICAgICAvLyBTZXQgbWluaW11bSBoZWlnaHRcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0NoYW5nZXMgc2F2ZWQhJyk7XG4gICAgICAgIC8vIFJlZnJlc2ggZGF0YSBvciBzaG93IGEgdG9hc3QgaGVyZVxuICAgICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZVJvbGVNYXBwaW5nKGVsZW1lbnQpIHtcbiAgICBjb25zb2xlLmxvZygnR2VuZXJhdGUgQ291cnNlIFJlY29tbWVuZGF0aW9uIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICB0aGlzLmFjdGl2ZVJvd0VsZW1lbnQgPSBlbGVtZW50XG4gICAgY29uc29sZS5sb2coJ0VkaXQgUm9sZSBNYXBwaW5nIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICAvLyBOYXZpZ2F0ZSBvciBvcGVuIG1vZGFsXG4gICAgY29uc29sZS5sb2coJ1ZpZXcgQ0JQIFBsYW4gY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGVsZXRlUm9sZU1hcHBpbmdDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNjAwcHgnLFxuICAgICAgZGF0YTogZWxlbWVudCxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzMwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iailcbiAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmogJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeSAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIgJiZcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5Py5zYk9yZ1R5cGUgPT09ICdtaW5pc3RyeSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSb2xlTWFwcGluZ0J5U3RhdGVDZW50ZXJBbmREZXBhcnRtZW50KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllciwgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cykuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZXMpXG4gICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRhdGFTb3VyY2UnLCB0aGlzLmRhdGFTb3VyY2UpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllcikuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZXMpXG4gICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRhdGFTb3VyY2UnLCB0aGlzLmRhdGFTb3VyY2UpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnQodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyLCB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzKVxuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygndGhpcy5kYXRhU291cmNlJywgdGhpcy5kYXRhU291cmNlKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdmlld0ZpbmFsQ0JQUGxhbihjb250ZXh0OiBzdHJpbmcpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFZpZXdGaW5hbENicFBsYW5Db21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnMTEwMHB4JyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcGF5bG9hZDogdGhpcy5vcmlnaW5hbERhdGEsXG4gICAgICAgIG9wZW5lZEZyb206IGNvbnRleHQgICAvLyDwn5GIIEJFU1QgUFJBQ1RJQ0VcbiAgICAgIH0sXG4gICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgLy8gUmVmcmVzaCBkYXRhIG9yIHNob3cgYSB0b2FzdCBoZXJlXG5cblxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbW92ZVRvSW5pdGlhbFNjcmVlbkxheW91dChldmVudCkge1xuICAgLy8gdGhpcy5tb3ZlVG9Jbml0aWFsU2NyZWVuLmVtaXQoZXZlbnQpXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYWkvaW5pdGlhbCddLCB7XG4gICAgICAgICAgICAgICAgb25TYW1lVXJsTmF2aWdhdGlvbjogJ3JlbG9hZCdcbiAgICAgICAgICAgICAgfSk7XG4gIH1cblxuICBvcGVuRnVsbExpc3QoZWxlbWVudDogYW55LCB0eXBlOiBhbnkpIHtcbiAgICBjb25zdCBsaXN0VG9TaG93OiBzdHJpbmdbXSA9IGVsZW1lbnRbdHlwZV0gfHwgW107XG4gICAgY29uc3QgdGl0bGUgPSB0eXBlID09PSAncm9sZV9yZXNwb25zaWJpbGl0aWVzJyA/ICdSb2xlICYgUmVzcG9uc2liaWxpdGllcycgOiAnQWN0aXZpdGllcyc7XG5cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKExpc3RQb3B1cENvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICBkYXRhOiB7IGVsZW1lbnQ6IGVsZW1lbnQsIHR5cGU6IHR5cGUgfSxcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgICAgIG1heEhlaWdodDogJzgwdmgnXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgLy8gTm8gbmVlZCB0byBkbyBhbnl0aGluZyBzcGVjaWFsIGhlcmUgdG8gcmVzZXQgaW5saW5lIGV4cGFuZGVkIHN0YXRlXG4gICAgICAvLyBCZWNhdXNlIHlvdSdyZSB1c2luZyBkaWFsb2csIG5vdCBpbmxpbmUgZXhwYW5kIOKAkyB2aWV3IHJlbWFpbnMgaW4gaW5pdGlhbCAoY29sbGFwc2VkKSBzdGF0ZVxuICAgIH0pO1xuICB9XG5cbiAgbG9hZFJvbGVNYXBwaW5nTGlzdCgpIHtcbiAgICBcbiAgICB0aGlzLmNicEZpbmFsT2JqID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldENCUFBsYW5Mb2NhbFN0b3JhZ2UoKVxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5jYnBGaW5hbE9iaj8ucm9sZV9tYXBwaW5nX2dlbmVyYXRpb24pXG4gICAgdGhpcy5vcmlnaW5hbERhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMuY2JwRmluYWxPYmo/LnJvbGVfbWFwcGluZ19nZW5lcmF0aW9uKVxuICAgIHRoaXMub3JpZ2luYWxEYXRhID0gdGhpcy5jYnBGaW5hbE9iaj8ucm9sZV9tYXBwaW5nX2dlbmVyYXRpb25cblxuICAgIGlmICh0aGlzLmNicEZpbmFsT2JqICYmIHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5ICYmICh0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeS5zYk9yZ1R5cGUpKSB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqID0gdGhpcy5jYnBGaW5hbE9ialxuICAgICAgaWYgKHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5LnNiT3JnVHlwZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgICB0aGlzLmZvcm1EYXRhID0ge31cbiAgICAgICAgdGhpcy5mb3JtRGF0YVsndmFsdWUnXSA9IHt9XG4gICAgICAgIHRoaXMuZm9ybURhdGFbJ3ZhbHVlJ11bJ21pbmlzdHJ5VHlwZSddID0gdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnkuc2JPcmdUeXBlXG4gICAgICAgIHRoaXMuZm9ybURhdGFbJ3ZhbHVlJ11bJ21pbmlzdHJ5J10gPSB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uaWRlbnRpZmllclxuICAgICAgICB0aGlzLmZvcm1EYXRhWyd2YWx1ZSddWydkZXBhcnRtZW50cyddID0gdGhpcy5jYnBGaW5hbE9iaj8uZGVwYXJ0bWVudHNcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnkuc2JPcmdUeXBlID09PSAnc3RhdGUnKSB7XG4gICAgICAgIHRoaXMuZm9ybURhdGEgPSB7fVxuICAgICAgICB0aGlzLmZvcm1EYXRhWyd2YWx1ZSddID0ge31cbiAgICAgICAgdGhpcy5mb3JtRGF0YVsndmFsdWUnXVsnbWluaXN0cnlUeXBlJ10gPSB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeS5zYk9yZ1R5cGVcbiAgICAgICAgdGhpcy5mb3JtRGF0YVsndmFsdWUnXVsnbWluaXN0cnknXSA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyXG4gICAgICAgIHRoaXMuZm9ybURhdGFbJ3ZhbHVlJ11bJ2RlcGFydG1lbnRzJ10gPSB0aGlzLmNicEZpbmFsT2JqPy5kZXBhcnRtZW50c1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndGhpcy5mb3JtRGF0YScsIHRoaXMuZm9ybURhdGEpXG4gICAgaWYgKHRoaXMuZm9ybURhdGEgJiYgdGhpcy5mb3JtRGF0YS52YWx1ZSAmJiB0aGlzLmZvcm1EYXRhLnZhbHVlLm1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgbGV0IHN0YXRlX2NlbnRlcl9pZCA9IHRoaXMuZm9ybURhdGEudmFsdWUubWluaXN0cnlcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgIGlmICh0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IGRlcGFydG1lbnRfaWQgPSB0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzXG4gICAgICAgIGlmICh0eXBlb2YgZGVwYXJ0bWVudF9pZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyQW5kRGVwYXJ0bWVudChzdGF0ZV9jZW50ZXJfaWQsIGRlcGFydG1lbnRfaWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSByZXNcbiAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgIHN0YXRlX2NlbnRlcl9pZDogdGhpcy5mb3JtRGF0YS52YWx1ZS5taW5pc3RyeVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYodHlwZW9mIHRoaXMuZm9ybURhdGEudmFsdWUuZGVwYXJ0bWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICBvYmpbJ2RlcGFydG1lbnRfaWQnXSA9IHRoaXMuZm9ybURhdGEudmFsdWUuZGVwYXJ0bWVudHNcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRNYXRjaGVkUm9sZU1hcHBpbmcob2JqKS5zdWJzY3JpYmUoKG1hdGNoZWRSb2xlTWFwcGluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyZXMnLCByZXMpXG5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbWF0Y2hlZFJvbGVNYXBwaW5nJywgbWF0Y2hlZFJvbGVNYXBwaW5nKVxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nRGF0YSA9IG1hdGNoZWRSb2xlTWFwcGluZz8ubWF0Y2hlZF9kZXRhaWxzIHx8IFtdXG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkUm9sZU1hcHBpbmcgPSBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfY291bnRcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWREZXNpZ25hdGlvbk5hbWVzID1cbiAgICAgICAgICAgICAgICAgIG1hdGNoZWRSb2xlTWFwcGluZz8ubWF0Y2hlZF9kZXRhaWxzPy5tYXAoXG4gICAgICAgICAgICAgICAgICAgIHggPT4geC5pZ290X2Rlc2lnbmF0aW9uX25hbWU/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICkgfHwgW107XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZE5hbWVzID1cbiAgICAgICAgICAgICAgICAgIG1hdGNoZWRSb2xlTWFwcGluZz8ubWF0Y2hlZF9kZXRhaWxzPy5tYXAoeCA9PlxuICAgICAgICAgICAgICAgICAgICB4Lmlnb3RfZGVzaWduYXRpb25fbmFtZT8udHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICkgfHwgW107XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkRGVzaWduYXRpb25TZXQgPSBuZXcgU2V0KG1hdGNoZWROYW1lcyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZyA9IG1hdGNoZWROYW1lcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVuTWF0Y2hlZFJvbGVNYXBwaW5nID0gdGhpcy5tYXN0ZXJEYXRhLmxlbmd0aCAtIHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlBbGxGaWx0ZXJzKCk7XG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZXMpXG4gICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxEYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZXMpXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgICAgICAgICAgfSwgMTAwMClcbiAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM7XG4gICAgICAgICAgICAgIHRoaXMubWFzdGVyRGF0YSA9IHJlcztcblxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGhpcy5kYXRhU291cmNlJywgdGhpcy5kYXRhU291cmNlKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSb2xlTWFwcGluZ0J5U3RhdGVDZW50ZXIoc3RhdGVfY2VudGVyX2lkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID0gcmVzXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICBzdGF0ZV9jZW50ZXJfaWQ6IHRoaXMuZm9ybURhdGEudmFsdWUubWluaXN0cnlcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgaWYodHlwZW9mIHRoaXMuZm9ybURhdGEudmFsdWUuZGVwYXJ0bWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICBvYmpbJ2RlcGFydG1lbnRfaWQnXSA9IHRoaXMuZm9ybURhdGEudmFsdWUuZGVwYXJ0bWVudHNcbiAgICAgICAgICAgIH0gIFxuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRNYXRjaGVkUm9sZU1hcHBpbmcob2JqKS5zdWJzY3JpYmUoKG1hdGNoZWRSb2xlTWFwcGluZykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtYXRjaGVkUm9sZU1hcHBpbmcnLCBtYXRjaGVkUm9sZU1hcHBpbmcpXG4gICAgICAgICAgICB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZ0RhdGEgPSBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfZGV0YWlscyB8fCBbXVxuICAgICAgICAgICAgdGhpcy5tYXRjaGVkUm9sZU1hcHBpbmcgPSBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfY291bnRcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlZERlc2lnbmF0aW9uTmFtZXMgPVxuICAgICAgICAgICAgICBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfZGV0YWlscz8ubWFwKFxuICAgICAgICAgICAgICAgIHggPT4geC5pZ290X2Rlc2lnbmF0aW9uX25hbWU/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgKSB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWROYW1lcyA9XG4gICAgICAgICAgICAgIG1hdGNoZWRSb2xlTWFwcGluZz8ubWF0Y2hlZF9kZXRhaWxzPy5tYXAoeCA9PlxuICAgICAgICAgICAgICAgIHguaWdvdF9kZXNpZ25hdGlvbl9uYW1lPy50cmltKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICApIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5tYXRjaGVkRGVzaWduYXRpb25TZXQgPSBuZXcgU2V0KG1hdGNoZWROYW1lcyk7XG5cbiAgICAgICAgICAgIHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nID0gbWF0Y2hlZE5hbWVzLmxlbmd0aDtcblxuICAgICAgICAgICAgdGhpcy51bk1hdGNoZWRSb2xlTWFwcGluZyA9IHRoaXMubWFzdGVyRGF0YS5sZW5ndGggLSB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZztcbiAgICAgICAgICAgIHRoaXMuYXBwbHlBbGxGaWx0ZXJzKCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlcylcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzKVxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgICAgICAgIH0sIDEwMDApXG5cbiAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHJlcztcbiAgICAgICAgICB0aGlzLm1hc3RlckRhdGEgPSByZXM7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZGF0YVNvdXJjZScsIHRoaXMuZGF0YVNvdXJjZSlcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgIH1cbiAgICBpZiAodGhpcy5mb3JtRGF0YSAmJiB0aGlzLmZvcm1EYXRhLnZhbHVlICYmIHRoaXMuZm9ybURhdGEudmFsdWUubWluaXN0cnlUeXBlID09PSAnc3RhdGUnKSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgICBjb25zb2xlLmxvZygndGhpcy5mb3JtRGF0YScsIHRoaXMuZm9ybURhdGEpXG4gICAgICBsZXQgc3RhdGVfY2VudGVyX2lkID0gdGhpcy5mb3JtRGF0YS52YWx1ZS5taW5pc3RyeVxuICAgICAgbGV0IGRlcGFydG1lbnRfaWQgPSB0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyQW5kRGVwYXJ0bWVudChzdGF0ZV9jZW50ZXJfaWQsIGRlcGFydG1lbnRfaWQpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSByZXNcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgIHN0YXRlX2NlbnRlcl9pZDogdGhpcy5mb3JtRGF0YS52YWx1ZS5taW5pc3RyeVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZih0eXBlb2YgdGhpcy5mb3JtRGF0YS52YWx1ZS5kZXBhcnRtZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgIG9ialsnZGVwYXJ0bWVudF9pZCddID0gdGhpcy5mb3JtRGF0YS52YWx1ZS5kZXBhcnRtZW50c1xuICAgICAgICAgICAgICAgIH0gIFxuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRNYXRjaGVkUm9sZU1hcHBpbmcob2JqKS5zdWJzY3JpYmUoKG1hdGNoZWRSb2xlTWFwcGluZykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtYXRjaGVkUm9sZU1hcHBpbmcnLCBtYXRjaGVkUm9sZU1hcHBpbmcpXG4gICAgICAgICAgICB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZ0RhdGEgPSBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfZGV0YWlscyB8fCBbXVxuICAgICAgICAgICAgdGhpcy5tYXRjaGVkUm9sZU1hcHBpbmcgPSBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfY291bnRcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlZERlc2lnbmF0aW9uTmFtZXMgPVxuICAgICAgICAgICAgICBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfZGV0YWlscz8ubWFwKFxuICAgICAgICAgICAgICAgIHggPT4geC5pZ290X2Rlc2lnbmF0aW9uX25hbWU/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgKSB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWROYW1lcyA9XG4gICAgICAgICAgICAgIG1hdGNoZWRSb2xlTWFwcGluZz8ubWF0Y2hlZF9kZXRhaWxzPy5tYXAoeCA9PlxuICAgICAgICAgICAgICAgIHguaWdvdF9kZXNpZ25hdGlvbl9uYW1lPy50cmltKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICApIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5tYXRjaGVkRGVzaWduYXRpb25TZXQgPSBuZXcgU2V0KG1hdGNoZWROYW1lcyk7XG5cbiAgICAgICAgICAgIHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nID0gbWF0Y2hlZE5hbWVzLmxlbmd0aDtcblxuICAgICAgICAgICAgdGhpcy51bk1hdGNoZWRSb2xlTWFwcGluZyA9IHRoaXMubWFzdGVyRGF0YS5sZW5ndGggLSB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZztcbiAgICAgICAgICAgIHRoaXMuYXBwbHlBbGxGaWx0ZXJzKCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlcylcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzKVxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgICAgICAgIH0sIDEwMDApXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM7XG4gICAgICAgICAgdGhpcy5tYXN0ZXJEYXRhID0gcmVzO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRhdGFTb3VyY2UnLCB0aGlzLmRhdGFTb3VyY2UpXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcblxuXG5cbiAgICB9XG5cbiAgfVxuXG4gIHRvZ2dsZVJvdyhyb3c6IGFueSkge1xuICAgIGlmICghcm93Py5jYnBfcGxhbnM/Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdGhpcy5zZWxlY3Rpb24udG9nZ2xlKHJvdyk7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIHJvd3M6JywgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICB9XG5cbiAgaXNBbGxTZWxlY3RlZCgpIHtcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcbiAgICBjb25zdCBudW1Sb3dzID0gdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoO1xuICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcbiAgfVxuXG4gIGlzU29tZVNlbGVjdGVkKCkge1xuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID4gMCAmJiBudW1TZWxlY3RlZCA8IG51bVJvd3M7XG4gIH1cblxuICB0b2dnbGVBbGxSb3dzKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YVxuICAuZmlsdGVyKHJvdyA9PiByb3c/LmNicF9wbGFucz8ubGVuZ3RoKVxuICAuZm9yRWFjaChyb3cgPT4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHJvdykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIHNldERhdGFTb3VyZSh0YWI/OiAnbWF0Y2hlZCcgfCAndW5tYXRjaGVkJykge1xuXG4gICAgdGhpcy5hY3RpdmVUYWIgPSB0YWI7XG5cbiAgICAvLyB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuXG4gICAgdGhpcy5hcHBseUFsbEZpbHRlcnMoKTtcblxuICB9XG5cbiAgYXBwbHlBbGxGaWx0ZXJzKCkge1xuXG4gICAgbGV0IGRhdGEgPSBbLi4udGhpcy5tYXN0ZXJEYXRhXTtcblxuICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnKSB7XG5cbiAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihpdGVtID0+XG4gICAgICAgIHRoaXMubWF0Y2hlZERlc2lnbmF0aW9uU2V0LmhhcyhcbiAgICAgICAgICBpdGVtLmRlc2lnbmF0aW9uX25hbWU/LnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICd1bm1hdGNoZWQnKSB7XG5cbiAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihpdGVtID0+XG4gICAgICAgICF0aGlzLm1hdGNoZWREZXNpZ25hdGlvblNldC5oYXMoXG4gICAgICAgICAgaXRlbS5kZXNpZ25hdGlvbl9uYW1lPy50cmltKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICApXG4gICAgICApO1xuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dC50cmltKCkpIHtcblxuICAgICAgY29uc3QgdGVybXMgPSB0aGlzLnNlYXJjaFRleHQudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuXG4gICAgICBkYXRhID0gZGF0YS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAoaXRlbS5kZXNpZ25hdGlvbl9uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gdGVybXMuZXZlcnkodGVybSA9PiBuYW1lLmluY2x1ZGVzKHRlcm0pKTtcbiAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShkYXRhKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIH0pO1xuXG4gIH1cblxuICBzZW5kRm9yQXBwcm92YWxGb3JtKCkge1xuICAgIGNvbnNvbGUubG9nKCd0aGlzLnNlbGVjdGlvbi0tJywgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBcHByb3ZhbFJlcXVlc3RGb3JtQ29tcG9uZW50LCB7XG4gICAgICAgIHdpZHRoOiAnNjAwcHgnLFxuICAgICAgICBkYXRhOiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCxcbiAgICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgICBtYXhIZWlnaHQ6ICc4MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgICB9KTtcblxuICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgIC8vIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgICAgLy8gICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgLy8gICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcblxuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKClcbiAgICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIGhhc1NlbGVjdGFibGVSb3dzKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2U/LmRhdGE/LnNvbWUoKHJvdzogYW55KSA9PiByb3c/LmNicF9wbGFucz8ubGVuZ3RoID4gMCk7XG4gIH1cblxuICBzZW5kRm9yRGVzaWduYXRpb25OYW1lQXBwcm92YWwoZWxlbWVudCkge1xuICAgIHRoaXMuYWN0aXZlUm93RWxlbWVudCA9IGVsZW1lbnRcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERlc2lnbmF0aW9uQXBwcm92YWxSZXF1ZXN0Rm9ybUNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICBkYXRhOiBlbGVtZW50LFxuICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgbWluSGVpZ2h0OiAnMzAwcHgnLCAgICAgICAgICAvLyBTZXQgbWluaW11bSBoZWlnaHRcbiAgICAgIG1heEhlaWdodDogJzgwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIC8vIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgIC8vICAgY29uc29sZS5sb2coJ0NoYW5nZXMgc2F2ZWQhJyk7XG4gICAgICAvLyAgIC8vIFJlZnJlc2ggZGF0YSBvciBzaG93IGEgdG9hc3QgaGVyZVxuXG4gICAgICAvLyB9XG4gICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKTtcbiAgICB9KTtcblxuICB9XG5cblxufVxuIiwiPGRpdiBjbGFzcz1cInJvbGUtbWFwcGluZy1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XG5cbiAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibXQtMCBwdC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1zZWN0aW9uIG10LTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LW1hcC1yb3V0ZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC1tYXAtZmxleC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtbWFwLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtbWFwcGluZy1yb3V0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD57e3NoYXJlZFNlcnZpY2U/LmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/Lm9yZ05hbWV9fSA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5kZXBhcnRtZW50X25hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHt7c2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5kZXBhcnRtZW50X25hbWV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LXBsYW4gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwibW92ZVRvSW5pdGlhbFNjcmVlbkxheW91dCgnZWRpdCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5FZGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbWwtMTBcIj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWFjdGl2ZSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJtb3ZlVG9Jbml0aWFsU2NyZWVuTGF5b3V0KCdhZGQnKVwiPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlIE5ldyBDQlAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWV3LWZpbmFsLWNicC1wbGFuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInZpZXctZmluYWwtY2JwLXBsYW4tdGV4dCBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJ2aWV3RmluYWxDQlBQbGFuKCdjYnAnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+PHNwYW4+Vmlld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmFsIENCUDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWV3LWZpbmFsLWNicC1wbGFuLXRleHQgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidmlld0ZpbmFsQ0JQUGxhbignYWNicCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj48c3Bhbj5WaWV3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluYWwgQ0JQPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1maWx0ZXItc2VjdGlvbiBtdC0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaCBmbGV4IG1hcmdpbi1yaWdodC1tIHNlYXJjaC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyc2VhcmNoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2xvci02MCBzZWFyY2gtaWNvbiBtYXQtaWNvbiBub3RyYW5zbGF0ZSBtYXRlcmlhbC1pY29ucyBtYXQtaWNvbi1uby1jb2xvclwiPnNlYXJjaDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cInNpbnB1dCBjb2xvci02MCB3LWZ1bGxcIiBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIiBsYWJlbD1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiYXBwbHlGaWx0ZXIoKVwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGJ5IGRlc2lnbmF0aW9uIG5hbWVcIiB0eXBlPVwiU3RhbmRhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwic2VhcmNoVGV4dC50cmltKCkubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbG9yLTYwIGNsZWFyLWljb24gbWF0LWljb24gbm90cmFuc2xhdGUgbWF0ZXJpYWwtaWNvbnMgbWF0LWljb24tbm8tY29sb3IgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VhcmNoKClcIj5jbGVhcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsLTIgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgW2Rpc2FibGVkXT1cInNlYXJjaFRleHQudHJpbSgpPy5sZW5ndGggPT09IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VhcmNoVGV4dC50cmltKCk/Lmxlbmd0aCA9PT0gMCA/ICdidG4tZGlzYWJsZSc6J2J0bi1hY3RpdmUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIlNlYXJjaFwiIChjbGljayk9XCJhcHBseUZpbHRlcigpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItc2VjdGlvbiBmbGV4IG1hcmdpbi10b3AtMTVcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIj5GaWx0ZXIgYnkgY29tcGV0ZW5jeSB0eXBlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogMjVweDsgcGFkZGluZzogMCAxMnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBbKHZhbHVlKV09XCJzZWxlY3RlZFZhbHVlXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgTWluaXN0cnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXItcmFkaXVzOiAyNXB4OyBiYWNrZ3JvdW5kOiB3aGl0ZTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCIndGVzdCdcIj5UZXN0PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIidhbm90aGVyJ1wiPkFub3RoZXI8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJidG4tYWN0aXZlXCIgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwiQWRkIE1vcmUgRGVzaWduYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTW9yZURlc2lnbmF0aW9uKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtMlwiICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnbWF0Y2hlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPyAnYnRuLWFjdGl2ZS1vdXRsaW5lJyA6ICdidG4tYWN0aXZlLW91dGxpbmUtZGlzYWJsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VuZEZvckFwcHJvdmFsRm9ybSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5zZW5kPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZCBGb3IgQXBwcm92YWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoXCI+KHt7c2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb2xlLW1hcHBpbmctdGFicyBtdC0zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvbGUtdGFiXCIgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIgPT09ICdtYXRjaGVkJ1wiIChjbGljayk9XCJzZXREYXRhU291cmUoJ21hdGNoZWQnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgTWF0Y2hlZCByb2xlIG1hcHBpbmdzXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmx1ZVwiPnt7bWF0Y2hlZFJvbGVNYXBwaW5nfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicm9sZS10YWIgdGFibGUtYm9keS11bm1hdGNoZWRcIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYiA9PT0gJ3VubWF0Y2hlZCdcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0RGF0YVNvdXJlKCd1bm1hdGNoZWQnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvdCByZWRcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIFVubWF0Y2hlZCByb2xlIG1hcHBpbmdcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSByZWRcIj57e3VuTWF0Y2hlZFJvbGVNYXBwaW5nfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuYXYtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpZGVuYXYtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY2xhc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhU291cmNlPy5maWx0ZXJlZERhdGE/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIlJlcXVlc3RJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInJvdy1oZWFkaW5nXCI+UmVxdWVzdCBJRCA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNsYXNzPVwidGl0bGUtY2xhc3NcIiAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3tlbGVtZW50Py5kZW1hbmRfaWR9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInJvdy1oZWFkaW5nXCI+VGl0bGUgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjbGFzcz1cInRpdGxlLWNsYXNzXCIgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7ZWxlbWVudD8udGl0bGV9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicmVxdWVzdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWhlYWRpbmdcIj5SZXF1ZXN0b3IgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjbGFzcz1cInRpdGxlLWNsYXNzXCIgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7ZWxlbWVudD8ub3duZXJOYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicmVxdWVzdFR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJyb3ctaGVhZGluZ1wiPlJlcXVlc3QgVHlwZSA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNsYXNzPVwidGl0bGUtY2xhc3NcIiAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3tlbGVtZW50Py5yZXF1ZXN0VHlwZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInJlcXVlc3RTdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJyb3ctaGVhZGluZ1wiPlJlcXVlc3QgU3RhdHVzIDwvdGg+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjbGFzcz1cInRpdGxlLWNsYXNzXCIgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cImdldFN0YXR1c0NsYXNzKGVsZW1lbnQ/LnN0YXR1cylcIj57e2VsZW1lbnQ/LnN0YXR1cyA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzS2V5LmZ1bGxmaWxsID8gJ0Z1bGZpbGxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBlbGVtZW50Py5zdGF0dXN9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYXNzaWduZWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJyb3ctaGVhZGluZ1wiPkFzc2lnbmVlIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJ0aXRsZS1jbGFzc1wiICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2VsZW1lbnQ/LmFzc2lnbmVkUHJvdmlkZXIgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ/LmFzc2lnbmVkUHJvdmlkZXIgOiAnTm90IEFzc2lnbmVkJyB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicmVxdWVzdGVkT25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJyb3ctaGVhZGluZ1wiPlJlcXVlc3RlZCBPbiA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNsYXNzPVwidGl0bGUtY2xhc3NcIiAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3tlbGVtZW50Py5jcmVhdGVkT24gfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGV9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW50ZXJlc3RzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWhlYWRpbmdcIj5JbnRlcmVzdHM8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNsYXNzPVwidGl0bGUtY2xhc3NcIiAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhY3Rpb24tYnRuLXZpZXdcIiAqbmdJZj1cImVsZW1lbnQ/LmludGVyZXN0Q291bnQhPT0gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBbbmdTdHlsZV09XCJnZXRQb2ludGVyRXZlbnRzU3R5bGUoZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImhhbmRsZUNsaWNrKGVsZW1lbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2VsZW1lbnQ/LmludGVyZXN0Q291bnR9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiXCIgKm5nSWY9XCJlbGVtZW50Py5pbnRlcmVzdENvdW50ID09PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiPnt7ZWxlbWVudD8ucmVxdWVzdFR5cGUgPT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NpbmdsZScgPyAnTi9BJyA6IGVsZW1lbnQ/LmludGVyZXN0Q291bnR9fTwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInJvdy1oZWFkaW5nXCI+RGV0YWlsczwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwibmF2aWdhdGVUb0RldGFpbHMoZWxlbWVudD8uZGVtYW5kX2lkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIj52aXNpYmlsaXR5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWhlYWRpbmdcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFeGFtcGxlIGljb24tYnV0dG9uIHdpdGggYSBtZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib25DbGlja01lbnUoZWxlbWVudCwndmlld0NvbnRlbnQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlZpZXc8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImVsZW1lbnQ/LnN0YXR1cyA9PT0gc3RhdHVzS2V5LlVuYXNzaWduZWQgJiYgZWxlbWVudD8uc3RhdHVzIT09IHN0YXR1c0tleS5JbnByb2dyZXNzICYmICBlbGVtZW50Py5zdGF0dXMhPT0gc3RhdHVzS2V5LmludmFsaWQgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvbkNsaWNrTWVudShlbGVtZW50LCdpbnZhbGlkQ29udGVudCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+TWFyayBhcyBpbnZhbGlkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImVsZW1lbnQ/LnN0YXR1cyE9PSBzdGF0dXNLZXkuQXNzaWduZWQgJiYgZWxlbWVudD8uaW50ZXJlc3RDb3VudCA+MCAmJiBlbGVtZW50Py5zdGF0dXMhPT0gc3RhdHVzS2V5LklucHJvZ3Jlc3MgJiYgIGVsZW1lbnQ/LnN0YXR1cyE9PSBzdGF0dXNLZXkuaW52YWxpZCAmJiBlbGVtZW50Py5zdGF0dXMhPT1zdGF0dXNLZXkuZnVsbGZpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrTWVudShlbGVtZW50LCdhc3NpZ25Db250ZW50JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Bc3NpZ248L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImVsZW1lbnQ/LnN0YXR1cyA9PT0gc3RhdHVzS2V5LkFzc2lnbmVkICYmIGVsZW1lbnQ/LnN0YXR1cyE9PSBzdGF0dXNLZXkuSW5wcm9ncmVzcyAmJiAgZWxlbWVudD8uc3RhdHVzIT09IHN0YXR1c0tleS5pbnZhbGlkICYmIGVsZW1lbnQ/LnN0YXR1cyE9PXN0YXR1c0tleS5mdWxsZmlsbCBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uQ2xpY2tNZW51KGVsZW1lbnQsJ3JlQXNzaWduQ29udGVudCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+IFJlLUFzc2lnbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvbkNsaWNrTWVudShlbGVtZW50LCdjb3B5Q29udGVudCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q29weTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIiBjbGFzcz1cInRhYmxlLXJvdy1kYXRhXCI+PC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7Y29sdW1uczpkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lciBtdC00XCIgc3R5bGU9XCJvdmVyZmxvdzogYXV0bztcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgY2xhc3M9XCJtYXQtZWxldmF0aW9uLXoxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAndGFibGUtYm9keSc6ICd0YWJsZS1ib2R5LXVubWF0Y2hlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0aW9uIENvbHVtbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbaGlkZGVuXT1cImFjdGl2ZVRhYiAhPT0gJ21hdGNoZWQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggY2xhc3M9XCJyYWRpby1zdHlsZS1jaGVja2JveFwiIChjaGFuZ2UpPVwidG9nZ2xlQWxsUm93cygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsU2VsZWN0ZWQoKVwiIFtpbmRldGVybWluYXRlXT1cImlzU29tZVNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNTZWxlY3RhYmxlUm93cygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgW2hpZGRlbl09XCJhY3RpdmVUYWIgIT09ICdtYXRjaGVkJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBtYXRUb29sdGlwPVwiUGxlYXNlIGdlbmVyYXRlICYgc2F2ZSBjb3Vyc2UgcmVjb21tZW5kYXRpb24gdG8gc2VsZWN0LiBDb3Vyc2UgcmVjb21tZW5kYXRpb24gZ2VuZXJhdGlvbiAmIHNhdmUgaXMgcGVuZGluZy5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09XCJyb3c/LmNicF9wbGFucz8ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cInJhZGlvLXN0eWxlLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGNoYW5nZSk9XCJ0b2dnbGVSb3cocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFyb3c/LmNicF9wbGFucz8ubGVuZ3RoXCIgW25nQ2xhc3NdPVwiIXJvdz8uY2JwX3BsYW5zPy5sZW5ndGggPyAnZ3JheWQtZGlzYWJsZSc6JydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZXNpZ25hdGlvbiBOYW1lIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZXNpZ25hdGlvbl9uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAndGFibGUtaGVhZGVyJzogJ3RhYmxlLWhlYWRlci11bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBEZXNpZ25hdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInZpZXdDQlBQbGFuKGVsZW1lbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAnZGVzaWduYXRpb24tdGV4dCc6ICdkZXNpZ25hdGlvbi10ZXh0LXVubWF0Y2hlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZGVzaWduYXRpb25cIj57eyBlbGVtZW50Py5kZXNpZ25hdGlvbl9uYW1lIH19IDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwid2luZy10ZXh0IG10LTJcIj5XaW5nL0RpdmlzaW9uIC0ge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Py53aW5nX2RpdmlzaW9uX3NlY3Rpb24gfX0gPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSb2xlICYgUmVzcG9uc2liaWxpdGllcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicm9sZV9yZXNwb25zaWJpbGl0aWVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAndGFibGUtaGVhZGVyJzogJ3RhYmxlLWhlYWRlci11bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBSb2xlICZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2liaWxpdGllcyA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInJvbGUtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHJvbGUgb2YgKGlzUmVzcG9uaXNiaWxpdHlFeHBhbmRlZChlbGVtZW50LmlkKSA/IGVsZW1lbnQucm9sZV9yZXNwb25zaWJpbGl0aWVzIDogZWxlbWVudC5yb2xlX3Jlc3BvbnNpYmlsaXRpZXMuc2xpY2UoMCwgMikpOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpKzF9fS4ge3sgcm9sZSB9fTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJlbGVtZW50LnJvbGVfcmVzcG9uc2liaWxpdGllcy5sZW5ndGggPiAyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZpZXctbW9yZS1sZXNzIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkZ1bGxMaXN0KGVsZW1lbnQsICdyb2xlX3Jlc3BvbnNpYmlsaXRpZXMnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICMxQjRDQTE7Zm9udC1zaXplOiAxNnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHt7IGlzUmVzcG9uaXNiaWxpdHlFeHBhbmRlZChlbGVtZW50LmlkKSA/ICdWaWV3IExlc3MnIDogJ1ZpZXcgTW9yZScgfX0gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBY3Rpdml0aWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpdml0aWVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAndGFibGUtaGVhZGVyJzogJ3RhYmxlLWhlYWRlci11bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBBY3Rpdml0aWVzIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicm9sZS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYWN0aXZpdHkgb2YgKGlzQWN0aXZpdHlFeHBhbmRlZChlbGVtZW50LmlkKSA/IGVsZW1lbnQuYWN0aXZpdGllcyA6IGVsZW1lbnQuYWN0aXZpdGllcy5zbGljZSgwLCAyKSk7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2krMX19LiB7eyBhY3Rpdml0eSB9fTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJlbGVtZW50LmFjdGl2aXRpZXMubGVuZ3RoID4gMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2aWV3LW1vcmUtbGVzcyBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5GdWxsTGlzdChlbGVtZW50LCAnYWN0aXZpdHknKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICMxQjRDQTE7Zm9udC1zaXplOiAxNnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IE1vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBCZWhhdmlvcmFsIENvbXBldGVuY2llcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYmVoYXZpb3JhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBbbmdDbGFzc109XCJhY3RpdmVUYWIgPT09ICdtYXRjaGVkJz8gJ3RhYmxlLWhlYWRlcic6ICd0YWJsZS1oZWFkZXItdW5tYXRjaGVkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gQmVoYXZpb3JhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wZXRlbmNpZXMgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjb21wZXRlbmN5LWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImJlaGF2aW91cmFsLXBpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21wIG9mIGdldENvbXBldGVuY2llc0J5VHlwZShlbGVtZW50LmNvbXBldGVuY2llcywgJ0JlaGF2aW9yYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcGV0ZW5jeS10ZXh0LWJlaGF2aW9yYWxcIj4ge3sgY29tcC50aGVtZSB9fSAtIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuc3ViX3RoZW1lIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZ1bmN0aW9uYWwgQ29tcGV0ZW5jaWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJmdW5jdGlvbmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAndGFibGUtaGVhZGVyJzogJ3RhYmxlLWhlYWRlci11bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBGdW5jdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBldGVuY2llcyA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNvbXBldGVuY3ktbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZnVuY3Rpb25hbC1waWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29tcCBvZiBnZXRDb21wZXRlbmNpZXNCeVR5cGUoZWxlbWVudC5jb21wZXRlbmNpZXMsICdGdW5jdGlvbmFsJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXBldGVuY3ktdGV4dC1mdW5jdGlvbmFsXCI+IHt7IGNvbXAudGhlbWUgfX0gLSB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnN1Yl90aGVtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERvbWFpbiBDb21wZXRlbmNpZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRvbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBbbmdDbGFzc109XCJhY3RpdmVUYWIgPT09ICdtYXRjaGVkJz8gJ3RhYmxlLWhlYWRlcic6ICd0YWJsZS1oZWFkZXItdW5tYXRjaGVkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gRG9tYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBldGVuY2llcyA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNvbXBldGVuY3ktbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZG9tYWluLXBpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21wIG9mIGdldENvbXBldGVuY2llc0J5VHlwZShlbGVtZW50LmNvbXBldGVuY2llcywgJ0RvbWFpbicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wZXRlbmN5LXRleHQtZG9tYWluXCI+IHt7IGNvbXAudGhlbWUgfX0gLSB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnN1Yl90aGVtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFjdGlvbnMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBbbmdDbGFzc109XCJhY3RpdmVUYWIgPT09ICdtYXRjaGVkJz8gJ3RhYmxlLWhlYWRlcic6ICd0YWJsZS1oZWFkZXItdW5tYXRjaGVkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gQWN0aW9uIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImFjdGlvbk1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNhY3Rpb25NZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJlZGl0Um9sZU1hcHBpbmcoZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+RWRpdCBSb2xlIE1hcHBpbmc8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwidmlld0NCUFBsYW4oZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+dmlzaWJpbGl0eTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+VmlldyBSb2xlIE1hcHBpbmc8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZ2VuZXJhdGVDb3Vyc2VSZWNvbW1lbmRhdGlvbihlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5zY2hvb2w8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkdlbmVyYXRlIENvdXJzZSBSZWNvbW1lbmRhdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJ2aWV3Q291cnNlUmVjb21tZW5kYXRpb24oZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+cHJldmlldzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+VmlldyBDb3Vyc2UgUmVjb21tZW5kYXRpb248L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZGVsZXRlUm9sZU1hcHBpbmcoZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5EZWxldGUgUm9sZSBNYXBwaW5nPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImFjdGl2ZVRhYiAhPT0gJ21hdGNoZWQnXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic2VuZEZvckRlc2lnbmF0aW9uTmFtZUFwcHJvdmFsKGVsZW1lbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnNlbmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlNlbmQgZm9yIERlc2lnbmF0aW9uIE5hbWUgQXBwcm92YWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSGVhZGVyICYgUm93cyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIj48L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUGFnaW5hdGlvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wYWdpbmF0b3IgW2xlbmd0aF09XCJkYXRhU291cmNlPy5kYXRhPy5sZW5ndGggfHwgMFwiIFtwYWdlU2l6ZV09XCI1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwiWzUsIDEwLCAyMF1cIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtcGFnaW5hdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWNicC1kYXRhXCIgKm5nSWY9XCJkYXRhU291cmNlPy5maWx0ZXJlZERhdGE/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdj48aW1nIHNyYz1cIi9tZG8tYXNzZXRzL2ltYWdlcy9uby1jb250ZW50LWRhdGEuc3ZnXCIgYWx0PVwibm8tY29udGVudFwiPjwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmcgbXQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5ObyByb2xlIG1hcHBpbmdzIGF2YWlsYWJsZSBpbiB0aGlzIGNhdGVnb3J5PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIiBtYXJnaW4tdG9wLW0gbm8tY29udGVudC1jcmVhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlYXJjaC1idG5zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnL2FwcC9ob21lL2NyZWF0ZS1yZXF1ZXN0LWZvcm0nXVwiPlJlcXVlc3QgQ29udGVudDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1wYWdpbmF0b3IgKm5nSWY9XCJkYXRhU291cmNlPy5maWx0ZXJlZERhdGE/Lmxlbmd0aCA+IDBcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsZW5ndGhdPVwidGhpcy5yZXF1ZXN0Q291bnRcIiBbcGFnZVNpemVPcHRpb25zXT1cIlsxMCwyMCw0MF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlKT1cIm9uQ2hhbmdlUGFnZSgkZXZlbnQpXCI+PC9tYXQtcGFnaW5hdG9yPiAtLT5cblxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuXG48ZGl2IGNsYXNzPVwib3ZlcmxheS1sb2FkZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG48L2Rpdj4iXX0=
774
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWxpc3Qvcm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWxpc3Qvcm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDRFQUE0RSxDQUFDO0FBQ25JLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLG9FQUFvRSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSww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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBWaWV3Q2JwUGxhbkNvbXBvbmVudCB9IGZyb20gJy4uL3ZpZXctY2JwLXBsYW4vdmlldy1jYnAtcGxhbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRWRpdENicFBsYW5Db21wb25lbnQgfSBmcm9tICcuLi9lZGl0LWNicC1wbGFuL2VkaXQtY2JwLXBsYW4uY29tcG9uZW50JztcbmltcG9ydCB7IEdlbmVyYXRlQ291cnNlUmVjb21tZW5kYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9nZW5lcmF0ZS1jb3Vyc2UtcmVjb21tZW5kYXRpb24vZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEZWxldGVSb2xlTWFwcGluZ0NvbXBvbmVudCB9IGZyb20gJy4uL2RlbGV0ZS1yb2xlLW1hcHBpbmcvZGVsZXRlLXJvbGUtbWFwcGluZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmlld0NvdXJzZVJlY29tbWVuZGF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy1jb3Vyc2UtcmVjb21tZW5kYXRpb24vdmlldy1jb3Vyc2UtcmVjb21tZW5kYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFZpZXdGaW5hbENicFBsYW5Db21wb25lbnQgfSBmcm9tICcuLi92aWV3LWZpbmFsLWNicC1wbGFuL3ZpZXctZmluYWwtY2JwLXBsYW4uY29tcG9uZW50JztcbmltcG9ydCB7IExpc3RQb3B1cENvbXBvbmVudCB9IGZyb20gJy4uL2xpc3QtcG9wdXAvbGlzdC1wb3B1cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWRkRGVzaWduYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9hZGQtZGVzaWduYXRpb24vYWRkLWRlc2lnbmF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBBcHByb3ZhbFJlcXVlc3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vYXBwcm92YWwtcmVxdWVzdC1mb3JtL2FwcHJvdmFsLXJlcXVlc3QtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcbmltcG9ydCB7IERlc2lnbmF0aW9uQXBwcm92YWxSZXF1ZXN0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2Rlc2lnbmF0aW9uLWFwcHJvdmFsLXJlcXVlc3QtZm9ybS9kZXNpZ25hdGlvbi1hcHByb3ZhbC1yZXF1ZXN0LWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJvbGUtbWFwcGluZy1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JvbGUtbWFwcGluZy1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBSb2xlTWFwcGluZ0xpc3RDb21wb25lbnQge1xuICBASW5wdXQoKSBmb3JtRGF0YTogYW55ID0ge31cbiAgc2VhcmNoVGV4dCA9ICcnXG4gIHNlbGVjdGVkVmFsdWUgPSAnJ1xuICAvLydzZWxlY3QnXG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gW1xuICAgICdzZWxlY3QnLFxuICAgICdkZXNpZ25hdGlvbl9uYW1lJyxcbiAgICAncm9sZV9yZXNwb25zaWJpbGl0aWVzJyxcbiAgICAnYWN0aXZpdGllcycsXG4gICAgJ2JlaGF2aW9yYWwnLFxuICAgICdmdW5jdGlvbmFsJyxcbiAgICAnZG9tYWluJyxcbiAgICAnYWN0aW9uJ1xuICBdO1xuICBkYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KFtdKTtcbiAgb3JpZ2luYWxEYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KFtdKTtcbiAgZmlsdGVyZWREYXRhID0gW107XG4gIG9yaWdpbmFsRGF0YTogYW55W10gPSBbXTtcbiAgc2VhcmNoUmVzdWx0czogYW55W10gPSBbXTsgLy8gU3RvcmUgc2VhcmNoIHJlc3VsdHMgZm9yIHBhZ2luYXRpb25cbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvciE6IE1hdFBhZ2luYXRvcjtcbiAgZXhwYW5kZWRSZXNwb25zaWJpbGl0eVJvd3M6IHsgW2lkOiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgZXhwYW5kZWRBY3Rpdml0eVJvd3M6IHsgW2lkOiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgYWN0aXZlUm93RWxlbWVudDogYW55XG4gIGNicEZpbmFsT2JqOiBhbnkgPSB7fVxuICBsb2FkaW5nID0gZmFsc2VcbiAgc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10pOyAvLyB0cnVlID0gbXVsdGktc2VsZWN0XG4gIG1hdGNoZWRSb2xlTWFwcGluZyA9IDBcbiAgdW5NYXRjaGVkUm9sZU1hcHBpbmcgPSAwXG4gIG1hdGNoZWRSb2xlTWFwcGluZ0lkcyA9IFtdXG4gIG1hdGNoZWREZXNpZ25hdGlvbk5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBwb3J0YWxEYXRhOiBhbnkgPSB7fVxuICBAT3V0cHV0KCkgbW92ZVRvSW5pdGlhbFNjcmVlbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIGFjdGl2ZVRhYjogJ21hdGNoZWQnIHwgJ3VubWF0Y2hlZCcgPSAnbWF0Y2hlZCc7XG5cbiAgbWF0Y2hlZERlc2lnbmF0aW9uU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIG1hc3RlckRhdGE6IGFueVtdID0gW107XG4gIHRhYkZpbHRlcmVkRGF0YTogYW55W10gPSBbXTsgICAvLyBhZnRlciBtYXRjaGVkL3VubWF0Y2hlZCBmaWx0ZXJcbiAgbWF0Y2hlZFJvbGVNYXBwaW5nRGF0YTogYW55W10gPSBbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXG4gICkge1xuXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIC8vIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICB0aGlzLnBvcnRhbERhdGEgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LmRhdGFbJ3BhcmVudERhdGEnXVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jaGVja1JvbGVNYXBwaW5nRm9ybVZhbGlkYXRpb24ubmV4dCh0cnVlKVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS51cGRhdGVEZXNpZ25hdGlvbkhpZXJhcmNoeVN1YmplY3Quc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBpZiAodGhpcy5wb3J0YWxEYXRhICYmIHRoaXMucG9ydGFsRGF0YT8ucGFyZW50QXBwRGF0YSAmJiB0aGlzLnBvcnRhbERhdGE/LnBhcmVudEFwcERhdGE/LmZyb21Qb3J0YWwgJiZcbiAgICAgICAgICB0aGlzLnBvcnRhbERhdGE/LnBhcmVudEFwcERhdGE/LmZyb21Qb3J0YWwgPT09ICdtZG8nXG4gICAgICAgICkge1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSlcbiAgICBpZiAodGhpcy5wb3J0YWxEYXRhICYmIHRoaXMucG9ydGFsRGF0YT8ucGFyZW50QXBwRGF0YSAmJiB0aGlzLnBvcnRhbERhdGE/LnBhcmVudEFwcERhdGE/LmZyb21Qb3J0YWwgJiZcbiAgICAgIHRoaXMucG9ydGFsRGF0YT8ucGFyZW50QXBwRGF0YT8uZnJvbVBvcnRhbCA9PT0gJ21kbydcbiAgICApIHtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKVxuICAgIH1cblxuXG5cbiAgfVxuXG4gIGdldENvbXBldGVuY2llc0J5VHlwZShjb21wZXRlbmNpZXM6IGFueVtdLCB0eXBlOiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgcmV0dXJuIGNvbXBldGVuY2llcz8uZmlsdGVyKGMgPT4gYy50eXBlID09PSB0eXBlKSB8fCBbXTtcbiAgfVxuXG4gIHZpZXdEZXRhaWxzKGVsZW1lbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdWaWV3IGNsaWNrZWQ6JywgZWxlbWVudCk7XG5cbiAgfVxuXG4gIGRlbGV0ZUl0ZW0oZWxlbWVudDogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ0RlbGV0ZSBjbGlja2VkOicsIGVsZW1lbnQpO1xuICAgIC8vIE9wdGlvbmFsbHkgcmVtb3ZlIGZyb20gZGF0YVNvdXJjZVxuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5kYXRhU291cmNlLmRhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pZCAhPT0gZWxlbWVudC5pZCk7XG4gIH1cblxuICBzZWFyY2hEYXRhKCkge1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyKCkge1xuICAgIC8vIGlmICh0aGlzLnNlYXJjaFRleHQudHJpbSgpKSB7XG4gICAgLy8gICAvLyBTZWFyY2ggb25seSBpbiBkZXNpZ25hdGlvbiBuYW1lc1xuICAgIC8vICAgdGhpcy5zZWFyY2hSZXN1bHRzID0gdGhpcy5maWx0ZXJCeURlc2lnbmF0aW9uTmFtZSh0aGlzLnNlYXJjaFRleHQpO1xuICAgIC8vICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLnNlYXJjaFJlc3VsdHMpO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICAvLyBJZiBzZWFyY2ggaXMgY2xlYXJlZCwgcmVzdG9yZSBvcmlnaW5hbCBkYXRhXG4gICAgLy8gICB0aGlzLnNlYXJjaFJlc3VsdHMgPSBbXTtcbiAgICAvLyAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5vcmlnaW5hbERhdGEpO1xuICAgIC8vIH1cblxuICAgIC8vIC8vIFNldCB1cCBwYWdpbmF0aW9uIGZvciBmaWx0ZXJlZCByZXN1bHRzXG4gICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAvLyAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIC8vICAgICB0aGlzLnBhZ2luYXRvci5maXJzdFBhZ2UoKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9LCAxMDApO1xuICAgIHRoaXMuYXBwbHlBbGxGaWx0ZXJzKCk7XG4gIH1cblxuICBjbGVhclNlYXJjaCgpIHtcbiAgICAvLyB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICAvLyB0aGlzLnNlYXJjaFJlc3VsdHMgPSBbXTtcbiAgICAvLyB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMub3JpZ2luYWxEYXRhKTtcblxuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgLy8gICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAvLyAgICAgdGhpcy5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgLy8gICB9XG4gICAgLy8gfSwgMTAwKTtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICB0aGlzLmFwcGx5QWxsRmlsdGVycygpO1xuICB9XG5cbiAgcmVmcmVzaFJvbGVNYXBwaW5nRGF0YSgpIHtcbiAgICBjb25zb2xlLmxvZygnUmVmcmVzaGluZyByb2xlIG1hcHBpbmcgZGF0YS4uLicpO1xuICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkgJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyKSB7XG4gICAgICBjb25zdCBtaW5pc3RyeVR5cGUgPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LnNiT3JnVHlwZTtcbiAgICAgIGNvbnN0IG1pbmlzdHJ5SWQgPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXI7XG5cbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgIGlmIChtaW5pc3RyeVR5cGUgPT09ICdtaW5pc3RyeScpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHMpIHtcbiAgICAgICAgICBjb25zdCBkZXBhcnRtZW50SWQgPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzO1xuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSb2xlTWFwcGluZ0J5U3RhdGVDZW50ZXJBbmREZXBhcnRtZW50KG1pbmlzdHJ5SWQsIGRlcGFydG1lbnRJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTdGF0ZSByb2xlIG1hcHBpbmcgZGF0YSByZWZyZXNoZWQ6JywgcmVzKTtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVEYXRhU291cmNlKHJlcyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVmcmVzaGluZyBzdGF0ZSByb2xlIG1hcHBpbmcgZGF0YTonLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlcihtaW5pc3RyeUlkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NlbnRlciByb2xlIG1hcHBpbmcgZGF0YSByZWZyZXNoZWQ6JywgcmVzKTtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVEYXRhU291cmNlKHJlcyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVmcmVzaGluZyBjZW50ZXIgcm9sZSBtYXBwaW5nIGRhdGE6JywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAobWluaXN0cnlUeXBlID09PSAnc3RhdGUnKSB7XG4gICAgICAgIGNvbnN0IGRlcGFydG1lbnRJZCA9IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHM7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSb2xlTWFwcGluZ0J5U3RhdGVDZW50ZXJBbmREZXBhcnRtZW50KG1pbmlzdHJ5SWQsIGRlcGFydG1lbnRJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTdGF0ZSByb2xlIG1hcHBpbmcgZGF0YSByZWZyZXNoZWQ6JywgcmVzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGF0YVNvdXJjZShyZXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWZyZXNoaW5nIHN0YXRlIHJvbGUgbWFwcGluZyBkYXRhOicsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEYXRhU291cmNlKHJlczogYW55W10pIHtcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID0gcmVzO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzKTtcbiAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHJlcztcbiAgICB0aGlzLnNlYXJjaFJlc3VsdHMgPSBbXTsgLy8gQ2xlYXIgc2VhcmNoIHJlc3VsdHMgd2hlbiBkYXRhIGlzIHVwZGF0ZWRcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIH0sIDEwMCk7XG4gICAgY29uc29sZS5sb2coJ0RhdGFTb3VyY2UgdXBkYXRlZDonLCB0aGlzLmRhdGFTb3VyY2UpO1xuICB9XG5cbiAgZWRpdFJvbGVNYXBwaW5nKGVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMuYWN0aXZlUm93RWxlbWVudCA9IGVsZW1lbnRcbiAgICBjb25zb2xlLmxvZygnRWRpdCBSb2xlIE1hcHBpbmcgY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIC8vIE5hdmlnYXRlIG9yIG9wZW4gbW9kYWxcbiAgICBjb25zb2xlLmxvZygnVmlldyBDQlAgUGxhbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihFZGl0Q2JwUGxhbkNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMDAwcHgnLFxuICAgICAgZGF0YTogZWxlbWVudCxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzMwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc4MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAvLyBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgLy8gICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcblxuICAgICAgLy8gfVxuICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICB2aWV3Q0JQUGxhbihlbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLmFjdGl2ZVJvd0VsZW1lbnQgPSBlbGVtZW50XG4gICAgY29uc29sZS5sb2coJ1ZpZXcgQ0JQIFBsYW4gY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oVmlld0NicFBsYW5Db21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnMTAwMHB4JyxcbiAgICAgIGRhdGE6IGVsZW1lbnQsXG4gICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgbWF4SGVpZ2h0OiAnODB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgLy8gUmVmcmVzaCBkYXRhIG9yIHNob3cgYSB0b2FzdCBoZXJlXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9uKGVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdHZW5lcmF0ZSBDb3Vyc2UgUmVjb21tZW5kYXRpb24gY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIHRoaXMuYWN0aXZlUm93RWxlbWVudCA9IGVsZW1lbnRcbiAgICBjb25zb2xlLmxvZygnRWRpdCBSb2xlIE1hcHBpbmcgY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIC8vIE5hdmlnYXRlIG9yIG9wZW4gbW9kYWxcbiAgICBjb25zb2xlLmxvZygnVmlldyBDQlAgUGxhbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihHZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9uQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzExMDBweCcsXG4gICAgICBkYXRhOiBlbGVtZW50LFxuICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgbWluSGVpZ2h0OiAnNDAwcHgnLCAgICAgICAgICAvLyBTZXQgbWluaW11bSBoZWlnaHRcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0NoYW5nZXMgc2F2ZWQhJyk7XG4gICAgICAgIC8vIFJlZnJlc2ggZGF0YSBvciBzaG93IGEgdG9hc3QgaGVyZVxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKVxuXG4gICAgICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkgJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSb2xlTWFwcGluZ0J5U3RhdGVDZW50ZXIodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICAgICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKVxuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnQodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyLCB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICAgICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKVxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGhpcy5kYXRhU291cmNlJywgdGhpcy5kYXRhU291cmNlKVxuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cblxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmogJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeSAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIgJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cykge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSb2xlTWFwcGluZ0J5U3RhdGVDZW50ZXJBbmREZXBhcnRtZW50KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllciwgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cykuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KClcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZGF0YVNvdXJjZScsIHRoaXMuZGF0YVNvdXJjZSlcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHZpZXdDb3Vyc2VSZWNvbW1lbmRhdGlvbihlbGVtZW50OiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZygnVmlldyBDb3Vyc2UgUmVjb21tZW5kYXRpb24gY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIHRoaXMuYWN0aXZlUm93RWxlbWVudCA9IGVsZW1lbnRcbiAgICBjb25zb2xlLmxvZygnRWRpdCBSb2xlIE1hcHBpbmcgY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIC8vIE5hdmlnYXRlIG9yIG9wZW4gbW9kYWxcbiAgICBjb25zb2xlLmxvZygnVmlldyBDQlAgUGxhbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihWaWV3Q291cnNlUmVjb21tZW5kYXRpb25Db21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnMTAwMHB4JyxcbiAgICAgIGRhdGE6IGVsZW1lbnQsXG4gICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICBtaW5IZWlnaHQ6ICc0MDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgLy8gUmVmcmVzaCBkYXRhIG9yIHNob3cgYSB0b2FzdCBoZXJlXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopXG4gICAgICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkgJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlcih0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZXMpXG4gICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICAgICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKVxuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygndGhpcy5kYXRhU291cmNlJywgdGhpcy5kYXRhU291cmNlKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGRhdGEgYnkgZGVzaWduYXRpb24gbmFtZSBvbmx5XG4gICAqIFN1cHBvcnRzIHNpbmdsZSBhbmQgbXVsdGlwbGUgd29yZCBzZWFyY2hlc1xuICAgKi9cbiAgZmlsdGVyQnlEZXNpZ25hdGlvbk5hbWUoc2VhcmNoVGV4dDogc3RyaW5nKTogYW55W10ge1xuICAgIGNvbnN0IHNlYXJjaFRlcm1zID0gc2VhcmNoVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuXG4gICAgcmV0dXJuIHRoaXMub3JpZ2luYWxEYXRhLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IGRlc2lnbmF0aW9uTmFtZSA9IChpdGVtLmRlc2lnbmF0aW9uX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGFsbCBzZWFyY2ggdGVybXMgYXJlIGZvdW5kIGluIHRoZSBkZXNpZ25hdGlvbiBuYW1lXG4gICAgICByZXR1cm4gc2VhcmNoVGVybXMuZXZlcnkodGVybSA9PiBkZXNpZ25hdGlvbk5hbWUuaW5jbHVkZXModGVybSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZmxhdHRlbk9iamVjdFRvU3RyaW5nKG9iajogYW55KTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlc3VsdCArPSAnICcgKyB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICcgJyArIHZhbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJyAnICsgdGhpcy5mbGF0dGVuT2JqZWN0VG9TdHJpbmcodmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdCArPSAnICcgKyB0aGlzLmZsYXR0ZW5PYmplY3RUb1N0cmluZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldFNlY3RvcnMoc2VjdG9yKSB7XG4gICAgaWYgKHNlY3RvciAmJiBzZWN0b3IubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShzZWN0b3IpID8gc2VjdG9yLmpvaW4oJy8gJykgOiAnJ1xuICAgIH1cblxuICB9XG5cbiAgdG9nZ2xlUmVzcG9uc2liaWxpdHlFeHBhbmQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRSZXNwb25zaWJpbGl0eVJvd3NbaWRdID0gIXRoaXMuZXhwYW5kZWRSZXNwb25zaWJpbGl0eVJvd3NbaWRdO1xuICB9XG5cbiAgaXNSZXNwb25pc2JpbGl0eUV4cGFuZGVkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcblxuXG4gICAgLy8gY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihMaXN0UG9wdXBDb21wb25lbnQsIHtcbiAgICAvLyAgIHdpZHRoOiAnMTAwMHB4JyxcbiAgICAvLyAgIGRhdGE6IHRoaXMuYWN0aXZlUm93RWxlbWVudCxcbiAgICAvLyAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgLy8gICBtaW5IZWlnaHQ6ICc0MDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgIC8vICAgbWF4SGVpZ2h0OiAnOTB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgLy8gICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICAvLyB9KTtcblxuICAgIC8vIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgIC8vICAgcmV0dXJuIGZhbHNlXG4gICAgLy8gfSk7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRSZXNwb25zaWJpbGl0eVJvd3NbaWRdO1xuICB9XG5cbiAgdG9nZ2xlQWN0aXZpdHlFeHBhbmQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRBY3Rpdml0eVJvd3NbaWRdID0gIXRoaXMuZXhwYW5kZWRBY3Rpdml0eVJvd3NbaWRdO1xuICB9XG5cbiAgaXNBY3Rpdml0eUV4cGFuZGVkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZEFjdGl2aXR5Um93c1tpZF07XG4gIH1cblxuXG5cbiAgYWRkTW9yZURlc2lnbmF0aW9uKCkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQWRkRGVzaWduYXRpb25Db21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNjAwcHgnLFxuICAgICAgZGF0YTogeyBzdGF0ZV9jZW50ZXJfaWQ6ICcnLCBtYXRjaGVkX3JvbGVfbWFwcGluZ3M6IHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nRGF0YSB9LFxuICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgbWluSGVpZ2h0OiAnMzAwcHgnLCAgICAgICAgICAvLyBTZXQgbWluaW11bSBoZWlnaHRcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0NoYW5nZXMgc2F2ZWQhJyk7XG4gICAgICAgIC8vIFJlZnJlc2ggZGF0YSBvciBzaG93IGEgdG9hc3QgaGVyZVxuICAgICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZVJvbGVNYXBwaW5nKGVsZW1lbnQpIHtcbiAgICBjb25zb2xlLmxvZygnR2VuZXJhdGUgQ291cnNlIFJlY29tbWVuZGF0aW9uIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICB0aGlzLmFjdGl2ZVJvd0VsZW1lbnQgPSBlbGVtZW50XG4gICAgY29uc29sZS5sb2coJ0VkaXQgUm9sZSBNYXBwaW5nIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICAvLyBOYXZpZ2F0ZSBvciBvcGVuIG1vZGFsXG4gICAgY29uc29sZS5sb2coJ1ZpZXcgQ0JQIFBsYW4gY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGVsZXRlUm9sZU1hcHBpbmdDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNjAwcHgnLFxuICAgICAgZGF0YTogZWxlbWVudCxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzMwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iailcbiAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmogJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeSAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIgJiZcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5Py5zYk9yZ1R5cGUgPT09ICdtaW5pc3RyeSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSb2xlTWFwcGluZ0J5U3RhdGVDZW50ZXJBbmREZXBhcnRtZW50KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllciwgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cykuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZXMpXG4gICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRhdGFTb3VyY2UnLCB0aGlzLmRhdGFTb3VyY2UpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllcikuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZXMpXG4gICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRhdGFTb3VyY2UnLCB0aGlzLmRhdGFTb3VyY2UpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnQodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyLCB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzKVxuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygndGhpcy5kYXRhU291cmNlJywgdGhpcy5kYXRhU291cmNlKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdmlld0ZpbmFsQ0JQUGxhbihjb250ZXh0OiBzdHJpbmcpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFZpZXdGaW5hbENicFBsYW5Db21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnMTEwMHB4JyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcGF5bG9hZDogdGhpcy5vcmlnaW5hbERhdGEsXG4gICAgICAgIG9wZW5lZEZyb206IGNvbnRleHQgICAvLyDwn5GIIEJFU1QgUFJBQ1RJQ0VcbiAgICAgIH0sXG4gICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgLy8gUmVmcmVzaCBkYXRhIG9yIHNob3cgYSB0b2FzdCBoZXJlXG5cblxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbW92ZVRvSW5pdGlhbFNjcmVlbkxheW91dChldmVudCkge1xuICAgIC8vIHRoaXMubW92ZVRvSW5pdGlhbFNjcmVlbi5lbWl0KGV2ZW50KVxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FpL2luaXRpYWwnXSwge1xuICAgICAgb25TYW1lVXJsTmF2aWdhdGlvbjogJ3JlbG9hZCdcbiAgICB9KTtcbiAgfVxuXG4gIG9wZW5GdWxsTGlzdChlbGVtZW50OiBhbnksIHR5cGU6IGFueSkge1xuICAgIGNvbnN0IGxpc3RUb1Nob3c6IHN0cmluZ1tdID0gZWxlbWVudFt0eXBlXSB8fCBbXTtcbiAgICBjb25zdCB0aXRsZSA9IHR5cGUgPT09ICdyb2xlX3Jlc3BvbnNpYmlsaXRpZXMnID8gJ1JvbGUgJiBSZXNwb25zaWJpbGl0aWVzJyA6ICdBY3Rpdml0aWVzJztcblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oTGlzdFBvcHVwQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgIGRhdGE6IHsgZWxlbWVudDogZWxlbWVudCwgdHlwZTogdHlwZSB9LFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgbWF4SGVpZ2h0OiAnODB2aCdcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyBObyBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgaGVyZSB0byByZXNldCBpbmxpbmUgZXhwYW5kZWQgc3RhdGVcbiAgICAgIC8vIEJlY2F1c2UgeW91J3JlIHVzaW5nIGRpYWxvZywgbm90IGlubGluZSBleHBhbmQg4oCTIHZpZXcgcmVtYWlucyBpbiBpbml0aWFsIChjb2xsYXBzZWQpIHN0YXRlXG4gICAgfSk7XG4gIH1cblxuICBsb2FkUm9sZU1hcHBpbmdMaXN0KCkge1xuXG4gICAgdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKClcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMuY2JwRmluYWxPYmo/LnJvbGVfbWFwcGluZ19nZW5lcmF0aW9uKVxuICAgIHRoaXMub3JpZ2luYWxEYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLmNicEZpbmFsT2JqPy5yb2xlX21hcHBpbmdfZ2VuZXJhdGlvbilcbiAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHRoaXMuY2JwRmluYWxPYmo/LnJvbGVfbWFwcGluZ19nZW5lcmF0aW9uXG5cbiAgICBpZiAodGhpcy5jYnBGaW5hbE9iaiAmJiB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeSAmJiAodGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnkuc2JPcmdUeXBlKSkge1xuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaiA9IHRoaXMuY2JwRmluYWxPYmpcbiAgICAgIGlmICh0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeS5zYk9yZ1R5cGUgPT09ICdtaW5pc3RyeScpIHtcbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IHt9XG4gICAgICAgIHRoaXMuZm9ybURhdGFbJ3ZhbHVlJ10gPSB7fVxuICAgICAgICB0aGlzLmZvcm1EYXRhWyd2YWx1ZSddWydtaW5pc3RyeVR5cGUnXSA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5LnNiT3JnVHlwZVxuICAgICAgICB0aGlzLmZvcm1EYXRhWyd2YWx1ZSddWydtaW5pc3RyeSddID0gdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXJcbiAgICAgICAgdGhpcy5mb3JtRGF0YVsndmFsdWUnXVsnZGVwYXJ0bWVudHMnXSA9IHRoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5LnNiT3JnVHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgICB0aGlzLmZvcm1EYXRhID0ge31cbiAgICAgICAgdGhpcy5mb3JtRGF0YVsndmFsdWUnXSA9IHt9XG4gICAgICAgIHRoaXMuZm9ybURhdGFbJ3ZhbHVlJ11bJ21pbmlzdHJ5VHlwZSddID0gdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnkuc2JPcmdUeXBlXG4gICAgICAgIHRoaXMuZm9ybURhdGFbJ3ZhbHVlJ11bJ21pbmlzdHJ5J10gPSB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uaWRlbnRpZmllclxuICAgICAgICB0aGlzLmZvcm1EYXRhWyd2YWx1ZSddWydkZXBhcnRtZW50cyddID0gdGhpcy5jYnBGaW5hbE9iaj8uZGVwYXJ0bWVudHNcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ3RoaXMuZm9ybURhdGEnLCB0aGlzLmZvcm1EYXRhKVxuICAgIGlmICh0aGlzLmZvcm1EYXRhICYmIHRoaXMuZm9ybURhdGEudmFsdWUgJiYgdGhpcy5mb3JtRGF0YS52YWx1ZS5taW5pc3RyeVR5cGUgPT09ICdtaW5pc3RyeScpIHtcbiAgICAgIGxldCBzdGF0ZV9jZW50ZXJfaWQgPSB0aGlzLmZvcm1EYXRhLnZhbHVlLm1pbmlzdHJ5XG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgICBpZiAodGhpcy5mb3JtRGF0YS52YWx1ZS5kZXBhcnRtZW50cz8ubGVuZ3RoKSB7XG4gICAgICAgIGxldCBkZXBhcnRtZW50X2lkID0gdGhpcy5mb3JtRGF0YS52YWx1ZS5kZXBhcnRtZW50c1xuICAgICAgICBpZiAodHlwZW9mIGRlcGFydG1lbnRfaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnQoc3RhdGVfY2VudGVyX2lkLCBkZXBhcnRtZW50X2lkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID0gcmVzXG4gICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYnBQbGFuRmluYWxPYmonLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKSlcbiAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgICBzdGF0ZV9jZW50ZXJfaWQ6IHRoaXMuZm9ybURhdGEudmFsdWUubWluaXN0cnlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtRGF0YS52YWx1ZS5kZXBhcnRtZW50cykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5mb3JtRGF0YS52YWx1ZS5kZXBhcnRtZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgIG9ialsnZGVwYXJ0bWVudF9pZCddID0gdGhpcy5mb3JtRGF0YS52YWx1ZS5kZXBhcnRtZW50c1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0TWF0Y2hlZFJvbGVNYXBwaW5nKG9iaikuc3Vic2NyaWJlKChtYXRjaGVkUm9sZU1hcHBpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ21hdGNoZWRSb2xlTWFwcGluZycsIG1hdGNoZWRSb2xlTWFwcGluZylcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZ0RhdGEgPSBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfZGV0YWlscyB8fCBbXVxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nID0gbWF0Y2hlZFJvbGVNYXBwaW5nPy5tYXRjaGVkX2NvdW50XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkRGVzaWduYXRpb25OYW1lcyA9XG4gICAgICAgICAgICAgICAgICBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfZGV0YWlscz8ubWFwKFxuICAgICAgICAgICAgICAgICAgICB4ID0+IHguaWdvdF9kZXNpZ25hdGlvbl9uYW1lPy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICApIHx8IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWROYW1lcyA9XG4gICAgICAgICAgICAgICAgICBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfZGV0YWlscz8ubWFwKHggPT5cbiAgICAgICAgICAgICAgICAgICAgeC5pZ290X2Rlc2lnbmF0aW9uX25hbWU/LnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICApIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlZERlc2lnbmF0aW9uU2V0ID0gbmV3IFNldChtYXRjaGVkTmFtZXMpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkUm9sZU1hcHBpbmcgPSBtYXRjaGVkTmFtZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgdGhpcy51bk1hdGNoZWRSb2xlTWFwcGluZyA9IHRoaXMubWFzdGVyRGF0YS5sZW5ndGggLSB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZztcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5QWxsRmlsdGVycygpO1xuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzKVxuICAgICAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzKVxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICAgICAgICAgIH0sIDEwMDApXG4gICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxEYXRhID0gcmVzO1xuICAgICAgICAgICAgICB0aGlzLm1hc3RlckRhdGEgPSByZXM7XG5cbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZGF0YVNvdXJjZScsIHRoaXMuZGF0YVNvdXJjZSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyKHN0YXRlX2NlbnRlcl9pZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIGNvbnNvbGUubG9nKCdyZXMnLCByZXMpXG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsncm9sZV9tYXBwaW5nX2dlbmVyYXRpb24nXSA9IHJlc1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYnBQbGFuRmluYWxPYmonLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKSlcbiAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgc3RhdGVfY2VudGVyX2lkOiB0aGlzLmZvcm1EYXRhLnZhbHVlLm1pbmlzdHJ5XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgb2JqWydkZXBhcnRtZW50X2lkJ10gPSB0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRNYXRjaGVkUm9sZU1hcHBpbmcob2JqKS5zdWJzY3JpYmUoKG1hdGNoZWRSb2xlTWFwcGluZykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtYXRjaGVkUm9sZU1hcHBpbmcnLCBtYXRjaGVkUm9sZU1hcHBpbmcpXG4gICAgICAgICAgICB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZ0RhdGEgPSBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfZGV0YWlscyB8fCBbXVxuICAgICAgICAgICAgdGhpcy5tYXRjaGVkUm9sZU1hcHBpbmcgPSBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfY291bnRcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlZERlc2lnbmF0aW9uTmFtZXMgPVxuICAgICAgICAgICAgICBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfZGV0YWlscz8ubWFwKFxuICAgICAgICAgICAgICAgIHggPT4geC5pZ290X2Rlc2lnbmF0aW9uX25hbWU/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgKSB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWROYW1lcyA9XG4gICAgICAgICAgICAgIG1hdGNoZWRSb2xlTWFwcGluZz8ubWF0Y2hlZF9kZXRhaWxzPy5tYXAoeCA9PlxuICAgICAgICAgICAgICAgIHguaWdvdF9kZXNpZ25hdGlvbl9uYW1lPy50cmltKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICApIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5tYXRjaGVkRGVzaWduYXRpb25TZXQgPSBuZXcgU2V0KG1hdGNoZWROYW1lcyk7XG5cbiAgICAgICAgICAgIHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nID0gbWF0Y2hlZE5hbWVzLmxlbmd0aDtcblxuICAgICAgICAgICAgdGhpcy51bk1hdGNoZWRSb2xlTWFwcGluZyA9IHRoaXMubWFzdGVyRGF0YS5sZW5ndGggLSB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZztcbiAgICAgICAgICAgIHRoaXMuYXBwbHlBbGxGaWx0ZXJzKCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlcylcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzKVxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgICAgICAgIH0sIDEwMDApXG5cbiAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHJlcztcbiAgICAgICAgICB0aGlzLm1hc3RlckRhdGEgPSByZXM7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZGF0YVNvdXJjZScsIHRoaXMuZGF0YVNvdXJjZSlcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgIH1cbiAgICBpZiAodGhpcy5mb3JtRGF0YSAmJiB0aGlzLmZvcm1EYXRhLnZhbHVlICYmIHRoaXMuZm9ybURhdGEudmFsdWUubWluaXN0cnlUeXBlID09PSAnc3RhdGUnKSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgICBjb25zb2xlLmxvZygndGhpcy5mb3JtRGF0YScsIHRoaXMuZm9ybURhdGEpXG4gICAgICBsZXQgc3RhdGVfY2VudGVyX2lkID0gdGhpcy5mb3JtRGF0YS52YWx1ZS5taW5pc3RyeVxuICAgICAgbGV0IGRlcGFydG1lbnRfaWQgPSB0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyQW5kRGVwYXJ0bWVudChzdGF0ZV9jZW50ZXJfaWQsIGRlcGFydG1lbnRfaWQpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSByZXNcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgIHN0YXRlX2NlbnRlcl9pZDogdGhpcy5mb3JtRGF0YS52YWx1ZS5taW5pc3RyeVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZm9ybURhdGEudmFsdWUuZGVwYXJ0bWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBvYmpbJ2RlcGFydG1lbnRfaWQnXSA9IHRoaXMuZm9ybURhdGEudmFsdWUuZGVwYXJ0bWVudHNcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldE1hdGNoZWRSb2xlTWFwcGluZyhvYmopLnN1YnNjcmliZSgobWF0Y2hlZFJvbGVNYXBwaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuICAgICAgICAgICAgY29uc29sZS5sb2coJ21hdGNoZWRSb2xlTWFwcGluZycsIG1hdGNoZWRSb2xlTWFwcGluZylcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nRGF0YSA9IG1hdGNoZWRSb2xlTWFwcGluZz8ubWF0Y2hlZF9kZXRhaWxzIHx8IFtdXG4gICAgICAgICAgICB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZyA9IG1hdGNoZWRSb2xlTWFwcGluZz8ubWF0Y2hlZF9jb3VudFxuICAgICAgICAgICAgdGhpcy5tYXRjaGVkRGVzaWduYXRpb25OYW1lcyA9XG4gICAgICAgICAgICAgIG1hdGNoZWRSb2xlTWFwcGluZz8ubWF0Y2hlZF9kZXRhaWxzPy5tYXAoXG4gICAgICAgICAgICAgICAgeCA9PiB4Lmlnb3RfZGVzaWduYXRpb25fbmFtZT8udG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICApIHx8IFtdO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZE5hbWVzID1cbiAgICAgICAgICAgICAgbWF0Y2hlZFJvbGVNYXBwaW5nPy5tYXRjaGVkX2RldGFpbHM/Lm1hcCh4ID0+XG4gICAgICAgICAgICAgICAgeC5pZ290X2Rlc2lnbmF0aW9uX25hbWU/LnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICkgfHwgW107XG4gICAgICAgICAgICB0aGlzLm1hdGNoZWREZXNpZ25hdGlvblNldCA9IG5ldyBTZXQobWF0Y2hlZE5hbWVzKTtcblxuICAgICAgICAgICAgdGhpcy5tYXRjaGVkUm9sZU1hcHBpbmcgPSBtYXRjaGVkTmFtZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICB0aGlzLnVuTWF0Y2hlZFJvbGVNYXBwaW5nID0gdGhpcy5tYXN0ZXJEYXRhLmxlbmd0aCAtIHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nO1xuICAgICAgICAgICAgdGhpcy5hcHBseUFsbEZpbHRlcnMoKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzKVxuICAgICAgICAgIHRoaXMub3JpZ2luYWxEYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZXMpXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICAgICAgfSwgMTAwMClcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHJlcztcbiAgICAgICAgICB0aGlzLm1hc3RlckRhdGEgPSByZXM7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZGF0YVNvdXJjZScsIHRoaXMuZGF0YVNvdXJjZSlcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuXG5cblxuICAgIH1cblxuICB9XG5cbiAgdG9nZ2xlUm93KHJvdzogYW55KSB7XG4gICAgaWYgKCFyb3c/LmNicF9wbGFucz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICB0aGlzLnNlbGVjdGlvbi50b2dnbGUocm93KTtcbiAgICBjb25zb2xlLmxvZygnU2VsZWN0ZWQgcm93czonLCB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG4gIH1cblxuICBpc0FsbFNlbGVjdGVkKCkge1xuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xuICB9XG5cbiAgaXNTb21lU2VsZWN0ZWQoKSB7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aDtcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPiAwICYmIG51bVNlbGVjdGVkIDwgbnVtUm93cztcbiAgfVxuXG4gIHRvZ2dsZUFsbFJvd3MoZXZlbnQ6IGFueSkge1xuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG5cbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhXG4gICAgICAgIC5maWx0ZXIocm93ID0+IHJvdz8uY2JwX3BsYW5zPy5sZW5ndGgpXG4gICAgICAgIC5mb3JFYWNoKHJvdyA9PiB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGF0YVNvdXJlKHRhYj86ICdtYXRjaGVkJyB8ICd1bm1hdGNoZWQnKSB7XG5cbiAgICB0aGlzLmFjdGl2ZVRhYiA9IHRhYjtcblxuICAgIC8vIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG5cbiAgICB0aGlzLmFwcGx5QWxsRmlsdGVycygpO1xuXG4gIH1cblxuICBhcHBseUFsbEZpbHRlcnMoKSB7XG5cbiAgICBsZXQgZGF0YSA9IFsuLi50aGlzLm1hc3RlckRhdGFdO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAnbWF0Y2hlZCcpIHtcblxuICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKGl0ZW0gPT5cbiAgICAgICAgdGhpcy5tYXRjaGVkRGVzaWduYXRpb25TZXQuaGFzKFxuICAgICAgICAgIGl0ZW0uZGVzaWduYXRpb25fbmFtZT8udHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ3VubWF0Y2hlZCcpIHtcblxuICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKGl0ZW0gPT5cbiAgICAgICAgIXRoaXMubWF0Y2hlZERlc2lnbmF0aW9uU2V0LmhhcyhcbiAgICAgICAgICBpdGVtLmRlc2lnbmF0aW9uX25hbWU/LnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWFyY2hUZXh0LnRyaW0oKSkge1xuXG4gICAgICBjb25zdCB0ZXJtcyA9IHRoaXMuc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG5cbiAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IChpdGVtLmRlc2lnbmF0aW9uX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiB0ZXJtcy5ldmVyeSh0ZXJtID0+IG5hbWUuaW5jbHVkZXModGVybSkpO1xuICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKGRhdGEpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgfSk7XG5cbiAgfVxuXG4gIHNlbmRGb3JBcHByb3ZhbEZvcm0oKSB7XG4gICAgY29uc29sZS5sb2coJ3RoaXMuc2VsZWN0aW9uLS0nLCB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZClcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFwcHJvdmFsUmVxdWVzdEZvcm1Db21wb25lbnQsIHtcbiAgICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICAgIGRhdGE6IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLFxuICAgICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICAgIG1pbkhlaWdodDogJzMwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICAgIG1heEhlaWdodDogJzgwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICAgIH0pO1xuXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgLy8gaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICAvLyAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyAgIC8vIFJlZnJlc2ggZGF0YSBvciBzaG93IGEgdG9hc3QgaGVyZVxuXG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKVxuICAgICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICB9XG5cbiAgaGFzU2VsZWN0YWJsZVJvd3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZT8uZGF0YT8uc29tZSgocm93OiBhbnkpID0+IHJvdz8uY2JwX3BsYW5zPy5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIHNlbmRGb3JEZXNpZ25hdGlvbk5hbWVBcHByb3ZhbChlbGVtZW50KSB7XG4gICAgdGhpcy5hY3RpdmVSb3dFbGVtZW50ID0gZWxlbWVudFxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGVzaWduYXRpb25BcHByb3ZhbFJlcXVlc3RGb3JtQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgIGRhdGE6IGVsZW1lbnQsXG4gICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgbWF4SGVpZ2h0OiAnODB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgLy8gaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgLy8gICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgIC8vICAgLy8gUmVmcmVzaCBkYXRhIG9yIHNob3cgYSB0b2FzdCBoZXJlXG5cbiAgICAgIC8vIH1cbiAgICAgIHRoaXMubG9hZFJvbGVNYXBwaW5nTGlzdCgpO1xuICAgIH0pO1xuXG4gIH1cblxuICBnZXRBY3RpdmF0ZUNicFBsYW4ocm93KSB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2VcbiAgICBpZiAocm93Py5jYnBfcGxhbnMgJiYgcm93Py5jYnBfcGxhbnM/Lmxlbmd0aCkge1xuICAgICAgcm93LmNicF9wbGFucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudD8uc2VsZWN0ZWRfY291cnNlcyAmJiBlbGVtZW50Py5zZWxlY3RlZF9jb3Vyc2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuICFmb3VuZFxuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJyb2xlLW1hcHBpbmctY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuXG4gICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm10LTAgcHQtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtc2VjdGlvbiBtdC00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC1tYXAtcm91dGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtbWFwLWZsZXgtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LW1hcC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLW1hcHBpbmctcm91dGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+e3tzaGFyZWRTZXJ2aWNlPy5jYnBQbGFuRmluYWxPYmo/Lm1pbmlzdHJ5Py5vcmdOYW1lfX0gPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNoYXJlZFNlcnZpY2U/LmNicFBsYW5GaW5hbE9iaj8uZGVwYXJ0bWVudF9uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyB7e3NoYXJlZFNlcnZpY2U/LmNicFBsYW5GaW5hbE9iaj8uZGVwYXJ0bWVudF9uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1wbGFuIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm1vdmVUb0luaXRpYWxTY3JlZW5MYXlvdXQoJ2VkaXQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+RWRpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIG1sLTEwXCI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1hY3RpdmUgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwibW92ZVRvSW5pdGlhbFNjcmVlbkxheW91dCgnYWRkJylcIj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBOZXcgQ0JQLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlldy1maW5hbC1jYnAtcGxhblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJ2aWV3LWZpbmFsLWNicC1wbGFuLXRleHQgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidmlld0ZpbmFsQ0JQUGxhbignY2JwJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPjxzcGFuPlZpZXdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5hbCBDQlA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlldy1maW5hbC1jYnAtcGxhbi10ZXh0IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInZpZXdGaW5hbENCUFBsYW4oJ2FjYnAnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+PHNwYW4+Vmlld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmFsIENCUDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtZmlsdGVyLXNlY3Rpb24gbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2ggZmxleCBtYXJnaW4tcmlnaHQtbSBzZWFyY2gtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnNlYXJjaFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sb3ItNjAgc2VhcmNoLWljb24gbWF0LWljb24gbm90cmFuc2xhdGUgbWF0ZXJpYWwtaWNvbnMgbWF0LWljb24tbm8tY29sb3JcIj5zZWFyY2g8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJzaW5wdXQgY29sb3ItNjAgdy1mdWxsXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCIgbGFiZWw9XCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImFwcGx5RmlsdGVyKClcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBieSBkZXNpZ25hdGlvbiBuYW1lXCIgdHlwZT1cIlN0YW5kYXJkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInNlYXJjaFRleHQudHJpbSgpLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2xvci02MCBjbGVhci1pY29uIG1hdC1pY29uIG5vdHJhbnNsYXRlIG1hdGVyaWFsLWljb25zIG1hdC1pY29uLW5vLWNvbG9yIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclNlYXJjaCgpXCI+Y2xlYXI8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwbC0yIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtkaXNhYmxlZF09XCJzZWFyY2hUZXh0LnRyaW0oKT8ubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlYXJjaFRleHQudHJpbSgpPy5sZW5ndGggPT09IDAgPyAnYnRuLWRpc2FibGUnOididG4tYWN0aXZlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJTZWFyY2hcIiAoY2xpY2spPVwiYXBwbHlGaWx0ZXIoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXNlY3Rpb24gZmxleCBtYXJnaW4tdG9wLTE1XCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCI+RmlsdGVyIGJ5IGNvbXBldGVuY3kgdHlwZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDI1cHg7IHBhZGRpbmc6IDAgMTJweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwic2VsZWN0ZWRWYWx1ZVwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IE1pbmlzdHJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLXJhZGl1czogMjVweDsgYmFja2dyb3VuZDogd2hpdGU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiJ3Rlc3QnXCI+VGVzdDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCInYW5vdGhlcidcIj5Bbm90aGVyPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYnRuLWFjdGl2ZVwiIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIkFkZCBNb3JlIERlc2lnbmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE1vcmVEZXNpZ25hdGlvbigpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTJcIiAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID8gJ2J0bi1hY3RpdmUtb3V0bGluZScgOiAnYnRuLWFjdGl2ZS1vdXRsaW5lLWRpc2FibGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbmRGb3JBcHByb3ZhbEZvcm0oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+c2VuZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmQgRm9yIEFwcHJvdmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aFwiPih7e3NlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGh9fSk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm9sZS1tYXBwaW5nLXRhYnMgbXQtM1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb2xlLXRhYlwiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09PSAnbWF0Y2hlZCdcIiAoY2xpY2spPVwic2V0RGF0YVNvdXJlKCdtYXRjaGVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIE1hdGNoZWQgcm9sZSBtYXBwaW5nc1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJsdWVcIj57e21hdGNoZWRSb2xlTWFwcGluZ319PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvbGUtdGFiIHRhYmxlLWJvZHktdW5tYXRjaGVkXCIgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIgPT09ICd1bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldERhdGFTb3VyZSgndW5tYXRjaGVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3QgcmVkXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICBVbm1hdGNoZWQgcm9sZSBtYXBwaW5nXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgcmVkXCI+e3t1bk1hdGNoZWRSb2xlTWFwcGluZ319PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlbmF2LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNsYXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YVNvdXJjZT8uZmlsdGVyZWREYXRhPy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJSZXF1ZXN0SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJyb3ctaGVhZGluZ1wiPlJlcXVlc3QgSUQgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjbGFzcz1cInRpdGxlLWNsYXNzXCIgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7ZWxlbWVudD8uZGVtYW5kX2lkfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJyb3ctaGVhZGluZ1wiPlRpdGxlIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJ0aXRsZS1jbGFzc1wiICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57e2VsZW1lbnQ/LnRpdGxlfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInJlcXVlc3RvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInJvdy1oZWFkaW5nXCI+UmVxdWVzdG9yIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJ0aXRsZS1jbGFzc1wiICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57e2VsZW1lbnQ/Lm93bmVyTmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInJlcXVlc3RUeXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWhlYWRpbmdcIj5SZXF1ZXN0IFR5cGUgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjbGFzcz1cInRpdGxlLWNsYXNzXCIgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7ZWxlbWVudD8ucmVxdWVzdFR5cGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJyZXF1ZXN0U3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWhlYWRpbmdcIj5SZXF1ZXN0IFN0YXR1cyA8L3RoPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJ0aXRsZS1jbGFzc1wiICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJnZXRTdGF0dXNDbGFzcyhlbGVtZW50Py5zdGF0dXMpXCI+e3tlbGVtZW50Py5zdGF0dXMgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0tleS5mdWxsZmlsbCA/ICdGdWxmaWxsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZWxlbWVudD8uc3RhdHVzfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFzc2lnbmVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWhlYWRpbmdcIj5Bc3NpZ25lZSA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNsYXNzPVwidGl0bGUtY2xhc3NcIiAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tlbGVtZW50Py5hc3NpZ25lZFByb3ZpZGVyID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Py5hc3NpZ25lZFByb3ZpZGVyIDogJ05vdCBBc3NpZ25lZCcgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInJlcXVlc3RlZE9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWhlYWRpbmdcIj5SZXF1ZXN0ZWQgT24gPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjbGFzcz1cInRpdGxlLWNsYXNzXCIgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7ZWxlbWVudD8uY3JlYXRlZE9uIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImludGVyZXN0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInJvdy1oZWFkaW5nXCI+SW50ZXJlc3RzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjbGFzcz1cInRpdGxlLWNsYXNzXCIgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYWN0aW9uLWJ0bi12aWV3XCIgKm5nSWY9XCJlbGVtZW50Py5pbnRlcmVzdENvdW50IT09IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgW25nU3R5bGVdPVwiZ2V0UG9pbnRlckV2ZW50c1N0eWxlKGVsZW1lbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJoYW5kbGVDbGljayhlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tlbGVtZW50Py5pbnRlcmVzdENvdW50fX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIlwiICpuZ0lmPVwiZWxlbWVudD8uaW50ZXJlc3RDb3VudCA9PT0gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIj57e2VsZW1lbnQ/LnJlcXVlc3RUeXBlID09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTaW5nbGUnID8gJ04vQScgOiBlbGVtZW50Py5pbnRlcmVzdENvdW50fX08L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJyb3ctaGVhZGluZ1wiPkRldGFpbHM8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cIm5hdmlnYXRlVG9EZXRhaWxzKGVsZW1lbnQ/LmRlbWFuZF9pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+dmlzaWJpbGl0eTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInJvdy1oZWFkaW5nXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRXhhbXBsZSBpY29uLWJ1dHRvbiB3aXRoIGEgbWVudVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uQ2xpY2tNZW51KGVsZW1lbnQsJ3ZpZXdDb250ZW50JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5WaWV3PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50Py5zdGF0dXMgPT09IHN0YXR1c0tleS5VbmFzc2lnbmVkICYmIGVsZW1lbnQ/LnN0YXR1cyE9PSBzdGF0dXNLZXkuSW5wcm9ncmVzcyAmJiAgZWxlbWVudD8uc3RhdHVzIT09IHN0YXR1c0tleS5pbnZhbGlkIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib25DbGlja01lbnUoZWxlbWVudCwnaW52YWxpZENvbnRlbnQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk1hcmsgYXMgaW52YWxpZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50Py5zdGF0dXMhPT0gc3RhdHVzS2V5LkFzc2lnbmVkICYmIGVsZW1lbnQ/LmludGVyZXN0Q291bnQgPjAgJiYgZWxlbWVudD8uc3RhdHVzIT09IHN0YXR1c0tleS5JbnByb2dyZXNzICYmICBlbGVtZW50Py5zdGF0dXMhPT0gc3RhdHVzS2V5LmludmFsaWQgJiYgZWxlbWVudD8uc3RhdHVzIT09c3RhdHVzS2V5LmZ1bGxmaWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja01lbnUoZWxlbWVudCwnYXNzaWduQ29udGVudCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QXNzaWduPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50Py5zdGF0dXMgPT09IHN0YXR1c0tleS5Bc3NpZ25lZCAmJiBlbGVtZW50Py5zdGF0dXMhPT0gc3RhdHVzS2V5LklucHJvZ3Jlc3MgJiYgIGVsZW1lbnQ/LnN0YXR1cyE9PSBzdGF0dXNLZXkuaW52YWxpZCAmJiBlbGVtZW50Py5zdGF0dXMhPT1zdGF0dXNLZXkuZnVsbGZpbGwgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvbkNsaWNrTWVudShlbGVtZW50LCdyZUFzc2lnbkNvbnRlbnQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiBSZS1Bc3NpZ248L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib25DbGlja01lbnUoZWxlbWVudCwnY29weUNvbnRlbnQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkNvcHk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCIgY2xhc3M9XCJ0YWJsZS1yb3ctZGF0YVwiPjwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93O2NvbHVtbnM6ZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXIgbXQtNFwiIHN0eWxlPVwib3ZlcmZsb3c6IGF1dG87XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIGNsYXNzPVwibWF0LWVsZXZhdGlvbi16MVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhY3RpdmVUYWIgPT09ICdtYXRjaGVkJz8gJ3RhYmxlLWJvZHknOiAndGFibGUtYm9keS11bm1hdGNoZWQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdGlvbiBDb2x1bW4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2hpZGRlbl09XCJhY3RpdmVUYWIgIT09ICdtYXRjaGVkJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwicmFkaW8tc3R5bGUtY2hlY2tib3hcIiAoY2hhbmdlKT1cInRvZ2dsZUFsbFJvd3MoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0FsbFNlbGVjdGVkKClcIiBbaW5kZXRlcm1pbmF0ZV09XCJpc1NvbWVTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzU2VsZWN0YWJsZVJvd3MoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtoaWRkZW5dPVwiYWN0aXZlVGFiICE9PSAnbWF0Y2hlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbWF0VG9vbHRpcD1cIlBsZWFzZSBnZW5lcmF0ZSAmIHNhdmUgY291cnNlIHJlY29tbWVuZGF0aW9uIHRvIHNlbGVjdC4gQ291cnNlIHJlY29tbWVuZGF0aW9uIGdlbmVyYXRpb24gJiBzYXZlIGlzIHBlbmRpbmcuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwRGlzYWJsZWRdPVwiIWdldEFjdGl2YXRlQ2JwUGxhbihyb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwicmFkaW8tc3R5bGUtY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cInRvZ2dsZVJvdyhyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2V0QWN0aXZhdGVDYnBQbGFuKHJvdylcIiBbbmdDbGFzc109XCIgZ2V0QWN0aXZhdGVDYnBQbGFuKHJvdyk/ICdncmF5ZC1kaXNhYmxlJzonJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERlc2lnbmF0aW9uIE5hbWUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRlc2lnbmF0aW9uX25hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggW25nQ2xhc3NdPVwiYWN0aXZlVGFiID09PSAnbWF0Y2hlZCc/ICd0YWJsZS1oZWFkZXInOiAndGFibGUtaGVhZGVyLXVubWF0Y2hlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IERlc2lnbmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidmlld0NCUFBsYW4oZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aXZlVGFiID09PSAnbWF0Y2hlZCc/ICdkZXNpZ25hdGlvbi10ZXh0JzogJ2Rlc2lnbmF0aW9uLXRleHQtdW5tYXRjaGVkJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJkZXNpZ25hdGlvblwiPnt7IGVsZW1lbnQ/LmRlc2lnbmF0aW9uX25hbWUgfX0gPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ3aW5nLXRleHQgbXQtMlwiPldpbmcvRGl2aXNpb24gLSB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ/LndpbmdfZGl2aXNpb25fc2VjdGlvbiB9fSA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJvbGUgJiBSZXNwb25zaWJpbGl0aWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJyb2xlX3Jlc3BvbnNpYmlsaXRpZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggW25nQ2xhc3NdPVwiYWN0aXZlVGFiID09PSAnbWF0Y2hlZCc/ICd0YWJsZS1oZWFkZXInOiAndGFibGUtaGVhZGVyLXVubWF0Y2hlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IFJvbGUgJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zaWJpbGl0aWVzIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicm9sZS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcm9sZSBvZiAoaXNSZXNwb25pc2JpbGl0eUV4cGFuZGVkKGVsZW1lbnQuaWQpID8gZWxlbWVudC5yb2xlX3Jlc3BvbnNpYmlsaXRpZXMgOiBlbGVtZW50LnJvbGVfcmVzcG9uc2liaWxpdGllcy5zbGljZSgwLCAyKSk7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2krMX19LiB7eyByb2xlIH19PC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImVsZW1lbnQucm9sZV9yZXNwb25zaWJpbGl0aWVzLmxlbmd0aCA+IDJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidmlldy1tb3JlLWxlc3MgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRnVsbExpc3QoZWxlbWVudCwgJ3JvbGVfcmVzcG9uc2liaWxpdGllcycpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzFCNENBMTtmb250LXNpemU6IDE2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ge3sgaXNSZXNwb25pc2JpbGl0eUV4cGFuZGVkKGVsZW1lbnQuaWQpID8gJ1ZpZXcgTGVzcycgOiAnVmlldyBNb3JlJyB9fSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBNb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFjdGl2aXRpZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGl2aXRpZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggW25nQ2xhc3NdPVwiYWN0aXZlVGFiID09PSAnbWF0Y2hlZCc/ICd0YWJsZS1oZWFkZXInOiAndGFibGUtaGVhZGVyLXVubWF0Y2hlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEFjdGl2aXRpZXMgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJyb2xlLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpdml0eSBvZiAoaXNBY3Rpdml0eUV4cGFuZGVkKGVsZW1lbnQuaWQpID8gZWxlbWVudC5hY3Rpdml0aWVzIDogZWxlbWVudC5hY3Rpdml0aWVzLnNsaWNlKDAsIDIpKTsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aSsxfX0uIHt7IGFjdGl2aXR5IH19PC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImVsZW1lbnQuYWN0aXZpdGllcy5sZW5ndGggPiAyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZpZXctbW9yZS1sZXNzIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkZ1bGxMaXN0KGVsZW1lbnQsICdhY3Rpdml0eScpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzFCNENBMTtmb250LXNpemU6IDE2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJlaGF2aW9yYWwgQ29tcGV0ZW5jaWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJiZWhhdmlvcmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAndGFibGUtaGVhZGVyJzogJ3RhYmxlLWhlYWRlci11bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBCZWhhdmlvcmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBldGVuY2llcyA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNvbXBldGVuY3ktbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiYmVoYXZpb3VyYWwtcGlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbXAgb2YgZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKGVsZW1lbnQuY29tcGV0ZW5jaWVzLCAnQmVoYXZpb3JhbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wZXRlbmN5LXRleHQtYmVoYXZpb3JhbFwiPiB7eyBjb21wLnRoZW1lIH19IC0ge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5zdWJfdGhlbWUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRnVuY3Rpb25hbCBDb21wZXRlbmNpZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImZ1bmN0aW9uYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggW25nQ2xhc3NdPVwiYWN0aXZlVGFiID09PSAnbWF0Y2hlZCc/ICd0YWJsZS1oZWFkZXInOiAndGFibGUtaGVhZGVyLXVubWF0Y2hlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEZ1bmN0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGV0ZW5jaWVzIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY29tcGV0ZW5jeS1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJmdW5jdGlvbmFsLXBpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21wIG9mIGdldENvbXBldGVuY2llc0J5VHlwZShlbGVtZW50LmNvbXBldGVuY2llcywgJ0Z1bmN0aW9uYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcGV0ZW5jeS10ZXh0LWZ1bmN0aW9uYWxcIj4ge3sgY29tcC50aGVtZSB9fSAtIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuc3ViX3RoZW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRG9tYWluIENvbXBldGVuY2llcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZG9tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAndGFibGUtaGVhZGVyJzogJ3RhYmxlLWhlYWRlci11bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBEb21haW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGV0ZW5jaWVzIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY29tcGV0ZW5jeS1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkb21haW4tcGlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbXAgb2YgZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKGVsZW1lbnQuY29tcGV0ZW5jaWVzLCAnRG9tYWluJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXBldGVuY3ktdGV4dC1kb21haW5cIj4ge3sgY29tcC50aGVtZSB9fSAtIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuc3ViX3RoZW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWN0aW9ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAndGFibGUtaGVhZGVyJzogJ3RhYmxlLWhlYWRlci11bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBBY3Rpb24gPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYWN0aW9uTWVudVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI2FjdGlvbk1lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImVkaXRSb2xlTWFwcGluZyhlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5FZGl0IFJvbGUgTWFwcGluZzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJ2aWV3Q0JQUGxhbihlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj52aXNpYmlsaXR5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5WaWV3IFJvbGUgTWFwcGluZzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJnZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9uKGVsZW1lbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnNjaG9vbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+R2VuZXJhdGUgQ291cnNlIFJlY29tbWVuZGF0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInZpZXdDb3Vyc2VSZWNvbW1lbmRhdGlvbihlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5wcmV2aWV3PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5WaWV3IENvdXJzZSBSZWNvbW1lbmRhdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJkZWxldGVSb2xlTWFwcGluZyhlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkRlbGV0ZSBSb2xlIE1hcHBpbmc8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiYWN0aXZlVGFiICE9PSAnbWF0Y2hlZCdcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzZW5kRm9yRGVzaWduYXRpb25OYW1lQXBwcm92YWwoZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+c2VuZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U2VuZCBmb3IgRGVzaWduYXRpb24gTmFtZSBBcHByb3ZhbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgJiBSb3dzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiPjwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQYWdpbmF0aW9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXBhZ2luYXRvciBbbGVuZ3RoXT1cImRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aCB8fCAwXCIgW3BhZ2VTaXplXT1cIjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJbNSwgMTAsIDIwXVwiIHNob3dGaXJzdExhc3RCdXR0b25zPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1wYWdpbmF0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8tY2JwLWRhdGFcIiAqbmdJZj1cImRhdGFTb3VyY2U/LmZpbHRlcmVkRGF0YT8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2PjxpbWcgc3JjPVwiL21kby1hc3NldHMvaW1hZ2VzL25vLWNvbnRlbnQtZGF0YS5zdmdcIiBhbHQ9XCJuby1jb250ZW50XCI+PC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZyBtdC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPk5vIHJvbGUgbWFwcGluZ3MgYXZhaWxhYmxlIGluIHRoaXMgY2F0ZWdvcnk8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiIG1hcmdpbi10b3AtbSBuby1jb250ZW50LWNyZWF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VhcmNoLWJ0bnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiWycvYXBwL2hvbWUvY3JlYXRlLXJlcXVlc3QtZm9ybSddXCI+UmVxdWVzdCBDb250ZW50PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LXBhZ2luYXRvciAqbmdJZj1cImRhdGFTb3VyY2U/LmZpbHRlcmVkRGF0YT8ubGVuZ3RoID4gMFwiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xlbmd0aF09XCJ0aGlzLnJlcXVlc3RDb3VudFwiIFtwYWdlU2l6ZU9wdGlvbnNdPVwiWzEwLDIwLDQwXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2UpPVwib25DaGFuZ2VQYWdlKCRldmVudClcIj48L21hdC1wYWdpbmF0b3I+IC0tPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtY2FyZD5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG5cbjxkaXYgY2xhc3M9XCJvdmVybGF5LWxvYWRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjUwXCI+PC9tYXQtc3Bpbm5lcj5cbjwvZGl2PiJdfQ==