@smarterplan/ngx-smarterplan-admin 0.3.6 → 0.3.8

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.
@@ -10,7 +10,7 @@ import * as i6 from "@angular/forms";
10
10
  import * as i7 from "../chevron/chevron.component";
11
11
  import * as i8 from "./create-batch/create-batch.component";
12
12
  import * as i9 from "./template/template.component";
13
- class VisitorComponent {
13
+ export class VisitorComponent {
14
14
  userService;
15
15
  missionService;
16
16
  router;
@@ -304,15 +304,14 @@ class VisitorComponent {
304
304
  });
305
305
  }));
306
306
  }
307
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VisitorComponent, deps: [{ token: i1.BaseUserService }, { token: i1.MissionService }, { token: i2.Router }, { token: i3.TranslateService }, { token: i1.SpaceService }, { token: i1.ZoneService }, { token: i4.NgbModal }, { token: i1.TemplateService }], target: i0.ɵɵFactoryTarget.Component });
308
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: VisitorComponent, selector: "lib-visitor", viewQueries: [{ propertyName: "modal", first: true, predicate: ["deleteUsers"], descendants: true }], ngImport: i0, template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Museum Visitors' | translate}}</h3>\r\n <!-- <app-search-bar [searchable]=\"allZoneTemplatesMap\" objectType=\"TEMPLATE\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-7\">\r\n <div class=\"row ml-0 mb-2\">\r\n <h4 class=\"header-small\">{{'Itineraries' | translate}}</h4>\r\n </div>\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!editing && !creating\">\r\n <button class=\"btn btn-outline-primary rounded-pill ml-3 add-button\" (click)=\"onCreateTemplate()\"\r\n data-testid=\"new-museum-template-btn\">\r\n {{'Create template for new itinerary' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!editing && !creating\">\r\n <ul class=\"list-group list-group-flush\" data-testid=\"open-museum-zone-btn\">\r\n <li class=\"list-group-item\" *ngFor=\"let pair of allZoneTemplatesMapFiltered | keyvalue\">\r\n <h4>{{pair.key.name}} <span style=\"font-size:0.8em\"> - {{pair.key.space.name}}</span> </h4>\r\n <div class=\"d-flex justify-content-between align-items-center\"\r\n (click)=\"onToggleMissionsForZone(pair.key.id)\">\r\n <ng-container *ngIf=\"pair.value.length <= 1\">\r\n {{pair.value.length}} {{'visit template found' | translate}}\r\n </ng-container>\r\n <ng-container *ngIf=\"pair.value.length > 1\">\r\n {{pair.value.length}} {{'visit templates found' | translate}}\r\n </ng-container>\r\n <lib-chevron [ngClass]=\"[pair.key.name]\" [conditionShowing]=\"detailsForZones.includes(pair.key.id)\"></lib-chevron>\r\n\r\n </div>\r\n <div *ngIf=\"detailsForZones.includes(pair.key.id)\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-3 mb-3 ml-2\"\r\n (click)=\"onAddNewTemplateToZone(pair.key)\">{{'Add new template' | translate}}</button>\r\n\r\n <ul class=\"container-fluid list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let template of pair.value\">\r\n <div class=\"d-flex justify-content-between align-items-center\"\r\n (click)=\"onToggleTemplateDetails(template)\">\r\n <h5>{{template.title}}</h5>\r\n <lib-chevron data-testid=\"open-museum-template-btn\" [conditionShowing]=\"templateShowing === template.id\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"templateShowing === template.id\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Description' | translate }}:\r\n {{ template.description}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}:\r\n {{ template.locale ? template.locale : ('Not applicable' | translate)}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\"\r\n *ngIf=\"template.hashtags && template.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}:\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\"\r\n *ngIf=\"template.hashtags.length> 0\">\r\n <li class=\"keywordsItem\"\r\n *ngFor=\"let hashtag of template.hashtags\">{{\r\n hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}:\r\n {{ template.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Planned at' | translate }} :\r\n {{ template.startDateTime ? (template.startDateTime |\r\n timeDateString:\"day_time_zone\" | async) :\r\n \"No data\" | translate }} -\r\n {{ template.endDateTime ?\r\n (template.endDateTime | timeDateString:\"day_time_zone\" | async) : \"No\r\n data\" |\r\n translate}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">\r\n {{'Effective start/end time ' | translate }}:\r\n {{ template.realStartedAt ? (template.realStartedAt |\r\n timeDateString:\"day_time_zone\" | async) : ('No data' | translate)}} /\r\n {{ template.realEndedAt ? (template.realEndedAt |\r\n timeDateString:\"day_time_zone\" | async) : ('No data' | translate)}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\"\r\n *ngIf=\"allTemplateMissionsMap.get(template.id)\">\r\n {{'Visitors created' |\r\n translate}}:{{allTemplateMissionsMap.get(template.id).length}}\r\n <lib-csv-export [headers]=\"csvHeaders\" [title]=\"'Users'\"\r\n buttonLabel=\"Download users\"\r\n [rowsInput]=\"generateCSVUsers(template)\">\r\n </lib-csv-export>\r\n </li>\r\n\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <div class=\"d-inline-block mr-2 action-button\" ngbDropdown\r\n #myDrop=\"ngbDropdown\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownManual\" data-testid=\"open-dropdownManual-museum-btn\"\r\n ngbDropdownToggle>{{'Manage users' |\r\n translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownManual\">\r\n <button (click)=\"onGenerateBatch(template)\" ngbDropdownItem data-testid=\"new-user-template-btn\"> \r\n {{'Create users from this template' | translate}}</button>\r\n <button (click)=\"onSendInvitation(template)\" ngbDropdownItem>\r\n {{'Send invitation to all users' | translate}}\r\n </button>\r\n <button (click)=\"onSendUpdate(template)\" ngbDropdownItem>\r\n {{'Send update to all users' | translate}}\r\n </button>\r\n <button (click)=\"onSendSatisfaction(template)\" ngbDropdownItem>\r\n {{'Send satisfaction mail to all users' | translate}}\r\n </button>\r\n <button (click)=\"onDeleteUsers(template)\" ngbDropdownItem>\r\n {{'Remove users' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"d-inline-block mr-2 action-button\" ngbDropdown\r\n #myDrop2=\"ngbDropdown\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdown2\" data-testid=\"open-dropdown2-museum-template-btn\"\r\n ngbDropdownToggle>{{'Manage template' |\r\n translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdown2\">\r\n <button (click)=\"onEditTemplate(template)\" ngbDropdownItem data-testid=\"edit-museum-template-btn\">\r\n {{'Edit template' | translate}}</button>\r\n <button (click)=\"onCleanTimeTemplate(template)\" ngbDropdownItem>\r\n {{'Clean effective times' | translate}}\r\n </button>\r\n <button (click)=\"onArchiveTemplate(template)\" ngbDropdownItem>\r\n {{'Archive template' | translate}}\r\n </button>\r\n <button (click)=\"onCancelTemplate(template)\" ngbDropdownItem>\r\n {{'Cancel visit' | translate}}\r\n </button>\r\n <button (click)=\"onDuplicateTemplate(template)\" ngbDropdownItem>\r\n {{'Duplicate' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <button type=\"button\" class=\"btn btn-primary rounded-pill mr-2 ml-auto\"\r\n (click)=\"onEdit(mis)\">\r\n {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-primary rounded-pill mt-3 mb-3 ml-auto\"\r\n (click)=\"onArchiveTemplate(mis)\">{{'Archive' | translate}}</button> -->\r\n </div>\r\n\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n <div *ngIf=\"editing\">\r\n <lib-template [editTemplate]=\"templateToEdit\" [currentOrg]=\"currentOrg\"\r\n (updatedTemplate)=\"onUpdatedTemplate($event)\"></lib-template>\r\n </div>\r\n <div *ngIf=\"creating\">\r\n <lib-template [currentOrg]=\"currentOrg\" [zoneID]=\"zoneIDForNewTemplate\"\r\n (createdTemplate)=\"onCreatedTemplate($event)\"></lib-template>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 col-lg-5\" *ngIf=\"isAddingBatch\">\r\n <lib-create-batch [template]=\"chosenTemplate\" (createdMissions)=\"onUpdatedEvent($event)\"></lib-create-batch>\r\n </div>\r\n <ng-template #deleteUsers let-modal>\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\" id=\"modal-basic-title\">{{\"Delete users\" | translate}}\r\n </h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modalRef.close()\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"column align-items-center\">\r\n <div class=\"row\" style=\"padding: 0 1.25rem;\">\r\n <ul class=\"container-fluid list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let object of currentTemplateUsers\">\r\n <input type=\"checkbox\" [(ngModel)]=\"object.checked\"> {{object.profile.email}}\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div class=\"row\" style=\"padding: 1.25rem;\">\r\n <button class=\"btn btn-outline-primary rounded-pill mr-4\" (click)=\"onDeleteChosen()\">{{\"Apply\" |\r\n translate}}\r\n </button>\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"modalRef.close()\">{{\"Cancel\" |\r\n translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</div>", styles: [".add-button{width:-moz-fit-content;width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"], dependencies: [{ kind: "directive", type: i4.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i4.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i4.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i4.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { 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: i1.CsvExportComponent, selector: "lib-csv-export", inputs: ["headers", "rowsInput", "getRows", "title", "buttonLabel"] }, { kind: "component", type: i1.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { kind: "component", type: i7.ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }, { kind: "component", type: i8.CreateBatchComponent, selector: "lib-create-batch", inputs: ["template"], outputs: ["createdMissions"] }, { kind: "component", type: i9.TemplateComponent, selector: "lib-template", inputs: ["currentOrg", "editTemplate", "zoneID"], outputs: ["updatedTemplate", "createdTemplate"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: i1.TimeDateToLocalStringPipe, name: "timeDateString" }, { kind: "pipe", type: i1.HashtagFromIdPipe, name: "hashtagFromID" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
307
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VisitorComponent, deps: [{ token: i1.BaseUserService }, { token: i1.MissionService }, { token: i2.Router }, { token: i3.TranslateService }, { token: i1.SpaceService }, { token: i1.ZoneService }, { token: i4.NgbModal }, { token: i1.TemplateService }], target: i0.ɵɵFactoryTarget.Component });
308
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: VisitorComponent, selector: "lib-visitor", viewQueries: [{ propertyName: "modal", first: true, predicate: ["deleteUsers"], descendants: true }], ngImport: i0, template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Museum Visitors' | translate}}</h3>\r\n <!-- <app-search-bar [searchable]=\"allZoneTemplatesMap\" objectType=\"TEMPLATE\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-7\">\r\n <div class=\"row ml-0 mb-2\">\r\n <h4 class=\"header-small\">{{'Itineraries' | translate}}</h4>\r\n </div>\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!editing && !creating\">\r\n <button class=\"btn btn-outline-primary rounded-pill ml-3 add-button\" (click)=\"onCreateTemplate()\"\r\n data-testid=\"new-museum-template-btn\">\r\n {{'Create template for new itinerary' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!editing && !creating\">\r\n <ul class=\"list-group list-group-flush\" data-testid=\"open-museum-zone-btn\">\r\n <li class=\"list-group-item\" *ngFor=\"let pair of allZoneTemplatesMapFiltered | keyvalue\">\r\n <h4>{{pair.key.name}} <span style=\"font-size:0.8em\"> - {{pair.key.space.name}}</span> </h4>\r\n <div class=\"d-flex justify-content-between align-items-center\"\r\n (click)=\"onToggleMissionsForZone(pair.key.id)\">\r\n <ng-container *ngIf=\"pair.value.length <= 1\">\r\n {{pair.value.length}} {{'visit template found' | translate}}\r\n </ng-container>\r\n <ng-container *ngIf=\"pair.value.length > 1\">\r\n {{pair.value.length}} {{'visit templates found' | translate}}\r\n </ng-container>\r\n <lib-chevron [ngClass]=\"[pair.key.name]\" [conditionShowing]=\"detailsForZones.includes(pair.key.id)\"></lib-chevron>\r\n\r\n </div>\r\n <div *ngIf=\"detailsForZones.includes(pair.key.id)\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-3 mb-3 ml-2\"\r\n (click)=\"onAddNewTemplateToZone(pair.key)\">{{'Add new template' | translate}}</button>\r\n\r\n <ul class=\"container-fluid list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let template of pair.value\">\r\n <div class=\"d-flex justify-content-between align-items-center\"\r\n (click)=\"onToggleTemplateDetails(template)\">\r\n <h5>{{template.title}}</h5>\r\n <lib-chevron data-testid=\"open-museum-template-btn\" [conditionShowing]=\"templateShowing === template.id\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"templateShowing === template.id\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Description' | translate }}:\r\n {{ template.description}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}:\r\n {{ template.locale ? template.locale : ('Not applicable' | translate)}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\"\r\n *ngIf=\"template.hashtags && template.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}:\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\"\r\n *ngIf=\"template.hashtags.length> 0\">\r\n <li class=\"keywordsItem\"\r\n *ngFor=\"let hashtag of template.hashtags\">{{\r\n hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}:\r\n {{ template.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Planned at' | translate }} :\r\n {{ template.startDateTime ? (template.startDateTime |\r\n timeDateString:\"day_time_zone\" | async) :\r\n \"No data\" | translate }} -\r\n {{ template.endDateTime ?\r\n (template.endDateTime | timeDateString:\"day_time_zone\" | async) : \"No\r\n data\" |\r\n translate}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">\r\n {{'Effective start/end time ' | translate }}:\r\n {{ template.realStartedAt ? (template.realStartedAt |\r\n timeDateString:\"day_time_zone\" | async) : ('No data' | translate)}} /\r\n {{ template.realEndedAt ? (template.realEndedAt |\r\n timeDateString:\"day_time_zone\" | async) : ('No data' | translate)}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\"\r\n *ngIf=\"allTemplateMissionsMap.get(template.id)\">\r\n {{'Visitors created' |\r\n translate}}:{{allTemplateMissionsMap.get(template.id).length}}\r\n <lib-csv-export [headers]=\"csvHeaders\" [title]=\"'Users'\"\r\n buttonLabel=\"Download users\"\r\n [rowsInput]=\"generateCSVUsers(template)\">\r\n </lib-csv-export>\r\n </li>\r\n\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <div class=\"d-inline-block mr-2 action-button\" ngbDropdown\r\n #myDrop=\"ngbDropdown\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownManual\" data-testid=\"open-dropdownManual-museum-btn\"\r\n ngbDropdownToggle>{{'Manage users' |\r\n translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownManual\">\r\n <button (click)=\"onGenerateBatch(template)\" ngbDropdownItem data-testid=\"new-user-template-btn\"> \r\n {{'Create users from this template' | translate}}</button>\r\n <button (click)=\"onSendInvitation(template)\" ngbDropdownItem>\r\n {{'Send invitation to all users' | translate}}\r\n </button>\r\n <button (click)=\"onSendUpdate(template)\" ngbDropdownItem>\r\n {{'Send update to all users' | translate}}\r\n </button>\r\n <button (click)=\"onSendSatisfaction(template)\" ngbDropdownItem>\r\n {{'Send satisfaction mail to all users' | translate}}\r\n </button>\r\n <button (click)=\"onDeleteUsers(template)\" ngbDropdownItem>\r\n {{'Remove users' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"d-inline-block mr-2 action-button\" ngbDropdown\r\n #myDrop2=\"ngbDropdown\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdown2\" data-testid=\"open-dropdown2-museum-template-btn\"\r\n ngbDropdownToggle>{{'Manage template' |\r\n translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdown2\">\r\n <button (click)=\"onEditTemplate(template)\" ngbDropdownItem data-testid=\"edit-museum-template-btn\">\r\n {{'Edit template' | translate}}</button>\r\n <button (click)=\"onCleanTimeTemplate(template)\" ngbDropdownItem>\r\n {{'Clean effective times' | translate}}\r\n </button>\r\n <button (click)=\"onArchiveTemplate(template)\" ngbDropdownItem>\r\n {{'Archive template' | translate}}\r\n </button>\r\n <button (click)=\"onCancelTemplate(template)\" ngbDropdownItem>\r\n {{'Cancel visit' | translate}}\r\n </button>\r\n <button (click)=\"onDuplicateTemplate(template)\" ngbDropdownItem>\r\n {{'Duplicate' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <button type=\"button\" class=\"btn btn-primary rounded-pill mr-2 ml-auto\"\r\n (click)=\"onEdit(mis)\">\r\n {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-primary rounded-pill mt-3 mb-3 ml-auto\"\r\n (click)=\"onArchiveTemplate(mis)\">{{'Archive' | translate}}</button> -->\r\n </div>\r\n\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n <div *ngIf=\"editing\">\r\n <lib-template [editTemplate]=\"templateToEdit\" [currentOrg]=\"currentOrg\"\r\n (updatedTemplate)=\"onUpdatedTemplate($event)\"></lib-template>\r\n </div>\r\n <div *ngIf=\"creating\">\r\n <lib-template [currentOrg]=\"currentOrg\" [zoneID]=\"zoneIDForNewTemplate\"\r\n (createdTemplate)=\"onCreatedTemplate($event)\"></lib-template>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 col-lg-5\" *ngIf=\"isAddingBatch\">\r\n <lib-create-batch [template]=\"chosenTemplate\" (createdMissions)=\"onUpdatedEvent($event)\"></lib-create-batch>\r\n </div>\r\n <ng-template #deleteUsers let-modal>\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\" id=\"modal-basic-title\">{{\"Delete users\" | translate}}\r\n </h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modalRef.close()\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"column align-items-center\">\r\n <div class=\"row\" style=\"padding: 0 1.25rem;\">\r\n <ul class=\"container-fluid list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let object of currentTemplateUsers\">\r\n <input type=\"checkbox\" [(ngModel)]=\"object.checked\"> {{object.profile.email}}\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div class=\"row\" style=\"padding: 1.25rem;\">\r\n <button class=\"btn btn-outline-primary rounded-pill mr-4\" (click)=\"onDeleteChosen()\">{{\"Apply\" |\r\n translate}}\r\n </button>\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"modalRef.close()\">{{\"Cancel\" |\r\n translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</div>", styles: [".add-button{width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"], dependencies: [{ kind: "directive", type: i4.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i4.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i4.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i4.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["tabindex", "disabled"] }, { kind: "directive", type: i4.NgbDropdownButtonItem, selector: "button[ngbDropdownItem]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { 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: i1.CsvExportComponent, selector: "lib-csv-export", inputs: ["headers", "rowsInput", "getRows", "title", "buttonLabel"] }, { kind: "component", type: i1.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { kind: "component", type: i7.ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }, { kind: "component", type: i8.CreateBatchComponent, selector: "lib-create-batch", inputs: ["template"], outputs: ["createdMissions"] }, { kind: "component", type: i9.TemplateComponent, selector: "lib-template", inputs: ["currentOrg", "editTemplate", "zoneID"], outputs: ["updatedTemplate", "createdTemplate"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: i1.TimeDateToLocalStringPipe, name: "timeDateString" }, { kind: "pipe", type: i1.HashtagFromIdPipe, name: "hashtagFromID" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
309
309
  }
310
- export { VisitorComponent };
311
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VisitorComponent, decorators: [{
310
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VisitorComponent, decorators: [{
312
311
  type: Component,
313
- args: [{ selector: 'lib-visitor', template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Museum Visitors' | translate}}</h3>\r\n <!-- <app-search-bar [searchable]=\"allZoneTemplatesMap\" objectType=\"TEMPLATE\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-7\">\r\n <div class=\"row ml-0 mb-2\">\r\n <h4 class=\"header-small\">{{'Itineraries' | translate}}</h4>\r\n </div>\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!editing && !creating\">\r\n <button class=\"btn btn-outline-primary rounded-pill ml-3 add-button\" (click)=\"onCreateTemplate()\"\r\n data-testid=\"new-museum-template-btn\">\r\n {{'Create template for new itinerary' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!editing && !creating\">\r\n <ul class=\"list-group list-group-flush\" data-testid=\"open-museum-zone-btn\">\r\n <li class=\"list-group-item\" *ngFor=\"let pair of allZoneTemplatesMapFiltered | keyvalue\">\r\n <h4>{{pair.key.name}} <span style=\"font-size:0.8em\"> - {{pair.key.space.name}}</span> </h4>\r\n <div class=\"d-flex justify-content-between align-items-center\"\r\n (click)=\"onToggleMissionsForZone(pair.key.id)\">\r\n <ng-container *ngIf=\"pair.value.length <= 1\">\r\n {{pair.value.length}} {{'visit template found' | translate}}\r\n </ng-container>\r\n <ng-container *ngIf=\"pair.value.length > 1\">\r\n {{pair.value.length}} {{'visit templates found' | translate}}\r\n </ng-container>\r\n <lib-chevron [ngClass]=\"[pair.key.name]\" [conditionShowing]=\"detailsForZones.includes(pair.key.id)\"></lib-chevron>\r\n\r\n </div>\r\n <div *ngIf=\"detailsForZones.includes(pair.key.id)\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-3 mb-3 ml-2\"\r\n (click)=\"onAddNewTemplateToZone(pair.key)\">{{'Add new template' | translate}}</button>\r\n\r\n <ul class=\"container-fluid list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let template of pair.value\">\r\n <div class=\"d-flex justify-content-between align-items-center\"\r\n (click)=\"onToggleTemplateDetails(template)\">\r\n <h5>{{template.title}}</h5>\r\n <lib-chevron data-testid=\"open-museum-template-btn\" [conditionShowing]=\"templateShowing === template.id\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"templateShowing === template.id\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Description' | translate }}:\r\n {{ template.description}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}:\r\n {{ template.locale ? template.locale : ('Not applicable' | translate)}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\"\r\n *ngIf=\"template.hashtags && template.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}:\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\"\r\n *ngIf=\"template.hashtags.length> 0\">\r\n <li class=\"keywordsItem\"\r\n *ngFor=\"let hashtag of template.hashtags\">{{\r\n hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}:\r\n {{ template.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Planned at' | translate }} :\r\n {{ template.startDateTime ? (template.startDateTime |\r\n timeDateString:\"day_time_zone\" | async) :\r\n \"No data\" | translate }} -\r\n {{ template.endDateTime ?\r\n (template.endDateTime | timeDateString:\"day_time_zone\" | async) : \"No\r\n data\" |\r\n translate}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">\r\n {{'Effective start/end time ' | translate }}:\r\n {{ template.realStartedAt ? (template.realStartedAt |\r\n timeDateString:\"day_time_zone\" | async) : ('No data' | translate)}} /\r\n {{ template.realEndedAt ? (template.realEndedAt |\r\n timeDateString:\"day_time_zone\" | async) : ('No data' | translate)}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\"\r\n *ngIf=\"allTemplateMissionsMap.get(template.id)\">\r\n {{'Visitors created' |\r\n translate}}:{{allTemplateMissionsMap.get(template.id).length}}\r\n <lib-csv-export [headers]=\"csvHeaders\" [title]=\"'Users'\"\r\n buttonLabel=\"Download users\"\r\n [rowsInput]=\"generateCSVUsers(template)\">\r\n </lib-csv-export>\r\n </li>\r\n\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <div class=\"d-inline-block mr-2 action-button\" ngbDropdown\r\n #myDrop=\"ngbDropdown\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownManual\" data-testid=\"open-dropdownManual-museum-btn\"\r\n ngbDropdownToggle>{{'Manage users' |\r\n translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownManual\">\r\n <button (click)=\"onGenerateBatch(template)\" ngbDropdownItem data-testid=\"new-user-template-btn\"> \r\n {{'Create users from this template' | translate}}</button>\r\n <button (click)=\"onSendInvitation(template)\" ngbDropdownItem>\r\n {{'Send invitation to all users' | translate}}\r\n </button>\r\n <button (click)=\"onSendUpdate(template)\" ngbDropdownItem>\r\n {{'Send update to all users' | translate}}\r\n </button>\r\n <button (click)=\"onSendSatisfaction(template)\" ngbDropdownItem>\r\n {{'Send satisfaction mail to all users' | translate}}\r\n </button>\r\n <button (click)=\"onDeleteUsers(template)\" ngbDropdownItem>\r\n {{'Remove users' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"d-inline-block mr-2 action-button\" ngbDropdown\r\n #myDrop2=\"ngbDropdown\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdown2\" data-testid=\"open-dropdown2-museum-template-btn\"\r\n ngbDropdownToggle>{{'Manage template' |\r\n translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdown2\">\r\n <button (click)=\"onEditTemplate(template)\" ngbDropdownItem data-testid=\"edit-museum-template-btn\">\r\n {{'Edit template' | translate}}</button>\r\n <button (click)=\"onCleanTimeTemplate(template)\" ngbDropdownItem>\r\n {{'Clean effective times' | translate}}\r\n </button>\r\n <button (click)=\"onArchiveTemplate(template)\" ngbDropdownItem>\r\n {{'Archive template' | translate}}\r\n </button>\r\n <button (click)=\"onCancelTemplate(template)\" ngbDropdownItem>\r\n {{'Cancel visit' | translate}}\r\n </button>\r\n <button (click)=\"onDuplicateTemplate(template)\" ngbDropdownItem>\r\n {{'Duplicate' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <button type=\"button\" class=\"btn btn-primary rounded-pill mr-2 ml-auto\"\r\n (click)=\"onEdit(mis)\">\r\n {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-primary rounded-pill mt-3 mb-3 ml-auto\"\r\n (click)=\"onArchiveTemplate(mis)\">{{'Archive' | translate}}</button> -->\r\n </div>\r\n\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n <div *ngIf=\"editing\">\r\n <lib-template [editTemplate]=\"templateToEdit\" [currentOrg]=\"currentOrg\"\r\n (updatedTemplate)=\"onUpdatedTemplate($event)\"></lib-template>\r\n </div>\r\n <div *ngIf=\"creating\">\r\n <lib-template [currentOrg]=\"currentOrg\" [zoneID]=\"zoneIDForNewTemplate\"\r\n (createdTemplate)=\"onCreatedTemplate($event)\"></lib-template>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 col-lg-5\" *ngIf=\"isAddingBatch\">\r\n <lib-create-batch [template]=\"chosenTemplate\" (createdMissions)=\"onUpdatedEvent($event)\"></lib-create-batch>\r\n </div>\r\n <ng-template #deleteUsers let-modal>\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\" id=\"modal-basic-title\">{{\"Delete users\" | translate}}\r\n </h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modalRef.close()\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"column align-items-center\">\r\n <div class=\"row\" style=\"padding: 0 1.25rem;\">\r\n <ul class=\"container-fluid list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let object of currentTemplateUsers\">\r\n <input type=\"checkbox\" [(ngModel)]=\"object.checked\"> {{object.profile.email}}\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div class=\"row\" style=\"padding: 1.25rem;\">\r\n <button class=\"btn btn-outline-primary rounded-pill mr-4\" (click)=\"onDeleteChosen()\">{{\"Apply\" |\r\n translate}}\r\n </button>\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"modalRef.close()\">{{\"Cancel\" |\r\n translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</div>", styles: [".add-button{width:-moz-fit-content;width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"] }]
314
- }], ctorParameters: function () { return [{ type: i1.BaseUserService }, { type: i1.MissionService }, { type: i2.Router }, { type: i3.TranslateService }, { type: i1.SpaceService }, { type: i1.ZoneService }, { type: i4.NgbModal }, { type: i1.TemplateService }]; }, propDecorators: { modal: [{
312
+ args: [{ selector: 'lib-visitor', template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Museum Visitors' | translate}}</h3>\r\n <!-- <app-search-bar [searchable]=\"allZoneTemplatesMap\" objectType=\"TEMPLATE\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-7\">\r\n <div class=\"row ml-0 mb-2\">\r\n <h4 class=\"header-small\">{{'Itineraries' | translate}}</h4>\r\n </div>\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!editing && !creating\">\r\n <button class=\"btn btn-outline-primary rounded-pill ml-3 add-button\" (click)=\"onCreateTemplate()\"\r\n data-testid=\"new-museum-template-btn\">\r\n {{'Create template for new itinerary' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!editing && !creating\">\r\n <ul class=\"list-group list-group-flush\" data-testid=\"open-museum-zone-btn\">\r\n <li class=\"list-group-item\" *ngFor=\"let pair of allZoneTemplatesMapFiltered | keyvalue\">\r\n <h4>{{pair.key.name}} <span style=\"font-size:0.8em\"> - {{pair.key.space.name}}</span> </h4>\r\n <div class=\"d-flex justify-content-between align-items-center\"\r\n (click)=\"onToggleMissionsForZone(pair.key.id)\">\r\n <ng-container *ngIf=\"pair.value.length <= 1\">\r\n {{pair.value.length}} {{'visit template found' | translate}}\r\n </ng-container>\r\n <ng-container *ngIf=\"pair.value.length > 1\">\r\n {{pair.value.length}} {{'visit templates found' | translate}}\r\n </ng-container>\r\n <lib-chevron [ngClass]=\"[pair.key.name]\" [conditionShowing]=\"detailsForZones.includes(pair.key.id)\"></lib-chevron>\r\n\r\n </div>\r\n <div *ngIf=\"detailsForZones.includes(pair.key.id)\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-3 mb-3 ml-2\"\r\n (click)=\"onAddNewTemplateToZone(pair.key)\">{{'Add new template' | translate}}</button>\r\n\r\n <ul class=\"container-fluid list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let template of pair.value\">\r\n <div class=\"d-flex justify-content-between align-items-center\"\r\n (click)=\"onToggleTemplateDetails(template)\">\r\n <h5>{{template.title}}</h5>\r\n <lib-chevron data-testid=\"open-museum-template-btn\" [conditionShowing]=\"templateShowing === template.id\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"templateShowing === template.id\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Description' | translate }}:\r\n {{ template.description}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}:\r\n {{ template.locale ? template.locale : ('Not applicable' | translate)}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\"\r\n *ngIf=\"template.hashtags && template.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}:\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\"\r\n *ngIf=\"template.hashtags.length> 0\">\r\n <li class=\"keywordsItem\"\r\n *ngFor=\"let hashtag of template.hashtags\">{{\r\n hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}:\r\n {{ template.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Planned at' | translate }} :\r\n {{ template.startDateTime ? (template.startDateTime |\r\n timeDateString:\"day_time_zone\" | async) :\r\n \"No data\" | translate }} -\r\n {{ template.endDateTime ?\r\n (template.endDateTime | timeDateString:\"day_time_zone\" | async) : \"No\r\n data\" |\r\n translate}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">\r\n {{'Effective start/end time ' | translate }}:\r\n {{ template.realStartedAt ? (template.realStartedAt |\r\n timeDateString:\"day_time_zone\" | async) : ('No data' | translate)}} /\r\n {{ template.realEndedAt ? (template.realEndedAt |\r\n timeDateString:\"day_time_zone\" | async) : ('No data' | translate)}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\"\r\n *ngIf=\"allTemplateMissionsMap.get(template.id)\">\r\n {{'Visitors created' |\r\n translate}}:{{allTemplateMissionsMap.get(template.id).length}}\r\n <lib-csv-export [headers]=\"csvHeaders\" [title]=\"'Users'\"\r\n buttonLabel=\"Download users\"\r\n [rowsInput]=\"generateCSVUsers(template)\">\r\n </lib-csv-export>\r\n </li>\r\n\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <div class=\"d-inline-block mr-2 action-button\" ngbDropdown\r\n #myDrop=\"ngbDropdown\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownManual\" data-testid=\"open-dropdownManual-museum-btn\"\r\n ngbDropdownToggle>{{'Manage users' |\r\n translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownManual\">\r\n <button (click)=\"onGenerateBatch(template)\" ngbDropdownItem data-testid=\"new-user-template-btn\"> \r\n {{'Create users from this template' | translate}}</button>\r\n <button (click)=\"onSendInvitation(template)\" ngbDropdownItem>\r\n {{'Send invitation to all users' | translate}}\r\n </button>\r\n <button (click)=\"onSendUpdate(template)\" ngbDropdownItem>\r\n {{'Send update to all users' | translate}}\r\n </button>\r\n <button (click)=\"onSendSatisfaction(template)\" ngbDropdownItem>\r\n {{'Send satisfaction mail to all users' | translate}}\r\n </button>\r\n <button (click)=\"onDeleteUsers(template)\" ngbDropdownItem>\r\n {{'Remove users' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"d-inline-block mr-2 action-button\" ngbDropdown\r\n #myDrop2=\"ngbDropdown\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdown2\" data-testid=\"open-dropdown2-museum-template-btn\"\r\n ngbDropdownToggle>{{'Manage template' |\r\n translate}}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdown2\">\r\n <button (click)=\"onEditTemplate(template)\" ngbDropdownItem data-testid=\"edit-museum-template-btn\">\r\n {{'Edit template' | translate}}</button>\r\n <button (click)=\"onCleanTimeTemplate(template)\" ngbDropdownItem>\r\n {{'Clean effective times' | translate}}\r\n </button>\r\n <button (click)=\"onArchiveTemplate(template)\" ngbDropdownItem>\r\n {{'Archive template' | translate}}\r\n </button>\r\n <button (click)=\"onCancelTemplate(template)\" ngbDropdownItem>\r\n {{'Cancel visit' | translate}}\r\n </button>\r\n <button (click)=\"onDuplicateTemplate(template)\" ngbDropdownItem>\r\n {{'Duplicate' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <button type=\"button\" class=\"btn btn-primary rounded-pill mr-2 ml-auto\"\r\n (click)=\"onEdit(mis)\">\r\n {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-primary rounded-pill mt-3 mb-3 ml-auto\"\r\n (click)=\"onArchiveTemplate(mis)\">{{'Archive' | translate}}</button> -->\r\n </div>\r\n\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n <div *ngIf=\"editing\">\r\n <lib-template [editTemplate]=\"templateToEdit\" [currentOrg]=\"currentOrg\"\r\n (updatedTemplate)=\"onUpdatedTemplate($event)\"></lib-template>\r\n </div>\r\n <div *ngIf=\"creating\">\r\n <lib-template [currentOrg]=\"currentOrg\" [zoneID]=\"zoneIDForNewTemplate\"\r\n (createdTemplate)=\"onCreatedTemplate($event)\"></lib-template>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 col-lg-5\" *ngIf=\"isAddingBatch\">\r\n <lib-create-batch [template]=\"chosenTemplate\" (createdMissions)=\"onUpdatedEvent($event)\"></lib-create-batch>\r\n </div>\r\n <ng-template #deleteUsers let-modal>\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\" id=\"modal-basic-title\">{{\"Delete users\" | translate}}\r\n </h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modalRef.close()\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"column align-items-center\">\r\n <div class=\"row\" style=\"padding: 0 1.25rem;\">\r\n <ul class=\"container-fluid list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let object of currentTemplateUsers\">\r\n <input type=\"checkbox\" [(ngModel)]=\"object.checked\"> {{object.profile.email}}\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div class=\"row\" style=\"padding: 1.25rem;\">\r\n <button class=\"btn btn-outline-primary rounded-pill mr-4\" (click)=\"onDeleteChosen()\">{{\"Apply\" |\r\n translate}}\r\n </button>\r\n <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"modalRef.close()\">{{\"Cancel\" |\r\n translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</div>", styles: [".add-button{width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"] }]
313
+ }], ctorParameters: () => [{ type: i1.BaseUserService }, { type: i1.MissionService }, { type: i2.Router }, { type: i3.TranslateService }, { type: i1.SpaceService }, { type: i1.ZoneService }, { type: i4.NgbModal }, { type: i1.TemplateService }], propDecorators: { modal: [{
315
314
  type: ViewChild,
316
315
  args: ["deleteUsers"]
317
316
  }] } });
318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi92aXNpdG9yL3Zpc2l0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdmlzaXRvci92aXNpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTdELE9BQU8sRUFFd0IsVUFBVSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQ3BFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7Ozs7O0FBRTNDLE1BS2EsZ0JBQWdCO0lBZ0RiO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUF0RGMsS0FBSyxDQUFDO0lBRWhDLGNBQWMsQ0FBZ0I7SUFFOUIsa0JBQWtCLENBQVk7SUFFOUIsVUFBVSxDQUFlO0lBRXpCLGNBQWMsQ0FBZ0I7SUFFOUIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVoQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRWpCLG9CQUFvQixDQUFTO0lBRTdCLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFFdEIsbUJBQW1CLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxzQkFBc0I7SUFFbkYsMkJBQTJCLENBQTZCO0lBRXhELHNCQUFzQixHQUEyQixJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsbUNBQW1DO0lBRS9GLGVBQWUsR0FBYSxFQUFFLENBQUM7SUFFL0IsVUFBVSxHQUFHO1FBQ1QsT0FBTztRQUNQLGFBQWE7UUFDYixNQUFNO1FBQ04sVUFBVTtRQUNWLGlCQUFpQjtRQUNqQixlQUFlO1FBQ2YsY0FBYztLQUNqQixDQUFDO0lBRUYsZUFBZSxDQUFTO0lBRXhCLE9B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LENBQUM7Z0JBQzdCLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDZCxXQUFXLEVBQUUsV0FBVyxDQUFDLHVCQUF1QjthQUNuRCxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FDVCxDQUFDO0lBQ04sQ0FBQzt3R0FoWFEsZ0JBQWdCOzRGQUFoQixnQkFBZ0IseUpDZDdCLDRxZEFvTU07O1NEdExPLGdCQUFnQjs0RkFBaEIsZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNJLGFBQWE7aVNBS0csS0FBSztzQkFBOUIsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gICAgTWlzc2lvbiwgWm9uZSwgT3JnYW5pc2F0aW9uLCBCYXNlVXNlclNlcnZpY2UsIE1pc3Npb25TZXJ2aWNlLFxyXG4gICAgU3BhY2VTZXJ2aWNlLCBab25lU2VydmljZSwgUm9sZVN0YXR1cywgUHJvZmlsZUVudGl0eSwgRW1haWxTdGF0dXMsIFRlbXBsYXRlU2VydmljZSwgVmlzaXRUZW1wbGF0ZSwgc29ydEFscGhhYmV0aWNhbGx5T25OYW1lXHJcbn0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItdmlzaXRvcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vdmlzaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi92aXNpdG9yLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFZpc2l0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgQFZpZXdDaGlsZChcImRlbGV0ZVVzZXJzXCIpIG1vZGFsO1xyXG5cclxuICAgIGNob3NlblRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlO1xyXG5cclxuICAgIGFsbE9yZGVyZWRNaXNzaW9uczogTWlzc2lvbltdO1xyXG5cclxuICAgIGN1cnJlbnRPcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICB0ZW1wbGF0ZVRvRWRpdDogVmlzaXRUZW1wbGF0ZTtcclxuXHJcbiAgICBlZGl0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgY3JlYXRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICB6b25lSURGb3JOZXdUZW1wbGF0ZTogc3RyaW5nO1xyXG5cclxuICAgIGlzQWRkaW5nQmF0Y2ggPSBmYWxzZTtcclxuXHJcbiAgICBhbGxab25lVGVtcGxhdGVzTWFwOiBNYXA8Wm9uZSwgVmlzaXRUZW1wbGF0ZVtdPiA9IG5ldyBNYXAoKTsgLy8gem9uZT0+aXRzIHRlbXBsYXRlc1xyXG5cclxuICAgIGFsbFpvbmVUZW1wbGF0ZXNNYXBGaWx0ZXJlZDogTWFwPFpvbmUsIFZpc2l0VGVtcGxhdGVbXT47XHJcblxyXG4gICAgYWxsVGVtcGxhdGVNaXNzaW9uc01hcDogTWFwPHN0cmluZywgTWlzc2lvbltdPiA9IG5ldyBNYXAoKTsgLy8gdGVtcGxhdGVJRCwgaXRzIGRlcml2ZWQgTWlzc2lvbnNcclxuXHJcbiAgICBkZXRhaWxzRm9yWm9uZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgY3N2SGVhZGVycyA9IFtcclxuICAgICAgICBcImVtYWlsXCIsXHJcbiAgICAgICAgXCJ1c2VyX3N0YXR1c1wiLFxyXG4gICAgICAgIFwiem9uZVwiLFxyXG4gICAgICAgIFwibG9jYXRpb25cIixcclxuICAgICAgICBcInN0YXJ0X2RhdGVfdGltZVwiLFxyXG4gICAgICAgIFwiZW5kX2RhdGVfdGltZVwiLFxyXG4gICAgICAgIFwiYWNjZXNzX2xldmVsXCIsXHJcbiAgICBdO1xyXG5cclxuICAgIHRlbXBsYXRlU2hvd2luZzogc3RyaW5nO1xyXG5cclxuICAgIGxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBjdXJyZW50VGVtcGxhdGVVc2VycztcclxuXHJcbiAgICBtb2RhbFJlZjtcclxuXHJcbiAgICB0b0R1cGxpY2F0ZSA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG1pc3Npb25TZXJ2aWNlOiBNaXNzaW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgc3BhY2VTZXJ2aWNlOiBTcGFjZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxyXG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVTZXJ2aWNlOiBUZW1wbGF0ZVNlcnZpY2UsXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmlzQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZXR1cCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldHVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0dXAoKSB7XHJcbiAgICAgICAgdGhpcy5zZXR1cFVzZXIoKTtcclxuICAgICAgICB0aGlzLnNldFpvbmVzVGVtcGxhdGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0Wm9uZXNUZW1wbGF0ZXMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRPcmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuYWxsWm9uZVRlbXBsYXRlc01hcCA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLmFsbFRlbXBsYXRlTWlzc2lvbnNNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgbGV0IGxvY2F0aW9ucyA9IHRoaXMuc3BhY2VTZXJ2aWNlLmxvY2F0aW9uc0ZvclVzZXI7XHJcbiAgICAgICAgaWYgKGxvY2F0aW9ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgbG9jYXRpb25zID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0TG9jYXRpb25zRm9yQ3VycmVudFVzZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgIGxvY2F0aW9ucy5tYXAoYXN5bmMgKHNwYWNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgem9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZShzcGFjZS5pZCk7XHJcbiAgICAgICAgICAgICAgICB6b25lcyA9IHpvbmVzLmZpbHRlcigoem9uZSkgPT4gem9uZS5pc011c2V1bVZpc2l0Wm9uZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgICAgICAgICB6b25lcy5tYXAoYXN5bmMgKHpvbmUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlzaXRvcnNNaXNzaW9ucyA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zQnlab25lQnlSb2xlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvbmUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9sZVN0YXR1cy5WSVNJVE9SX01VU0VVTSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wbGF0ZXMgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy50ZW1wbGF0ZVNlcnZpY2UuZ2V0VGVtcGxhdGVzQnlab25lKHpvbmUuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMgPSB0ZW1wbGF0ZXMuZmlsdGVyKCh0ZW1wbGF0ZSkgPT4gIXRlbXBsYXRlLmRlbGV0ZWRBdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlcyA9IHRlbXBsYXRlcy5zb3J0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEsIGIpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmV0dGllci9wcmV0dGllclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKGIuc3RhcnREYXRlVGltZSkgLSBuZXcgRGF0ZShhLnN0YXJ0RGF0ZVRpbWUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIHRlbXBsYXRlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWlzc2lvbnNGcm9tVGVtcGxhdGUgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3JzTWlzc2lvbnMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWlzKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLnRlbXBsYXRlTWlzc2lvbklEID09PSB0ZW1wbGF0ZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxsVGVtcGxhdGVNaXNzaW9uc01hcC5zZXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2lvbnNGcm9tVGVtcGxhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxsWm9uZVRlbXBsYXRlc01hcC5zZXQoem9uZSwgdGVtcGxhdGVzKTtcclxuICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8gc29ydCBsaXN0IGJ5IHpvbmUgbmFtZSBhbHBoYWJldGljYWxseVxyXG4gICAgICAgIHRoaXMuYWxsWm9uZVRlbXBsYXRlc01hcEZpbHRlcmVkID1cclxuICAgICAgICAgICAgbmV3IE1hcChbLi4udGhpcy5hbGxab25lVGVtcGxhdGVzTWFwLmVudHJpZXMoKV0uc29ydCgoYSwgYikgPT4gYVswXS5uYW1lLmxvY2FsZUNvbXBhcmUoYlswXS5uYW1lKSkpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldHVwVXNlcigpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRPcmcgPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRPcmdhbmlzYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNyZWF0ZVRlbXBsYXRlKCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uRGVsZXRlTWlzc2lvbihtaXNzaW9uOiBNaXNzaW9uKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5zb2Z0RGVsZXRlTWlzc2lvbihtaXNzaW9uLmlkKTtcclxuICAgICAgICB0aGlzLnNldFpvbmVzVGVtcGxhdGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25FZGl0VGVtcGxhdGUodGVtcGxhdGU6IFZpc2l0VGVtcGxhdGUpIHtcclxuICAgICAgICB0aGlzLmVkaXRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGVUb0VkaXQgPSB0ZW1wbGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBvblVwZGF0ZWRFdmVudChpc0FkZGVkOiBNaXNzaW9uW10pIHtcclxuICAgICAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlVG9FZGl0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmlzQWRkaW5nQmF0Y2ggPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNob3NlblRlbXBsYXRlID0gbnVsbDtcclxuICAgICAgICBpZiAoaXNBZGRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFpvbmVzVGVtcGxhdGVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uVXBkYXRlZFRlbXBsYXRlKHRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlVG9FZGl0ID0gbnVsbDtcclxuICAgICAgICBpZiAodGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudG9EdXBsaWNhdGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0ZW1wbGF0ZS5pZDtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudGVtcGxhdGVTZXJ2aWNlLmNyZWF0ZSh0ZW1wbGF0ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvRHVwbGljYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldFpvbmVzVGVtcGxhdGVzKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy50ZW1wbGF0ZVNlcnZpY2UudXBkYXRlKHRlbXBsYXRlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRab25lc1RlbXBsYXRlcygpO1xyXG4gICAgICAgICAgICAvLyB1cGRhdGUgcmVsYXRlZCBNaXNzaW9uc1xyXG4gICAgICAgICAgICBjb25zdCBtaXNzaW9uc0ZvclRlbXBsYXRlID1cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UuZ2V0TWlzc2lvbnNCeVRlbXBsYXRlKHRlbXBsYXRlLmlkKTtcclxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgICAgICBtaXNzaW9uc0ZvclRlbXBsYXRlLm1hcChhc3luYyAobWlzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pc3Npb25VcGRhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBtaXNzaW9uLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogdGVtcGxhdGUubGV2ZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZVRpbWU6IHRlbXBsYXRlLnN0YXJ0RGF0ZVRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZERhdGVUaW1lOiB0ZW1wbGF0ZS5lbmREYXRlVGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlOiB0ZW1wbGF0ZS5sb2NhbGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVJRDogdGVtcGxhdGUuem9uZUlELFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZUlEOiB0ZW1wbGF0ZS5zcGFjZUlELFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFnczogdGVtcGxhdGUuaGFzaHRhZ3MsXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnVwZGF0ZShtaXNzaW9uVXBkYXRlKTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25DcmVhdGVkVGVtcGxhdGUodGVtcGxhdGU6IFZpc2l0VGVtcGxhdGUpIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY3JlYXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnpvbmVJREZvck5ld1RlbXBsYXRlID0gbnVsbDtcclxuICAgICAgICBpZiAodGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy50ZW1wbGF0ZVNlcnZpY2UuY3JlYXRlKHRlbXBsYXRlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRab25lc1RlbXBsYXRlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBvblRvZ2dsZU1pc3Npb25zRm9yWm9uZSh6b25lSUQ6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLmRldGFpbHNGb3Jab25lcy5pbmNsdWRlcyh6b25lSUQpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kZXRhaWxzRm9yWm9uZXMuaW5kZXhPZih6b25lSUQpO1xyXG4gICAgICAgICAgICB0aGlzLmRldGFpbHNGb3Jab25lcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGV0YWlsc0ZvclpvbmVzLnB1c2goem9uZUlEKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25Ub2dnbGVUZW1wbGF0ZURldGFpbHModGVtcGxhdGUpIHtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlU2hvd2luZyA9XHJcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVTaG93aW5nID09PSB0ZW1wbGF0ZS5pZCA/IG51bGwgOiB0ZW1wbGF0ZS5pZDtcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZE5ld1RlbXBsYXRlVG9ab25lKHpvbmU6IFpvbmUpIHtcclxuICAgICAgICB0aGlzLnpvbmVJREZvck5ld1RlbXBsYXRlID0gem9uZS5pZDtcclxuICAgICAgICB0aGlzLmNyZWF0aW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkFyY2hpdmVUZW1wbGF0ZSh0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiY29uZmlybS5hcmNoaXZlVGVtcGxhdGVcIik7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pc3Npb25zVG9EZWxldGUgPSB0aGlzLmFsbFRlbXBsYXRlTWlzc2lvbnNNYXAuZ2V0KHRlbXBsYXRlLmlkKTtcclxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgICAgICBtaXNzaW9uc1RvRGVsZXRlLm1hcChhc3luYyAobWlzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2Uuc29mdERlbGV0ZU1pc3Npb24obWlzc2lvbi5pZCk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy50ZW1wbGF0ZVNlcnZpY2Uuc29mdERlbGV0ZSh0ZW1wbGF0ZS5pZCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Wm9uZXNUZW1wbGF0ZXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25HZW5lcmF0ZUJhdGNoKHRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgdGhpcy5jaG9zZW5UZW1wbGF0ZSA9IHRlbXBsYXRlO1xyXG4gICAgICAgIHRoaXMuaXNBZGRpbmdCYXRjaCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVDU1ZVc2Vycyh0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IG1pc3Npb24gb2YgdGhpcy5hbGxUZW1wbGF0ZU1pc3Npb25zTWFwLmdldCh0ZW1wbGF0ZS5pZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgdXNlciA9IG5ldyBQcm9maWxlRW50aXR5KG1pc3Npb24udXNlcik7XHJcbiAgICAgICAgICAgIGRhdGEucHVzaChbXHJcbiAgICAgICAgICAgICAgICB1c2VyLmVtYWlsLFxyXG4gICAgICAgICAgICAgICAgbWlzc2lvbi51c2VyLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgIG1pc3Npb24uem9uZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgbWlzc2lvbi5zcGFjZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgbWlzc2lvbi5zdGFydERhdGVUaW1lLFxyXG4gICAgICAgICAgICAgICAgbWlzc2lvbi5lbmREYXRlVGltZSxcclxuICAgICAgICAgICAgICAgIG1pc3Npb24ubGV2ZWwsXHJcbiAgICAgICAgICAgIF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblNlbmRJbnZpdGF0aW9uKHRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgIHRoaXMuYWxsVGVtcGxhdGVNaXNzaW9uc01hcFxyXG4gICAgICAgICAgICAgICAgLmdldCh0ZW1wbGF0ZS5pZClcclxuICAgICAgICAgICAgICAgIC5tYXAoYXN5bmMgKG1pc3Npb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWlzc2lvbi5lbWFpbFN0YXR1cyAhPT0gRW1haWxTdGF0dXMuU0VOVCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnVwZGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbWlzc2lvbi5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsU3RhdHVzOiBFbWFpbFN0YXR1cy5DUkVBVElPTl9UT19ERUxJVkVSLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU2VuZFVwZGF0ZSh0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICB0aGlzLmFsbFRlbXBsYXRlTWlzc2lvbnNNYXBcclxuICAgICAgICAgICAgICAgIC5nZXQodGVtcGxhdGUuaWQpXHJcbiAgICAgICAgICAgICAgICAubWFwKGFzeW5jIChtaXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS51cGRhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogbWlzc2lvbi5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWxTdGF0dXM6IEVtYWlsU3RhdHVzLlVQREFURV9UT19ERUxJVkVSLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkNhbmNlbFRlbXBsYXRlKHRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJjb25maXJtLmNhbmNlbFRlbXBsYXRlXCIpO1xyXG4gICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xyXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgICAgIHRoaXMuYWxsVGVtcGxhdGVNaXNzaW9uc01hcFxyXG4gICAgICAgICAgICAgICAgICAgIC5nZXQodGVtcGxhdGUuaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcChhc3luYyAobWlzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnVwZGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbWlzc2lvbi5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsU3RhdHVzOiBFbWFpbFN0YXR1cy5DQU5DRUxMQVRJT05fVE9fREVMSVZFUixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZWRBdDogRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5UmVzdWx0c1NlYXJjaEJhcihyZXN1bHRzKSB7XHJcbiAgICAgICAgdGhpcy5hbGxab25lVGVtcGxhdGVzTWFwRmlsdGVyZWQgPSByZXN1bHRzIHx8IHRoaXMuYWxsWm9uZVRlbXBsYXRlc01hcDtcclxuICAgIH1cclxuXHJcbiAgICBvbkRlbGV0ZVVzZXJzKG1pczogVmlzaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRlbXBsYXRlVXNlcnMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IG1pc3Npb24gb2YgdGhpcy5hbGxUZW1wbGF0ZU1pc3Npb25zTWFwLmdldChtaXMuaWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRlbXBsYXRlVXNlcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBtaXNzaW9uLFxyXG4gICAgICAgICAgICAgICAgcHJvZmlsZTogbmV3IFByb2ZpbGVFbnRpdHkobWlzc2lvbi51c2VyKSxcclxuICAgICAgICAgICAgICAgIGNoZWNrZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMuYWxsVGVtcGxhdGVNaXNzaW9uc01hcC5nZXQobWlzLmlkKS5pbmRleE9mKG1pc3Npb24pLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5tb2RhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWxldGVzIG1pc3Npb24gb2YgdGhlIHVzZXIgYW5kIGNoZWNrcyBpZiBjYW4gaGFyZCBkZWxldGUgdGhlIFByb2ZpbGUgKG5vIG90aGVyIG1pc3Npb25zKVxyXG4gICAgICovXHJcbiAgICBhc3luYyBvbkRlbGV0ZUNob3NlbigpIHtcclxuICAgICAgICBjb25zdCBsaXN0VG9EZWxldGUgPSB0aGlzLmN1cnJlbnRUZW1wbGF0ZVVzZXJzLmZpbHRlcihcclxuICAgICAgICAgICAgKG9iamVjdCkgPT4gb2JqZWN0LmNoZWNrZWQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgbGlzdFRvRGVsZXRlLm1hcChhc3luYyAob2JqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnNvZnREZWxldGVNaXNzaW9uKG9iamVjdC5taXNzaW9uLmlkKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2Uuc29mdERlbGV0ZVVzZXIob2JqZWN0LnByb2ZpbGUuaWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYWxsVGVtcGxhdGVNaXNzaW9uc01hcFxyXG4gICAgICAgICAgICAgICAgICAgIC5nZXQob2JqZWN0Lm1pc3Npb24udGVtcGxhdGVNaXNzaW9uSUQpXHJcbiAgICAgICAgICAgICAgICAgICAgLnNwbGljZShvYmplY3QuaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMubW9kYWxSZWYuY2xvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkR1cGxpY2F0ZVRlbXBsYXRlKHRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlVG9FZGl0ID0gdGVtcGxhdGU7XHJcbiAgICAgICAgdGhpcy50b0R1cGxpY2F0ZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25DbGVhblRpbWVUZW1wbGF0ZSh0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMudGVtcGxhdGVTZXJ2aWNlLnVwZGF0ZSh7XHJcbiAgICAgICAgICAgIGlkOiB0ZW1wbGF0ZS5pZCxcclxuICAgICAgICAgICAgcmVhbEVuZGVkQXQ6IG51bGwsXHJcbiAgICAgICAgICAgIHJlYWxTdGFydGVkQXQ6IG51bGxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldFpvbmVzVGVtcGxhdGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG1pc3Npb24gc3RhdHVzIHRvIFNBVElTRkFDVElPTl9UT19ERUxJVkVSIGZvciB2aXNpdG9ycywgd2hvIGFzc2l0ZWQgdG8gbGl2ZSB2aXNpdC5cclxuICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSBWaXNpdFRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIG9uU2VuZFNhdGlzZmFjdGlvbih0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IG1pc3Npb25zQXNzaXN0ZWQgPSB0aGlzLm1pc3Npb25TZXJ2aWNlLmZpbHRlck1pc3Npb25zQXNzaXRlZFRvTGl2ZUZvclRlbXBsYXRlKHRlbXBsYXRlLFxyXG4gICAgICAgICAgICB0aGlzLmFsbFRlbXBsYXRlTWlzc2lvbnNNYXAuZ2V0KHRlbXBsYXRlLmlkKSk7XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgIG1pc3Npb25zQXNzaXN0ZWRcclxuICAgICAgICAgICAgICAgIC5tYXAoYXN5bmMgKG1pc3Npb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnVwZGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBtaXNzaW9uLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbWFpbFN0YXR1czogRW1haWxTdGF0dXMuU0FUSVNGQUNUSU9OX1RPX0RFTElWRVIsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJkYXNoYm9hcmQtdGFiXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWRhc2hib2FyZC10YWJcIj5cclxuICAgICAgICA8aDM+e3snTXVzZXVtIFZpc2l0b3JzJyB8IHRyYW5zbGF0ZX19PC9oMz5cclxuICAgICAgICA8IS0tIDxhcHAtc2VhcmNoLWJhciBbc2VhcmNoYWJsZV09XCJhbGxab25lVGVtcGxhdGVzTWFwXCIgb2JqZWN0VHlwZT1cIlRFTVBMQVRFXCJcclxuICAgICAgICAgICAgKHNlYXJjaEV2ZW50KT1cImFwcGx5UmVzdWx0c1NlYXJjaEJhcigkZXZlbnQpXCI+XHJcbiAgICAgICAgPC9hcHAtc2VhcmNoLWJhcj4gLS0+XHJcbiAgICAgICAgPGhyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04IGNvbC1sZy03XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWwtMCBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJoZWFkZXItc21hbGxcIj57eydJdGluZXJhcmllcycgfCB0cmFuc2xhdGV9fTwvaDQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1sLTAgbWItMlwiICpuZ0lmPVwiIWVkaXRpbmcgJiYgIWNyZWF0aW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1sLTMgYWRkLWJ1dHRvblwiIChjbGljayk9XCJvbkNyZWF0ZVRlbXBsYXRlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibmV3LW11c2V1bS10ZW1wbGF0ZS1idG5cIj5cclxuICAgICAgICAgICAgICAgICAgICB7eydDcmVhdGUgdGVtcGxhdGUgZm9yIG5ldyBpdGluZXJhcnknIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1sb2FkZXI+PC9saWItbG9hZGVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFlZGl0aW5nICYmICFjcmVhdGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCIgZGF0YS10ZXN0aWQ9XCJvcGVuLW11c2V1bS16b25lLWJ0blwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiICpuZ0Zvcj1cImxldCBwYWlyIG9mIGFsbFpvbmVUZW1wbGF0ZXNNYXBGaWx0ZXJlZCB8IGtleXZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoND57e3BhaXIua2V5Lm5hbWV9fSA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbVwiPiAtIHt7cGFpci5rZXkuc3BhY2UubmFtZX19PC9zcGFuPiA8L2g0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ub2dnbGVNaXNzaW9uc0ZvclpvbmUocGFpci5rZXkuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFpci52YWx1ZS5sZW5ndGggPD0gMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7cGFpci52YWx1ZS5sZW5ndGh9fSB7eyd2aXNpdCB0ZW1wbGF0ZSBmb3VuZCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFpci52YWx1ZS5sZW5ndGggPiAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3twYWlyLnZhbHVlLmxlbmd0aH19IHt7J3Zpc2l0IHRlbXBsYXRlcyBmb3VuZCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWNoZXZyb24gW25nQ2xhc3NdPVwiW3BhaXIua2V5Lm5hbWVdXCIgIFtjb25kaXRpb25TaG93aW5nXT1cImRldGFpbHNGb3Jab25lcy5pbmNsdWRlcyhwYWlyLmtleS5pZClcIj48L2xpYi1jaGV2cm9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkZXRhaWxzRm9yWm9uZXMuaW5jbHVkZXMocGFpci5rZXkuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG10LTMgbWItMyBtbC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25BZGROZXdUZW1wbGF0ZVRvWm9uZShwYWlyLmtleSlcIj57eydBZGQgbmV3IHRlbXBsYXRlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY29udGFpbmVyLWZsdWlkIGxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiICpuZ0Zvcj1cImxldCB0ZW1wbGF0ZSBvZiBwYWlyLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblRvZ2dsZVRlbXBsYXRlRGV0YWlscyh0ZW1wbGF0ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT57e3RlbXBsYXRlLnRpdGxlfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1jaGV2cm9uIGRhdGEtdGVzdGlkPVwib3Blbi1tdXNldW0tdGVtcGxhdGUtYnRuXCIgW2NvbmRpdGlvblNob3dpbmddPVwidGVtcGxhdGVTaG93aW5nID09PSB0ZW1wbGF0ZS5pZFwiPjwvbGliLWNoZXZyb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGVtcGxhdGVTaG93aW5nID09PSB0ZW1wbGF0ZS5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snRGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlIH19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZW1wbGF0ZS5kZXNjcmlwdGlvbn19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydMYW5ndWFnZScgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRlbXBsYXRlLmxvY2FsZSA/IHRlbXBsYXRlLmxvY2FsZSA6ICgnTm90IGFwcGxpY2FibGUnIHwgdHJhbnNsYXRlKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRlbXBsYXRlLmhhc2h0YWdzICYmIHRlbXBsYXRlLmhhc2h0YWdzLmxlbmd0aD4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydIYXNodGFncycgfCB0cmFuc2xhdGV9fTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwia2V5d29yZHNEaXNwbGF5IG5vLWJvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleXdvcmRzZGlzcGxheUNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0ZW1wbGF0ZS5oYXNodGFncy5sZW5ndGg+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJrZXl3b3Jkc0l0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiB0ZW1wbGF0ZS5oYXNodGFnc1wiPnt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWcgfCBoYXNodGFnRnJvbUlEIHwgYXN5bmMgfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBY2Nlc3MgbGV2ZWwnIHwgdHJhbnNsYXRlIH19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZW1wbGF0ZS5sZXZlbH19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydQbGFubmVkIGF0JyB8IHRyYW5zbGF0ZSB9fSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRlbXBsYXRlLnN0YXJ0RGF0ZVRpbWUgPyAodGVtcGxhdGUuc3RhcnREYXRlVGltZSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVEYXRlU3RyaW5nOlwiZGF5X3RpbWVfem9uZVwiIHwgYXN5bmMpIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJObyBkYXRhXCIgfCB0cmFuc2xhdGUgfX0gLVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZW1wbGF0ZS5lbmREYXRlVGltZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wbGF0ZS5lbmREYXRlVGltZSB8IHRpbWVEYXRlU3RyaW5nOlwiZGF5X3RpbWVfem9uZVwiIHwgYXN5bmMpIDogXCJOb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhXCIgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0VmZmVjdGl2ZSBzdGFydC9lbmQgdGltZSAnIHwgdHJhbnNsYXRlIH19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZW1wbGF0ZS5yZWFsU3RhcnRlZEF0ID8gKHRlbXBsYXRlLnJlYWxTdGFydGVkQXQgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lRGF0ZVN0cmluZzpcImRheV90aW1lX3pvbmVcIiB8IGFzeW5jKSA6ICgnTm8gZGF0YScgfCB0cmFuc2xhdGUpfX0gL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZW1wbGF0ZS5yZWFsRW5kZWRBdCA/ICh0ZW1wbGF0ZS5yZWFsRW5kZWRBdCB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVEYXRlU3RyaW5nOlwiZGF5X3RpbWVfem9uZVwiIHwgYXN5bmMpIDogKCdObyBkYXRhJyB8IHRyYW5zbGF0ZSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhbGxUZW1wbGF0ZU1pc3Npb25zTWFwLmdldCh0ZW1wbGF0ZS5pZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snVmlzaXRvcnMgY3JlYXRlZCcgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTp7e2FsbFRlbXBsYXRlTWlzc2lvbnNNYXAuZ2V0KHRlbXBsYXRlLmlkKS5sZW5ndGh9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWNzdi1leHBvcnQgW2hlYWRlcnNdPVwiY3N2SGVhZGVyc1wiIFt0aXRsZV09XCInVXNlcnMnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkxhYmVsPVwiRG93bmxvYWQgdXNlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd3NJbnB1dF09XCJnZW5lcmF0ZUNTVlVzZXJzKHRlbXBsYXRlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1jc3YtZXhwb3J0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWlubGluZS1ibG9jayBtci0yIGFjdGlvbi1idXR0b25cIiBuZ2JEcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbXlEcm9wPVwibmdiRHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGFiZWwtZmlsZSByb3VuZGVkLXBpbGxcIiBpZD1cImRyb3Bkb3duTWFudWFsXCIgZGF0YS10ZXN0aWQ9XCJvcGVuLWRyb3Bkb3duTWFudWFsLW11c2V1bS1idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiRHJvcGRvd25Ub2dnbGU+e3snTWFuYWdlIHVzZXJzJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bk1hbnVhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25HZW5lcmF0ZUJhdGNoKHRlbXBsYXRlKVwiIG5nYkRyb3Bkb3duSXRlbSBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLXRlbXBsYXRlLWJ0blwiPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydDcmVhdGUgdXNlcnMgZnJvbSB0aGlzIHRlbXBsYXRlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJvblNlbmRJbnZpdGF0aW9uKHRlbXBsYXRlKVwiIG5nYkRyb3Bkb3duSXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydTZW5kIGludml0YXRpb24gdG8gYWxsIHVzZXJzJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uU2VuZFVwZGF0ZSh0ZW1wbGF0ZSlcIiBuZ2JEcm9wZG93bkl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snU2VuZCB1cGRhdGUgdG8gYWxsIHVzZXJzJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uU2VuZFNhdGlzZmFjdGlvbih0ZW1wbGF0ZSlcIiBuZ2JEcm9wZG93bkl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snU2VuZCBzYXRpc2ZhY3Rpb24gbWFpbCB0byBhbGwgdXNlcnMnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25EZWxldGVVc2Vycyh0ZW1wbGF0ZSlcIiBuZ2JEcm9wZG93bkl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snUmVtb3ZlIHVzZXJzJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtaW5saW5lLWJsb2NrIG1yLTIgYWN0aW9uLWJ1dHRvblwiIG5nYkRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNteURyb3AyPVwibmdiRHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGFiZWwtZmlsZSByb3VuZGVkLXBpbGxcIiBpZD1cImRyb3Bkb3duMlwiIGRhdGEtdGVzdGlkPVwib3Blbi1kcm9wZG93bjItbXVzZXVtLXRlbXBsYXRlLWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JEcm9wZG93blRvZ2dsZT57eydNYW5hZ2UgdGVtcGxhdGUnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25FZGl0VGVtcGxhdGUodGVtcGxhdGUpXCIgbmdiRHJvcGRvd25JdGVtIGRhdGEtdGVzdGlkPVwiZWRpdC1tdXNldW0tdGVtcGxhdGUtYnRuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snRWRpdCB0ZW1wbGF0ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25DbGVhblRpbWVUZW1wbGF0ZSh0ZW1wbGF0ZSlcIiBuZ2JEcm9wZG93bkl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snQ2xlYW4gZWZmZWN0aXZlIHRpbWVzJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uQXJjaGl2ZVRlbXBsYXRlKHRlbXBsYXRlKVwiIG5nYkRyb3Bkb3duSXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydBcmNoaXZlIHRlbXBsYXRlJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uQ2FuY2VsVGVtcGxhdGUodGVtcGxhdGUpXCIgbmdiRHJvcGRvd25JdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0NhbmNlbCB2aXNpdCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJvbkR1cGxpY2F0ZVRlbXBsYXRlKHRlbXBsYXRlKVwiIG5nYkRyb3Bkb3duSXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydEdXBsaWNhdGUnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGwgbXItMiBtbC1hdXRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25FZGl0KG1pcylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydFZGl0JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtdC0zIG1iLTMgbWwtYXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQXJjaGl2ZVRlbXBsYXRlKG1pcylcIj57eydBcmNoaXZlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImVkaXRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxsaWItdGVtcGxhdGUgW2VkaXRUZW1wbGF0ZV09XCJ0ZW1wbGF0ZVRvRWRpdFwiIFtjdXJyZW50T3JnXT1cImN1cnJlbnRPcmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICh1cGRhdGVkVGVtcGxhdGUpPVwib25VcGRhdGVkVGVtcGxhdGUoJGV2ZW50KVwiPjwvbGliLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNyZWF0aW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8bGliLXRlbXBsYXRlIFtjdXJyZW50T3JnXT1cImN1cnJlbnRPcmdcIiBbem9uZUlEXT1cInpvbmVJREZvck5ld1RlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAoY3JlYXRlZFRlbXBsYXRlKT1cIm9uQ3JlYXRlZFRlbXBsYXRlKCRldmVudClcIj48L2xpYi10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IGNvbC1sZy01XCIgKm5nSWY9XCJpc0FkZGluZ0JhdGNoXCI+XHJcbiAgICAgICAgICAgIDxsaWItY3JlYXRlLWJhdGNoIFt0ZW1wbGF0ZV09XCJjaG9zZW5UZW1wbGF0ZVwiIChjcmVhdGVkTWlzc2lvbnMpPVwib25VcGRhdGVkRXZlbnQoJGV2ZW50KVwiPjwvbGliLWNyZWF0ZS1iYXRjaD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlbGV0ZVVzZXJzIGxldC1tb2RhbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cIm1vZGFsLWJhc2ljLXRpdGxlXCI+e3tcIkRlbGV0ZSB1c2Vyc1wiIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsUmVmLmNsb3NlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJwYWRkaW5nOiAwIDEuMjVyZW07XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCBsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiICpuZ0Zvcj1cImxldCBvYmplY3Qgb2YgY3VycmVudFRlbXBsYXRlVXNlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJvYmplY3QuY2hlY2tlZFwiPiB7e29iamVjdC5wcm9maWxlLmVtYWlsfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiBzdHlsZT1cInBhZGRpbmc6IDEuMjVyZW07XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbXItNFwiIChjbGljayk9XCJvbkRlbGV0ZUNob3NlbigpXCI+e3tcIkFwcGx5XCIgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwibW9kYWxSZWYuY2xvc2UoKVwiPnt7XCJDYW5jZWxcIiB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
317
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi92aXNpdG9yL3Zpc2l0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdmlzaXRvci92aXNpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTdELE9BQU8sRUFFd0IsVUFBVSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQ3BFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7Ozs7O0FBTzNDLE1BQU0sT0FBTyxnQkFBZ0I7SUFnRGI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQXREYyxLQUFLLENBQUM7SUFFaEMsY0FBYyxDQUFnQjtJQUU5QixrQkFBa0IsQ0FBWTtJQUU5QixVQUFVLENBQWU7SUFFekIsY0FBYyxDQUFnQjtJQUU5QixPQUFPLEdBQUcsS0FBSyxDQUFDO0lBRWhCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFakIsb0JBQW9CLENBQVM7SUFFN0IsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUV0QixtQkFBbUIsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQjtJQUVuRiwyQkFBMkIsQ0FBNkI7SUFFeEQsc0JBQXNCLEdBQTJCLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxtQ0FBbUM7SUFFL0YsZUFBZSxHQUFhLEVBQUUsQ0FBQztJQUUvQixVQUFVLEdBQUc7UUFDVCxPQUFPO1FBQ1AsYUFBYTtRQUNiLE1BQU07UUFDTixVQUFVO1FBQ1YsaUJBQWlCO1FBQ2pCLGVBQWU7UUFDZixjQUFjO0tBQ2pCLENBQUM7SUFFRixlQUFlLENBQVM7SUFF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QyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2IsZ0JBQWdCO2FBQ1gsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUNuQixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO2dCQUM3QixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ2QsV0FBVyxFQUFFLFdBQVcsQ0FBQyx1QkFBdUI7YUFDbkQsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQ1QsQ0FBQztJQUNOLENBQUM7d0dBaFhRLGdCQUFnQjs0RkFBaEIsZ0JBQWdCLHlKQ2Q3Qiw0cWRBb01NOzs0RkR0TE8sZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNJLGFBQWE7K1FBS0csS0FBSztzQkFBOUIsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gICAgTWlzc2lvbiwgWm9uZSwgT3JnYW5pc2F0aW9uLCBCYXNlVXNlclNlcnZpY2UsIE1pc3Npb25TZXJ2aWNlLFxyXG4gICAgU3BhY2VTZXJ2aWNlLCBab25lU2VydmljZSwgUm9sZVN0YXR1cywgUHJvZmlsZUVudGl0eSwgRW1haWxTdGF0dXMsIFRlbXBsYXRlU2VydmljZSwgVmlzaXRUZW1wbGF0ZSwgc29ydEFscGhhYmV0aWNhbGx5T25OYW1lXHJcbn0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItdmlzaXRvcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vdmlzaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi92aXNpdG9yLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFZpc2l0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgQFZpZXdDaGlsZChcImRlbGV0ZVVzZXJzXCIpIG1vZGFsO1xyXG5cclxuICAgIGNob3NlblRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlO1xyXG5cclxuICAgIGFsbE9yZGVyZWRNaXNzaW9uczogTWlzc2lvbltdO1xyXG5cclxuICAgIGN1cnJlbnRPcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICB0ZW1wbGF0ZVRvRWRpdDogVmlzaXRUZW1wbGF0ZTtcclxuXHJcbiAgICBlZGl0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgY3JlYXRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICB6b25lSURGb3JOZXdUZW1wbGF0ZTogc3RyaW5nO1xyXG5cclxuICAgIGlzQWRkaW5nQmF0Y2ggPSBmYWxzZTtcclxuXHJcbiAgICBhbGxab25lVGVtcGxhdGVzTWFwOiBNYXA8Wm9uZSwgVmlzaXRUZW1wbGF0ZVtdPiA9IG5ldyBNYXAoKTsgLy8gem9uZT0+aXRzIHRlbXBsYXRlc1xyXG5cclxuICAgIGFsbFpvbmVUZW1wbGF0ZXNNYXBGaWx0ZXJlZDogTWFwPFpvbmUsIFZpc2l0VGVtcGxhdGVbXT47XHJcblxyXG4gICAgYWxsVGVtcGxhdGVNaXNzaW9uc01hcDogTWFwPHN0cmluZywgTWlzc2lvbltdPiA9IG5ldyBNYXAoKTsgLy8gdGVtcGxhdGVJRCwgaXRzIGRlcml2ZWQgTWlzc2lvbnNcclxuXHJcbiAgICBkZXRhaWxzRm9yWm9uZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgY3N2SGVhZGVycyA9IFtcclxuICAgICAgICBcImVtYWlsXCIsXHJcbiAgICAgICAgXCJ1c2VyX3N0YXR1c1wiLFxyXG4gICAgICAgIFwiem9uZVwiLFxyXG4gICAgICAgIFwibG9jYXRpb25cIixcclxuICAgICAgICBcInN0YXJ0X2RhdGVfdGltZVwiLFxyXG4gICAgICAgIFwiZW5kX2RhdGVfdGltZVwiLFxyXG4gICAgICAgIFwiYWNjZXNzX2xldmVsXCIsXHJcbiAgICBdO1xyXG5cclxuICAgIHRlbXBsYXRlU2hvd2luZzogc3RyaW5nO1xyXG5cclxuICAgIGxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBjdXJyZW50VGVtcGxhdGVVc2VycztcclxuXHJcbiAgICBtb2RhbFJlZjtcclxuXHJcbiAgICB0b0R1cGxpY2F0ZSA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG1pc3Npb25TZXJ2aWNlOiBNaXNzaW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgc3BhY2VTZXJ2aWNlOiBTcGFjZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxyXG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVTZXJ2aWNlOiBUZW1wbGF0ZVNlcnZpY2UsXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmlzQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZXR1cCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldHVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0dXAoKSB7XHJcbiAgICAgICAgdGhpcy5zZXR1cFVzZXIoKTtcclxuICAgICAgICB0aGlzLnNldFpvbmVzVGVtcGxhdGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0Wm9uZXNUZW1wbGF0ZXMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRPcmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuYWxsWm9uZVRlbXBsYXRlc01hcCA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLmFsbFRlbXBsYXRlTWlzc2lvbnNNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgbGV0IGxvY2F0aW9ucyA9IHRoaXMuc3BhY2VTZXJ2aWNlLmxvY2F0aW9uc0ZvclVzZXI7XHJcbiAgICAgICAgaWYgKGxvY2F0aW9ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgbG9jYXRpb25zID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0TG9jYXRpb25zRm9yQ3VycmVudFVzZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgIGxvY2F0aW9ucy5tYXAoYXN5bmMgKHNwYWNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgem9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZShzcGFjZS5pZCk7XHJcbiAgICAgICAgICAgICAgICB6b25lcyA9IHpvbmVzLmZpbHRlcigoem9uZSkgPT4gem9uZS5pc011c2V1bVZpc2l0Wm9uZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgICAgICAgICB6b25lcy5tYXAoYXN5bmMgKHpvbmUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlzaXRvcnNNaXNzaW9ucyA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zQnlab25lQnlSb2xlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvbmUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9sZVN0YXR1cy5WSVNJVE9SX01VU0VVTSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wbGF0ZXMgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy50ZW1wbGF0ZVNlcnZpY2UuZ2V0VGVtcGxhdGVzQnlab25lKHpvbmUuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMgPSB0ZW1wbGF0ZXMuZmlsdGVyKCh0ZW1wbGF0ZSkgPT4gIXRlbXBsYXRlLmRlbGV0ZWRBdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlcyA9IHRlbXBsYXRlcy5zb3J0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEsIGIpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmV0dGllci9wcmV0dGllclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKGIuc3RhcnREYXRlVGltZSkgLSBuZXcgRGF0ZShhLnN0YXJ0RGF0ZVRpbWUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIHRlbXBsYXRlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWlzc2lvbnNGcm9tVGVtcGxhdGUgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3JzTWlzc2lvbnMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWlzKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLnRlbXBsYXRlTWlzc2lvbklEID09PSB0ZW1wbGF0ZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxsVGVtcGxhdGVNaXNzaW9uc01hcC5zZXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2lvbnNGcm9tVGVtcGxhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxsWm9uZVRlbXBsYXRlc01hcC5zZXQoem9uZSwgdGVtcGxhdGVzKTtcclxuICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8gc29ydCBsaXN0IGJ5IHpvbmUgbmFtZSBhbHBoYWJldGljYWxseVxyXG4gICAgICAgIHRoaXMuYWxsWm9uZVRlbXBsYXRlc01hcEZpbHRlcmVkID1cclxuICAgICAgICAgICAgbmV3IE1hcChbLi4udGhpcy5hbGxab25lVGVtcGxhdGVzTWFwLmVudHJpZXMoKV0uc29ydCgoYSwgYikgPT4gYVswXS5uYW1lLmxvY2FsZUNvbXBhcmUoYlswXS5uYW1lKSkpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldHVwVXNlcigpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRPcmcgPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRPcmdhbmlzYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNyZWF0ZVRlbXBsYXRlKCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uRGVsZXRlTWlzc2lvbihtaXNzaW9uOiBNaXNzaW9uKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5zb2Z0RGVsZXRlTWlzc2lvbihtaXNzaW9uLmlkKTtcclxuICAgICAgICB0aGlzLnNldFpvbmVzVGVtcGxhdGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25FZGl0VGVtcGxhdGUodGVtcGxhdGU6IFZpc2l0VGVtcGxhdGUpIHtcclxuICAgICAgICB0aGlzLmVkaXRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGVUb0VkaXQgPSB0ZW1wbGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBvblVwZGF0ZWRFdmVudChpc0FkZGVkOiBNaXNzaW9uW10pIHtcclxuICAgICAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlVG9FZGl0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmlzQWRkaW5nQmF0Y2ggPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNob3NlblRlbXBsYXRlID0gbnVsbDtcclxuICAgICAgICBpZiAoaXNBZGRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFpvbmVzVGVtcGxhdGVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uVXBkYXRlZFRlbXBsYXRlKHRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlVG9FZGl0ID0gbnVsbDtcclxuICAgICAgICBpZiAodGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudG9EdXBsaWNhdGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0ZW1wbGF0ZS5pZDtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudGVtcGxhdGVTZXJ2aWNlLmNyZWF0ZSh0ZW1wbGF0ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvRHVwbGljYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldFpvbmVzVGVtcGxhdGVzKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy50ZW1wbGF0ZVNlcnZpY2UudXBkYXRlKHRlbXBsYXRlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRab25lc1RlbXBsYXRlcygpO1xyXG4gICAgICAgICAgICAvLyB1cGRhdGUgcmVsYXRlZCBNaXNzaW9uc1xyXG4gICAgICAgICAgICBjb25zdCBtaXNzaW9uc0ZvclRlbXBsYXRlID1cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UuZ2V0TWlzc2lvbnNCeVRlbXBsYXRlKHRlbXBsYXRlLmlkKTtcclxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgICAgICBtaXNzaW9uc0ZvclRlbXBsYXRlLm1hcChhc3luYyAobWlzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pc3Npb25VcGRhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBtaXNzaW9uLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogdGVtcGxhdGUubGV2ZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZVRpbWU6IHRlbXBsYXRlLnN0YXJ0RGF0ZVRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZERhdGVUaW1lOiB0ZW1wbGF0ZS5lbmREYXRlVGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlOiB0ZW1wbGF0ZS5sb2NhbGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVJRDogdGVtcGxhdGUuem9uZUlELFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZUlEOiB0ZW1wbGF0ZS5zcGFjZUlELFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFnczogdGVtcGxhdGUuaGFzaHRhZ3MsXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnVwZGF0ZShtaXNzaW9uVXBkYXRlKTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25DcmVhdGVkVGVtcGxhdGUodGVtcGxhdGU6IFZpc2l0VGVtcGxhdGUpIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY3JlYXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnpvbmVJREZvck5ld1RlbXBsYXRlID0gbnVsbDtcclxuICAgICAgICBpZiAodGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy50ZW1wbGF0ZVNlcnZpY2UuY3JlYXRlKHRlbXBsYXRlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRab25lc1RlbXBsYXRlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBvblRvZ2dsZU1pc3Npb25zRm9yWm9uZSh6b25lSUQ6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLmRldGFpbHNGb3Jab25lcy5pbmNsdWRlcyh6b25lSUQpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kZXRhaWxzRm9yWm9uZXMuaW5kZXhPZih6b25lSUQpO1xyXG4gICAgICAgICAgICB0aGlzLmRldGFpbHNGb3Jab25lcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGV0YWlsc0ZvclpvbmVzLnB1c2goem9uZUlEKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25Ub2dnbGVUZW1wbGF0ZURldGFpbHModGVtcGxhdGUpIHtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlU2hvd2luZyA9XHJcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVTaG93aW5nID09PSB0ZW1wbGF0ZS5pZCA/IG51bGwgOiB0ZW1wbGF0ZS5pZDtcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZE5ld1RlbXBsYXRlVG9ab25lKHpvbmU6IFpvbmUpIHtcclxuICAgICAgICB0aGlzLnpvbmVJREZvck5ld1RlbXBsYXRlID0gem9uZS5pZDtcclxuICAgICAgICB0aGlzLmNyZWF0aW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkFyY2hpdmVUZW1wbGF0ZSh0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiY29uZmlybS5hcmNoaXZlVGVtcGxhdGVcIik7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pc3Npb25zVG9EZWxldGUgPSB0aGlzLmFsbFRlbXBsYXRlTWlzc2lvbnNNYXAuZ2V0KHRlbXBsYXRlLmlkKTtcclxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgICAgICBtaXNzaW9uc1RvRGVsZXRlLm1hcChhc3luYyAobWlzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2Uuc29mdERlbGV0ZU1pc3Npb24obWlzc2lvbi5pZCk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy50ZW1wbGF0ZVNlcnZpY2Uuc29mdERlbGV0ZSh0ZW1wbGF0ZS5pZCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Wm9uZXNUZW1wbGF0ZXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25HZW5lcmF0ZUJhdGNoKHRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgdGhpcy5jaG9zZW5UZW1wbGF0ZSA9IHRlbXBsYXRlO1xyXG4gICAgICAgIHRoaXMuaXNBZGRpbmdCYXRjaCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVDU1ZVc2Vycyh0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IG1pc3Npb24gb2YgdGhpcy5hbGxUZW1wbGF0ZU1pc3Npb25zTWFwLmdldCh0ZW1wbGF0ZS5pZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgdXNlciA9IG5ldyBQcm9maWxlRW50aXR5KG1pc3Npb24udXNlcik7XHJcbiAgICAgICAgICAgIGRhdGEucHVzaChbXHJcbiAgICAgICAgICAgICAgICB1c2VyLmVtYWlsLFxyXG4gICAgICAgICAgICAgICAgbWlzc2lvbi51c2VyLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgIG1pc3Npb24uem9uZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgbWlzc2lvbi5zcGFjZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgbWlzc2lvbi5zdGFydERhdGVUaW1lLFxyXG4gICAgICAgICAgICAgICAgbWlzc2lvbi5lbmREYXRlVGltZSxcclxuICAgICAgICAgICAgICAgIG1pc3Npb24ubGV2ZWwsXHJcbiAgICAgICAgICAgIF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblNlbmRJbnZpdGF0aW9uKHRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgIHRoaXMuYWxsVGVtcGxhdGVNaXNzaW9uc01hcFxyXG4gICAgICAgICAgICAgICAgLmdldCh0ZW1wbGF0ZS5pZClcclxuICAgICAgICAgICAgICAgIC5tYXAoYXN5bmMgKG1pc3Npb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWlzc2lvbi5lbWFpbFN0YXR1cyAhPT0gRW1haWxTdGF0dXMuU0VOVCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnVwZGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbWlzc2lvbi5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsU3RhdHVzOiBFbWFpbFN0YXR1cy5DUkVBVElPTl9UT19ERUxJVkVSLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU2VuZFVwZGF0ZSh0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICB0aGlzLmFsbFRlbXBsYXRlTWlzc2lvbnNNYXBcclxuICAgICAgICAgICAgICAgIC5nZXQodGVtcGxhdGUuaWQpXHJcbiAgICAgICAgICAgICAgICAubWFwKGFzeW5jIChtaXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS51cGRhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogbWlzc2lvbi5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWxTdGF0dXM6IEVtYWlsU3RhdHVzLlVQREFURV9UT19ERUxJVkVSLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkNhbmNlbFRlbXBsYXRlKHRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJjb25maXJtLmNhbmNlbFRlbXBsYXRlXCIpO1xyXG4gICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xyXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgICAgIHRoaXMuYWxsVGVtcGxhdGVNaXNzaW9uc01hcFxyXG4gICAgICAgICAgICAgICAgICAgIC5nZXQodGVtcGxhdGUuaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcChhc3luYyAobWlzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnVwZGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbWlzc2lvbi5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsU3RhdHVzOiBFbWFpbFN0YXR1cy5DQU5DRUxMQVRJT05fVE9fREVMSVZFUixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZWRBdDogRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5UmVzdWx0c1NlYXJjaEJhcihyZXN1bHRzKSB7XHJcbiAgICAgICAgdGhpcy5hbGxab25lVGVtcGxhdGVzTWFwRmlsdGVyZWQgPSByZXN1bHRzIHx8IHRoaXMuYWxsWm9uZVRlbXBsYXRlc01hcDtcclxuICAgIH1cclxuXHJcbiAgICBvbkRlbGV0ZVVzZXJzKG1pczogVmlzaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFRlbXBsYXRlVXNlcnMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IG1pc3Npb24gb2YgdGhpcy5hbGxUZW1wbGF0ZU1pc3Npb25zTWFwLmdldChtaXMuaWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRlbXBsYXRlVXNlcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBtaXNzaW9uLFxyXG4gICAgICAgICAgICAgICAgcHJvZmlsZTogbmV3IFByb2ZpbGVFbnRpdHkobWlzc2lvbi51c2VyKSxcclxuICAgICAgICAgICAgICAgIGNoZWNrZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMuYWxsVGVtcGxhdGVNaXNzaW9uc01hcC5nZXQobWlzLmlkKS5pbmRleE9mKG1pc3Npb24pLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5tb2RhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWxldGVzIG1pc3Npb24gb2YgdGhlIHVzZXIgYW5kIGNoZWNrcyBpZiBjYW4gaGFyZCBkZWxldGUgdGhlIFByb2ZpbGUgKG5vIG90aGVyIG1pc3Npb25zKVxyXG4gICAgICovXHJcbiAgICBhc3luYyBvbkRlbGV0ZUNob3NlbigpIHtcclxuICAgICAgICBjb25zdCBsaXN0VG9EZWxldGUgPSB0aGlzLmN1cnJlbnRUZW1wbGF0ZVVzZXJzLmZpbHRlcihcclxuICAgICAgICAgICAgKG9iamVjdCkgPT4gb2JqZWN0LmNoZWNrZWQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgbGlzdFRvRGVsZXRlLm1hcChhc3luYyAob2JqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnNvZnREZWxldGVNaXNzaW9uKG9iamVjdC5taXNzaW9uLmlkKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2Uuc29mdERlbGV0ZVVzZXIob2JqZWN0LnByb2ZpbGUuaWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYWxsVGVtcGxhdGVNaXNzaW9uc01hcFxyXG4gICAgICAgICAgICAgICAgICAgIC5nZXQob2JqZWN0Lm1pc3Npb24udGVtcGxhdGVNaXNzaW9uSUQpXHJcbiAgICAgICAgICAgICAgICAgICAgLnNwbGljZShvYmplY3QuaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMubW9kYWxSZWYuY2xvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkR1cGxpY2F0ZVRlbXBsYXRlKHRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlVG9FZGl0ID0gdGVtcGxhdGU7XHJcbiAgICAgICAgdGhpcy50b0R1cGxpY2F0ZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25DbGVhblRpbWVUZW1wbGF0ZSh0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMudGVtcGxhdGVTZXJ2aWNlLnVwZGF0ZSh7XHJcbiAgICAgICAgICAgIGlkOiB0ZW1wbGF0ZS5pZCxcclxuICAgICAgICAgICAgcmVhbEVuZGVkQXQ6IG51bGwsXHJcbiAgICAgICAgICAgIHJlYWxTdGFydGVkQXQ6IG51bGxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldFpvbmVzVGVtcGxhdGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG1pc3Npb24gc3RhdHVzIHRvIFNBVElTRkFDVElPTl9UT19ERUxJVkVSIGZvciB2aXNpdG9ycywgd2hvIGFzc2l0ZWQgdG8gbGl2ZSB2aXNpdC5cclxuICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSBWaXNpdFRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIG9uU2VuZFNhdGlzZmFjdGlvbih0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IG1pc3Npb25zQXNzaXN0ZWQgPSB0aGlzLm1pc3Npb25TZXJ2aWNlLmZpbHRlck1pc3Npb25zQXNzaXRlZFRvTGl2ZUZvclRlbXBsYXRlKHRlbXBsYXRlLFxyXG4gICAgICAgICAgICB0aGlzLmFsbFRlbXBsYXRlTWlzc2lvbnNNYXAuZ2V0KHRlbXBsYXRlLmlkKSk7XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgIG1pc3Npb25zQXNzaXN0ZWRcclxuICAgICAgICAgICAgICAgIC5tYXAoYXN5bmMgKG1pc3Npb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnVwZGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBtaXNzaW9uLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbWFpbFN0YXR1czogRW1haWxTdGF0dXMuU0FUSVNGQUNUSU9OX1RPX0RFTElWRVIsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJkYXNoYm9hcmQtdGFiXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWRhc2hib2FyZC10YWJcIj5cclxuICAgICAgICA8aDM+e3snTXVzZXVtIFZpc2l0b3JzJyB8IHRyYW5zbGF0ZX19PC9oMz5cclxuICAgICAgICA8IS0tIDxhcHAtc2VhcmNoLWJhciBbc2VhcmNoYWJsZV09XCJhbGxab25lVGVtcGxhdGVzTWFwXCIgb2JqZWN0VHlwZT1cIlRFTVBMQVRFXCJcclxuICAgICAgICAgICAgKHNlYXJjaEV2ZW50KT1cImFwcGx5UmVzdWx0c1NlYXJjaEJhcigkZXZlbnQpXCI+XHJcbiAgICAgICAgPC9hcHAtc2VhcmNoLWJhcj4gLS0+XHJcbiAgICAgICAgPGhyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04IGNvbC1sZy03XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWwtMCBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJoZWFkZXItc21hbGxcIj57eydJdGluZXJhcmllcycgfCB0cmFuc2xhdGV9fTwvaDQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1sLTAgbWItMlwiICpuZ0lmPVwiIWVkaXRpbmcgJiYgIWNyZWF0aW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1sLTMgYWRkLWJ1dHRvblwiIChjbGljayk9XCJvbkNyZWF0ZVRlbXBsYXRlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibmV3LW11c2V1bS10ZW1wbGF0ZS1idG5cIj5cclxuICAgICAgICAgICAgICAgICAgICB7eydDcmVhdGUgdGVtcGxhdGUgZm9yIG5ldyBpdGluZXJhcnknIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1sb2FkZXI+PC9saWItbG9hZGVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFlZGl0aW5nICYmICFjcmVhdGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCIgZGF0YS10ZXN0aWQ9XCJvcGVuLW11c2V1bS16b25lLWJ0blwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiICpuZ0Zvcj1cImxldCBwYWlyIG9mIGFsbFpvbmVUZW1wbGF0ZXNNYXBGaWx0ZXJlZCB8IGtleXZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoND57e3BhaXIua2V5Lm5hbWV9fSA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbVwiPiAtIHt7cGFpci5rZXkuc3BhY2UubmFtZX19PC9zcGFuPiA8L2g0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ub2dnbGVNaXNzaW9uc0ZvclpvbmUocGFpci5rZXkuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFpci52YWx1ZS5sZW5ndGggPD0gMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7cGFpci52YWx1ZS5sZW5ndGh9fSB7eyd2aXNpdCB0ZW1wbGF0ZSBmb3VuZCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFpci52YWx1ZS5sZW5ndGggPiAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3twYWlyLnZhbHVlLmxlbmd0aH19IHt7J3Zpc2l0IHRlbXBsYXRlcyBmb3VuZCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWNoZXZyb24gW25nQ2xhc3NdPVwiW3BhaXIua2V5Lm5hbWVdXCIgIFtjb25kaXRpb25TaG93aW5nXT1cImRldGFpbHNGb3Jab25lcy5pbmNsdWRlcyhwYWlyLmtleS5pZClcIj48L2xpYi1jaGV2cm9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkZXRhaWxzRm9yWm9uZXMuaW5jbHVkZXMocGFpci5rZXkuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG10LTMgbWItMyBtbC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25BZGROZXdUZW1wbGF0ZVRvWm9uZShwYWlyLmtleSlcIj57eydBZGQgbmV3IHRlbXBsYXRlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY29udGFpbmVyLWZsdWlkIGxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiICpuZ0Zvcj1cImxldCB0ZW1wbGF0ZSBvZiBwYWlyLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblRvZ2dsZVRlbXBsYXRlRGV0YWlscyh0ZW1wbGF0ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT57e3RlbXBsYXRlLnRpdGxlfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1jaGV2cm9uIGRhdGEtdGVzdGlkPVwib3Blbi1tdXNldW0tdGVtcGxhdGUtYnRuXCIgW2NvbmRpdGlvblNob3dpbmddPVwidGVtcGxhdGVTaG93aW5nID09PSB0ZW1wbGF0ZS5pZFwiPjwvbGliLWNoZXZyb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGVtcGxhdGVTaG93aW5nID09PSB0ZW1wbGF0ZS5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snRGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlIH19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZW1wbGF0ZS5kZXNjcmlwdGlvbn19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydMYW5ndWFnZScgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRlbXBsYXRlLmxvY2FsZSA/IHRlbXBsYXRlLmxvY2FsZSA6ICgnTm90IGFwcGxpY2FibGUnIHwgdHJhbnNsYXRlKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRlbXBsYXRlLmhhc2h0YWdzICYmIHRlbXBsYXRlLmhhc2h0YWdzLmxlbmd0aD4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydIYXNodGFncycgfCB0cmFuc2xhdGV9fTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwia2V5d29yZHNEaXNwbGF5IG5vLWJvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleXdvcmRzZGlzcGxheUNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0ZW1wbGF0ZS5oYXNodGFncy5sZW5ndGg+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJrZXl3b3Jkc0l0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiB0ZW1wbGF0ZS5oYXNodGFnc1wiPnt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWcgfCBoYXNodGFnRnJvbUlEIHwgYXN5bmMgfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBY2Nlc3MgbGV2ZWwnIHwgdHJhbnNsYXRlIH19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZW1wbGF0ZS5sZXZlbH19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydQbGFubmVkIGF0JyB8IHRyYW5zbGF0ZSB9fSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRlbXBsYXRlLnN0YXJ0RGF0ZVRpbWUgPyAodGVtcGxhdGUuc3RhcnREYXRlVGltZSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVEYXRlU3RyaW5nOlwiZGF5X3RpbWVfem9uZVwiIHwgYXN5bmMpIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJObyBkYXRhXCIgfCB0cmFuc2xhdGUgfX0gLVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZW1wbGF0ZS5lbmREYXRlVGltZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wbGF0ZS5lbmREYXRlVGltZSB8IHRpbWVEYXRlU3RyaW5nOlwiZGF5X3RpbWVfem9uZVwiIHwgYXN5bmMpIDogXCJOb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhXCIgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0VmZmVjdGl2ZSBzdGFydC9lbmQgdGltZSAnIHwgdHJhbnNsYXRlIH19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZW1wbGF0ZS5yZWFsU3RhcnRlZEF0ID8gKHRlbXBsYXRlLnJlYWxTdGFydGVkQXQgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lRGF0ZVN0cmluZzpcImRheV90aW1lX3pvbmVcIiB8IGFzeW5jKSA6ICgnTm8gZGF0YScgfCB0cmFuc2xhdGUpfX0gL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZW1wbGF0ZS5yZWFsRW5kZWRBdCA/ICh0ZW1wbGF0ZS5yZWFsRW5kZWRBdCB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVEYXRlU3RyaW5nOlwiZGF5X3RpbWVfem9uZVwiIHwgYXN5bmMpIDogKCdObyBkYXRhJyB8IHRyYW5zbGF0ZSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhbGxUZW1wbGF0ZU1pc3Npb25zTWFwLmdldCh0ZW1wbGF0ZS5pZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snVmlzaXRvcnMgY3JlYXRlZCcgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTp7e2FsbFRlbXBsYXRlTWlzc2lvbnNNYXAuZ2V0KHRlbXBsYXRlLmlkKS5sZW5ndGh9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWNzdi1leHBvcnQgW2hlYWRlcnNdPVwiY3N2SGVhZGVyc1wiIFt0aXRsZV09XCInVXNlcnMnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkxhYmVsPVwiRG93bmxvYWQgdXNlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd3NJbnB1dF09XCJnZW5lcmF0ZUNTVlVzZXJzKHRlbXBsYXRlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1jc3YtZXhwb3J0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWlubGluZS1ibG9jayBtci0yIGFjdGlvbi1idXR0b25cIiBuZ2JEcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbXlEcm9wPVwibmdiRHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGFiZWwtZmlsZSByb3VuZGVkLXBpbGxcIiBpZD1cImRyb3Bkb3duTWFudWFsXCIgZGF0YS10ZXN0aWQ9XCJvcGVuLWRyb3Bkb3duTWFudWFsLW11c2V1bS1idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiRHJvcGRvd25Ub2dnbGU+e3snTWFuYWdlIHVzZXJzJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bk1hbnVhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25HZW5lcmF0ZUJhdGNoKHRlbXBsYXRlKVwiIG5nYkRyb3Bkb3duSXRlbSBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLXRlbXBsYXRlLWJ0blwiPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydDcmVhdGUgdXNlcnMgZnJvbSB0aGlzIHRlbXBsYXRlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJvblNlbmRJbnZpdGF0aW9uKHRlbXBsYXRlKVwiIG5nYkRyb3Bkb3duSXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydTZW5kIGludml0YXRpb24gdG8gYWxsIHVzZXJzJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uU2VuZFVwZGF0ZSh0ZW1wbGF0ZSlcIiBuZ2JEcm9wZG93bkl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snU2VuZCB1cGRhdGUgdG8gYWxsIHVzZXJzJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uU2VuZFNhdGlzZmFjdGlvbih0ZW1wbGF0ZSlcIiBuZ2JEcm9wZG93bkl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snU2VuZCBzYXRpc2ZhY3Rpb24gbWFpbCB0byBhbGwgdXNlcnMnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25EZWxldGVVc2Vycyh0ZW1wbGF0ZSlcIiBuZ2JEcm9wZG93bkl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snUmVtb3ZlIHVzZXJzJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtaW5saW5lLWJsb2NrIG1yLTIgYWN0aW9uLWJ1dHRvblwiIG5nYkRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNteURyb3AyPVwibmdiRHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGFiZWwtZmlsZSByb3VuZGVkLXBpbGxcIiBpZD1cImRyb3Bkb3duMlwiIGRhdGEtdGVzdGlkPVwib3Blbi1kcm9wZG93bjItbXVzZXVtLXRlbXBsYXRlLWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JEcm9wZG93blRvZ2dsZT57eydNYW5hZ2UgdGVtcGxhdGUnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25FZGl0VGVtcGxhdGUodGVtcGxhdGUpXCIgbmdiRHJvcGRvd25JdGVtIGRhdGEtdGVzdGlkPVwiZWRpdC1tdXNldW0tdGVtcGxhdGUtYnRuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snRWRpdCB0ZW1wbGF0ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25DbGVhblRpbWVUZW1wbGF0ZSh0ZW1wbGF0ZSlcIiBuZ2JEcm9wZG93bkl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snQ2xlYW4gZWZmZWN0aXZlIHRpbWVzJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uQXJjaGl2ZVRlbXBsYXRlKHRlbXBsYXRlKVwiIG5nYkRyb3Bkb3duSXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydBcmNoaXZlIHRlbXBsYXRlJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uQ2FuY2VsVGVtcGxhdGUodGVtcGxhdGUpXCIgbmdiRHJvcGRvd25JdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0NhbmNlbCB2aXNpdCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJvbkR1cGxpY2F0ZVRlbXBsYXRlKHRlbXBsYXRlKVwiIG5nYkRyb3Bkb3duSXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydEdXBsaWNhdGUnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGwgbXItMiBtbC1hdXRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25FZGl0KG1pcylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydFZGl0JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtdC0zIG1iLTMgbWwtYXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQXJjaGl2ZVRlbXBsYXRlKG1pcylcIj57eydBcmNoaXZlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImVkaXRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxsaWItdGVtcGxhdGUgW2VkaXRUZW1wbGF0ZV09XCJ0ZW1wbGF0ZVRvRWRpdFwiIFtjdXJyZW50T3JnXT1cImN1cnJlbnRPcmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICh1cGRhdGVkVGVtcGxhdGUpPVwib25VcGRhdGVkVGVtcGxhdGUoJGV2ZW50KVwiPjwvbGliLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNyZWF0aW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8bGliLXRlbXBsYXRlIFtjdXJyZW50T3JnXT1cImN1cnJlbnRPcmdcIiBbem9uZUlEXT1cInpvbmVJREZvck5ld1RlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAoY3JlYXRlZFRlbXBsYXRlKT1cIm9uQ3JlYXRlZFRlbXBsYXRlKCRldmVudClcIj48L2xpYi10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IGNvbC1sZy01XCIgKm5nSWY9XCJpc0FkZGluZ0JhdGNoXCI+XHJcbiAgICAgICAgICAgIDxsaWItY3JlYXRlLWJhdGNoIFt0ZW1wbGF0ZV09XCJjaG9zZW5UZW1wbGF0ZVwiIChjcmVhdGVkTWlzc2lvbnMpPVwib25VcGRhdGVkRXZlbnQoJGV2ZW50KVwiPjwvbGliLWNyZWF0ZS1iYXRjaD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlbGV0ZVVzZXJzIGxldC1tb2RhbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cIm1vZGFsLWJhc2ljLXRpdGxlXCI+e3tcIkRlbGV0ZSB1c2Vyc1wiIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsUmVmLmNsb3NlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJwYWRkaW5nOiAwIDEuMjVyZW07XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCBsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiICpuZ0Zvcj1cImxldCBvYmplY3Qgb2YgY3VycmVudFRlbXBsYXRlVXNlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJvYmplY3QuY2hlY2tlZFwiPiB7e29iamVjdC5wcm9maWxlLmVtYWlsfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiBzdHlsZT1cInBhZGRpbmc6IDEuMjVyZW07XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbXItNFwiIChjbGljayk9XCJvbkRlbGV0ZUNob3NlbigpXCI+e3tcIkFwcGx5XCIgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwibW9kYWxSZWYuY2xvc2UoKVwiPnt7XCJDYW5jZWxcIiB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==