tango-app-ui-manage-users 3.7.1-alpha.0-test3 → 3.7.1-alpha.0-test4

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.
@@ -65,7 +65,7 @@ export class AddUsersComponent {
65
65
  ]
66
66
  },
67
67
  {
68
- featureName: "FootfallDirectory",
68
+ featureName: "Tickets",
69
69
  modules: [
70
70
  {
71
71
  name: 'creator', isAdd: true, isEdit: true,
@@ -118,7 +118,6 @@ export class AddUsersComponent {
118
118
  return decrypted.toString(CryptoJS.enc.Utf8);
119
119
  }
120
120
  ngOnInit() {
121
- console.log('AddUsersComponent initialized with type:', this.type, 'and user:', this.user);
122
121
  let data;
123
122
  if ("header-filters" in localStorage) {
124
123
  data = JSON.parse(localStorage.getItem('header-filters') || '');
@@ -221,7 +220,6 @@ export class AddUsersComponent {
221
220
  next: (res) => {
222
221
  if (res && res.code == 200 && res.data.result) {
223
222
  const userData = res.data.result;
224
- console.log('userData', userData);
225
223
  const isViewMode = this.type === 'view';
226
224
  const isSuperadmin = this.user_data?.role === 'superadmin';
227
225
  const email = (isViewMode && !isSuperadmin) ? this.maskEmail(userData.email) : userData.email;
@@ -283,7 +281,6 @@ export class AddUsersComponent {
283
281
  }
284
282
  }
285
283
  initUserForm() {
286
- console.log('init form called');
287
284
  this.userForm = this.fb.group({
288
285
  userName: ["", Validators.required],
289
286
  email: ["", Validators.compose([Validators.required,
@@ -309,7 +306,6 @@ export class AddUsersComponent {
309
306
  this.getUserPermissionData("user", this.user_data.userType);
310
307
  }
311
308
  populatePermission(permissionsData) {
312
- console.log('populatePermission called', permissionsData);
313
309
  const permissions = this.userForm.get("rolespermission");
314
310
  permissions.clear(); // Clear existing entries
315
311
  permissionsData.forEach((rolespermission) => {
@@ -333,7 +329,6 @@ export class AddUsersComponent {
333
329
  permissions.updateValueAndValidity();
334
330
  }
335
331
  getPermissions() {
336
- // console.log(this.userForm.value)
337
332
  return this.userForm.get("rolespermission");
338
333
  }
339
334
  getFeaturePermissions(rolespermission) {
@@ -659,11 +654,11 @@ export class AddUsersComponent {
659
654
  event.preventDefault();
660
655
  }
661
656
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddUsersComponent, deps: [{ token: i1.ManageUsersService }, { token: i0.ChangeDetectorRef }, { token: i2.NgbActiveModal }, { token: i3.FormBuilder }, { token: i4.UserService }, { token: i5.ToastService }, { token: i6.GlobalStateService }, { token: i2.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
662
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AddUsersComponent, selector: "lib-add-users", inputs: { type: "type", user: "user", userType: "userType", data: "data" }, ngImport: i0, template: "<div class=\"card pt-0 pb-3 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 d-flex\">\r\n <div class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/add-store-icon.svg\">\r\n </div>\r\n \r\n </div>\r\n <div class=\"row w-100\">\r\n <div *ngIf=\"type!=='view' && type!=='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Add\r\n User</a>\r\n <div class=\"sub-title\">Please add your user details</div>\r\n </div>\r\n <div *ngIf=\"type==='view' && type !=='edit'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">View your user details</div>\r\n </div>\r\n <ng-container *ngIf=\"operationType!=='view'\">\r\n <div *ngIf=\"(gs.userAccess |async)?.Global_User_isEdit && type ==='view' && type !=='edit' && user?.role !== 'superadmin' && user?.isActive === true\" class=\"col-md-3 text-end px-0\" (click)=\"editUser()\">\r\n <button class=\"btn btn-outline\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_3833_85908)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_3833_85908\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></button>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"type==='edit' && type !=='view'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">Edit your user details</div>\r\n </div>\r\n <div class=\"w-100 h-0px scroll\">\r\n <div class=\"mt-5\" *ngIf=\"userForm\">\r\n <form [formGroup]=\"userForm\" novalidate=\"novalidate\" (keydown.enter)=\"preventClose($event)\" class=\"\">\r\n <div class=\"row px-0 me-3\">\r\n <!-- User Name Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"username\" class=\"form-label\">User Name <span class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"username\" formControlName=\"userName\" autocomplete=\"off\" (keypress)=\"omitSpecialChar($event)\" (paste)=\"omitSpecialCharPaste($event)\">\r\n <div *ngIf=\"userForm.get('userName')?.invalid && (userForm.get('userName')?.dirty)\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('userName')?.errors?.['required']\">User Name is required.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Email Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"email\" class=\"form-label\">Email <span class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control\" id=\"email\" formControlName=\"email\" autocomplete=\"off\">\r\n <div *ngIf=\"userForm.get('email')?.invalid && userForm.get('email')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('email')?.errors?.['required']\">Email is required.</small>\r\n <small *ngIf=\"userForm.get('email')?.errors?.['pattern']\">Invalid email format.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Contact Number Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"contact\" class=\"form-label\">Contact Number <span class=\"alert-required text-danger\">*</span></label>\r\n <div class=\"row\">\r\n <div class=\"col-md-12 col-lg-4 col-xl-4\">\r\n <select class=\"form-select ps-3 pe-8\" id=\"inputGroupSelect01\" formControlName=\"countryCode\">\r\n <option *ngFor=\"let country of countryList\" [value]=\"country.phonecode\">\r\n {{country.name}} ({{country.phonecode}})\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-8 col-xl-8\">\r\n <input type=\"text\" class=\"form-control\" (keypress)=\"omit_special_char($event)\"\r\n id=\"mobileNumber\" autocomplete=\"off\" formControlName=\"mobileNumber\" minlength=\"8\" maxlength=\"13\">\r\n <div *ngIf=\"userForm.get('mobileNumber')?.invalid && userForm.get('mobileNumber')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['required']\">Contact Number is required.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['minlength']\">Contact Number must be at least 8 digits.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['maxlength']\">Contact Number cannot exceed 13 digits.</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Role Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"role\" class=\"form-label\">Role <span class=\"alert-required text-danger\">*</span></label>\r\n <select class=\"form-select\" formControlName=\"role\" (change)=\"onRoleChange(userForm.get('role')?.value)\">\r\n <option value=\"admin\">Admin</option>\r\n <option value=\"user\">User</option>\r\n </select>\r\n <div *ngIf=\"userForm.get('role')?.invalid && userForm.get('role')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('role')?.errors?.['required']\">Role is required.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Add to Team Field -->\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\" *ngIf=\"this.userType !=='tango'\">\r\n <label for=\"teamLead\" class=\"form-label teams-title\">Add to a team</label>\r\n <team-select [items]=\"teamList\" [multi]=\"true\" [searchField]=\"'teamName'\" [idField]=\"'_id'\" [disabled]=\"type === 'view' ? true : false\"\r\n (selected)=\"onStoreSelect($event)\" [selectedValues]=\"selectedUser\"></team-select>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"userForm.get('role')?.value === 'admin'\">\r\n <h3 class=\"teams-title\" *ngIf=\"getPermissions().length\">Access for Admin</h3>\r\n <ng-container *ngIf=\"getPermissions().length\">\r\n <ng-container formArrayName=\"rolespermission\">\r\n <ng-container *ngFor=\"let rolespermission of getPermissions().controls; let i = index\" [formGroupName]=\"i\">\r\n <div class=\"table-responsive my-2 me-3\">\r\n <div class=\"row w-100\">\r\n <div class=\"title-header mt-4 ms-2\">\r\n {{ camelCaseToText(rolespermission.get('featureName')?.value) }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"rolespermission.get('modules')\" formArrayName=\"modules\">\r\n <ng-container *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\" [formGroupName]=\"j\">\r\n <table class=\"w-100\">\r\n <tbody>\r\n <tr *ngIf=\"rolespermission.get('featureName')?.value !== 'TangoAdmin'\">\r\n <td class=\"w-50\">{{ camelCaseToText(modules.get('name')?.value) }}</td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input type=\"checkbox\" formControlName=\"isAdd\" class=\"cursor-pointer\" (change)=\"handleViewChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Add</label>\r\n </div>\r\n </td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input formControlName=\"isEdit\" type=\"checkbox\" class=\"cursor-pointer\" (change)=\"handleEditChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Edit</label>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n <div *ngIf=\"rolespermission.get('featureName')?.value === 'TangoAdmin'\" class=\"row w-100 text-nowrap\">\r\n <div class=\"col-md-4\" *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\" [formGroupName]=\"j\">\r\n <div class=\"d-inline-flex mt-3\">\r\n <input type=\"checkbox\" class=\"cursor-pointer\" formControlName=\"isEdit\">\r\n <label class=\"global-label mb-5 mx-2 mt-1\" style=\"text-wrap:nowrap\">\r\n {{ camelCaseToText(modules.get('name')?.value) }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n \r\n </div>\r\n <div *ngIf=\"type!=='view'\" class=\"d-flex my-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\"\r\n (click)=\"onSubmit()\" [disabled]=\"userForm.invalid || type === 'view'\">Submit</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>", styles: [".scroll{overflow-y:auto;overflow-x:hidden}.title{color:var(--Gray-900, #101828)!important;font-size:18px!important;font-weight:600;line-height:28px}.sub-title{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.teams-title{color:var(--Black, #101828)!important;font-size:18px!important;font-weight:600!important;line-height:28px}.title-header{border-radius:6px!important;border-bottom:2px solid var(--Gray-200, #EAECF0)!important;background:#f2f4f7!important;box-shadow:0 4px 10px #0000000d!important;color:var(--Black, #101828)!important;font-size:20px!important;font-weight:600;line-height:30px;padding:8px 16px}input[type=checkbox]{width:18px!important;height:18px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:0;padding-top:12px;padding-right:6px}.global-label{color:var(--Gray-700, #344054)!important;font-size:16px!important;font-weight:500;line-height:24px}.w-25{width:40%!important}td{color:var(--Black, #101828)!important;font-size:16px!important;font-weight:500!important;line-height:24px}tr,.add-team{border-bottom:1px solid var(--Gray-200, #EAECF0)!important}input[disabled]{pointer-events:none;opacity:.5}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i8.CustomSelectComponent, selector: "team-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected", "deselected", "deselectedAll"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }] });
657
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AddUsersComponent, selector: "lib-add-users", inputs: { type: "type", user: "user", userType: "userType", data: "data" }, ngImport: i0, template: "<div class=\"card pt-0 pb-3 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 d-flex\">\r\n <div class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/add-store-icon.svg\">\r\n </div>\r\n \r\n </div>\r\n <div class=\"row w-100\">\r\n <div *ngIf=\"type!=='view' && type!=='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Add\r\n User</a>\r\n <div class=\"sub-title\">Please add your user details</div>\r\n </div>\r\n <div *ngIf=\"type==='view' && type !=='edit'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">View your user details</div>\r\n </div>\r\n <ng-container *ngIf=\"operationType!=='view'\">\r\n <div *ngIf=\"(gs.userAccess |async)?.Global_User_isEdit && type ==='view' && type !=='edit' && user?.role !== 'superadmin' && user?.isActive === true\" class=\"col-md-3 text-end px-0\" (click)=\"editUser()\">\r\n <button class=\"btn btn-outline\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_3833_85908)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_3833_85908\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></button>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"type==='edit' && type !=='view'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">Edit your user details</div>\r\n </div>\r\n <div class=\"w-100 h-0px scroll\">\r\n <div class=\"mt-5\" *ngIf=\"userForm\">\r\n <form [formGroup]=\"userForm\" novalidate=\"novalidate\" (keydown.enter)=\"preventClose($event)\" class=\"\">\r\n <div class=\"row px-0 me-3\">\r\n <!-- User Name Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"username\" class=\"form-label\">User Name <span class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"username\" formControlName=\"userName\" autocomplete=\"off\" (keypress)=\"omitSpecialChar($event)\" (paste)=\"omitSpecialCharPaste($event)\">\r\n <div *ngIf=\"userForm.get('userName')?.invalid && (userForm.get('userName')?.dirty)\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('userName')?.errors?.['required']\">User Name is required.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Email Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"email\" class=\"form-label\">Email <span class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control\" id=\"email\" formControlName=\"email\" autocomplete=\"off\">\r\n <div *ngIf=\"userForm.get('email')?.invalid && userForm.get('email')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('email')?.errors?.['required']\">Email is required.</small>\r\n <small *ngIf=\"userForm.get('email')?.errors?.['pattern']\">Invalid email format.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Contact Number Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"contact\" class=\"form-label\">Contact Number <span class=\"alert-required text-danger\">*</span></label>\r\n <div class=\"row\">\r\n <div class=\"col-md-12 col-lg-4 col-xl-4\">\r\n <select class=\"form-select ps-3 pe-8\" id=\"inputGroupSelect01\" formControlName=\"countryCode\">\r\n <option *ngFor=\"let country of countryList\" [value]=\"country.phonecode\">\r\n {{country.name}} ({{country.phonecode}})\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-8 col-xl-8\">\r\n <input type=\"text\" class=\"form-control\" (keypress)=\"omit_special_char($event)\"\r\n id=\"mobileNumber\" autocomplete=\"off\" formControlName=\"mobileNumber\" minlength=\"8\" maxlength=\"13\">\r\n <div *ngIf=\"userForm.get('mobileNumber')?.invalid && userForm.get('mobileNumber')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['required']\">Contact Number is required.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['minlength']\">Contact Number must be at least 8 digits.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['maxlength']\">Contact Number cannot exceed 13 digits.</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Role Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"role\" class=\"form-label\">Role <span class=\"alert-required text-danger\">*</span></label>\r\n <select class=\"form-select\" formControlName=\"role\" (change)=\"onRoleChange(userForm.get('role')?.value)\">\r\n <option value=\"admin\">Admin</option>\r\n <option value=\"user\">User</option>\r\n </select>\r\n <div *ngIf=\"userForm.get('role')?.invalid && userForm.get('role')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('role')?.errors?.['required']\">Role is required.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Add to Team Field -->\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\" *ngIf=\"this.userType !=='tango'\">\r\n <label for=\"teamLead\" class=\"form-label teams-title\">Add to a team</label>\r\n <team-select [items]=\"teamList\" [multi]=\"true\" [searchField]=\"'teamName'\" [idField]=\"'_id'\" [disabled]=\"type === 'view' ? true : false\"\r\n (selected)=\"onStoreSelect($event)\" [selectedValues]=\"selectedUser\"></team-select>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"userForm.get('role')?.value === 'admin'\">\r\n\r\n <h3 class=\"teams-title\" *ngIf=\"getPermissions().length\">Access for Admin</h3>\r\n <ng-container *ngIf=\"getPermissions().length\">\r\n <ng-container formArrayName=\"rolespermission\">\r\n <ng-container *ngFor=\"let rolespermission of getPermissions().controls; let i = index\" [formGroupName]=\"i\">\r\n <div class=\"table-responsive my-2 me-3\">\r\n <div class=\"row w-100\">\r\n <div class=\"title-header mt-4 ms-2\">\r\n {{ camelCaseToText(rolespermission.get('featureName')?.value) }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"rolespermission.get('modules')\" formArrayName=\"modules\">\r\n <ng-container *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\" [formGroupName]=\"j\">\r\n <table class=\"w-100\">\r\n <tbody>\r\n <tr *ngIf=\"rolespermission.get('featureName')?.value !== 'TangoAdmin'\">\r\n <td class=\"w-50\">{{ camelCaseToText(modules.get('name')?.value) }}</td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input type=\"checkbox\" formControlName=\"isAdd\" class=\"cursor-pointer\" (change)=\"handleViewChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Add</label>\r\n </div>\r\n </td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input formControlName=\"isEdit\" type=\"checkbox\" class=\"cursor-pointer\" (change)=\"handleEditChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Edit</label>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n <div *ngIf=\"rolespermission.get('featureName')?.value === 'TangoAdmin'\" class=\"row w-100 text-nowrap\">\r\n <div class=\"col-md-4\" *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\" [formGroupName]=\"j\">\r\n <div class=\"d-inline-flex mt-3\">\r\n <input type=\"checkbox\" class=\"cursor-pointer\" formControlName=\"isEdit\">\r\n <label class=\"global-label mb-5 mx-2 mt-1\" style=\"text-wrap:nowrap\">\r\n {{ camelCaseToText(modules.get('name')?.value) }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n \r\n </div>\r\n <div *ngIf=\"type!=='view'\" class=\"d-flex my-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\"\r\n (click)=\"onSubmit()\" [disabled]=\"userForm.invalid || type === 'view'\">Submit</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>", styles: [".scroll{overflow-y:auto;overflow-x:hidden}.title{color:var(--Gray-900, #101828)!important;font-size:18px!important;font-weight:600;line-height:28px}.sub-title{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.teams-title{color:var(--Black, #101828)!important;font-size:18px!important;font-weight:600!important;line-height:28px}.title-header{border-radius:6px!important;border-bottom:2px solid var(--Gray-200, #EAECF0)!important;background:#f2f4f7!important;box-shadow:0 4px 10px #0000000d!important;color:var(--Black, #101828)!important;font-size:20px!important;font-weight:600;line-height:30px;padding:8px 16px}input[type=checkbox]{width:18px!important;height:18px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:0;padding-top:12px;padding-right:6px}.global-label{color:var(--Gray-700, #344054)!important;font-size:16px!important;font-weight:500;line-height:24px}.w-25{width:40%!important}td{color:var(--Black, #101828)!important;font-size:16px!important;font-weight:500!important;line-height:24px}tr,.add-team{border-bottom:1px solid var(--Gray-200, #EAECF0)!important}input[disabled]{pointer-events:none;opacity:.5}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i8.CustomSelectComponent, selector: "team-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected", "deselected", "deselectedAll"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }] });
663
658
  }
664
659
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddUsersComponent, decorators: [{
665
660
  type: Component,
666
- args: [{ selector: 'lib-add-users', template: "<div class=\"card pt-0 pb-3 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 d-flex\">\r\n <div class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/add-store-icon.svg\">\r\n </div>\r\n \r\n </div>\r\n <div class=\"row w-100\">\r\n <div *ngIf=\"type!=='view' && type!=='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Add\r\n User</a>\r\n <div class=\"sub-title\">Please add your user details</div>\r\n </div>\r\n <div *ngIf=\"type==='view' && type !=='edit'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">View your user details</div>\r\n </div>\r\n <ng-container *ngIf=\"operationType!=='view'\">\r\n <div *ngIf=\"(gs.userAccess |async)?.Global_User_isEdit && type ==='view' && type !=='edit' && user?.role !== 'superadmin' && user?.isActive === true\" class=\"col-md-3 text-end px-0\" (click)=\"editUser()\">\r\n <button class=\"btn btn-outline\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_3833_85908)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_3833_85908\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></button>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"type==='edit' && type !=='view'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">Edit your user details</div>\r\n </div>\r\n <div class=\"w-100 h-0px scroll\">\r\n <div class=\"mt-5\" *ngIf=\"userForm\">\r\n <form [formGroup]=\"userForm\" novalidate=\"novalidate\" (keydown.enter)=\"preventClose($event)\" class=\"\">\r\n <div class=\"row px-0 me-3\">\r\n <!-- User Name Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"username\" class=\"form-label\">User Name <span class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"username\" formControlName=\"userName\" autocomplete=\"off\" (keypress)=\"omitSpecialChar($event)\" (paste)=\"omitSpecialCharPaste($event)\">\r\n <div *ngIf=\"userForm.get('userName')?.invalid && (userForm.get('userName')?.dirty)\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('userName')?.errors?.['required']\">User Name is required.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Email Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"email\" class=\"form-label\">Email <span class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control\" id=\"email\" formControlName=\"email\" autocomplete=\"off\">\r\n <div *ngIf=\"userForm.get('email')?.invalid && userForm.get('email')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('email')?.errors?.['required']\">Email is required.</small>\r\n <small *ngIf=\"userForm.get('email')?.errors?.['pattern']\">Invalid email format.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Contact Number Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"contact\" class=\"form-label\">Contact Number <span class=\"alert-required text-danger\">*</span></label>\r\n <div class=\"row\">\r\n <div class=\"col-md-12 col-lg-4 col-xl-4\">\r\n <select class=\"form-select ps-3 pe-8\" id=\"inputGroupSelect01\" formControlName=\"countryCode\">\r\n <option *ngFor=\"let country of countryList\" [value]=\"country.phonecode\">\r\n {{country.name}} ({{country.phonecode}})\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-8 col-xl-8\">\r\n <input type=\"text\" class=\"form-control\" (keypress)=\"omit_special_char($event)\"\r\n id=\"mobileNumber\" autocomplete=\"off\" formControlName=\"mobileNumber\" minlength=\"8\" maxlength=\"13\">\r\n <div *ngIf=\"userForm.get('mobileNumber')?.invalid && userForm.get('mobileNumber')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['required']\">Contact Number is required.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['minlength']\">Contact Number must be at least 8 digits.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['maxlength']\">Contact Number cannot exceed 13 digits.</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Role Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"role\" class=\"form-label\">Role <span class=\"alert-required text-danger\">*</span></label>\r\n <select class=\"form-select\" formControlName=\"role\" (change)=\"onRoleChange(userForm.get('role')?.value)\">\r\n <option value=\"admin\">Admin</option>\r\n <option value=\"user\">User</option>\r\n </select>\r\n <div *ngIf=\"userForm.get('role')?.invalid && userForm.get('role')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('role')?.errors?.['required']\">Role is required.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Add to Team Field -->\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\" *ngIf=\"this.userType !=='tango'\">\r\n <label for=\"teamLead\" class=\"form-label teams-title\">Add to a team</label>\r\n <team-select [items]=\"teamList\" [multi]=\"true\" [searchField]=\"'teamName'\" [idField]=\"'_id'\" [disabled]=\"type === 'view' ? true : false\"\r\n (selected)=\"onStoreSelect($event)\" [selectedValues]=\"selectedUser\"></team-select>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"userForm.get('role')?.value === 'admin'\">\r\n <h3 class=\"teams-title\" *ngIf=\"getPermissions().length\">Access for Admin</h3>\r\n <ng-container *ngIf=\"getPermissions().length\">\r\n <ng-container formArrayName=\"rolespermission\">\r\n <ng-container *ngFor=\"let rolespermission of getPermissions().controls; let i = index\" [formGroupName]=\"i\">\r\n <div class=\"table-responsive my-2 me-3\">\r\n <div class=\"row w-100\">\r\n <div class=\"title-header mt-4 ms-2\">\r\n {{ camelCaseToText(rolespermission.get('featureName')?.value) }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"rolespermission.get('modules')\" formArrayName=\"modules\">\r\n <ng-container *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\" [formGroupName]=\"j\">\r\n <table class=\"w-100\">\r\n <tbody>\r\n <tr *ngIf=\"rolespermission.get('featureName')?.value !== 'TangoAdmin'\">\r\n <td class=\"w-50\">{{ camelCaseToText(modules.get('name')?.value) }}</td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input type=\"checkbox\" formControlName=\"isAdd\" class=\"cursor-pointer\" (change)=\"handleViewChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Add</label>\r\n </div>\r\n </td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input formControlName=\"isEdit\" type=\"checkbox\" class=\"cursor-pointer\" (change)=\"handleEditChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Edit</label>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n <div *ngIf=\"rolespermission.get('featureName')?.value === 'TangoAdmin'\" class=\"row w-100 text-nowrap\">\r\n <div class=\"col-md-4\" *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\" [formGroupName]=\"j\">\r\n <div class=\"d-inline-flex mt-3\">\r\n <input type=\"checkbox\" class=\"cursor-pointer\" formControlName=\"isEdit\">\r\n <label class=\"global-label mb-5 mx-2 mt-1\" style=\"text-wrap:nowrap\">\r\n {{ camelCaseToText(modules.get('name')?.value) }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n \r\n </div>\r\n <div *ngIf=\"type!=='view'\" class=\"d-flex my-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\"\r\n (click)=\"onSubmit()\" [disabled]=\"userForm.invalid || type === 'view'\">Submit</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>", styles: [".scroll{overflow-y:auto;overflow-x:hidden}.title{color:var(--Gray-900, #101828)!important;font-size:18px!important;font-weight:600;line-height:28px}.sub-title{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.teams-title{color:var(--Black, #101828)!important;font-size:18px!important;font-weight:600!important;line-height:28px}.title-header{border-radius:6px!important;border-bottom:2px solid var(--Gray-200, #EAECF0)!important;background:#f2f4f7!important;box-shadow:0 4px 10px #0000000d!important;color:var(--Black, #101828)!important;font-size:20px!important;font-weight:600;line-height:30px;padding:8px 16px}input[type=checkbox]{width:18px!important;height:18px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:0;padding-top:12px;padding-right:6px}.global-label{color:var(--Gray-700, #344054)!important;font-size:16px!important;font-weight:500;line-height:24px}.w-25{width:40%!important}td{color:var(--Black, #101828)!important;font-size:16px!important;font-weight:500!important;line-height:24px}tr,.add-team{border-bottom:1px solid var(--Gray-200, #EAECF0)!important}input[disabled]{pointer-events:none;opacity:.5}\n"] }]
661
+ args: [{ selector: 'lib-add-users', template: "<div class=\"card pt-0 pb-3 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 d-flex\">\r\n <div class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/add-store-icon.svg\">\r\n </div>\r\n \r\n </div>\r\n <div class=\"row w-100\">\r\n <div *ngIf=\"type!=='view' && type!=='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Add\r\n User</a>\r\n <div class=\"sub-title\">Please add your user details</div>\r\n </div>\r\n <div *ngIf=\"type==='view' && type !=='edit'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">View your user details</div>\r\n </div>\r\n <ng-container *ngIf=\"operationType!=='view'\">\r\n <div *ngIf=\"(gs.userAccess |async)?.Global_User_isEdit && type ==='view' && type !=='edit' && user?.role !== 'superadmin' && user?.isActive === true\" class=\"col-md-3 text-end px-0\" (click)=\"editUser()\">\r\n <button class=\"btn btn-outline\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_3833_85908)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_3833_85908\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></button>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"type==='edit' && type !=='view'\" class=\"col-md-9\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">User Details</a>\r\n <div class=\"sub-title\">Edit your user details</div>\r\n </div>\r\n <div class=\"w-100 h-0px scroll\">\r\n <div class=\"mt-5\" *ngIf=\"userForm\">\r\n <form [formGroup]=\"userForm\" novalidate=\"novalidate\" (keydown.enter)=\"preventClose($event)\" class=\"\">\r\n <div class=\"row px-0 me-3\">\r\n <!-- User Name Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"username\" class=\"form-label\">User Name <span class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"username\" formControlName=\"userName\" autocomplete=\"off\" (keypress)=\"omitSpecialChar($event)\" (paste)=\"omitSpecialCharPaste($event)\">\r\n <div *ngIf=\"userForm.get('userName')?.invalid && (userForm.get('userName')?.dirty)\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('userName')?.errors?.['required']\">User Name is required.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Email Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"email\" class=\"form-label\">Email <span class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"email\" class=\"form-control\" id=\"email\" formControlName=\"email\" autocomplete=\"off\">\r\n <div *ngIf=\"userForm.get('email')?.invalid && userForm.get('email')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('email')?.errors?.['required']\">Email is required.</small>\r\n <small *ngIf=\"userForm.get('email')?.errors?.['pattern']\">Invalid email format.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Contact Number Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"contact\" class=\"form-label\">Contact Number <span class=\"alert-required text-danger\">*</span></label>\r\n <div class=\"row\">\r\n <div class=\"col-md-12 col-lg-4 col-xl-4\">\r\n <select class=\"form-select ps-3 pe-8\" id=\"inputGroupSelect01\" formControlName=\"countryCode\">\r\n <option *ngFor=\"let country of countryList\" [value]=\"country.phonecode\">\r\n {{country.name}} ({{country.phonecode}})\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-8 col-xl-8\">\r\n <input type=\"text\" class=\"form-control\" (keypress)=\"omit_special_char($event)\"\r\n id=\"mobileNumber\" autocomplete=\"off\" formControlName=\"mobileNumber\" minlength=\"8\" maxlength=\"13\">\r\n <div *ngIf=\"userForm.get('mobileNumber')?.invalid && userForm.get('mobileNumber')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['required']\">Contact Number is required.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['minlength']\">Contact Number must be at least 8 digits.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['maxlength']\">Contact Number cannot exceed 13 digits.</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Role Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"role\" class=\"form-label\">Role <span class=\"alert-required text-danger\">*</span></label>\r\n <select class=\"form-select\" formControlName=\"role\" (change)=\"onRoleChange(userForm.get('role')?.value)\">\r\n <option value=\"admin\">Admin</option>\r\n <option value=\"user\">User</option>\r\n </select>\r\n <div *ngIf=\"userForm.get('role')?.invalid && userForm.get('role')?.touched\" class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('role')?.errors?.['required']\">Role is required.</small>\r\n </div>\r\n </div>\r\n \r\n <!-- Add to Team Field -->\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\" *ngIf=\"this.userType !=='tango'\">\r\n <label for=\"teamLead\" class=\"form-label teams-title\">Add to a team</label>\r\n <team-select [items]=\"teamList\" [multi]=\"true\" [searchField]=\"'teamName'\" [idField]=\"'_id'\" [disabled]=\"type === 'view' ? true : false\"\r\n (selected)=\"onStoreSelect($event)\" [selectedValues]=\"selectedUser\"></team-select>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"userForm.get('role')?.value === 'admin'\">\r\n\r\n <h3 class=\"teams-title\" *ngIf=\"getPermissions().length\">Access for Admin</h3>\r\n <ng-container *ngIf=\"getPermissions().length\">\r\n <ng-container formArrayName=\"rolespermission\">\r\n <ng-container *ngFor=\"let rolespermission of getPermissions().controls; let i = index\" [formGroupName]=\"i\">\r\n <div class=\"table-responsive my-2 me-3\">\r\n <div class=\"row w-100\">\r\n <div class=\"title-header mt-4 ms-2\">\r\n {{ camelCaseToText(rolespermission.get('featureName')?.value) }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"rolespermission.get('modules')\" formArrayName=\"modules\">\r\n <ng-container *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\" [formGroupName]=\"j\">\r\n <table class=\"w-100\">\r\n <tbody>\r\n <tr *ngIf=\"rolespermission.get('featureName')?.value !== 'TangoAdmin'\">\r\n <td class=\"w-50\">{{ camelCaseToText(modules.get('name')?.value) }}</td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input type=\"checkbox\" formControlName=\"isAdd\" class=\"cursor-pointer\" (change)=\"handleViewChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Add</label>\r\n </div>\r\n </td>\r\n <td class=\"text-start\">\r\n <div class=\"d-inline-flex align-items-center\">\r\n <input formControlName=\"isEdit\" type=\"checkbox\" class=\"cursor-pointer\" (change)=\"handleEditChange(modules)\">\r\n <label class=\"global-label ms-2 mt-auto\">Edit</label>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n <div *ngIf=\"rolespermission.get('featureName')?.value === 'TangoAdmin'\" class=\"row w-100 text-nowrap\">\r\n <div class=\"col-md-4\" *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\" [formGroupName]=\"j\">\r\n <div class=\"d-inline-flex mt-3\">\r\n <input type=\"checkbox\" class=\"cursor-pointer\" formControlName=\"isEdit\">\r\n <label class=\"global-label mb-5 mx-2 mt-1\" style=\"text-wrap:nowrap\">\r\n {{ camelCaseToText(modules.get('name')?.value) }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n \r\n </div>\r\n <div *ngIf=\"type!=='view'\" class=\"d-flex my-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\"\r\n (click)=\"onSubmit()\" [disabled]=\"userForm.invalid || type === 'view'\">Submit</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>", styles: [".scroll{overflow-y:auto;overflow-x:hidden}.title{color:var(--Gray-900, #101828)!important;font-size:18px!important;font-weight:600;line-height:28px}.sub-title{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.teams-title{color:var(--Black, #101828)!important;font-size:18px!important;font-weight:600!important;line-height:28px}.title-header{border-radius:6px!important;border-bottom:2px solid var(--Gray-200, #EAECF0)!important;background:#f2f4f7!important;box-shadow:0 4px 10px #0000000d!important;color:var(--Black, #101828)!important;font-size:20px!important;font-weight:600;line-height:30px;padding:8px 16px}input[type=checkbox]{width:18px!important;height:18px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:0;padding-top:12px;padding-right:6px}.global-label{color:var(--Gray-700, #344054)!important;font-size:16px!important;font-weight:500;line-height:24px}.w-25{width:40%!important}td{color:var(--Black, #101828)!important;font-size:16px!important;font-weight:500!important;line-height:24px}tr,.add-team{border-bottom:1px solid var(--Gray-200, #EAECF0)!important}input[disabled]{pointer-events:none;opacity:.5}\n"] }]
667
662
  }], ctorParameters: () => [{ type: i1.ManageUsersService }, { type: i0.ChangeDetectorRef }, { type: i2.NgbActiveModal }, { type: i3.FormBuilder }, { type: i4.UserService }, { type: i5.ToastService }, { type: i6.GlobalStateService }, { type: i2.NgbModal }], propDecorators: { type: [{
668
663
  type: Input
669
664
  }], user: [{
@@ -673,4 +668,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
673
668
  }], data: [{
674
669
  type: Input
675
670
  }] } });
676
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXVzZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS11c2Vycy9zcmMvbGliL2NvbXBvbmVudHMtdjIvYWRkLXVzZXJzL2FkZC11c2Vycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtdXNlcnMvc3JjL2xpYi9jb21wb25lbnRzLXYyL2FkZC11c2Vycy9hZGQtdXNlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHeEQsT0FBTyxFQUEwQixXQUFXLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLNUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0ZBQWtGLENBQUM7QUFDdkgsT0FBTyxLQUFLLFFBQVEsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7QUFFdEMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUN4QyxRQUFRLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO0tBQ25DLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztLQUM3QixTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUNwQixDQUFDO0FBT0YsTUFBTSxPQUFPLGlCQUFpQjtJQXVFUjtJQUNWO0lBQ0Q7SUFDQztJQUNBO0lBQ0E7SUFDRDtJQUNBO0lBN0VRLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ2hDLElBQUksQ0FBTTtJQUNWLElBQUksQ0FBTTtJQUNWLFFBQVEsQ0FBTTtJQUNkLElBQUksQ0FBTTtJ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LENBQUM7YUFDTDtRQUVILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFvQjtRQUNsQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7SUFFQyxvQkFBb0IsQ0FBQyxLQUFxQjtRQUM1QyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxJQUFNLE1BQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUFBLENBQUM7UUFDaEYsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQztRQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMzQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMscUNBQXFDLENBQUMsQ0FBQztTQUM5RDtJQUNELENBQUM7SUFFRCxZQUFZLENBQUMsS0FBWTtRQUN2QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDekIsQ0FBQzt3R0E1cUJVLGlCQUFpQjs0RkFBakIsaUJBQWlCLGlJQ3ZCOUIsZzlhQW9LVTs7NEZEN0lHLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxlQUFlOzJSQU1oQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgTWFuYWdlVXNlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMtdjIvbWFuYWdlLXVzZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7IEFsZXJ0UG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3RhbmdvLW1hbmFnZS11c2Vycy91c2VyLXRhYmxlL2FsZXJ0LXBvcHVwL2FsZXJ0LXBvcHVwLmNvbXBvbmVudCc7XHJcbmltcG9ydCAqIGFzIENyeXB0b0pTIGZyb20gJ2NyeXB0by1qcyc7XHJcblxyXG5jb25zdCBTRUNSRVRfS0VZID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoXHJcbiAgQ3J5cHRvSlMuU0hBMjU2KFwidEBuZzAtcmV0QGlsLUBwaS12M1wiKVxyXG4gICAgLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5CYXNlNjQpXHJcbiAgICAuc3Vic3RyaW5nKDAsIDMyKVxyXG4pO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYWRkLXVzZXJzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYWRkLXVzZXJzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYWRkLXVzZXJzLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQWRkVXNlcnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95ID0gbmV3IFN1YmplY3QoKTtcclxuICBASW5wdXQoKSB0eXBlOiBhbnk7XHJcbiAgQElucHV0KCkgdXNlcjogYW55O1xyXG4gIEBJbnB1dCgpIHVzZXJUeXBlOiBhbnk7XHJcbiAgQElucHV0KCkgZGF0YTogYW55O1xyXG4gIHVzZXJGb3JtOiBGb3JtR3JvdXA7XHJcbiAgb3BlcmF0aW9uVHlwZTogc3RyaW5nID0gJ2FkZCc7XHJcbiAgdGVhbUxpc3Q6IGFueSA9IFtdXHJcbiAgY291bnRyeUxpc3Q6IGFueTtcclxuICBzZWxlY3RlZFVzZXI6IGFueSA9IFtdO1xyXG4gIHBob25lUmVnZXg6IFJlZ0V4cCA9IC9eKFxcZHszfSk/XFxkezE1fSQvO1xyXG4gIGVtYWlsUmVnZXg6IFJlZ0V4cCA9IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvO1xyXG4gIHVzZXJfZGF0YTogYW55O1xyXG4gICRoZWFkZXJGaWx0ZXJzOiBhbnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcGVybWlzc2lvbkFycmF5ID0gW1xyXG4gICAge1xyXG4gICAgICBmZWF0dXJlTmFtZTogXCJHbG9iYWxcIixcclxuICAgICAgbW9kdWxlczogW1xyXG4gICAgICAgIHsgbmFtZTogXCJTdG9yZVwiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiVXNlclwiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiQ2FtZXJhXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJDb25maWd1cmF0aW9uXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJTdWJzY3JpcHRpb25cIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBuYW1lOiBcIkJpbGxpbmdcIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgIF1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZlYXR1cmVOYW1lOiBcIlRhbmdvRXllXCIsXHJcbiAgICAgIG1vZHVsZXM6IFtcclxuXHJcbiAgICAgICAgeyBuYW1lOiBcIlpvbmVUYWdcIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgIF1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZlYXR1cmVOYW1lOiBcIlRhbmdvVHJheFwiLFxyXG4gICAgICBtb2R1bGVzOiBbXHJcbiAgICAgICAgeyBuYW1lOiBcImNoZWNrbGlzdFwiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiVGFza1wiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgXVxyXG4gICAgfSxcclxuICAgICB7XHJcbiAgICAgIGZlYXR1cmVOYW1lOiBcIkZvb3RmYWxsRGlyZWN0b3J5XCIsXHJcbiAgICAgIG1vZHVsZXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnY3JlYXRvcicsIGlzQWRkOiB0cnVlLCBpc0VkaXQ6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAncmV2aWV3ZXInLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiBcImFwcHJvdmVyXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSxcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgXTtcclxuXHJcbiAgaGFuZGxlVmlld0NoYW5nZShtb2R1bGVzOiBGb3JtR3JvdXAgfCBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghbW9kdWxlcy5nZXQoXCJpc0FkZFwiKT8udmFsdWUpIHtcclxuICAgICAgbW9kdWxlcy5nZXQoXCJpc0RlbGV0ZVwiKT8uc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgICBtb2R1bGVzLmdldChcImlzRWRpdFwiKT8uc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuICBoYW5kbGVFZGl0Q2hhbmdlKG1vZHVsZXM6IEZvcm1Hcm91cCB8IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCFtb2R1bGVzLmdldChcImlzRWRpdFwiKT8udmFsdWUpIHtcclxuICAgICAgbW9kdWxlcy5nZXQoXCJpc0RlbGV0ZVwiKT8uc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBNYW5hZ2VVc2Vyc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHB1YmxpYyBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0czogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHVibGljIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbFxyXG4gICkge1xyXG5cclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5kZXN0cm95Lm5leHQoZmFsc2UpO1xyXG4gICAgdGhpcy5kZXN0cm95LmNvbXBsZXRlKCk7XHJcblxyXG4gIH1cclxuIC8vIG11c3QgbWF0Y2ggYmFja2VuZFxyXG4gXHJcbmRlY3J5cHQoZW5jcnlwdGVkVGV4dDogc3RyaW5nKTogc3RyaW5nIHtcclxuICBjb25zdCBbaXZIZXgsIGVuY3J5cHRlZF0gPSBlbmNyeXB0ZWRUZXh0LnNwbGl0KCc6Jyk7XHJcblxyXG4gIGNvbnN0IGl2ID0gQ3J5cHRvSlMuZW5jLkhleC5wYXJzZShpdkhleCk7XHJcbiAgY29uc3QgY2lwaGVydGV4dCA9IENyeXB0b0pTLmVuYy5IZXgucGFyc2UoZW5jcnlwdGVkKTtcclxuXHJcbiAgY29uc3QgY2lwaGVyUGFyYW1zID0gQ3J5cHRvSlMubGliLkNpcGhlclBhcmFtcy5jcmVhdGUoeyBjaXBoZXJ0ZXh0IH0pO1xyXG5cclxuICBjb25zdCBkZWNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdChjaXBoZXJQYXJhbXMsIFNFQ1JFVF9LRVksIHtcclxuICAgIGl2OiBpdixcclxuICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLFxyXG4gICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBkZWNyeXB0ZWQudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpO1xyXG59XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ0FkZFVzZXJzQ29tcG9uZW50IGluaXRpYWxpemVkIHdpdGggdHlwZTonLCB0aGlzLnR5cGUsICdhbmQgdXNlcjonLCB0aGlzLnVzZXIpO1xyXG4gICAgbGV0IGRhdGE6IGFueTtcclxuICAgIGlmIChcImhlYWRlci1maWx0ZXJzXCIgaW4gbG9jYWxTdG9yYWdlKSB7XHJcbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXItZmlsdGVycycpIHx8ICcnKTtcclxuICAgIH1cclxuICAgIHRoaXMudXNlcl9kYXRhID0gSlNPTj8ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXItaW5mbycpIHx8ICcnKTtcclxuICAgIHRoaXMuJGhlYWRlckZpbHRlcnMgPSBkYXRhID8gZGF0YSA6IHRoaXMudXNlcl9kYXRhO1xyXG4gICBcclxuICAgIHRoaXMuZ2V0Um9sZXMoKTtcclxuICAgIHRoaXMuZ2V0QWxsVGVhbXNMaXN0KClcclxuICAgIGlmICh0aGlzLnR5cGUgPT09IFwidmlld1wiIHx8ICh0aGlzLnR5cGUgPT09IFwiZWRpdFwiKSkge1xyXG4gICAgICB0aGlzLmxvYWRVc2VyRm9ybSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbml0VXNlckZvcm0oKTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0Q291bnRyeUNvZGVzKCk7XHJcbiAgfVxyXG5cclxuICBnZXRSb2xlcygpIHtcclxuICAgIGlmICh0aGlzLnVzZXJUeXBlID09PSAndGFuZ28nKSB7XHJcbiAgICAgIHRoaXMucGVybWlzc2lvbkFycmF5LnB1c2goe1xyXG4gICAgICAgIGZlYXR1cmVOYW1lOiBcIlRhbmdvQWRtaW5cIixcclxuICAgICAgICBtb2R1bGVzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiaW52b2ljZUFwcHJvdmFsXCIsIGlzQWRkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNFZGl0OiBmYWxzZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogXCJFZGl0QmlsbGluZ1wiLCBpc0FkZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzRWRpdDogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiVGlja2V0Q29uZmlndXJhdGlvblwiLCBpc0FkZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzRWRpdDogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiUmVwb3J0c1wiLCBpc0FkZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzRWRpdDogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXVxyXG4gICAgICB9LClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9taXRfc3BlY2lhbF9jaGFyKGV2ZW50OiBhbnkpIHtcclxuICAgIHZhciBrO1xyXG4gICAgayA9IGV2ZW50LmNoYXJDb2RlO1xyXG4gICAgcmV0dXJuIGsgPT0gOCB8fCBrID09IDMyIHx8IChrID49IDQ4ICYmIGsgPD0gNTcpO1xyXG4gIH1cclxuXHJcbiAgb25Sb2xlQ2hhbmdlKHJvbGU6IHN0cmluZykge1xyXG4gICAgdGhpcy5nZXRVc2VyUGVybWlzc2lvbkRhdGEocm9sZSwgdGhpcy51c2VyX2RhdGEudXNlclR5cGUpO1xyXG4gIH1cclxuICBnZXRDb3VudHJ5Q29kZXMoKSB7XHJcbiAgICB0aGlzLnNlcnZpY2UuZ2V0QWxsQ291bnRyaWVzKCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMuY291bnRyeUxpc3QgPSByZXMuZGF0YVxyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcblxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICBvbnJvbGVjaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJ3VzZXInKSB7XHJcbiAgICAgIHRoaXMucG9wdWxhdGVQZXJtaXNzaW9uKHRoaXMucGVybWlzc2lvbkFycmF5KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG4gIG9uU3RvcmVTZWxlY3QoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFVzZXIgPSBldmVudFxyXG4gICAgY29uc3QgdGVhbUxlYWRBcnJheSA9IHRoaXMudXNlckZvcm0uZ2V0KCd0ZWFtTGVhZCcpIGFzIEZvcm1BcnJheTtcclxuICAgIHRlYW1MZWFkQXJyYXkuY2xlYXIoKTsgLy8gQ2xlYXJzIGV4aXN0aW5nIHZhbHVlc1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRVc2VyLmZvckVhY2goKHVzZXI6IGFueSkgPT4ge1xyXG4gICAgICB0ZWFtTGVhZEFycmF5LnB1c2gobmV3IEZvcm1Db250cm9sKHVzZXIpKTsgLy8gQWRkcyBlYWNoIHVzZXIgaW4gc2VsZWN0ZWRVc2VyIGFycmF5XHJcbiAgICB9KTtcclxuICAgIDtcclxuICAgIC8vIHRoaXMuc2V0VGVhbUxlYWRzKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGNhbmNlbCgpIHtcclxuICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgY29uc3QgdHJpZ2dlckJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0cmlnZ2VyQnV0dG9uSWQnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIHRyaWdnZXJCdXR0b24/LmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBtYXNrRW1haWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXZhbHVlIHx8ICF2YWx1ZS5pbmNsdWRlcygnQCcpKSByZXR1cm4gJyc7XHJcbiAgICBjb25zdCBbbG9jYWwsIGRvbWFpbl0gPSB2YWx1ZS5zcGxpdCgnQCcpO1xyXG4gICAgY29uc3QgdmlzaWJsZUxlbmd0aCA9IE1hdGgubWluKDMsIGxvY2FsLmxlbmd0aCk7XHJcbiAgICBjb25zdCB2aXNpYmxlUGFydCA9IGxvY2FsLnNsaWNlKDAsIHZpc2libGVMZW5ndGgpO1xyXG4gICAgY29uc3QgbWFza2VkUGFydCA9ICcqJy5yZXBlYXQobG9jYWwubGVuZ3RoIC0gdmlzaWJsZUxlbmd0aCk7XHJcbiAgICByZXR1cm4gYCR7dmlzaWJsZVBhcnR9JHttYXNrZWRQYXJ0fUAke2RvbWFpbn1gO1xyXG4gIH1cclxuICBcclxuICBtYXNrTW9iaWxlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPD0gNCkgcmV0dXJuICcqJy5yZXBlYXQodmFsdWUubGVuZ3RoKTtcclxuICAgIGNvbnN0IGZpcnN0MiA9IHZhbHVlLnNsaWNlKDAsIDIpO1xyXG4gICAgY29uc3QgbGFzdDIgPSB2YWx1ZS5zbGljZSgtMik7XHJcbiAgICBjb25zdCBtYXNrZWRNaWRkbGUgPSAnKicucmVwZWF0KHZhbHVlLmxlbmd0aCAtIDQpO1xyXG4gICAgcmV0dXJuIGAke2ZpcnN0Mn0ke21hc2tlZE1pZGRsZX0ke2xhc3QyfWA7XHJcbiAgfVxyXG4gIGxvYWRVc2VyRm9ybSgpIHtcclxuICAgIC8vIHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcih0aGlzLmRlY3J5cHQodGhpcy51c2VyLmVtYWlsKSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlcih0aGlzLnVzZXIuZW1haWwpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCAmJiByZXMuZGF0YS5yZXN1bHQpIHtcclxuICAgICAgICAgIGNvbnN0IHVzZXJEYXRhID0gcmVzLmRhdGEucmVzdWx0O1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ3VzZXJEYXRhJywgdXNlckRhdGEpO1xyXG4gICAgICAgICAgY29uc3QgaXNWaWV3TW9kZSA9IHRoaXMudHlwZSA9PT0gJ3ZpZXcnO1xyXG4gICAgICAgICAgY29uc3QgaXNTdXBlcmFkbWluID0gdGhpcy51c2VyX2RhdGE/LnJvbGUgPT09ICdzdXBlcmFkbWluJztcclxuICBcclxuICAgICAgICAgIGNvbnN0IGVtYWlsID0gKGlzVmlld01vZGUgJiYgIWlzU3VwZXJhZG1pbikgPyB0aGlzLm1hc2tFbWFpbCh1c2VyRGF0YS5lbWFpbCkgOiB1c2VyRGF0YS5lbWFpbDtcclxuICAgICAgICAgIGNvbnN0IG1vYmlsZSA9IChpc1ZpZXdNb2RlICYmICFpc1N1cGVyYWRtaW4pID8gdGhpcy5tYXNrTW9iaWxlKHVzZXJEYXRhLm1vYmlsZU51bWJlcikgOiB1c2VyRGF0YS5tb2JpbGVOdW1iZXI7XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsRW1haWwgPSB1c2VyRGF0YS5lbWFpbDtcclxuICAgICAgICAgIHRoaXMub3JpZ2luYWxNb2JpbGUgPSB1c2VyRGF0YS5tb2JpbGVOdW1iZXI7IFxyXG4gICAgICAgICAgdGhpcy51c2VyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICB1c2VyTmFtZTogW3Jlcy5kYXRhLnJlc3VsdC51c2VyTmFtZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIGVtYWlsOiBbZW1haWwsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oXCJeW2EtekEtWjAtOS5fLV0rQFthLXpBLVowLTkuLV0rXFxcXC5bYS16QS1aXXsyLDZ9JFwiKSxcclxuICAgICAgICAgIF0pXSxcclxuICAgICAgICAgICAgbW9iaWxlTnVtYmVyOiBbbW9iaWxlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoOCksVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTMpXSBdLFxyXG4gICAgICAgICAgICByb2xlOiBbcmVzLmRhdGEucmVzdWx0LnJvbGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICB1c2VyVHlwZTogW3Jlcy5kYXRhLnJlc3VsdC51c2VyVHlwZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIHJvbGVzcGVybWlzc2lvbjogdGhpcy5mYi5hcnJheShbXSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgICAgICAgIHRlYW1MZWFkOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgICAgICAgY291bnRyeUNvZGU6IFtyZXMuZGF0YS5yZXN1bHQuY291bnRyeUNvZGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRhbmdvdXNlckZpZWxkKHJlcy5kYXRhLnJlc3VsdC50YW5nb1VzZXJUeXBlKTtcclxuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gXCJ2aWV3XCIpIHtcclxuICAgICAgICAgICAgdGhpcy51c2VyRm9ybS5kaXNhYmxlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlciA9IHJlcy5kYXRhLnRlYW1zTGlzdFxyXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRVc2VyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFRlYW1MZWFkcyh0aGlzLnNlbGVjdGVkVXNlcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgIC8vIHRoaXMudXNlckZvcm0uZ2V0KCd0ZWFtTGVhZCcpPy5zZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgdGhpcy5wb3B1bGF0ZVBlcm1pc3Npb24ocmVzPy5kYXRhPy5yZXN1bHQ/LnJvbGVzcGVybWlzc2lvbik7XHJcbiAgICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25UeXBlID09IFwidmlld1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXNlckZvcm0uZGlzYWJsZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy51c2VyRm9ybS5nZXQoXCJlbWFpbFwiKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAvLyB0aGlzLmdldFVzZXJQZXJtaXNzaW9uRGF0YShyZXMuZGF0YS5yZXN1bHQucm9sZSxyZXMuZGF0YS5yZXN1bHQudXNlclR5cGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmluaXRVc2VyRm9ybSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmluaXRVc2VyRm9ybSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4geyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUYW5nb3VzZXJGaWVsZCh0YW5nb1VzZXJUeXBlOmFueSkge1xyXG4gICAgaWYgKHRoaXMudXNlclR5cGUgPT09ICd0YW5nbycpIHtcclxuICAgICAgaWYgKCF0aGlzLnVzZXJGb3JtLmNvbnRhaW5zKCd0YW5nb1VzZXJUeXBlJykpIHtcclxuICAgICAgICB0aGlzLnVzZXJGb3JtLmFkZENvbnRyb2woJ3RhbmdvVXNlclR5cGUnLCB0aGlzLmZiLmNvbnRyb2wodGFuZ29Vc2VyVHlwZSB8fCAnZGFzaGJvYXJkJywgVmFsaWRhdG9ycy5yZXF1aXJlZCkpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy51c2VyRm9ybS5jb250YWlucygndGFuZ29Vc2VyVHlwZScpKSB7XHJcbiAgICAgICAgdGhpcy51c2VyRm9ybS5yZW1vdmVDb250cm9sKCd0YW5nb1VzZXJUeXBlJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRVc2VyRm9ybSgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdpbml0IGZvcm0gY2FsbGVkJyk7XHJcbiAgICB0aGlzLnVzZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHVzZXJOYW1lOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGVtYWlsOiBbXCJcIiwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgIFZhbGlkYXRvcnMucGF0dGVybihcIl5bYS16QS1aMC05Ll8tXStAW2EtekEtWjAtOS4tXStcXFxcLlthLXpBLVpdezIsNn0kXCIpXHJcbiAgICAgIF0pXSxcclxuICAgICAgbW9iaWxlTnVtYmVyOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDgpLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMyldXSxcclxuICAgICAgcm9sZTogW1widXNlclwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgdXNlclR5cGU6IFt0aGlzLnVzZXJUeXBlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgcm9sZXNwZXJtaXNzaW9uOiB0aGlzLmZiLmFycmF5KFtdLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgdGVhbUxlYWQ6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBjb3VudHJ5Q29kZTogW1wiOTFcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy51c2VyVHlwZSA9PT0gJ3RhbmdvJykge1xyXG4gICAgICBpZiAoIXRoaXMudXNlckZvcm0uY29udGFpbnMoJ3RhbmdvVXNlclR5cGUnKSkge1xyXG4gICAgICAgIHRoaXMudXNlckZvcm0uYWRkQ29udHJvbCgndGFuZ29Vc2VyVHlwZScsIHRoaXMuZmIuY29udHJvbCgnZGFzaGJvYXJkJywgVmFsaWRhdG9ycy5yZXF1aXJlZCkpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy51c2VyRm9ybS5jb250YWlucygndGFuZ29Vc2VyVHlwZScpKSB7XHJcbiAgICAgICAgdGhpcy51c2VyRm9ybS5yZW1vdmVDb250cm9sKCd0YW5nb1VzZXJUeXBlJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZ2V0VXNlclBlcm1pc3Npb25EYXRhKFwidXNlclwiLCB0aGlzLnVzZXJfZGF0YS51c2VyVHlwZSk7XHJcbiAgfVxyXG4gIHBvcHVsYXRlUGVybWlzc2lvbihwZXJtaXNzaW9uc0RhdGE6IGFueVtdKSB7XHJcbiAgICBjb25zb2xlLmxvZygncG9wdWxhdGVQZXJtaXNzaW9uIGNhbGxlZCcsIHBlcm1pc3Npb25zRGF0YSk7XHJcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMudXNlckZvcm0uZ2V0KFwicm9sZXNwZXJtaXNzaW9uXCIpIGFzIEZvcm1BcnJheTtcclxuICAgIHBlcm1pc3Npb25zLmNsZWFyKCk7ICAvLyBDbGVhciBleGlzdGluZyBlbnRyaWVzXHJcblxyXG4gICAgcGVybWlzc2lvbnNEYXRhLmZvckVhY2goKHJvbGVzcGVybWlzc2lvbjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZlYXR1cmVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIGZlYXR1cmVOYW1lOiBbcm9sZXNwZXJtaXNzaW9uPy5mZWF0dXJlTmFtZV0sXHJcbiAgICAgICAgbW9kdWxlczogdGhpcy5mYi5hcnJheShbXSksICAvLyBJbml0aWFsaXplIG1vZHVsZXMgYXMgYSBGb3JtQXJyYXlcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBtb2R1bGVzQXJyYXkgPSBmZWF0dXJlR3JvdXAuZ2V0KFwibW9kdWxlc1wiKSBhcyBGb3JtQXJyYXk7XHJcbiAgICAgIHJvbGVzcGVybWlzc2lvbi5tb2R1bGVzLmZvckVhY2goKG1vZHVsZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbW9kdWxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgIG5hbWU6IFttb2R1bGUubmFtZV0sXHJcbiAgICAgICAgICBpc0FkZDogW3sgdmFsdWU6IG1vZHVsZS5pc0FkZCwgZGlzYWJsZWQ6IHRoaXMudHlwZSA9PT0gJ3ZpZXcnIH1dLCAvLyBTZXQgZGlzYWJsZWQgYmFzZWQgb24gdHlwZVxyXG4gICAgICAgICAgaXNFZGl0OiBbeyB2YWx1ZTogbW9kdWxlLmlzRWRpdCwgZGlzYWJsZWQ6IHRoaXMudHlwZSA9PT0gJ3ZpZXcnIH1dLCAvLyBTZXQgZGlzYWJsZWQgYmFzZWQgb24gdHlwZVxyXG4gICAgICAgICAgLy8gaXNEZWxldGU6IFttb2R1bGUuaXNEZWxldGVdLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZHVsZXNBcnJheS5wdXNoKG1vZHVsZUdyb3VwKTsgIC8vIEFkZCBlYWNoIG1vZHVsZSB0byBtb2R1bGVzIGFycmF5XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcGVybWlzc2lvbnMucHVzaChmZWF0dXJlR3JvdXApOyAgLy8gQWRkIGVhY2ggZmVhdHVyZSBncm91cCB0byBwZXJtaXNzaW9uc1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gVHJpZ2dlciB2YWxpZGF0aW9uIGFmdGVyIHBvcHVsYXRpbmdcclxuICAgIHBlcm1pc3Npb25zLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICB9XHJcblxyXG4gIGdldFBlcm1pc3Npb25zKCk6IEZvcm1BcnJheSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnVzZXJGb3JtLnZhbHVlKVxyXG4gICAgcmV0dXJuIHRoaXMudXNlckZvcm0uZ2V0KFwicm9sZXNwZXJtaXNzaW9uXCIpIGFzIEZvcm1BcnJheTtcclxuXHJcbiAgfVxyXG4gIGdldEZlYXR1cmVQZXJtaXNzaW9ucyhyb2xlc3Blcm1pc3Npb246IEZvcm1Hcm91cCB8IGFueSk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gcm9sZXNwZXJtaXNzaW9uLmdldChcIm1vZHVsZXNcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuICBnZXRVc2VyUGVybWlzc2lvbkRhdGEocm9sZU5hbWU6IHN0cmluZywgdXNlclR5cGU6IHN0cmluZykge1xyXG4gICAgKHRoaXMudXNlckZvcm0/LmdldChcInJvbGVzcGVybWlzc2lvblwiKSBhcyBGb3JtQXJyYXkpLmNsZWFyKCk7XHJcbiAgICB0aGlzLnBvcHVsYXRlUGVybWlzc2lvbih0aGlzLnBlcm1pc3Npb25BcnJheSk7XHJcbiAgfVxyXG4gIGNhbWVsQ2FzZVRvVGV4dChpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC8oW0EtWl0pL2csICcgJDEnKVxyXG4gICAgICAucmVwbGFjZSgvXi4vLCAoc3RyKSA9PiBzdHIudG9VcHBlckNhc2UoKSlcclxuICAgICAgLnRyaW0oKTtcclxuICB9XHJcbm9yaWdpbmFsRW1haWw6IHN0cmluZyA9ICcnO1xyXG5vcmlnaW5hbE1vYmlsZTogc3RyaW5nID0gJyc7XHJcbmFkZFVzZXJTdWJtaXQoKSB7XHJcbiAgbGV0IHZhbHVlID0gdGhpcy51cGRhdGVQZXJtaXNzaW9uc0Jhc2VkT25Vc2VyVHlwZSh0aGlzLnVzZXJGb3JtLnZhbHVlKTtcclxuICBjb25zdCB1cGRhdGVkRGF0YSA9IHRoaXMucmVtb3ZlTnVsbFZhbHVlcyh2YWx1ZSk7XHJcblxyXG4gIGNvbnN0IGNsaWVudElkID0gdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnQgPyB0aGlzLiRoZWFkZXJGaWx0ZXJzLmNsaWVudCA6IHRoaXMudXNlcl9kYXRhLmNsaWVudElkO1xyXG5cclxuICB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZVNpbmdsZVVzZXJzKHsgLi4udXBkYXRlZERhdGEsIGNsaWVudElkIH0pLnN1YnNjcmliZSh7XHJcbiAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdChcIlVzZXIgY3JlYXRlZCBzdWNjZXNzZnVsbHkuXCIpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICAgIHRoaXMuZ3MubWFuYWdlUmVmcmVzaFRyaWdnZXIubmV4dCh0cnVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJVbmFibGUgdG8gY3JlYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgPyBlcnI/LmVycm9yPy5lcnJvciA6IFwiVW5hYmxlIHRvIGNyZWF0ZSBVc2VyIVwiKTtcclxuICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgfSxcclxuICAgIGNvbXBsZXRlOiAoKSA9PiB7fVxyXG4gIH0pO1xyXG59XHJcblxyXG4gIG9uU3VibWl0KCkge1xyXG4gICAgaWYgKHRoaXMudHlwZSA9PSBcImVkaXRcIikge1xyXG4gICAgICB0aGlzLnVzZXJVcGRhdGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWRkVXNlclN1Ym1pdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICB1c2VyVXBkYXRlKCkge1xyXG50aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5lbmFibGUoKTtcclxubGV0IHVzZXI6IGFueSA9IHRoaXMudXNlckZvcm0udmFsdWU7XHJcbmlmICghdXNlci5tb2JpbGVOdW1iZXIgfHwgdXNlci5tb2JpbGVOdW1iZXIuaW5jbHVkZXMoJyonKSkge1xyXG4gIHVzZXIubW9iaWxlTnVtYmVyID0gdGhpcy5vcmlnaW5hbE1vYmlsZTtcclxufSBlbHNlIHtcclxuIHVzZXIubW9iaWxlTnVtYmVyO1xyXG59XHJcblxyXG51c2VyLmVtYWlsID0gdGhpcy5vcmlnaW5hbEVtYWlsO1xyXG50aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5kaXNhYmxlKCk7XHJcblxyXG50eXBlIFJvbGUgPSAndXNlcicgfCAnYWRtaW4nIHwgJ3N1cGVyYWRtaW4nO1xyXG5sZXQgbWFwcGluZzogUmVjb3JkPFJvbGUsIG51bWJlcj4gPSB7XHJcbiAgdXNlcjogMSxcclxuICBhZG1pbjogMixcclxuICBzdXBlcmFkbWluOiAzLFxyXG59O1xyXG5cclxubGV0IG9sZFJvbGU6IFJvbGUgPSB0aGlzLnVzZXIucm9sZTtcclxubGV0IHVwZGF0ZWRSb2xlOiBSb2xlID0gdXNlci5yb2xlO1xyXG5cclxuaWYodXNlcj8ucm9sZSAmJiBtYXBwaW5nW29sZFJvbGVdPG1hcHBpbmdbdXBkYXRlZFJvbGVdKXtcclxudGhpcy51c2VyW1wicm9sZVN0YXR1c1wiXSA9IFwidXBcIlxyXG4gICB0aGlzLnNlcnZpY2UuZ2V0VXNlclRlYW1zKHtlbWFpbDp1c2VyLmVtYWlsLCB0eXBlOlwidXNlclwifSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDAgJiYgcmVzLmRhdGE/LnJlc3VsdD8ubGVuZ3RoID4gMCkgeyAgICAgICBcclxuICAgICAgICAgIHRoaXMudXNlcltcInRlYW1zXCJdID0gcmVzLmRhdGEucmVzdWx0XHJcbiAgICAgICAgICAvLyAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG5jb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oQWxlcnRQb3B1cENvbXBvbmVudCwgeyBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgYmFja2Ryb3A6IFwic3RhdGljXCIgfSk7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS51c2VyID0gdGhpcy51c2VyXHJcblxyXG4gICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3N1Ym1pdCcpIHtcclxuICAgICAgICAgdXNlci50ZWFtTGVhZCA9IFtdXHJcbiAgIHRoaXMuc2VydmljZS51cGRhdGVVc2Vycyh1c2VyKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoXHJcbiAgICAgICAgICAgIFwiVXNlciBkZXRhaWxzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/IGVycj8uZXJyb3I/LmVycm9yIDogXCJVbmFibGUgdG8gdXBkYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2UudXBkYXRlVXNlcnModXNlcikuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0U3VjY2Vzc1RvYXN0KFxyXG4gICAgICAgICAgICBcIlVzZXIgZGV0YWlscyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5cIlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJVbmFibGUgdG8gdXBkYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgPyBlcnI/LmVycm9yPy5lcnJvciA6IFwiVW5hYmxlIHRvIHVwZGF0ZSBVc2VyIVwiKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yID8gZXJyPy5lcnJvcj8uZXJyb3IgOiBcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4geyB9LFxyXG4gICAgfSk7XHJcblxyXG59ZWxzZSBpZih1c2VyPy5yb2xlICYmIG1hcHBpbmdbb2xkUm9sZV0+bWFwcGluZ1t1cGRhdGVkUm9sZV0pe1xyXG50aGlzLnVzZXJbXCJyb2xlU3RhdHVzXCJdID0gXCJkb3duXCJcclxuXHJcbmlmKCF0aGlzLnVzZXIubGFzdE9uZSl7XHJcbiAgICB0aGlzLnNlcnZpY2UuZ2V0VXNlclRlYW1zKHtlbWFpbDp1c2VyLmVtYWlsLCB0eXBlOlwibGVhZFwifSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDAgJiYgcmVzLmRhdGEucmVzdWx0Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIHRoaXMudXNlcltcInRlYW1zXCJdID0gcmVzLmRhdGEucmVzdWx0XHJcbiAgICAgICAgICAvLyAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICAgIC8vICBjb25zb2xlLmxvZyh7dXNlcjp0aGlzLnVzZXIsIHJvbGUxOm1hcHBpbmdbb2xkUm9sZV0sICByb2xlMjptYXBwaW5nW3VwZGF0ZWRSb2xlXSxtZXNnOlwiLi4uLi4uLi4uLi4uLjJcIiwgcm9sZTp1c2VyPy5yb2xlfSlcclxuY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEFsZXJ0UG9wdXBDb21wb25lbnQsIHsgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIGJhY2tkcm9wOiBcInN0YXRpY1wiIH0pO1xyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudXNlciA9IHRoaXMudXNlclxyXG5cclxuICAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQgPT09ICdzdWJtaXQnKSB7XHJcbiAgICAgICAgLy8gIHVzZXIudGVhbUxlYWQgPSBbXVxyXG4gICB0aGlzLnNlcnZpY2UudXBkYXRlVXNlcnModXNlcikuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0U3VjY2Vzc1RvYXN0KFxyXG4gICAgICAgICAgICBcIlVzZXIgZGV0YWlscyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5cIlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJVbmFibGUgdG8gdXBkYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6YW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yID8gZXJyPy5lcnJvcj8uZXJyb3IgOiBcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4geyB9LFxyXG4gICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS51cGRhdGVVc2Vycyh1c2VyKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoXHJcbiAgICAgICAgICAgIFwiVXNlciBkZXRhaWxzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/IGVycj8uZXJyb3I/LmVycm9yIDogXCJVbmFibGUgdG8gdXBkYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgPyBlcnI/LmVycm9yPy5lcnJvciA6IFwiVW5hYmxlIHRvIHVwZGF0ZSBVc2VyIVwiKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICB9KTtcclxufWVsc2V7XHJcbiAgICAgIC8vICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbmNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihBbGVydFBvcHVwQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnLCBiYWNrZHJvcDogXCJzdGF0aWNcIiB9KTtcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnVzZXIgPSB0aGlzLnVzZXJcclxuXHJcbiAgICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3N1Ym1pdCcpIHtcclxuICAgICAgICAvLyAgdXNlci50ZWFtTGVhZCA9IFtdXHJcbiAgIHRoaXMuc2VydmljZS51cGRhdGVVc2Vycyh1c2VyKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoXHJcbiAgICAgICAgICAgIFwiVXNlciBkZXRhaWxzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjphbnkpID0+IHtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgPyBlcnI/LmVycm9yPy5lcnJvciA6IFwiVW5hYmxlIHRvIHVwZGF0ZSBVc2VyIVwiKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIFxyXG59XHJcblxyXG5cclxufVxyXG5lbHNle1xyXG4gIHRoaXMuc2VydmljZS51cGRhdGVVc2Vycyh1c2VyKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoXHJcbiAgICAgICAgICAgIFwiVXNlciBkZXRhaWxzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/IGVycj8uZXJyb3I/LmVycm9yIDogXCJVbmFibGUgdG8gdXBkYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgIH0pO1xyXG59XHJcbiAgICBcclxuICB9XHJcbiAgdXBkYXRlUGVybWlzc2lvbnNCYXNlZE9uVXNlclR5cGUodXNlcjogYW55KSB7XHJcbiAgICB1c2VyLnJvbGVzcGVybWlzc2lvbi5mb3JFYWNoKChmZWF0dXJlOiBhbnkpID0+IHtcclxuICAgICAgZmVhdHVyZS5tb2R1bGVzLmZvckVhY2goKG1vZHVsZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh1c2VyLnVzZXJUeXBlID09PSBcInVzZXJzXCIpIHtcclxuICAgICAgICAgIG1vZHVsZXMuaXNBZGQgPSBmYWxzZTtcclxuICAgICAgICAgIG1vZHVsZXMuaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHVzZXI7XHJcbiAgfVxyXG4gIHJlbW92ZU51bGxWYWx1ZXMgPSAoZGF0YTogYW55KSA9PiB7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5yb2xlc3Blcm1pc3Npb24pKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlBlcm1pc3Npb24gaXMgbm90IGFuIGFycmF5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1hcCB0aHJvdWdoIHRoZSBwZXJtaXNzaW9ucyBhbmQgcHJvZHVjdHMgdG8gcmVtb3ZlIG51bGwgdmFsdWVzXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5kYXRhLFxyXG4gICAgICByb2xlc3Blcm1pc3Npb246IGRhdGEucm9sZXNwZXJtaXNzaW9uLm1hcCgoZmVhdHVyZTogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLmZlYXR1cmUsXHJcbiAgICAgICAgICBtb2R1bGVzOiBmZWF0dXJlLm1vZHVsZXMubWFwKChtb2R1bGVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3UHJvZHVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtb2R1bGVzKSkge1xyXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbmV3UHJvZHVjdFtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdQcm9kdWN0O1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9O1xyXG4gIGdldEFsbFRlYW1zTGlzdCgpIHtcclxuICAgIHRoaXMuc2VydmljZS5nZXRBbGxUZWFtc0xpc3QoeyBjbGllbnRJZDogdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnQgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95KSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudGVhbUxpc3QgPSByZXMuZGF0YS5yZXN1bHRcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG4gIGVkaXRVc2VyKCkge1xyXG4gICAgaWYgKHRoaXMudXNlcj8uaXNBY3RpdmUpIHtcclxuICAgICAgdGhpcy50eXBlID0gXCJlZGl0XCI7XHJcbiAgICAgIHRoaXMudXNlckZvcm0uZW5hYmxlKCk7XHJcbiAgICAgIHRoaXMudXNlckZvcm0uZ2V0KFwiZW1haWxcIik/LmRpc2FibGUoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy51c2VyPy5zdGF0dXMgPT09ICdhY3RpdmUnKSB7XHJcbiAgICAgIHRoaXMudHlwZSA9IFwidmlld1wiO1xyXG4gICAgICB0aGlzLnVzZXJGb3JtLmVuYWJsZSgpO1xyXG4gICAgICB0aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5kaXNhYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlzQnV0dG9uRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB7IHRlYW1MZWFkLCAuLi5jb250cm9sc1RvQ2hlY2sgfSA9IHRoaXMudXNlckZvcm0uY29udHJvbHM7XHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhjb250cm9sc1RvQ2hlY2spLnNvbWUoY29udHJvbCA9PiBjb250cm9sLmludmFsaWQpO1xyXG4gIH1cclxuICBzZXRUZWFtTGVhZHModGVhbUxpc3Q6IGFueVtdKSB7XHJcbiAgICBjb25zdCB0ZWFtTGVhZEFycmF5ID0gdGhpcy51c2VyRm9ybS5nZXQoJ3RlYW1MZWFkJykgYXMgRm9ybUFycmF5O1xyXG4gICAgdGVhbUxpc3QuZm9yRWFjaCh0ZWFtID0+IHtcclxuICAgICAgLy8gUHVzaCBlYWNoIHRlYW0gb2JqZWN0IGFzIGEgbmV3IEZvcm1Hcm91cCBpbnRvIHRoZSB0ZWFtTGVhZCBGb3JtQXJyYXlcclxuICAgICAgaWYgKHRlYW0uY2xpZW50SWQpIHtcclxuICAgICAgICB0ZWFtTGVhZEFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICBfaWQ6IG5ldyBGb3JtQ29udHJvbCh0ZWFtLl9pZCksXHJcbiAgICAgICAgICBjbGllbnRJZDogbmV3IEZvcm1Db250cm9sKHRlYW0uY2xpZW50SWQpLFxyXG4gICAgICAgICAgdGVhbU5hbWU6IG5ldyBGb3JtQ29udHJvbCh0ZWFtLnRlYW1OYW1lKSxcclxuICAgICAgICAgIHVzZXJzQ291bnQ6IG5ldyBGb3JtQ29udHJvbCh0ZWFtLnVzZXJzQ291bnQpXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbWl0U3BlY2lhbENoYXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcclxuICAgIGNvbnN0IHJlZ2V4ID0gL15bYS16QS1aMC05IF8tXSQvO1xyXG4gICAgaWYgKCFyZWdleC50ZXN0KGtleSkpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICAgb21pdFNwZWNpYWxDaGFyUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XHJcbiAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGEgfHwgICh3aW5kb3cgYXMgYW55KVsnY2xpcGJvYXJkRGF0YSddOztcclxuICBjb25zdCBwYXN0ZWRUZXh0ID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgY29uc3QgcmVnZXggPSAvXlthLXpBLVowLTkgXy1dKiQvO1xyXG4gIGlmICghcmVnZXgudGVzdChwYXN0ZWRUZXh0KSkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlNwZWNpYWwgY2hhcmFjdGVycyBhcmUgbm90IGFsbG93ZWQuXCIpO1xyXG4gIH1cclxuICB9XHJcbiAgXHJcbiAgcHJldmVudENsb3NlKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICB9XHJcblxyXG59IiwiPGRpdiAgY2xhc3M9XCJjYXJkIHB0LTAgcGItMyBzY3JvbGxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHktMCBkLWZsZXggZmxleC1zdGFydCBmbGV4LWNvbHVtbiBwLTkgXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTUgZC1mbGV4XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzeW1ib2wgc3ltYm9sLTc1cHggc3ltYm9sLWNpcmNsZVwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBhbHQ9XCJQaWNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9hZGQtc3RvcmUtaWNvbi5zdmdcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlIT09J3ZpZXcnICYmIHR5cGUhPT0nZWRpdCdcIiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmcy00IHRleHQtZ3JheS04MDAgdGV4dC1ob3Zlci1wcmltYXJ5IGZ3LWJvbGQgbWItMCB0aXRsZSBjdXJzb3ItcG9pbnRlclwiPkFkZFxyXG4gICAgICAgICAgICAgICAgICAgIFVzZXI8L2E+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRpdGxlXCI+UGxlYXNlIGFkZCB5b3VyIHVzZXIgZGV0YWlsczwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGU9PT0ndmlldycgJiYgdHlwZSAhPT0nZWRpdCdcIiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImZzLTQgdGV4dC1ncmF5LTgwMCB0ZXh0LWhvdmVyLXByaW1hcnkgZnctYm9sZCBtYi0wIHRpdGxlIGN1cnNvci1wb2ludGVyXCI+VXNlciBEZXRhaWxzPC9hPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10aXRsZVwiPlZpZXcgeW91ciB1c2VyIGRldGFpbHM8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcGVyYXRpb25UeXBlIT09J3ZpZXcnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8YXN5bmMpPy5HbG9iYWxfVXNlcl9pc0VkaXQgJiYgdHlwZSA9PT0ndmlldycgICYmIHR5cGUgIT09J2VkaXQnICYmIHVzZXI/LnJvbGUgIT09ICdzdXBlcmFkbWluJyAmJiB1c2VyPy5pc0FjdGl2ZSA9PT0gdHJ1ZVwiIGNsYXNzPVwiY29sLW1kLTMgdGV4dC1lbmQgcHgtMFwiIChjbGljayk9XCJlZGl0VXNlcigpXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMzgzM184NTkwOClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05LjE2NjAyIDMuMzMzMkgzLjMzMjY4QzIuODkwNjUgMy4zMzMyIDIuNDY2NzMgMy41MDg3OSAyLjE1NDE3IDMuODIxMzVDMS44NDE2MSA0LjEzMzkxIDEuNjY2MDIgNC41NTc4NCAxLjY2NjAyIDQuOTk5ODZWMTYuNjY2NUMxLjY2NjAyIDE3LjEwODYgMS44NDE2MSAxNy41MzI1IDIuMTU0MTcgMTcuODQ1QzIuNDY2NzMgMTguMTU3NiAyLjg5MDY1IDE4LjMzMzIgMy4zMzI2OCAxOC4zMzMySDE0Ljk5OTNDMTUuNDQxNCAxOC4zMzMyIDE1Ljg2NTMgMTguMTU3NiAxNi4xNzc5IDE3Ljg0NUMxNi40OTA0IDE3LjUzMjUgMTYuNjY2IDE3LjEwODYgMTYuNjY2IDE2LjY2NjVWMTAuODMzMk0xNS40MTYgMi4wODMyQzE1Ljc0NzUgMS43NTE2OCAxNi4xOTcyIDEuNTY1NDMgMTYuNjY2IDEuNTY1NDNDMTcuMTM0OSAxLjU2NTQzIDE3LjU4NDUgMS43NTE2OCAxNy45MTYgMi4wODMyQzE4LjI0NzUgMi40MTQ3MiAxOC40MzM4IDIuODY0MzYgMTguNDMzOCAzLjMzMzJDMTguNDMzOCAzLjgwMjA0IDE4LjI0NzUgNC4yNTE2OCAxNy45MTYgNC41ODMyTDkuOTk5MzUgMTIuNDk5OUw2LjY2NjAyIDEzLjMzMzJMNy40OTkzNSA5Ljk5OTg2TDE1LjQxNiAyLjA4MzJaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8zODMzXzg1OTA4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGU9PT0nZWRpdCcgICYmIHR5cGUgIT09J3ZpZXcnXCIgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmcy00IHRleHQtZ3JheS04MDAgdGV4dC1ob3Zlci1wcmltYXJ5IGZ3LWJvbGQgbWItMCB0aXRsZSBjdXJzb3ItcG9pbnRlclwiPlVzZXIgRGV0YWlsczwvYT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGl0bGVcIj5FZGl0IHlvdXIgdXNlciBkZXRhaWxzPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgaC0wcHggc2Nyb2xsXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNVwiICpuZ0lmPVwidXNlckZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInVzZXJGb3JtXCIgbm92YWxpZGF0ZT1cIm5vdmFsaWRhdGVcIiAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50Q2xvc2UoJGV2ZW50KVwiIGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHgtMCBtZS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFVzZXIgTmFtZSBGaWVsZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInVzZXJuYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+VXNlciBOYW1lIDxzcGFuIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJ1c2VybmFtZVwiIGZvcm1Db250cm9sTmFtZT1cInVzZXJOYW1lXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKGtleXByZXNzKT1cIm9taXRTcGVjaWFsQ2hhcigkZXZlbnQpXCIgKHBhc3RlKT1cIm9taXRTcGVjaWFsQ2hhclBhc3RlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJGb3JtLmdldCgndXNlck5hbWUnKT8uaW52YWxpZCAmJiAodXNlckZvcm0uZ2V0KCd1c2VyTmFtZScpPy5kaXJ0eSlcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCd1c2VyTmFtZScpPy5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPlVzZXIgTmFtZSBpcyByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbWFpbCBGaWVsZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVtYWlsXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+RW1haWwgPHNwYW4gY2xhc3M9XCJhbGVydC1yZXF1aXJlZCB0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJlbWFpbFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJlbWFpbFwiIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ2VtYWlsJyk/LmludmFsaWQgJiYgdXNlckZvcm0uZ2V0KCdlbWFpbCcpPy50b3VjaGVkXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgnZW1haWwnKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5FbWFpbCBpcyByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgnZW1haWwnKT8uZXJyb3JzPy5bJ3BhdHRlcm4nXVwiPkludmFsaWQgZW1haWwgZm9ybWF0Ljwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvbnRhY3QgTnVtYmVyIEZpZWxkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY29udGFjdFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNvbnRhY3QgTnVtYmVyIDxzcGFuIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy00IGNvbC14bC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgcHMtMyBwZS04XCIgaWQ9XCJpbnB1dEdyb3VwU2VsZWN0MDFcIiBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5Q29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb3VudHJ5IG9mIGNvdW50cnlMaXN0XCIgW3ZhbHVlXT1cImNvdW50cnkucGhvbmVjb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb3VudHJ5Lm5hbWV9fSAoe3tjb3VudHJ5LnBob25lY29kZX19KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTggY29sLXhsLThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgKGtleXByZXNzKT1cIm9taXRfc3BlY2lhbF9jaGFyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1vYmlsZU51bWJlclwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGZvcm1Db250cm9sTmFtZT1cIm1vYmlsZU51bWJlclwiIG1pbmxlbmd0aD1cIjhcIiBtYXhsZW5ndGg9XCIxM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJGb3JtLmdldCgnbW9iaWxlTnVtYmVyJyk/LmludmFsaWQgJiYgdXNlckZvcm0uZ2V0KCdtb2JpbGVOdW1iZXInKT8udG91Y2hlZFwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCdtb2JpbGVOdW1iZXInKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5Db250YWN0IE51bWJlciBpcyByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ21vYmlsZU51bWJlcicpPy5lcnJvcnM/LlsnbWlubGVuZ3RoJ11cIj5Db250YWN0IE51bWJlciBtdXN0IGJlIGF0IGxlYXN0IDggZGlnaXRzLjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgnbW9iaWxlTnVtYmVyJyk/LmVycm9ycz8uWydtYXhsZW5ndGgnXVwiPkNvbnRhY3QgTnVtYmVyIGNhbm5vdCBleGNlZWQgMTMgZGlnaXRzLjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUm9sZSBGaWVsZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInJvbGVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Sb2xlIDxzcGFuIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGZvcm1Db250cm9sTmFtZT1cInJvbGVcIiAoY2hhbmdlKT1cIm9uUm9sZUNoYW5nZSh1c2VyRm9ybS5nZXQoJ3JvbGUnKT8udmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFkbWluXCI+QWRtaW48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidXNlclwiPlVzZXI8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ3JvbGUnKT8uaW52YWxpZCAmJiB1c2VyRm9ybS5nZXQoJ3JvbGUnKT8udG91Y2hlZFwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ3JvbGUnKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5Sb2xlIGlzIHJlcXVpcmVkLjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCB0byBUZWFtIEZpZWxkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgY29sLXhsLTEyIGNvbC14eGwtMTIgbWItNVwiICpuZ0lmPVwidGhpcy51c2VyVHlwZSAhPT0ndGFuZ28nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0ZWFtTGVhZFwiIGNsYXNzPVwiZm9ybS1sYWJlbCB0ZWFtcy10aXRsZVwiPkFkZCB0byBhIHRlYW08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVhbS1zZWxlY3QgW2l0ZW1zXT1cInRlYW1MaXN0XCIgW211bHRpXT1cInRydWVcIiBbc2VhcmNoRmllbGRdPVwiJ3RlYW1OYW1lJ1wiIFtpZEZpZWxkXT1cIidfaWQnXCIgW2Rpc2FibGVkXT1cInR5cGUgPT09ICd2aWV3JyA/IHRydWUgOiBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwib25TdG9yZVNlbGVjdCgkZXZlbnQpXCIgW3NlbGVjdGVkVmFsdWVzXT1cInNlbGVjdGVkVXNlclwiPjwvdGVhbS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJGb3JtLmdldCgncm9sZScpPy52YWx1ZSA9PT0gJ2FkbWluJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwidGVhbXMtdGl0bGVcIiAgKm5nSWY9XCJnZXRQZXJtaXNzaW9ucygpLmxlbmd0aFwiPkFjY2VzcyBmb3IgQWRtaW48L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFBlcm1pc3Npb25zKCkubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBmb3JtQXJyYXlOYW1lPVwicm9sZXNwZXJtaXNzaW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByb2xlc3Blcm1pc3Npb24gb2YgZ2V0UGVybWlzc2lvbnMoKS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmUgbXktMiBtZS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLWhlYWRlciBtdC00IG1zLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2FtZWxDYXNlVG9UZXh0KHJvbGVzcGVybWlzc2lvbi5nZXQoJ2ZlYXR1cmVOYW1lJyk/LnZhbHVlKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvbGVzcGVybWlzc2lvbi5nZXQoJ21vZHVsZXMnKVwiIGZvcm1BcnJheU5hbWU9XCJtb2R1bGVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBtb2R1bGVzIG9mIGdldEZlYXR1cmVQZXJtaXNzaW9ucyhyb2xlc3Blcm1pc3Npb24pPy5jb250cm9sczsgbGV0IGogPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImpcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJyb2xlc3Blcm1pc3Npb24uZ2V0KCdmZWF0dXJlTmFtZScpPy52YWx1ZSAhPT0gJ1RhbmdvQWRtaW4nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInctNTBcIj57eyBjYW1lbENhc2VUb1RleHQobW9kdWxlcy5nZXQoJ25hbWUnKT8udmFsdWUpIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1zdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cImlzQWRkXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjaGFuZ2UpPVwiaGFuZGxlVmlld0NoYW5nZShtb2R1bGVzKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWxhYmVsIG1zLTIgbXQtYXV0b1wiPkFkZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtc3RhcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1pbmxpbmUtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJpc0VkaXRcIiB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNoYW5nZSk9XCJoYW5kbGVFZGl0Q2hhbmdlKG1vZHVsZXMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnbG9iYWwtbGFiZWwgbXMtMiBtdC1hdXRvXCI+RWRpdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb2xlc3Blcm1pc3Npb24uZ2V0KCdmZWF0dXJlTmFtZScpPy52YWx1ZSA9PT0gJ1RhbmdvQWRtaW4nXCIgY2xhc3M9XCJyb3cgdy0xMDAgdGV4dC1ub3dyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCIgKm5nRm9yPVwibGV0IG1vZHVsZXMgb2YgZ2V0RmVhdHVyZVBlcm1pc3Npb25zKHJvbGVzcGVybWlzc2lvbik/LmNvbnRyb2xzOyBsZXQgaiA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwialwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWlubGluZS1mbGV4IG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgZm9ybUNvbnRyb2xOYW1lPVwiaXNFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnbG9iYWwtbGFiZWwgbWItNSBteC0yIG10LTFcIiBzdHlsZT1cInRleHQtd3JhcDpub3dyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2FtZWxDYXNlVG9UZXh0KG1vZHVsZXMuZ2V0KCduYW1lJyk/LnZhbHVlKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlIT09J3ZpZXcnXCIgY2xhc3M9XCJkLWZsZXggbXktMTBcIiByb2xlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgdy0xMDAgbWUtM1wiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDAgbXMtM1wiIGlkPVwiYWxlcnQtdG9hc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblN1Ym1pdCgpXCIgW2Rpc2FibGVkXT1cInVzZXJGb3JtLmludmFsaWQgfHwgdHlwZSA9PT0gJ3ZpZXcnXCI+U3VibWl0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PiJdfQ==
671
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXVzZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS11c2Vycy9zcmMvbGliL2NvbXBvbmVudHMtdjIvYWRkLXVzZXJzL2FkZC11c2Vycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtdXNlcnMvc3JjL2xpYi9jb21wb25lbnRzLXYyL2FkZC11c2Vycy9hZGQtdXNlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHeEQsT0FBTyxFQUEwQixXQUFXLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLNUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0ZBQWtGLENBQUM7QUFDdkgsT0FBTyxLQUFLLFFBQVEsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7QUFFdEMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUN4QyxRQUFRLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO0tBQ25DLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztLQUM3QixTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUNwQixDQUFDO0FBT0YsTUFBTSxPQUFPLGlCQUFpQjtJQXVFUjtJQUNWO0lBQ0Q7SUFDQztJQUNBO0lBQ0E7SUFDRDtJQUNBO0lBN0VRLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ2hDLElBQUksQ0FBTTtJQUNWLElBQUksQ0FBTTtJQUNWLFFBQVEsQ0FBTTtJQUNkLElBQUksQ0FBTTtJ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O1FBQzVDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQU0sTUFBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQUEsQ0FBQztRQUNoRixNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzNCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1NBQzlEO0lBQ0QsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFZO1FBQ3ZCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QixDQUFDO3dHQTFxQlUsaUJBQWlCOzRGQUFqQixpQkFBaUIsaUlDdkI5QixvOWFBcUtVOzs0RkQ5SUcsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLGVBQWU7MlJBTWhCLElBQUk7c0JBQVosS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBNYW5hZ2VVc2Vyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy12Mi9tYW5hZ2UtdXNlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHsgQWxlcnRQb3B1cENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdGFuZ28tbWFuYWdlLXVzZXJzL3VzZXItdGFibGUvYWxlcnQtcG9wdXAvYWxlcnQtcG9wdXAuY29tcG9uZW50JztcclxuaW1wb3J0ICogYXMgQ3J5cHRvSlMgZnJvbSAnY3J5cHRvLWpzJztcclxuXHJcbmNvbnN0IFNFQ1JFVF9LRVkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShcclxuICBDcnlwdG9KUy5TSEEyNTYoXCJ0QG5nMC1yZXRAaWwtQHBpLXYzXCIpXHJcbiAgICAudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLkJhc2U2NClcclxuICAgIC5zdWJzdHJpbmcoMCwgMzIpXHJcbik7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hZGQtdXNlcnMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGQtdXNlcnMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hZGQtdXNlcnMuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBZGRVc2Vyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25Jbml0IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kgPSBuZXcgU3ViamVjdCgpO1xyXG4gIEBJbnB1dCgpIHR5cGU6IGFueTtcclxuICBASW5wdXQoKSB1c2VyOiBhbnk7XHJcbiAgQElucHV0KCkgdXNlclR5cGU6IGFueTtcclxuICBASW5wdXQoKSBkYXRhOiBhbnk7XHJcbiAgdXNlckZvcm06IEZvcm1Hcm91cDtcclxuICBvcGVyYXRpb25UeXBlOiBzdHJpbmcgPSAnYWRkJztcclxuICB0ZWFtTGlzdDogYW55ID0gW11cclxuICBjb3VudHJ5TGlzdDogYW55O1xyXG4gIHNlbGVjdGVkVXNlcjogYW55ID0gW107XHJcbiAgcGhvbmVSZWdleDogUmVnRXhwID0gL14oXFxkezN9KT9cXGR7MTV9JC87XHJcbiAgZW1haWxSZWdleDogUmVnRXhwID0gL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC87XHJcbiAgdXNlcl9kYXRhOiBhbnk7XHJcbiAgJGhlYWRlckZpbHRlcnM6IGFueTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuICBwZXJtaXNzaW9uQXJyYXkgPSBbXHJcbiAgICB7XHJcbiAgICAgIGZlYXR1cmVOYW1lOiBcIkdsb2JhbFwiLFxyXG4gICAgICBtb2R1bGVzOiBbXHJcbiAgICAgICAgeyBuYW1lOiBcIlN0b3JlXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJVc2VyXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJDYW1lcmFcIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBuYW1lOiBcIkNvbmZpZ3VyYXRpb25cIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBuYW1lOiBcIlN1YnNjcmlwdGlvblwiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiQmlsbGluZ1wiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgXVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZmVhdHVyZU5hbWU6IFwiVGFuZ29FeWVcIixcclxuICAgICAgbW9kdWxlczogW1xyXG5cclxuICAgICAgICB7IG5hbWU6IFwiWm9uZVRhZ1wiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgXVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZmVhdHVyZU5hbWU6IFwiVGFuZ29UcmF4XCIsXHJcbiAgICAgIG1vZHVsZXM6IFtcclxuICAgICAgICB7IG5hbWU6IFwiY2hlY2tsaXN0XCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJUYXNrXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICBdXHJcbiAgICB9LFxyXG4gICAgIHtcclxuICAgICAgZmVhdHVyZU5hbWU6IFwiVGlja2V0c1wiLFxyXG4gICAgICBtb2R1bGVzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ2NyZWF0b3InLCBpc0FkZDogdHJ1ZSwgaXNFZGl0OiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ3Jldmlld2VyJywgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogXCJhcHByb3ZlclwiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UsXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9XHJcblxyXG4gIF07XHJcblxyXG4gIGhhbmRsZVZpZXdDaGFuZ2UobW9kdWxlczogRm9ybUdyb3VwIHwgYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIW1vZHVsZXMuZ2V0KFwiaXNBZGRcIik/LnZhbHVlKSB7XHJcbiAgICAgIG1vZHVsZXMuZ2V0KFwiaXNEZWxldGVcIik/LnNldFZhbHVlKGZhbHNlKTtcclxuICAgICAgbW9kdWxlcy5nZXQoXCJpc0VkaXRcIik/LnNldFZhbHVlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcbiAgaGFuZGxlRWRpdENoYW5nZShtb2R1bGVzOiBGb3JtR3JvdXAgfCBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghbW9kdWxlcy5nZXQoXCJpc0VkaXRcIik/LnZhbHVlKSB7XHJcbiAgICAgIG1vZHVsZXMuZ2V0KFwiaXNEZWxldGVcIik/LnNldFZhbHVlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2VydmljZTogTWFuYWdlVXNlcnNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgdHM6IFRvYXN0U2VydmljZSxcclxuICAgIHB1YmxpYyBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHVibGljIG1vZGFsU2VydmljZTogTmdiTW9kYWxcclxuICApIHtcclxuXHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZGVzdHJveS5uZXh0KGZhbHNlKTtcclxuICAgIHRoaXMuZGVzdHJveS5jb21wbGV0ZSgpO1xyXG5cclxuICB9XHJcbiAvLyBtdXN0IG1hdGNoIGJhY2tlbmRcclxuIFxyXG5kZWNyeXB0KGVuY3J5cHRlZFRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgY29uc3QgW2l2SGV4LCBlbmNyeXB0ZWRdID0gZW5jcnlwdGVkVGV4dC5zcGxpdCgnOicpO1xyXG5cclxuICBjb25zdCBpdiA9IENyeXB0b0pTLmVuYy5IZXgucGFyc2UoaXZIZXgpO1xyXG4gIGNvbnN0IGNpcGhlcnRleHQgPSBDcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGVuY3J5cHRlZCk7XHJcblxyXG4gIGNvbnN0IGNpcGhlclBhcmFtcyA9IENyeXB0b0pTLmxpYi5DaXBoZXJQYXJhbXMuY3JlYXRlKHsgY2lwaGVydGV4dCB9KTtcclxuXHJcbiAgY29uc3QgZGVjcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoY2lwaGVyUGFyYW1zLCBTRUNSRVRfS0VZLCB7XHJcbiAgICBpdjogaXYsXHJcbiAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcclxuICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5Qa2NzN1xyXG4gIH0pO1xyXG5cclxuICByZXR1cm4gZGVjcnlwdGVkLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcclxufVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCBkYXRhOiBhbnk7XHJcbiAgICBpZiAoXCJoZWFkZXItZmlsdGVyc1wiIGluIGxvY2FsU3RvcmFnZSkge1xyXG4gICAgICBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSB8fCAnJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVzZXJfZGF0YSA9IEpTT04/LnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSB8fCAnJyk7XHJcbiAgICB0aGlzLiRoZWFkZXJGaWx0ZXJzID0gZGF0YSA/IGRhdGEgOiB0aGlzLnVzZXJfZGF0YTtcclxuICAgXHJcbiAgICB0aGlzLmdldFJvbGVzKCk7XHJcbiAgICB0aGlzLmdldEFsbFRlYW1zTGlzdCgpXHJcbiAgICBpZiAodGhpcy50eXBlID09PSBcInZpZXdcIiB8fCAodGhpcy50eXBlID09PSBcImVkaXRcIikpIHtcclxuICAgICAgdGhpcy5sb2FkVXNlckZvcm0oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW5pdFVzZXJGb3JtKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdldENvdW50cnlDb2RlcygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Um9sZXMoKSB7XHJcbiAgICBpZiAodGhpcy51c2VyVHlwZSA9PT0gJ3RhbmdvJykge1xyXG4gICAgICB0aGlzLnBlcm1pc3Npb25BcnJheS5wdXNoKHtcclxuICAgICAgICBmZWF0dXJlTmFtZTogXCJUYW5nb0FkbWluXCIsXHJcbiAgICAgICAgbW9kdWxlczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiBcImludm9pY2VBcHByb3ZhbFwiLCBpc0FkZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzRWRpdDogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiRWRpdEJpbGxpbmdcIiwgaXNBZGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0VkaXQ6IGZhbHNlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiBcIlRpY2tldENvbmZpZ3VyYXRpb25cIiwgaXNBZGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0VkaXQ6IGZhbHNlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiBcIlJlcG9ydHNcIiwgaXNBZGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0VkaXQ6IGZhbHNlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF1cclxuICAgICAgfSwpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbWl0X3NwZWNpYWxfY2hhcihldmVudDogYW55KSB7XHJcbiAgICB2YXIgaztcclxuICAgIGsgPSBldmVudC5jaGFyQ29kZTtcclxuICAgIHJldHVybiBrID09IDggfHwgayA9PSAzMiB8fCAoayA+PSA0OCAmJiBrIDw9IDU3KTtcclxuICB9XHJcblxyXG4gIG9uUm9sZUNoYW5nZShyb2xlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZ2V0VXNlclBlcm1pc3Npb25EYXRhKHJvbGUsIHRoaXMudXNlcl9kYXRhLnVzZXJUeXBlKTtcclxuICB9XHJcbiAgZ2V0Q291bnRyeUNvZGVzKCkge1xyXG4gICAgdGhpcy5zZXJ2aWNlLmdldEFsbENvdW50cmllcygpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLmNvdW50cnlMaXN0ID0gcmVzLmRhdGFcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG5cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbiAgb25yb2xlY2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmIChldmVudC50YXJnZXQudmFsdWUgPT09ICd1c2VyJykge1xyXG4gICAgICB0aGlzLnBvcHVsYXRlUGVybWlzc2lvbih0aGlzLnBlcm1pc3Npb25BcnJheSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuICBvblN0b3JlU2VsZWN0KGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRVc2VyID0gZXZlbnRcclxuICAgIGNvbnN0IHRlYW1MZWFkQXJyYXkgPSB0aGlzLnVzZXJGb3JtLmdldCgndGVhbUxlYWQnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICB0ZWFtTGVhZEFycmF5LmNsZWFyKCk7IC8vIENsZWFycyBleGlzdGluZyB2YWx1ZXNcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkVXNlci5mb3JFYWNoKCh1c2VyOiBhbnkpID0+IHtcclxuICAgICAgdGVhbUxlYWRBcnJheS5wdXNoKG5ldyBGb3JtQ29udHJvbCh1c2VyKSk7IC8vIEFkZHMgZWFjaCB1c2VyIGluIHNlbGVjdGVkVXNlciBhcnJheVxyXG4gICAgfSk7XHJcbiAgICA7XHJcbiAgICAvLyB0aGlzLnNldFRlYW1MZWFkcyhldmVudCk7XHJcbiAgfVxyXG5cclxuICBjYW5jZWwoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuICAgIGNvbnN0IHRyaWdnZXJCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdHJpZ2dlckJ1dHRvbklkJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB0cmlnZ2VyQnV0dG9uPy5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgbWFza0VtYWlsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF2YWx1ZSB8fCAhdmFsdWUuaW5jbHVkZXMoJ0AnKSkgcmV0dXJuICcnO1xyXG4gICAgY29uc3QgW2xvY2FsLCBkb21haW5dID0gdmFsdWUuc3BsaXQoJ0AnKTtcclxuICAgIGNvbnN0IHZpc2libGVMZW5ndGggPSBNYXRoLm1pbigzLCBsb2NhbC5sZW5ndGgpO1xyXG4gICAgY29uc3QgdmlzaWJsZVBhcnQgPSBsb2NhbC5zbGljZSgwLCB2aXNpYmxlTGVuZ3RoKTtcclxuICAgIGNvbnN0IG1hc2tlZFBhcnQgPSAnKicucmVwZWF0KGxvY2FsLmxlbmd0aCAtIHZpc2libGVMZW5ndGgpO1xyXG4gICAgcmV0dXJuIGAke3Zpc2libGVQYXJ0fSR7bWFza2VkUGFydH1AJHtkb21haW59YDtcclxuICB9XHJcbiAgXHJcbiAgbWFza01vYmlsZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUgfHwgdmFsdWUubGVuZ3RoIDw9IDQpIHJldHVybiAnKicucmVwZWF0KHZhbHVlLmxlbmd0aCk7XHJcbiAgICBjb25zdCBmaXJzdDIgPSB2YWx1ZS5zbGljZSgwLCAyKTtcclxuICAgIGNvbnN0IGxhc3QyID0gdmFsdWUuc2xpY2UoLTIpO1xyXG4gICAgY29uc3QgbWFza2VkTWlkZGxlID0gJyonLnJlcGVhdCh2YWx1ZS5sZW5ndGggLSA0KTtcclxuICAgIHJldHVybiBgJHtmaXJzdDJ9JHttYXNrZWRNaWRkbGV9JHtsYXN0Mn1gO1xyXG4gIH1cclxuICBsb2FkVXNlckZvcm0oKSB7XHJcbiAgICAvLyB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXIodGhpcy5kZWNyeXB0KHRoaXMudXNlci5lbWFpbCkpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXIodGhpcy51c2VyLmVtYWlsKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDAgJiYgcmVzLmRhdGEucmVzdWx0KSB7XHJcbiAgICAgICAgICBjb25zdCB1c2VyRGF0YSA9IHJlcy5kYXRhLnJlc3VsdDtcclxuICAgICAgICAgIGNvbnN0IGlzVmlld01vZGUgPSB0aGlzLnR5cGUgPT09ICd2aWV3JztcclxuICAgICAgICAgIGNvbnN0IGlzU3VwZXJhZG1pbiA9IHRoaXMudXNlcl9kYXRhPy5yb2xlID09PSAnc3VwZXJhZG1pbic7XHJcbiAgXHJcbiAgICAgICAgICBjb25zdCBlbWFpbCA9IChpc1ZpZXdNb2RlICYmICFpc1N1cGVyYWRtaW4pID8gdGhpcy5tYXNrRW1haWwodXNlckRhdGEuZW1haWwpIDogdXNlckRhdGEuZW1haWw7XHJcbiAgICAgICAgICBjb25zdCBtb2JpbGUgPSAoaXNWaWV3TW9kZSAmJiAhaXNTdXBlcmFkbWluKSA/IHRoaXMubWFza01vYmlsZSh1c2VyRGF0YS5tb2JpbGVOdW1iZXIpIDogdXNlckRhdGEubW9iaWxlTnVtYmVyO1xyXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbEVtYWlsID0gdXNlckRhdGEuZW1haWw7XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsTW9iaWxlID0gdXNlckRhdGEubW9iaWxlTnVtYmVyOyBcclxuICAgICAgICAgIHRoaXMudXNlckZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgdXNlck5hbWU6IFtyZXMuZGF0YS5yZXN1bHQudXNlck5hbWUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBlbWFpbDogW2VtYWlsLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICAgICAgVmFsaWRhdG9ycy5wYXR0ZXJuKFwiXlthLXpBLVowLTkuXy1dK0BbYS16QS1aMC05Li1dK1xcXFwuW2EtekEtWl17Miw2fSRcIiksXHJcbiAgICAgICAgICBdKV0sXHJcbiAgICAgICAgICAgIG1vYmlsZU51bWJlcjogW21vYmlsZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDgpLFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEzKV0gXSxcclxuICAgICAgICAgICAgcm9sZTogW3Jlcy5kYXRhLnJlc3VsdC5yb2xlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgdXNlclR5cGU6IFtyZXMuZGF0YS5yZXN1bHQudXNlclR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICByb2xlc3Blcm1pc3Npb246IHRoaXMuZmIuYXJyYXkoW10sIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICAgICAgICB0ZWFtTGVhZDogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICAgICAgICAgIGNvdW50cnlDb2RlOiBbcmVzLmRhdGEucmVzdWx0LmNvdW50cnlDb2RlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVUYW5nb3VzZXJGaWVsZChyZXMuZGF0YS5yZXN1bHQudGFuZ29Vc2VyVHlwZSk7XHJcbiAgICAgICAgICBpZiAodGhpcy50eXBlID09IFwidmlld1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXNlckZvcm0uZGlzYWJsZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy51c2VyRm9ybS5nZXQoXCJlbWFpbFwiKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXIgPSByZXMuZGF0YS50ZWFtc0xpc3RcclxuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVXNlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRUZWFtTGVhZHModGhpcy5zZWxlY3RlZFVzZXIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAvLyB0aGlzLnVzZXJGb3JtLmdldCgndGVhbUxlYWQnKT8uc2V0VmFsdWUoKTtcclxuICAgICAgICAgIHRoaXMucG9wdWxhdGVQZXJtaXNzaW9uKHJlcz8uZGF0YT8ucmVzdWx0Py5yb2xlc3Blcm1pc3Npb24pO1xyXG4gICAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uVHlwZSA9PSBcInZpZXdcIikge1xyXG4gICAgICAgICAgICB0aGlzLnVzZXJGb3JtLmRpc2FibGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMudXNlckZvcm0uZ2V0KFwiZW1haWxcIik/LmRpc2FibGUoKTtcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgLy8gdGhpcy5nZXRVc2VyUGVybWlzc2lvbkRhdGEocmVzLmRhdGEucmVzdWx0LnJvbGUscmVzLmRhdGEucmVzdWx0LnVzZXJUeXBlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5pbml0VXNlckZvcm0oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbml0VXNlckZvcm0oKTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVGFuZ291c2VyRmllbGQodGFuZ29Vc2VyVHlwZTphbnkpIHtcclxuICAgIGlmICh0aGlzLnVzZXJUeXBlID09PSAndGFuZ28nKSB7XHJcbiAgICAgIGlmICghdGhpcy51c2VyRm9ybS5jb250YWlucygndGFuZ29Vc2VyVHlwZScpKSB7XHJcbiAgICAgICAgdGhpcy51c2VyRm9ybS5hZGRDb250cm9sKCd0YW5nb1VzZXJUeXBlJywgdGhpcy5mYi5jb250cm9sKHRhbmdvVXNlclR5cGUgfHwgJ2Rhc2hib2FyZCcsIFZhbGlkYXRvcnMucmVxdWlyZWQpKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMudXNlckZvcm0uY29udGFpbnMoJ3RhbmdvVXNlclR5cGUnKSkge1xyXG4gICAgICAgIHRoaXMudXNlckZvcm0ucmVtb3ZlQ29udHJvbCgndGFuZ29Vc2VyVHlwZScpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0VXNlckZvcm0oKSB7XHJcbiAgICB0aGlzLnVzZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHVzZXJOYW1lOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGVtYWlsOiBbXCJcIiwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgIFZhbGlkYXRvcnMucGF0dGVybihcIl5bYS16QS1aMC05Ll8tXStAW2EtekEtWjAtOS4tXStcXFxcLlthLXpBLVpdezIsNn0kXCIpXHJcbiAgICAgIF0pXSxcclxuICAgICAgbW9iaWxlTnVtYmVyOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDgpLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMyldXSxcclxuICAgICAgcm9sZTogW1widXNlclwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgdXNlclR5cGU6IFt0aGlzLnVzZXJUeXBlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgcm9sZXNwZXJtaXNzaW9uOiB0aGlzLmZiLmFycmF5KFtdLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgdGVhbUxlYWQ6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBjb3VudHJ5Q29kZTogW1wiOTFcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy51c2VyVHlwZSA9PT0gJ3RhbmdvJykge1xyXG4gICAgICBpZiAoIXRoaXMudXNlckZvcm0uY29udGFpbnMoJ3RhbmdvVXNlclR5cGUnKSkge1xyXG4gICAgICAgIHRoaXMudXNlckZvcm0uYWRkQ29udHJvbCgndGFuZ29Vc2VyVHlwZScsIHRoaXMuZmIuY29udHJvbCgnZGFzaGJvYXJkJywgVmFsaWRhdG9ycy5yZXF1aXJlZCkpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy51c2VyRm9ybS5jb250YWlucygndGFuZ29Vc2VyVHlwZScpKSB7XHJcbiAgICAgICAgdGhpcy51c2VyRm9ybS5yZW1vdmVDb250cm9sKCd0YW5nb1VzZXJUeXBlJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZ2V0VXNlclBlcm1pc3Npb25EYXRhKFwidXNlclwiLCB0aGlzLnVzZXJfZGF0YS51c2VyVHlwZSk7XHJcbiAgfVxyXG4gIHBvcHVsYXRlUGVybWlzc2lvbihwZXJtaXNzaW9uc0RhdGE6IGFueVtdKSB7XHJcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMudXNlckZvcm0uZ2V0KFwicm9sZXNwZXJtaXNzaW9uXCIpIGFzIEZvcm1BcnJheTtcclxuICAgIHBlcm1pc3Npb25zLmNsZWFyKCk7ICAvLyBDbGVhciBleGlzdGluZyBlbnRyaWVzXHJcblxyXG4gICAgcGVybWlzc2lvbnNEYXRhLmZvckVhY2goKHJvbGVzcGVybWlzc2lvbjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZlYXR1cmVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIGZlYXR1cmVOYW1lOiBbcm9sZXNwZXJtaXNzaW9uPy5mZWF0dXJlTmFtZV0sXHJcbiAgICAgICAgbW9kdWxlczogdGhpcy5mYi5hcnJheShbXSksICAvLyBJbml0aWFsaXplIG1vZHVsZXMgYXMgYSBGb3JtQXJyYXlcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBtb2R1bGVzQXJyYXkgPSBmZWF0dXJlR3JvdXAuZ2V0KFwibW9kdWxlc1wiKSBhcyBGb3JtQXJyYXk7XHJcbiAgICAgIHJvbGVzcGVybWlzc2lvbi5tb2R1bGVzLmZvckVhY2goKG1vZHVsZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbW9kdWxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgIG5hbWU6IFttb2R1bGUubmFtZV0sXHJcbiAgICAgICAgICBpc0FkZDogW3sgdmFsdWU6IG1vZHVsZS5pc0FkZCwgZGlzYWJsZWQ6IHRoaXMudHlwZSA9PT0gJ3ZpZXcnIH1dLCAvLyBTZXQgZGlzYWJsZWQgYmFzZWQgb24gdHlwZVxyXG4gICAgICAgICAgaXNFZGl0OiBbeyB2YWx1ZTogbW9kdWxlLmlzRWRpdCwgZGlzYWJsZWQ6IHRoaXMudHlwZSA9PT0gJ3ZpZXcnIH1dLCAvLyBTZXQgZGlzYWJsZWQgYmFzZWQgb24gdHlwZVxyXG4gICAgICAgICAgLy8gaXNEZWxldGU6IFttb2R1bGUuaXNEZWxldGVdLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZHVsZXNBcnJheS5wdXNoKG1vZHVsZUdyb3VwKTsgIC8vIEFkZCBlYWNoIG1vZHVsZSB0byBtb2R1bGVzIGFycmF5XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcGVybWlzc2lvbnMucHVzaChmZWF0dXJlR3JvdXApOyAgLy8gQWRkIGVhY2ggZmVhdHVyZSBncm91cCB0byBwZXJtaXNzaW9uc1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gVHJpZ2dlciB2YWxpZGF0aW9uIGFmdGVyIHBvcHVsYXRpbmdcclxuICAgIHBlcm1pc3Npb25zLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICB9XHJcblxyXG4gIGdldFBlcm1pc3Npb25zKCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy51c2VyRm9ybS5nZXQoXCJyb2xlc3Blcm1pc3Npb25cIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0RmVhdHVyZVBlcm1pc3Npb25zKHJvbGVzcGVybWlzc2lvbjogRm9ybUdyb3VwIHwgYW55KTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiByb2xlc3Blcm1pc3Npb24uZ2V0KFwibW9kdWxlc1wiKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VyUGVybWlzc2lvbkRhdGEocm9sZU5hbWU6IHN0cmluZywgdXNlclR5cGU6IHN0cmluZykge1xyXG4gICAgKHRoaXMudXNlckZvcm0/LmdldChcInJvbGVzcGVybWlzc2lvblwiKSBhcyBGb3JtQXJyYXkpLmNsZWFyKCk7XHJcbiAgICB0aGlzLnBvcHVsYXRlUGVybWlzc2lvbih0aGlzLnBlcm1pc3Npb25BcnJheSk7XHJcbiAgfVxyXG5cclxuICBjYW1lbENhc2VUb1RleHQoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvKFtBLVpdKS9nLCAnICQxJylcclxuICAgICAgLnJlcGxhY2UoL14uLywgKHN0cikgPT4gc3RyLnRvVXBwZXJDYXNlKCkpXHJcbiAgICAgIC50cmltKCk7XHJcbiAgfVxyXG5cclxuICBvcmlnaW5hbEVtYWlsOiBzdHJpbmcgPSAnJztcclxuICBvcmlnaW5hbE1vYmlsZTogc3RyaW5nID0gJyc7XHJcbmFkZFVzZXJTdWJtaXQoKSB7XHJcbiAgbGV0IHZhbHVlID0gdGhpcy51cGRhdGVQZXJtaXNzaW9uc0Jhc2VkT25Vc2VyVHlwZSh0aGlzLnVzZXJGb3JtLnZhbHVlKTtcclxuICBjb25zdCB1cGRhdGVkRGF0YSA9IHRoaXMucmVtb3ZlTnVsbFZhbHVlcyh2YWx1ZSk7XHJcblxyXG4gIGNvbnN0IGNsaWVudElkID0gdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnQgPyB0aGlzLiRoZWFkZXJGaWx0ZXJzLmNsaWVudCA6IHRoaXMudXNlcl9kYXRhLmNsaWVudElkO1xyXG5cclxuICB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZVNpbmdsZVVzZXJzKHsgLi4udXBkYXRlZERhdGEsIGNsaWVudElkIH0pLnN1YnNjcmliZSh7XHJcbiAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdChcIlVzZXIgY3JlYXRlZCBzdWNjZXNzZnVsbHkuXCIpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICAgIHRoaXMuZ3MubWFuYWdlUmVmcmVzaFRyaWdnZXIubmV4dCh0cnVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJVbmFibGUgdG8gY3JlYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgPyBlcnI/LmVycm9yPy5lcnJvciA6IFwiVW5hYmxlIHRvIGNyZWF0ZSBVc2VyIVwiKTtcclxuICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgfSxcclxuICAgIGNvbXBsZXRlOiAoKSA9PiB7fVxyXG4gIH0pO1xyXG59XHJcblxyXG4gIG9uU3VibWl0KCkge1xyXG4gICAgaWYgKHRoaXMudHlwZSA9PSBcImVkaXRcIikge1xyXG4gICAgICB0aGlzLnVzZXJVcGRhdGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWRkVXNlclN1Ym1pdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICB1c2VyVXBkYXRlKCkge1xyXG50aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5lbmFibGUoKTtcclxubGV0IHVzZXI6IGFueSA9IHRoaXMudXNlckZvcm0udmFsdWU7XHJcbmlmICghdXNlci5tb2JpbGVOdW1iZXIgfHwgdXNlci5tb2JpbGVOdW1iZXIuaW5jbHVkZXMoJyonKSkge1xyXG4gIHVzZXIubW9iaWxlTnVtYmVyID0gdGhpcy5vcmlnaW5hbE1vYmlsZTtcclxufSBlbHNlIHtcclxuIHVzZXIubW9iaWxlTnVtYmVyO1xyXG59XHJcblxyXG51c2VyLmVtYWlsID0gdGhpcy5vcmlnaW5hbEVtYWlsO1xyXG50aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5kaXNhYmxlKCk7XHJcblxyXG50eXBlIFJvbGUgPSAndXNlcicgfCAnYWRtaW4nIHwgJ3N1cGVyYWRtaW4nO1xyXG5sZXQgbWFwcGluZzogUmVjb3JkPFJvbGUsIG51bWJlcj4gPSB7XHJcbiAgdXNlcjogMSxcclxuICBhZG1pbjogMixcclxuICBzdXBlcmFkbWluOiAzLFxyXG59O1xyXG5cclxubGV0IG9sZFJvbGU6IFJvbGUgPSB0aGlzLnVzZXIucm9sZTtcclxubGV0IHVwZGF0ZWRSb2xlOiBSb2xlID0gdXNlci5yb2xlO1xyXG5cclxuaWYodXNlcj8ucm9sZSAmJiBtYXBwaW5nW29sZFJvbGVdPG1hcHBpbmdbdXBkYXRlZFJvbGVdKXtcclxudGhpcy51c2VyW1wicm9sZVN0YXR1c1wiXSA9IFwidXBcIlxyXG4gICB0aGlzLnNlcnZpY2UuZ2V0VXNlclRlYW1zKHtlbWFpbDp1c2VyLmVtYWlsLCB0eXBlOlwidXNlclwifSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDAgJiYgcmVzLmRhdGE/LnJlc3VsdD8ubGVuZ3RoID4gMCkgeyAgICAgICBcclxuICAgICAgICAgIHRoaXMudXNlcltcInRlYW1zXCJdID0gcmVzLmRhdGEucmVzdWx0XHJcbiAgICAgICAgICAvLyAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG5jb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oQWxlcnRQb3B1cENvbXBvbmVudCwgeyBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgYmFja2Ryb3A6IFwic3RhdGljXCIgfSk7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS51c2VyID0gdGhpcy51c2VyXHJcblxyXG4gICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3N1Ym1pdCcpIHtcclxuICAgICAgICAgdXNlci50ZWFtTGVhZCA9IFtdXHJcbiAgIHRoaXMuc2VydmljZS51cGRhdGVVc2Vycyh1c2VyKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoXHJcbiAgICAgICAgICAgIFwiVXNlciBkZXRhaWxzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/IGVycj8uZXJyb3I/LmVycm9yIDogXCJVbmFibGUgdG8gdXBkYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2UudXBkYXRlVXNlcnModXNlcikuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0U3VjY2Vzc1RvYXN0KFxyXG4gICAgICAgICAgICBcIlVzZXIgZGV0YWlscyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5cIlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJVbmFibGUgdG8gdXBkYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgPyBlcnI/LmVycm9yPy5lcnJvciA6IFwiVW5hYmxlIHRvIHVwZGF0ZSBVc2VyIVwiKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yID8gZXJyPy5lcnJvcj8uZXJyb3IgOiBcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4geyB9LFxyXG4gICAgfSk7XHJcblxyXG59ZWxzZSBpZih1c2VyPy5yb2xlICYmIG1hcHBpbmdbb2xkUm9sZV0+bWFwcGluZ1t1cGRhdGVkUm9sZV0pe1xyXG50aGlzLnVzZXJbXCJyb2xlU3RhdHVzXCJdID0gXCJkb3duXCJcclxuXHJcbmlmKCF0aGlzLnVzZXIubGFzdE9uZSl7XHJcbiAgICB0aGlzLnNlcnZpY2UuZ2V0VXNlclRlYW1zKHtlbWFpbDp1c2VyLmVtYWlsLCB0eXBlOlwibGVhZFwifSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDAgJiYgcmVzLmRhdGEucmVzdWx0Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIHRoaXMudXNlcltcInRlYW1zXCJdID0gcmVzLmRhdGEucmVzdWx0XHJcbiAgICAgICAgICAvLyAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICAgIC8vICBjb25zb2xlLmxvZyh7dXNlcjp0aGlzLnVzZXIsIHJvbGUxOm1hcHBpbmdbb2xkUm9sZV0sICByb2xlMjptYXBwaW5nW3VwZGF0ZWRSb2xlXSxtZXNnOlwiLi4uLi4uLi4uLi4uLjJcIiwgcm9sZTp1c2VyPy5yb2xlfSlcclxuY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEFsZXJ0UG9wdXBDb21wb25lbnQsIHsgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIGJhY2tkcm9wOiBcInN0YXRpY1wiIH0pO1xyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudXNlciA9IHRoaXMudXNlclxyXG5cclxuICAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQgPT09ICdzdWJtaXQnKSB7XHJcbiAgICAgICAgLy8gIHVzZXIudGVhbUxlYWQgPSBbXVxyXG4gICB0aGlzLnNlcnZpY2UudXBkYXRlVXNlcnModXNlcikuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0U3VjY2Vzc1RvYXN0KFxyXG4gICAgICAgICAgICBcIlVzZXIgZGV0YWlscyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5cIlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJVbmFibGUgdG8gdXBkYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6YW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yID8gZXJyPy5lcnJvcj8uZXJyb3IgOiBcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4geyB9LFxyXG4gICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS51cGRhdGVVc2Vycyh1c2VyKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoXHJcbiAgICAgICAgICAgIFwiVXNlciBkZXRhaWxzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/IGVycj8uZXJyb3I/LmVycm9yIDogXCJVbmFibGUgdG8gdXBkYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgPyBlcnI/LmVycm9yPy5lcnJvciA6IFwiVW5hYmxlIHRvIHVwZGF0ZSBVc2VyIVwiKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICB9KTtcclxufWVsc2V7XHJcbiAgICAgIC8vICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbmNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihBbGVydFBvcHVwQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnLCBiYWNrZHJvcDogXCJzdGF0aWNcIiB9KTtcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnVzZXIgPSB0aGlzLnVzZXJcclxuXHJcbiAgICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3N1Ym1pdCcpIHtcclxuICAgICAgICAvLyAgdXNlci50ZWFtTGVhZCA9IFtdXHJcbiAgIHRoaXMuc2VydmljZS51cGRhdGVVc2Vycyh1c2VyKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoXHJcbiAgICAgICAgICAgIFwiVXNlciBkZXRhaWxzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjphbnkpID0+IHtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgPyBlcnI/LmVycm9yPy5lcnJvciA6IFwiVW5hYmxlIHRvIHVwZGF0ZSBVc2VyIVwiKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIFxyXG59XHJcblxyXG5cclxufVxyXG5lbHNle1xyXG4gIHRoaXMuc2VydmljZS51cGRhdGVVc2Vycyh1c2VyKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoXHJcbiAgICAgICAgICAgIFwiVXNlciBkZXRhaWxzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/IGVycj8uZXJyb3I/LmVycm9yIDogXCJVbmFibGUgdG8gdXBkYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgIH0pO1xyXG59XHJcbiAgICBcclxuICB9XHJcbiAgdXBkYXRlUGVybWlzc2lvbnNCYXNlZE9uVXNlclR5cGUodXNlcjogYW55KSB7XHJcbiAgICB1c2VyLnJvbGVzcGVybWlzc2lvbi5mb3JFYWNoKChmZWF0dXJlOiBhbnkpID0+IHtcclxuICAgICAgZmVhdHVyZS5tb2R1bGVzLmZvckVhY2goKG1vZHVsZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh1c2VyLnVzZXJUeXBlID09PSBcInVzZXJzXCIpIHtcclxuICAgICAgICAgIG1vZHVsZXMuaXNBZGQgPSBmYWxzZTtcclxuICAgICAgICAgIG1vZHVsZXMuaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHVzZXI7XHJcbiAgfVxyXG4gIHJlbW92ZU51bGxWYWx1ZXMgPSAoZGF0YTogYW55KSA9PiB7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5yb2xlc3Blcm1pc3Npb24pKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlBlcm1pc3Npb24gaXMgbm90IGFuIGFycmF5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1hcCB0aHJvdWdoIHRoZSBwZXJtaXNzaW9ucyBhbmQgcHJvZHVjdHMgdG8gcmVtb3ZlIG51bGwgdmFsdWVzXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5kYXRhLFxyXG4gICAgICByb2xlc3Blcm1pc3Npb246IGRhdGEucm9sZXNwZXJtaXNzaW9uLm1hcCgoZmVhdHVyZTogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLmZlYXR1cmUsXHJcbiAgICAgICAgICBtb2R1bGVzOiBmZWF0dXJlLm1vZHVsZXMubWFwKChtb2R1bGVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3UHJvZHVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtb2R1bGVzKSkge1xyXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbmV3UHJvZHVjdFtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdQcm9kdWN0O1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9O1xyXG4gIGdldEFsbFRlYW1zTGlzdCgpIHtcclxuICAgIHRoaXMuc2VydmljZS5nZXRBbGxUZWFtc0xpc3QoeyBjbGllbnRJZDogdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnQgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95KSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudGVhbUxpc3QgPSByZXMuZGF0YS5yZXN1bHRcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG4gIGVkaXRVc2VyKCkge1xyXG4gICAgaWYgKHRoaXMudXNlcj8uaXNBY3RpdmUpIHtcclxuICAgICAgdGhpcy50eXBlID0gXCJlZGl0XCI7XHJcbiAgICAgIHRoaXMudXNlckZvcm0uZW5hYmxlKCk7XHJcbiAgICAgIHRoaXMudXNlckZvcm0uZ2V0KFwiZW1haWxcIik/LmRpc2FibGUoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy51c2VyPy5zdGF0dXMgPT09ICdhY3RpdmUnKSB7XHJcbiAgICAgIHRoaXMudHlwZSA9IFwidmlld1wiO1xyXG4gICAgICB0aGlzLnVzZXJGb3JtLmVuYWJsZSgpO1xyXG4gICAgICB0aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5kaXNhYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlzQnV0dG9uRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB7IHRlYW1MZWFkLCAuLi5jb250cm9sc1RvQ2hlY2sgfSA9IHRoaXMudXNlckZvcm0uY29udHJvbHM7XHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhjb250cm9sc1RvQ2hlY2spLnNvbWUoY29udHJvbCA9PiBjb250cm9sLmludmFsaWQpO1xyXG4gIH1cclxuICBzZXRUZWFtTGVhZHModGVhbUxpc3Q6IGFueVtdKSB7XHJcbiAgICBjb25zdCB0ZWFtTGVhZEFycmF5ID0gdGhpcy51c2VyRm9ybS5nZXQoJ3RlYW1MZWFkJykgYXMgRm9ybUFycmF5O1xyXG4gICAgdGVhbUxpc3QuZm9yRWFjaCh0ZWFtID0+IHtcclxuICAgICAgLy8gUHVzaCBlYWNoIHRlYW0gb2JqZWN0IGFzIGEgbmV3IEZvcm1Hcm91cCBpbnRvIHRoZSB0ZWFtTGVhZCBGb3JtQXJyYXlcclxuICAgICAgaWYgKHRlYW0uY2xpZW50SWQpIHtcclxuICAgICAgICB0ZWFtTGVhZEFycmF5LnB1c2godGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICBfaWQ6IG5ldyBGb3JtQ29udHJvbCh0ZWFtLl9pZCksXHJcbiAgICAgICAgICBjbGllbnRJZDogbmV3IEZvcm1Db250cm9sKHRlYW0uY2xpZW50SWQpLFxyXG4gICAgICAgICAgdGVhbU5hbWU6IG5ldyBGb3JtQ29udHJvbCh0ZWFtLnRlYW1OYW1lKSxcclxuICAgICAgICAgIHVzZXJzQ291bnQ6IG5ldyBGb3JtQ29udHJvbCh0ZWFtLnVzZXJzQ291bnQpXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbWl0U3BlY2lhbENoYXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcclxuICAgIGNvbnN0IHJlZ2V4ID0gL15bYS16QS1aMC05IF8tXSQvO1xyXG4gICAgaWYgKCFyZWdleC50ZXN0KGtleSkpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICAgb21pdFNwZWNpYWxDaGFyUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XHJcbiAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGEgfHwgICh3aW5kb3cgYXMgYW55KVsnY2xpcGJvYXJkRGF0YSddOztcclxuICBjb25zdCBwYXN0ZWRUZXh0ID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgY29uc3QgcmVnZXggPSAvXlthLXpBLVowLTkgXy1dKiQvO1xyXG4gIGlmICghcmVnZXgudGVzdChwYXN0ZWRUZXh0KSkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlNwZWNpYWwgY2hhcmFjdGVycyBhcmUgbm90IGFsbG93ZWQuXCIpO1xyXG4gIH1cclxuICB9XHJcbiAgXHJcbiAgcHJldmVudENsb3NlKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICB9XHJcblxyXG59IiwiPGRpdiAgY2xhc3M9XCJjYXJkIHB0LTAgcGItMyBzY3JvbGxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHktMCBkLWZsZXggZmxleC1zdGFydCBmbGV4LWNvbHVtbiBwLTkgXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTUgZC1mbGV4XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzeW1ib2wgc3ltYm9sLTc1cHggc3ltYm9sLWNpcmNsZVwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBhbHQ9XCJQaWNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9hZGQtc3RvcmUtaWNvbi5zdmdcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlIT09J3ZpZXcnICYmIHR5cGUhPT0nZWRpdCdcIiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmcy00IHRleHQtZ3JheS04MDAgdGV4dC1ob3Zlci1wcmltYXJ5IGZ3LWJvbGQgbWItMCB0aXRsZSBjdXJzb3ItcG9pbnRlclwiPkFkZFxyXG4gICAgICAgICAgICAgICAgICAgIFVzZXI8L2E+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRpdGxlXCI+UGxlYXNlIGFkZCB5b3VyIHVzZXIgZGV0YWlsczwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGU9PT0ndmlldycgJiYgdHlwZSAhPT0nZWRpdCdcIiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImZzLTQgdGV4dC1ncmF5LTgwMCB0ZXh0LWhvdmVyLXByaW1hcnkgZnctYm9sZCBtYi0wIHRpdGxlIGN1cnNvci1wb2ludGVyXCI+VXNlciBEZXRhaWxzPC9hPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10aXRsZVwiPlZpZXcgeW91ciB1c2VyIGRldGFpbHM8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcGVyYXRpb25UeXBlIT09J3ZpZXcnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8YXN5bmMpPy5HbG9iYWxfVXNlcl9pc0VkaXQgJiYgdHlwZSA9PT0ndmlldycgICYmIHR5cGUgIT09J2VkaXQnICYmIHVzZXI/LnJvbGUgIT09ICdzdXBlcmFkbWluJyAmJiB1c2VyPy5pc0FjdGl2ZSA9PT0gdHJ1ZVwiIGNsYXNzPVwiY29sLW1kLTMgdGV4dC1lbmQgcHgtMFwiIChjbGljayk9XCJlZGl0VXNlcigpXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMzgzM184NTkwOClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05LjE2NjAyIDMuMzMzMkgzLjMzMjY4QzIuODkwNjUgMy4zMzMyIDIuNDY2NzMgMy41MDg3OSAyLjE1NDE3IDMuODIxMzVDMS44NDE2MSA0LjEzMzkxIDEuNjY2MDIgNC41NTc4NCAxLjY2NjAyIDQuOTk5ODZWMTYuNjY2NUMxLjY2NjAyIDE3LjEwODYgMS44NDE2MSAxNy41MzI1IDIuMTU0MTcgMTcuODQ1QzIuNDY2NzMgMTguMTU3NiAyLjg5MDY1IDE4LjMzMzIgMy4zMzI2OCAxOC4zMzMySDE0Ljk5OTNDMTUuNDQxNCAxOC4zMzMyIDE1Ljg2NTMgMTguMTU3NiAxNi4xNzc5IDE3Ljg0NUMxNi40OTA0IDE3LjUzMjUgMTYuNjY2IDE3LjEwODYgMTYuNjY2IDE2LjY2NjVWMTAuODMzMk0xNS40MTYgMi4wODMyQzE1Ljc0NzUgMS43NTE2OCAxNi4xOTcyIDEuNTY1NDMgMTYuNjY2IDEuNTY1NDNDMTcuMTM0OSAxLjU2NTQzIDE3LjU4NDUgMS43NTE2OCAxNy45MTYgMi4wODMyQzE4LjI0NzUgMi40MTQ3MiAxOC40MzM4IDIuODY0MzYgMTguNDMzOCAzLjMzMzJDMTguNDMzOCAzLjgwMjA0IDE4LjI0NzUgNC4yNTE2OCAxNy45MTYgNC41ODMyTDkuOTk5MzUgMTIuNDk5OUw2LjY2NjAyIDEzLjMzMzJMNy40OTkzNSA5Ljk5OTg2TDE1LjQxNiAyLjA4MzJaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8zODMzXzg1OTA4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGU9PT0nZWRpdCcgICYmIHR5cGUgIT09J3ZpZXcnXCIgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmcy00IHRleHQtZ3JheS04MDAgdGV4dC1ob3Zlci1wcmltYXJ5IGZ3LWJvbGQgbWItMCB0aXRsZSBjdXJzb3ItcG9pbnRlclwiPlVzZXIgRGV0YWlsczwvYT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGl0bGVcIj5FZGl0IHlvdXIgdXNlciBkZXRhaWxzPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgaC0wcHggc2Nyb2xsXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNVwiICpuZ0lmPVwidXNlckZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInVzZXJGb3JtXCIgbm92YWxpZGF0ZT1cIm5vdmFsaWRhdGVcIiAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50Q2xvc2UoJGV2ZW50KVwiIGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHgtMCBtZS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFVzZXIgTmFtZSBGaWVsZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInVzZXJuYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+VXNlciBOYW1lIDxzcGFuIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJ1c2VybmFtZVwiIGZvcm1Db250cm9sTmFtZT1cInVzZXJOYW1lXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKGtleXByZXNzKT1cIm9taXRTcGVjaWFsQ2hhcigkZXZlbnQpXCIgKHBhc3RlKT1cIm9taXRTcGVjaWFsQ2hhclBhc3RlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJGb3JtLmdldCgndXNlck5hbWUnKT8uaW52YWxpZCAmJiAodXNlckZvcm0uZ2V0KCd1c2VyTmFtZScpPy5kaXJ0eSlcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCd1c2VyTmFtZScpPy5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPlVzZXIgTmFtZSBpcyByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbWFpbCBGaWVsZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVtYWlsXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+RW1haWwgPHNwYW4gY2xhc3M9XCJhbGVydC1yZXF1aXJlZCB0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJlbWFpbFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJlbWFpbFwiIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ2VtYWlsJyk/LmludmFsaWQgJiYgdXNlckZvcm0uZ2V0KCdlbWFpbCcpPy50b3VjaGVkXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgnZW1haWwnKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5FbWFpbCBpcyByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgnZW1haWwnKT8uZXJyb3JzPy5bJ3BhdHRlcm4nXVwiPkludmFsaWQgZW1haWwgZm9ybWF0Ljwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvbnRhY3QgTnVtYmVyIEZpZWxkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY29udGFjdFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNvbnRhY3QgTnVtYmVyIDxzcGFuIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy00IGNvbC14bC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgcHMtMyBwZS04XCIgaWQ9XCJpbnB1dEdyb3VwU2VsZWN0MDFcIiBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5Q29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb3VudHJ5IG9mIGNvdW50cnlMaXN0XCIgW3ZhbHVlXT1cImNvdW50cnkucGhvbmVjb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb3VudHJ5Lm5hbWV9fSAoe3tjb3VudHJ5LnBob25lY29kZX19KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTggY29sLXhsLThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgKGtleXByZXNzKT1cIm9taXRfc3BlY2lhbF9jaGFyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1vYmlsZU51bWJlclwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGZvcm1Db250cm9sTmFtZT1cIm1vYmlsZU51bWJlclwiIG1pbmxlbmd0aD1cIjhcIiBtYXhsZW5ndGg9XCIxM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJGb3JtLmdldCgnbW9iaWxlTnVtYmVyJyk/LmludmFsaWQgJiYgdXNlckZvcm0uZ2V0KCdtb2JpbGVOdW1iZXInKT8udG91Y2hlZFwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCdtb2JpbGVOdW1iZXInKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5Db250YWN0IE51bWJlciBpcyByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ21vYmlsZU51bWJlcicpPy5lcnJvcnM/LlsnbWlubGVuZ3RoJ11cIj5Db250YWN0IE51bWJlciBtdXN0IGJlIGF0IGxlYXN0IDggZGlnaXRzLjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgnbW9iaWxlTnVtYmVyJyk/LmVycm9ycz8uWydtYXhsZW5ndGgnXVwiPkNvbnRhY3QgTnVtYmVyIGNhbm5vdCBleGNlZWQgMTMgZGlnaXRzLjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUm9sZSBGaWVsZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInJvbGVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Sb2xlIDxzcGFuIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGZvcm1Db250cm9sTmFtZT1cInJvbGVcIiAoY2hhbmdlKT1cIm9uUm9sZUNoYW5nZSh1c2VyRm9ybS5nZXQoJ3JvbGUnKT8udmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFkbWluXCI+QWRtaW48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidXNlclwiPlVzZXI8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ3JvbGUnKT8uaW52YWxpZCAmJiB1c2VyRm9ybS5nZXQoJ3JvbGUnKT8udG91Y2hlZFwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ3JvbGUnKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5Sb2xlIGlzIHJlcXVpcmVkLjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCB0byBUZWFtIEZpZWxkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgY29sLXhsLTEyIGNvbC14eGwtMTIgbWItNVwiICpuZ0lmPVwidGhpcy51c2VyVHlwZSAhPT0ndGFuZ28nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0ZWFtTGVhZFwiIGNsYXNzPVwiZm9ybS1sYWJlbCB0ZWFtcy10aXRsZVwiPkFkZCB0byBhIHRlYW08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVhbS1zZWxlY3QgW2l0ZW1zXT1cInRlYW1MaXN0XCIgW211bHRpXT1cInRydWVcIiBbc2VhcmNoRmllbGRdPVwiJ3RlYW1OYW1lJ1wiIFtpZEZpZWxkXT1cIidfaWQnXCIgW2Rpc2FibGVkXT1cInR5cGUgPT09ICd2aWV3JyA/IHRydWUgOiBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwib25TdG9yZVNlbGVjdCgkZXZlbnQpXCIgW3NlbGVjdGVkVmFsdWVzXT1cInNlbGVjdGVkVXNlclwiPjwvdGVhbS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJGb3JtLmdldCgncm9sZScpPy52YWx1ZSA9PT0gJ2FkbWluJ1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRlYW1zLXRpdGxlXCIgICpuZ0lmPVwiZ2V0UGVybWlzc2lvbnMoKS5sZW5ndGhcIj5BY2Nlc3MgZm9yIEFkbWluPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRQZXJtaXNzaW9ucygpLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgZm9ybUFycmF5TmFtZT1cInJvbGVzcGVybWlzc2lvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm9sZXNwZXJtaXNzaW9uIG9mIGdldFBlcm1pc3Npb25zKCkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlIG15LTIgbWUtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1oZWFkZXIgbXQtNCBtcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNhbWVsQ2FzZVRvVGV4dChyb2xlc3Blcm1pc3Npb24uZ2V0KCdmZWF0dXJlTmFtZScpPy52YWx1ZSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb2xlc3Blcm1pc3Npb24uZ2V0KCdtb2R1bGVzJylcIiBmb3JtQXJyYXlOYW1lPVwibW9kdWxlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbW9kdWxlcyBvZiBnZXRGZWF0dXJlUGVybWlzc2lvbnMocm9sZXNwZXJtaXNzaW9uKT8uY29udHJvbHM7IGxldCBqID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJqXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwicm9sZXNwZXJtaXNzaW9uLmdldCgnZmVhdHVyZU5hbWUnKT8udmFsdWUgIT09ICdUYW5nb0FkbWluJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3LTUwXCI+e3sgY2FtZWxDYXNlVG9UZXh0KG1vZHVsZXMuZ2V0KCduYW1lJyk/LnZhbHVlKSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtc3RhcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1pbmxpbmUtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0FkZFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2hhbmdlKT1cImhhbmRsZVZpZXdDaGFuZ2UobW9kdWxlcylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1sYWJlbCBtcy0yIG10LWF1dG9cIj5BZGQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LXN0YXJ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiaXNFZGl0XCIgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjaGFuZ2UpPVwiaGFuZGxlRWRpdENoYW5nZShtb2R1bGVzKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWxhYmVsIG1zLTIgbXQtYXV0b1wiPkVkaXQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm9sZXNwZXJtaXNzaW9uLmdldCgnZmVhdHVyZU5hbWUnKT8udmFsdWUgPT09ICdUYW5nb0FkbWluJ1wiIGNsYXNzPVwicm93IHctMTAwIHRleHQtbm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiICpuZ0Zvcj1cImxldCBtb2R1bGVzIG9mIGdldEZlYXR1cmVQZXJtaXNzaW9ucyhyb2xlc3Blcm1pc3Npb24pPy5jb250cm9sczsgbGV0IGogPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImpcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1pbmxpbmUtZmxleCBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIGZvcm1Db250cm9sTmFtZT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWxhYmVsIG1iLTUgbXgtMiBtdC0xXCIgc3R5bGU9XCJ0ZXh0LXdyYXA6bm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNhbWVsQ2FzZVRvVGV4dChtb2R1bGVzLmdldCgnbmFtZScpPy52YWx1ZSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHlwZSE9PSd2aWV3J1wiIGNsYXNzPVwiZC1mbGV4IG15LTEwXCIgcm9sZT1cImdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwIG1lLTNcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwIG1zLTNcIiBpZD1cImFsZXJ0LXRvYXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TdWJtaXQoKVwiIFtkaXNhYmxlZF09XCJ1c2VyRm9ybS5pbnZhbGlkIHx8IHR5cGUgPT09ICd2aWV3J1wiPlN1Ym1pdDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj4iXX0=