tango-app-ui-manage-users 3.4.0-alpha.2 → 3.4.0-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/esm2022/lib/components/tango-manage-users/add-user-popup/add-user-popup.component.mjs +63 -17
  2. package/esm2022/lib/components/tango-manage-users/assign-store-popup/assign-store-popup.component.mjs +19 -73
  3. package/esm2022/lib/components/tango-manage-users/audit-user/audit-user-earnings/audit-user-earnings.component.mjs +19 -11
  4. package/esm2022/lib/components/tango-manage-users/audit-user/audit-user-list/audit-user-list.component.mjs +24 -27
  5. package/esm2022/lib/components/tango-manage-users/brand-user/brand-user.component.mjs +26 -5
  6. package/esm2022/lib/components/tango-manage-users/group-select/group-select.component.mjs +155 -0
  7. package/esm2022/lib/components/tango-manage-users/roles-permission-table/roles-permission-table.component.mjs +3 -3
  8. package/esm2022/lib/components/tango-manage-users/tango-manage-users.component.mjs +3 -3
  9. package/esm2022/lib/components/tango-manage-users/user-table/alert-popup/alert-popup.component.mjs +3 -3
  10. package/esm2022/lib/components/tango-manage-users/user-table/user-table.component.mjs +5 -5
  11. package/esm2022/lib/components-v2/action-popup/action-popup.component.mjs +3 -3
  12. package/esm2022/lib/components-v2/add-users/add-users.component.mjs +72 -16
  13. package/esm2022/lib/components-v2/custom-select/custom-select.component.mjs +3 -3
  14. package/esm2022/lib/components-v2/teams-creation/teams-creation.component.mjs +12 -5
  15. package/esm2022/lib/components-v2/teams-list/teams-list.component.mjs +18 -5
  16. package/esm2022/lib/components-v2/users-list/users-list.component.mjs +3 -3
  17. package/esm2022/lib/components-v2/users-manage/users-manage.component.mjs +3 -3
  18. package/esm2022/lib/components-v2/viewteams-list/viewteams-list.component.mjs +28 -5
  19. package/esm2022/lib/services/excel.service.mjs +3 -3
  20. package/esm2022/lib/services/user.service.mjs +6 -5
  21. package/esm2022/lib/services-v2/manage-users.service.mjs +3 -3
  22. package/esm2022/lib/tango-manage-users-routing.module.mjs +4 -4
  23. package/esm2022/lib/tango-manage-users.module.mjs +8 -5
  24. package/fesm2022/tango-app-ui-manage-users.mjs +464 -193
  25. package/fesm2022/tango-app-ui-manage-users.mjs.map +1 -1
  26. package/lib/components/tango-manage-users/add-user-popup/add-user-popup.component.d.ts +3 -0
  27. package/lib/components/tango-manage-users/assign-store-popup/assign-store-popup.component.d.ts +3 -3
  28. package/lib/components/tango-manage-users/audit-user/audit-user-earnings/audit-user-earnings.component.d.ts +1 -1
  29. package/lib/components/tango-manage-users/audit-user/audit-user-list/audit-user-list.component.d.ts +3 -5
  30. package/lib/components/tango-manage-users/brand-user/brand-user.component.d.ts +2 -0
  31. package/lib/components/tango-manage-users/group-select/group-select.component.d.ts +33 -0
  32. package/lib/components-v2/add-users/add-users.component.d.ts +5 -0
  33. package/lib/components-v2/teams-creation/teams-creation.component.d.ts +1 -0
  34. package/lib/components-v2/teams-list/teams-list.component.d.ts +2 -0
  35. package/lib/components-v2/viewteams-list/viewteams-list.component.d.ts +3 -0
  36. package/lib/services/user.service.d.ts +1 -0
  37. package/lib/tango-manage-users.module.d.ts +10 -9
  38. package/package.json +1 -1
@@ -96,7 +96,6 @@ export class AddUsersComponent {
96
96
  }
97
97
  this.user_data = JSON?.parse(localStorage.getItem('user-info') || '');
98
98
  this.$headerFilters = data ? data : this.user_data;
99
- this.getCountryCodes();
100
99
  this.getRoles();
101
100
  this.getAllTeamsList();
102
101
  if (this.type === "view" || (this.type === "edit")) {
@@ -108,6 +107,7 @@ export class AddUsersComponent {
108
107
  // this.getAllTeamsList()
109
108
  // this.showsingleuser = false;
110
109
  }
110
+ this.getCountryCodes();
111
111
  }
112
112
  getRoles() {
113
113
  if (this.userType === 'tango') {
@@ -153,7 +153,6 @@ export class AddUsersComponent {
153
153
  });
154
154
  }
155
155
  onrolechange(event) {
156
- console.log(event.target.value);
157
156
  if (event.target.value === 'user') {
158
157
  this.populatePermission(this.permissionArray);
159
158
  }
@@ -176,23 +175,45 @@ export class AddUsersComponent {
176
175
  // onSubmit() {
177
176
  // this.activeModal.close('submit');
178
177
  // }
178
+ maskEmail(value) {
179
+ if (!value || !value.includes('@'))
180
+ return '';
181
+ const [local, domain] = value.split('@');
182
+ const visibleLength = Math.min(3, local.length);
183
+ const visiblePart = local.slice(0, visibleLength);
184
+ const maskedPart = '*'.repeat(local.length - visibleLength);
185
+ return `${visiblePart}${maskedPart}@${domain}`;
186
+ }
187
+ maskMobile(value) {
188
+ if (!value || value.length <= 4)
189
+ return '*'.repeat(value.length);
190
+ const first2 = value.slice(0, 2);
191
+ const last2 = value.slice(-2);
192
+ const maskedMiddle = '*'.repeat(value.length - 4);
193
+ return `${first2}${maskedMiddle}${last2}`;
194
+ }
179
195
  loadUserForm() {
180
196
  this.userService.getUser(this.user.email).pipe(takeUntil(this.destroy$)).subscribe({
181
197
  next: (res) => {
182
198
  if (res && res.code == 200 && res.data.result) {
199
+ const userData = res.data.result;
200
+ const isViewMode = this.type === 'view';
201
+ const isSuperadmin = this.user_data?.role === 'superadmin';
202
+ const email = (isViewMode && !isSuperadmin) ? this.maskEmail(userData.email) : userData.email;
203
+ const mobile = (isViewMode && !isSuperadmin) ? this.maskMobile(userData.mobileNumber) : userData.mobileNumber;
183
204
  this.userForm = this.fb.group({
184
205
  userName: [res.data.result.userName, Validators.required],
185
- email: [res.data.result.email, Validators.compose([Validators.required,
206
+ email: [email, Validators.compose([Validators.required,
186
207
  Validators.pattern("^[a-zA-Z0-9]+([.-_]?[a-zA-Z0-9]+)*@[a-zA-Z0-9]+([.-_]?[a-zA-Z]+)*[.]{1}[a-zA-Z]{2,}$"),
187
208
  ])],
188
- mobileNumber: [res.data.result.mobileNumber, [Validators.required, Validators.minLength(10), Validators.maxLength(13)]],
209
+ mobileNumber: [mobile, [Validators.required, Validators.minLength(8), Validators.maxLength(13)]],
189
210
  role: [res.data.result.role, Validators.required],
190
211
  userType: [res.data.result.userType, Validators.required],
191
- tangoUserType: [res.data.result.tangoUserType, Validators.required],
192
212
  rolespermission: this.fb.array([], Validators.required),
193
213
  teamLead: this.fb.array([]),
194
214
  countryCode: [res.data.result.countryCode, Validators.required],
195
215
  });
216
+ this.updateTangouserField(res.data.result.tangoUserType);
196
217
  if (this.type == "view") {
197
218
  this.userForm.disable();
198
219
  }
@@ -222,20 +243,41 @@ export class AddUsersComponent {
222
243
  complete: () => { },
223
244
  });
224
245
  }
246
+ updateTangouserField(tangoUserType) {
247
+ if (this.userType === 'tango') {
248
+ if (!this.userForm.contains('tangoUserType')) {
249
+ this.userForm.addControl('tangoUserType', this.fb.control(tangoUserType || 'dashboard', Validators.required));
250
+ }
251
+ }
252
+ else {
253
+ if (this.userForm.contains('tangoUserType')) {
254
+ this.userForm.removeControl('tangoUserType');
255
+ }
256
+ }
257
+ }
225
258
  initUserForm() {
226
259
  this.userForm = this.fb.group({
227
260
  userName: ["", Validators.required],
228
261
  email: ["", Validators.compose([Validators.required,
229
262
  Validators.pattern("^[a-zA-Z0-9]+([.-_]?[a-zA-Z0-9]+)*@[a-zA-Z0-9]+([.-_]?[a-zA-Z]+)*[.]{1}[a-zA-Z]{2,}$"),
230
263
  ])],
231
- mobileNumber: ["", [Validators.required, Validators.minLength(10), Validators.maxLength(15)]],
264
+ mobileNumber: ["", [Validators.required, Validators.minLength(8), Validators.maxLength(13)]],
232
265
  role: ["user", Validators.required],
233
266
  userType: [this.userType, Validators.required],
234
- tangoUserType: ["dashboard", Validators.required],
235
267
  rolespermission: this.fb.array([], Validators.required),
236
268
  teamLead: this.fb.array([]),
237
- countryCode: ["", Validators.required],
269
+ countryCode: ["91", Validators.required],
238
270
  });
271
+ if (this.userType === 'tango') {
272
+ if (!this.userForm.contains('tangoUserType')) {
273
+ this.userForm.addControl('tangoUserType', this.fb.control('dashboard', Validators.required));
274
+ }
275
+ }
276
+ else {
277
+ if (this.userForm.contains('tangoUserType')) {
278
+ this.userForm.removeControl('tangoUserType');
279
+ }
280
+ }
239
281
  this.getUserPermissionData("user", this.user_data.userType);
240
282
  }
241
283
  populatePermission(permissionsData) {
@@ -280,8 +322,6 @@ export class AddUsersComponent {
280
322
  addUserSubmit() {
281
323
  let value = this.updatePermissionsBasedOnUserType(this.userForm.value);
282
324
  const updatedData = this.removeNullValues(value);
283
- console.log('this.userForm.value', this.userForm.value);
284
- console.log('updatedData', updatedData);
285
325
  this.userService.createSingleUsers({ ...updatedData, ...{ clientId: this.$headerFilters.client ? this.$headerFilters.client : this.user_data.clientId } }).subscribe({
286
326
  next: (res) => {
287
327
  if (res && res.code == 200) {
@@ -396,7 +436,6 @@ export class AddUsersComponent {
396
436
  }
397
437
  setTeamLeads(teamList) {
398
438
  const teamLeadArray = this.userForm.get('teamLead');
399
- console.log(teamLeadArray);
400
439
  teamList.forEach(team => {
401
440
  // Push each team object as a new FormGroup into the teamLead FormArray
402
441
  if (team.clientId) {
@@ -409,12 +448,29 @@ export class AddUsersComponent {
409
448
  }
410
449
  });
411
450
  }
412
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", 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 }], target: i0.ɵɵFactoryTarget.Component });
413
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", 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==='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Edit User Details</a>\r\n <div class=\"sub-title\">Please Edit 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\r\n *ngIf=\"(gs.userAccess |async)?.Global_User_isEdit && type ==='view' && type !=='edit' && user?.role !== 'superadmin'\"\r\n 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\" 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\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"username\" formControlName=\"userName\" autocomplete=\"off\">\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\r\n 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)\" id=\"mobileNumber\"\r\n autocomplete=\"off\" formControlName=\"mobileNumber\">\r\n <div *ngIf=\"userForm.get('mobileNumber')?.invalid && userForm.get('mobileNumber')?.touched\"\r\n class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['required']\">Contact Number is\r\n required.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['minlength']\">Contact Number must be at least\r\n 10 digits.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['maxlength']\">Contact Number cannot exceed 13\r\n 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 <!-- User Type Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"tangoUserType\" class=\"form-label\">User Type <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <select class=\"form-select\" formControlName=\"tangoUserType\"\r\n (change)=\"onRoleChange(userForm.get('tangoUserType')?.value)\">\r\n <option value=\"dashboard\">Dashboard</option>\r\n <option value=\"audit\">Audit</option>\r\n </select>\r\n <div *ngIf=\"userForm.get('tangoUserType')?.invalid && userForm.get('tangoUserType')?.touched\"\r\n class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('tangoUserType')?.errors?.['required']\">User Type 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'\"\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\"\r\n [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\r\n *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\"\r\n [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\"\r\n (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\"\r\n (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'\"\r\n class=\"row w-100 text-nowrap\">\r\n <div class=\"col-md-4\"\r\n *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\"\r\n [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\" (click)=\"onSubmit()\"\r\n [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.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" }] });
451
+ omitSpecialChar(event) {
452
+ const key = event.key;
453
+ const regex = /^[a-zA-Z0-9 _-]$/;
454
+ if (!regex.test(key)) {
455
+ event.preventDefault();
456
+ }
457
+ }
458
+ omitSpecialCharPaste(event) {
459
+ const clipboardData = event.clipboardData || window['clipboardData'];
460
+ ;
461
+ const pastedText = clipboardData.getData('text');
462
+ const regex = /^[a-zA-Z0-9 _-]*$/;
463
+ if (!regex.test(pastedText)) {
464
+ event.preventDefault();
465
+ this.ts.getErrorToast("Special characters are not allowed.");
466
+ }
467
+ }
468
+ 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 }], target: i0.ɵɵFactoryTarget.Component });
469
+ 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==='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Edit User Details</a>\r\n <div class=\"sub-title\">Please Edit 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'\" 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\" 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'\" \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" }] });
414
470
  }
415
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: AddUsersComponent, decorators: [{
471
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddUsersComponent, decorators: [{
416
472
  type: Component,
417
- 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==='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Edit User Details</a>\r\n <div class=\"sub-title\">Please Edit 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\r\n *ngIf=\"(gs.userAccess |async)?.Global_User_isEdit && type ==='view' && type !=='edit' && user?.role !== 'superadmin'\"\r\n 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\" 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\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" id=\"username\" formControlName=\"userName\" autocomplete=\"off\">\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\r\n 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)\" id=\"mobileNumber\"\r\n autocomplete=\"off\" formControlName=\"mobileNumber\">\r\n <div *ngIf=\"userForm.get('mobileNumber')?.invalid && userForm.get('mobileNumber')?.touched\"\r\n class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['required']\">Contact Number is\r\n required.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['minlength']\">Contact Number must be at least\r\n 10 digits.</small>\r\n <small *ngIf=\"userForm.get('mobileNumber')?.errors?.['maxlength']\">Contact Number cannot exceed 13\r\n 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 <!-- User Type Field -->\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"tangoUserType\" class=\"form-label\">User Type <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <select class=\"form-select\" formControlName=\"tangoUserType\"\r\n (change)=\"onRoleChange(userForm.get('tangoUserType')?.value)\">\r\n <option value=\"dashboard\">Dashboard</option>\r\n <option value=\"audit\">Audit</option>\r\n </select>\r\n <div *ngIf=\"userForm.get('tangoUserType')?.invalid && userForm.get('tangoUserType')?.touched\"\r\n class=\"text-danger\">\r\n <small *ngIf=\"userForm.get('tangoUserType')?.errors?.['required']\">User Type 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'\"\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\"\r\n [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\r\n *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\"\r\n [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\"\r\n (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\"\r\n (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'\"\r\n class=\"row w-100 text-nowrap\">\r\n <div class=\"col-md-4\"\r\n *ngFor=\"let modules of getFeaturePermissions(rolespermission)?.controls; let j = index\"\r\n [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\" (click)=\"onSubmit()\"\r\n [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"] }]
473
+ 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==='edit'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Edit User Details</a>\r\n <div class=\"sub-title\">Please Edit 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'\" 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\" 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'\" \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"] }]
418
474
  }], ctorParameters: () => [{ type: i1.ManageUsersService }, { type: i0.ChangeDetectorRef }, { type: i2.NgbActiveModal }, { type: i3.FormBuilder }, { type: i4.UserService }, { type: i5.ToastService }, { type: i6.GlobalStateService }], propDecorators: { type: [{
419
475
  type: Input
420
476
  }], user: [{
@@ -424,4 +480,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
424
480
  }], data: [{
425
481
  type: Input
426
482
  }] } });
427
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXVzZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS11c2Vycy9zcmMvbGliL2NvbXBvbmVudHMtdjIvYWRkLXVzZXJzL2FkZC11c2Vycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtdXNlcnMvc3JjL2xpYi9jb21wb25lbnRzLXYyL2FkZC11c2Vycy9hZGQtdXNlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHeEQsT0FBTyxFQUEwQixXQUFXLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7QUFTNUYsTUFBTSxPQUFPLGlCQUFpQjtJQThEUjtJQUNWO0lBQ0Q7SUFDQztJQUNBO0lBQ0E7SUFDRDtJQW5FUSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUNoQyxJQUFJLENBQU07SUFDVixJQUFJLENBQU07SUFDVixRQUFRLENBQU07SUFDZCxJQUFJLENBQU07SUFDbkIsUUFBUSxDQUFZO0lBQ3BCLGFBQWEsR0FBVyxLQUFLLENBQUM7SUFDOUIsUUFBUSxHQUFRLEVBQUUsQ0FBQTtJQUNsQixXQUFXLENBQU07SUFDakIsWUFBWSxHQUFRLEVBQUUsQ0FBQztJQUN2QixVQUFVLEdBQVcsa0JBQWtCLENBQUM7SUFDeEMsVUFBVSxHQUFXLDRCQUE0QixDQUFDO0lBQ2xELFNBQVMsQ0FBTTtJQUNmLGNBQWMsQ0FBTTtJQUNILFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzFDLGVBQWUsR0FBRztRQUNoQjtZQUNFLFdBQVcsRUFBRSxRQUFR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QUFDO0lBQ0QsWUFBWSxDQUFDLFFBQWU7UUFDMUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFjLENBQUM7UUFDakUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUMxQixRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RCLHVFQUF1RTtZQUN2RSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0JBQy9CLEdBQUcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO29CQUM5QixRQUFRLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDeEMsUUFBUSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQ3hDLFVBQVUsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUM3QyxDQUFDLENBQUMsQ0FBQzthQUNMO1FBRUgsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO3dHQTlaVSxpQkFBaUI7NEZBQWpCLGlCQUFpQixpSUNiOUIsa3ZaQXdNUTs7NEZEM0xLLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxlQUFlO29RQU1oQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgTWFuYWdlVXNlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMtdjIvbWFuYWdlLXVzZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWFkZC11c2VycycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC11c2Vycy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2FkZC11c2Vycy5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEFkZFVzZXJzQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkluaXQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgQElucHV0KCkgdHlwZTogYW55O1xyXG4gIEBJbnB1dCgpIHVzZXI6IGFueTtcclxuICBASW5wdXQoKSB1c2VyVHlwZTogYW55O1xyXG4gIEBJbnB1dCgpIGRhdGE6IGFueTtcclxuICB1c2VyRm9ybTogRm9ybUdyb3VwO1xyXG4gIG9wZXJhdGlvblR5cGU6IHN0cmluZyA9ICdhZGQnO1xyXG4gIHRlYW1MaXN0OiBhbnkgPSBbXVxyXG4gIGNvdW50cnlMaXN0OiBhbnk7XHJcbiAgc2VsZWN0ZWRVc2VyOiBhbnkgPSBbXTtcclxuICBwaG9uZVJlZ2V4OiBSZWdFeHAgPSAvXihcXGR7M30pP1xcZHsxNX0kLztcclxuICBlbWFpbFJlZ2V4OiBSZWdFeHAgPSAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLztcclxuICB1c2VyX2RhdGE6IGFueTtcclxuICAkaGVhZGVyRmlsdGVyczogYW55O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG4gIHBlcm1pc3Npb25BcnJheSA9IFtcclxuICAgIHtcclxuICAgICAgZmVhdHVyZU5hbWU6IFwiR2xvYmFsXCIsXHJcbiAgICAgIG1vZHVsZXM6IFtcclxuICAgICAgICB7IG5hbWU6IFwiU3RvcmVcIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBuYW1lOiBcIlVzZXJcIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBuYW1lOiBcIkNhbWVyYVwiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiQ29uZmlndXJhdGlvblwiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiU3Vic2NyaXB0aW9uXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJCaWxsaW5nXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICBdXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBmZWF0dXJlTmFtZTogXCJUYW5nb0V5ZVwiLFxyXG4gICAgICBtb2R1bGVzOiBbXHJcblxyXG4gICAgICAgIHsgbmFtZTogXCJab25lVGFnXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICBdXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBmZWF0dXJlTmFtZTogXCJUYW5nb1RyYXhcIixcclxuICAgICAgbW9kdWxlczogW1xyXG4gICAgICAgIHsgbmFtZTogXCJjaGVja2xpc3RcIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBuYW1lOiBcIlRhc2tcIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgIF1cclxuICAgIH0sXHJcblxyXG4gIF07XHJcblxyXG4gIGhhbmRsZVZpZXdDaGFuZ2UobW9kdWxlczogRm9ybUdyb3VwIHwgYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIW1vZHVsZXMuZ2V0KFwiaXNBZGRcIik/LnZhbHVlKSB7XHJcbiAgICAgIG1vZHVsZXMuZ2V0KFwiaXNEZWxldGVcIik/LnNldFZhbHVlKGZhbHNlKTtcclxuICAgICAgbW9kdWxlcy5nZXQoXCJpc0VkaXRcIik/LnNldFZhbHVlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcbiAgaGFuZGxlRWRpdENoYW5nZShtb2R1bGVzOiBGb3JtR3JvdXAgfCBhbnkpOiB2b2lkIHtcclxuICAgIC8vIGlmICghbW9kdWxlcy5nZXQoXCJpc0FkZFwiKT8udmFsdWUpIHtcclxuICAgIC8vICAgbW9kdWxlcy5nZXQoXCJpc0RlbGV0ZVwiKT8uc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgLy8gICBtb2R1bGVzLmdldChcImlzRWRpdFwiKT8uc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgLy8gfVxyXG4gICAgaWYgKCFtb2R1bGVzLmdldChcImlzRWRpdFwiKT8udmFsdWUpIHtcclxuICAgICAgLy8gbW9kdWxlcy5nZXQoJ2lzRG93bmxvYWQnKT8uc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgICBtb2R1bGVzLmdldChcImlzRGVsZXRlXCIpPy5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNlcnZpY2U6IE1hbmFnZVVzZXJzU2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHVibGljIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRzOiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICApIHtcclxuXHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZGVzdHJveS5uZXh0KGZhbHNlKTtcclxuICAgIHRoaXMuZGVzdHJveS5jb21wbGV0ZSgpO1xyXG5cclxuICB9XHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLnR5cGUpXHJcbiAgICBsZXQgZGF0YTogYW55O1xyXG4gICAgaWYgKFwiaGVhZGVyLWZpbHRlcnNcIiBpbiBsb2NhbFN0b3JhZ2UpIHtcclxuICAgICAgZGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJykgfHwgJycpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51c2VyX2RhdGEgPSBKU09OPy5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgfHwgJycpO1xyXG4gICAgdGhpcy4kaGVhZGVyRmlsdGVycyA9IGRhdGEgPyBkYXRhIDogdGhpcy51c2VyX2RhdGE7XHJcbiAgICB0aGlzLmdldENvdW50cnlDb2RlcygpO1xyXG4gICAgdGhpcy5nZXRSb2xlcygpO1xyXG4gICAgdGhpcy5nZXRBbGxUZWFtc0xpc3QoKVxyXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gXCJ2aWV3XCIgfHwgKHRoaXMudHlwZSA9PT0gXCJlZGl0XCIpKSB7XHJcbiAgICAgIC8vIHRoaXMuYWRkU2luZ2xlVXNlcigpO1xyXG4gICAgICB0aGlzLmxvYWRVc2VyRm9ybSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbml0VXNlckZvcm0oKTtcclxuICAgICAgLy8gdGhpcy5nZXRBbGxUZWFtc0xpc3QoKVxyXG4gICAgICAvLyB0aGlzLnNob3dzaW5nbGV1c2VyID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0Um9sZXMoKSB7XHJcbiAgICBpZiAodGhpcy51c2VyVHlwZSA9PT0gJ3RhbmdvJykge1xyXG4gICAgICB0aGlzLnBlcm1pc3Npb25BcnJheS5wdXNoKHtcclxuICAgICAgICBmZWF0dXJlTmFtZTogXCJUYW5nb0FkbWluXCIsXHJcbiAgICAgICAgbW9kdWxlczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiBcImludm9pY2VBcHByb3ZhbFwiLCBpc0FkZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzRWRpdDogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiRWRpdEJpbGxpbmdcIiwgaXNBZGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0VkaXQ6IGZhbHNlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiBcIlRpY2tldENvbmZpZ3VyYXRpb25cIiwgaXNBZGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0VkaXQ6IGZhbHNlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiBcIlJlcG9ydHNcIiwgaXNBZGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0VkaXQ6IGZhbHNlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF1cclxuICAgICAgfSwpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbWl0X3NwZWNpYWxfY2hhcihldmVudDogYW55KSB7XHJcbiAgICB2YXIgaztcclxuICAgIGsgPSBldmVudC5jaGFyQ29kZTtcclxuICAgIHJldHVybiBrID09IDggfHwgayA9PSAzMiB8fCAoayA+PSA0OCAmJiBrIDw9IDU3KTtcclxuICB9XHJcblxyXG4gIG9uUm9sZUNoYW5nZShyb2xlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZ2V0VXNlclBlcm1pc3Npb25EYXRhKHJvbGUsIHRoaXMudXNlcl9kYXRhLnVzZXJUeXBlKTtcclxuICB9XHJcbiAgZ2V0Q291bnRyeUNvZGVzKCkge1xyXG4gICAgdGhpcy5zZXJ2aWNlLmdldEFsbENvdW50cmllcygpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLmNvdW50cnlMaXN0ID0gcmVzLmRhdGFcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG5cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbiAgb25yb2xlY2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnNvbGUubG9nKGV2ZW50LnRhcmdldC52YWx1ZSlcclxuICAgIGlmIChldmVudC50YXJnZXQudmFsdWUgPT09ICd1c2VyJykge1xyXG4gICAgICB0aGlzLnBvcHVsYXRlUGVybWlzc2lvbih0aGlzLnBlcm1pc3Npb25BcnJheSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuICBvblN0b3JlU2VsZWN0KGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRVc2VyID0gZXZlbnRcclxuICAgIGNvbnN0IHRlYW1MZWFkQXJyYXkgPSB0aGlzLnVzZXJGb3JtLmdldCgndGVhbUxlYWQnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICB0ZWFtTGVhZEFycmF5LmNsZWFyKCk7IC8vIENsZWFycyBleGlzdGluZyB2YWx1ZXNcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkVXNlci5mb3JFYWNoKCh1c2VyOiBhbnkpID0+IHtcclxuICAgICAgdGVhbUxlYWRBcnJheS5wdXNoKG5ldyBGb3JtQ29udHJvbCh1c2VyKSk7IC8vIEFkZHMgZWFjaCB1c2VyIGluIHNlbGVjdGVkVXNlciBhcnJheVxyXG4gICAgfSk7XHJcbiAgICA7XHJcbiAgICAvLyB0aGlzLnNldFRlYW1MZWFkcyhldmVudCk7XHJcbiAgfVxyXG5cclxuICBjYW5jZWwoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuICAgIGNvbnN0IHRyaWdnZXJCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdHJpZ2dlckJ1dHRvbklkJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB0cmlnZ2VyQnV0dG9uPy5mb2N1cygpO1xyXG4gIH1cclxuICAvLyBvblN1Ym1pdCgpIHtcclxuICAvLyAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gIC8vIH1cclxuICBsb2FkVXNlckZvcm0oKSB7XHJcbiAgICB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXIodGhpcy51c2VyLmVtYWlsKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDAgJiYgcmVzLmRhdGEucmVzdWx0KSB7XHJcbiAgICAgICAgICB0aGlzLnVzZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIHVzZXJOYW1lOiBbcmVzLmRhdGEucmVzdWx0LnVzZXJOYW1lLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgZW1haWw6IFtyZXMuZGF0YS5yZXN1bHQuZW1haWwsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgICAgVmFsaWRhdG9ycy5wYXR0ZXJuKFwiXlthLXpBLVowLTldKyhbLi1fXT9bYS16QS1aMC05XSspKkBbYS16QS1aMC05XSsoWy4tX10/W2EtekEtWl0rKSpbLl17MX1bYS16QS1aXXsyLH0kXCIpLFxyXG4gICAgICAgICAgICBdKV0sXHJcbiAgICAgICAgICAgIG1vYmlsZU51bWJlcjogW3Jlcy5kYXRhLnJlc3VsdC5tb2JpbGVOdW1iZXIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxMCksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEzKV1dLFxyXG4gICAgICAgICAgICByb2xlOiBbcmVzLmRhdGEucmVzdWx0LnJvbGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICB1c2VyVHlwZTogW3Jlcy5kYXRhLnJlc3VsdC51c2VyVHlwZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIHRhbmdvVXNlclR5cGU6IFtyZXMuZGF0YS5yZXN1bHQudGFuZ29Vc2VyVHlwZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIHJvbGVzcGVybWlzc2lvbjogdGhpcy5mYi5hcnJheShbXSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgICAgICAgIHRlYW1MZWFkOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgICAgICAgY291bnRyeUNvZGU6IFtyZXMuZGF0YS5yZXN1bHQuY291bnRyeUNvZGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZiAodGhpcy50eXBlID09IFwidmlld1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXNlckZvcm0uZGlzYWJsZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy51c2VyRm9ybS5nZXQoXCJlbWFpbFwiKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXIgPSByZXMuZGF0YS50ZWFtc0xpc3RcclxuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVXNlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRUZWFtTGVhZHModGhpcy5zZWxlY3RlZFVzZXIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAvLyB0aGlzLnVzZXJGb3JtLmdldCgndGVhbUxlYWQnKT8uc2V0VmFsdWUoKTtcclxuICAgICAgICAgIHRoaXMucG9wdWxhdGVQZXJtaXNzaW9uKHJlcz8uZGF0YT8ucmVzdWx0Py5yb2xlc3Blcm1pc3Npb24pO1xyXG4gICAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uVHlwZSA9PSBcInZpZXdcIikge1xyXG4gICAgICAgICAgICB0aGlzLnVzZXJGb3JtLmRpc2FibGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMudXNlckZvcm0uZ2V0KFwiZW1haWxcIik/LmRpc2FibGUoKTtcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgLy8gdGhpcy5nZXRVc2VyUGVybWlzc2lvbkRhdGEocmVzLmRhdGEucmVzdWx0LnJvbGUscmVzLmRhdGEucmVzdWx0LnVzZXJUeXBlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5pbml0VXNlckZvcm0oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbml0VXNlckZvcm0oKTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuICBpbml0VXNlckZvcm0oKSB7XHJcbiAgICB0aGlzLnVzZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHVzZXJOYW1lOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGVtYWlsOiBbXCJcIiwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oXCJeW2EtekEtWjAtOV0rKFsuLV9dP1thLXpBLVowLTldKykqQFthLXpBLVowLTldKyhbLi1fXT9bYS16QS1aXSspKlsuXXsxfVthLXpBLVpdezIsfSRcIiksXHJcbiAgICAgIF0pXSxcclxuICAgICAgbW9iaWxlTnVtYmVyOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEwKSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTUpXV0sXHJcbiAgICAgIHJvbGU6IFtcInVzZXJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHVzZXJUeXBlOiBbdGhpcy51c2VyVHlwZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHRhbmdvVXNlclR5cGU6IFtcImRhc2hib2FyZFwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgcm9sZXNwZXJtaXNzaW9uOiB0aGlzLmZiLmFycmF5KFtdLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgdGVhbUxlYWQ6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBjb3VudHJ5Q29kZTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdldFVzZXJQZXJtaXNzaW9uRGF0YShcInVzZXJcIiwgdGhpcy51c2VyX2RhdGEudXNlclR5cGUpO1xyXG4gIH1cclxuICBwb3B1bGF0ZVBlcm1pc3Npb24ocGVybWlzc2lvbnNEYXRhOiBhbnlbXSkge1xyXG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSB0aGlzLnVzZXJGb3JtLmdldChcInJvbGVzcGVybWlzc2lvblwiKSBhcyBGb3JtQXJyYXk7XHJcbiAgICBwZXJtaXNzaW9ucy5jbGVhcigpOyAgLy8gQ2xlYXIgZXhpc3RpbmcgZW50cmllc1xyXG5cclxuICAgIHBlcm1pc3Npb25zRGF0YS5mb3JFYWNoKChyb2xlc3Blcm1pc3Npb246IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBmZWF0dXJlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBmZWF0dXJlTmFtZTogW3JvbGVzcGVybWlzc2lvbj8uZmVhdHVyZU5hbWVdLFxyXG4gICAgICAgIG1vZHVsZXM6IHRoaXMuZmIuYXJyYXkoW10pLCAgLy8gSW5pdGlhbGl6ZSBtb2R1bGVzIGFzIGEgRm9ybUFycmF5XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgbW9kdWxlc0FycmF5ID0gZmVhdHVyZUdyb3VwLmdldChcIm1vZHVsZXNcIikgYXMgRm9ybUFycmF5O1xyXG4gICAgICByb2xlc3Blcm1pc3Npb24ubW9kdWxlcy5mb3JFYWNoKChtb2R1bGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1vZHVsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICBuYW1lOiBbbW9kdWxlLm5hbWVdLFxyXG4gICAgICAgICAgaXNBZGQ6IFt7IHZhbHVlOiBtb2R1bGUuaXNBZGQsIGRpc2FibGVkOiB0aGlzLnR5cGUgPT09ICd2aWV3JyB9XSwgLy8gU2V0IGRpc2FibGVkIGJhc2VkIG9uIHR5cGVcclxuICAgICAgICAgIGlzRWRpdDogW3sgdmFsdWU6IG1vZHVsZS5pc0VkaXQsIGRpc2FibGVkOiB0aGlzLnR5cGUgPT09ICd2aWV3JyB9XSwgLy8gU2V0IGRpc2FibGVkIGJhc2VkIG9uIHR5cGVcclxuICAgICAgICAgIC8vIGlzRGVsZXRlOiBbbW9kdWxlLmlzRGVsZXRlXSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBtb2R1bGVzQXJyYXkucHVzaChtb2R1bGVHcm91cCk7ICAvLyBBZGQgZWFjaCBtb2R1bGUgdG8gbW9kdWxlcyBhcnJheVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHBlcm1pc3Npb25zLnB1c2goZmVhdHVyZUdyb3VwKTsgIC8vIEFkZCBlYWNoIGZlYXR1cmUgZ3JvdXAgdG8gcGVybWlzc2lvbnNcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFRyaWdnZXIgdmFsaWRhdGlvbiBhZnRlciBwb3B1bGF0aW5nXHJcbiAgICBwZXJtaXNzaW9ucy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgfVxyXG5cclxuICBnZXRQZXJtaXNzaW9ucygpOiBGb3JtQXJyYXkge1xyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy51c2VyRm9ybS52YWx1ZSlcclxuICAgIHJldHVybiB0aGlzLnVzZXJGb3JtLmdldChcInJvbGVzcGVybWlzc2lvblwiKSBhcyBGb3JtQXJyYXk7XHJcblxyXG4gIH1cclxuICBnZXRGZWF0dXJlUGVybWlzc2lvbnMocm9sZXNwZXJtaXNzaW9uOiBGb3JtR3JvdXAgfCBhbnkpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHJvbGVzcGVybWlzc2lvbi5nZXQoXCJtb2R1bGVzXCIpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcbiAgZ2V0VXNlclBlcm1pc3Npb25EYXRhKHJvbGVOYW1lOiBzdHJpbmcsIHVzZXJUeXBlOiBzdHJpbmcpIHtcclxuICAgICh0aGlzLnVzZXJGb3JtPy5nZXQoXCJyb2xlc3Blcm1pc3Npb25cIikgYXMgRm9ybUFycmF5KS5jbGVhcigpO1xyXG4gICAgdGhpcy5wb3B1bGF0ZVBlcm1pc3Npb24odGhpcy5wZXJtaXNzaW9uQXJyYXkpO1xyXG4gIH1cclxuICBjYW1lbENhc2VUb1RleHQoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvKFtBLVpdKS9nLCAnICQxJylcclxuICAgICAgLnJlcGxhY2UoL14uLywgKHN0cikgPT4gc3RyLnRvVXBwZXJDYXNlKCkpXHJcbiAgICAgIC50cmltKCk7XHJcbiAgfVxyXG5cclxuICBhZGRVc2VyU3VibWl0KCkge1xyXG4gICAgbGV0IHZhbHVlID0gdGhpcy51cGRhdGVQZXJtaXNzaW9uc0Jhc2VkT25Vc2VyVHlwZSh0aGlzLnVzZXJGb3JtLnZhbHVlKVxyXG4gICAgY29uc3QgdXBkYXRlZERhdGEgPSB0aGlzLnJlbW92ZU51bGxWYWx1ZXModmFsdWUpO1xyXG4gICAgY29uc29sZS5sb2coJ3RoaXMudXNlckZvcm0udmFsdWUnLCB0aGlzLnVzZXJGb3JtLnZhbHVlKVxyXG4gICAgY29uc29sZS5sb2coJ3VwZGF0ZWREYXRhJywgdXBkYXRlZERhdGEpXHJcbiAgICB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZVNpbmdsZVVzZXJzKHsgLi4udXBkYXRlZERhdGEsIC4uLnsgY2xpZW50SWQ6IHRoaXMuJGhlYWRlckZpbHRlcnMuY2xpZW50ID8gdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnQgOiB0aGlzLnVzZXJfZGF0YS5jbGllbnRJZCB9IH0pLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdChcIlVzZXIgY3JlYXRlZCBzdWNjZXNzZnVsbHkuXCIpO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgICAgICB0aGlzLmdzLm1hbmFnZVJlZnJlc2hUcmlnZ2VyLm5leHQodHJ1ZSlcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byBjcmVhdGUgVXNlciFcIik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgPyBlcnI/LmVycm9yPy5lcnJvciA6IFwiVW5hYmxlIHRvIGNyZWF0ZSBVc2VyIVwiKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICB9KTtcclxuICB9XHJcbiAgb25TdWJtaXQoKSB7XHJcbiAgICBpZiAodGhpcy50eXBlID09IFwiZWRpdFwiKSB7XHJcbiAgICAgIHRoaXMudXNlclVwZGF0ZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hZGRVc2VyU3VibWl0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHVzZXJVcGRhdGUoKSB7XHJcbiAgICB0aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5lbmFibGUoKTtcclxuICAgIGxldCB1c2VyOiBhbnkgPSB0aGlzLnVzZXJGb3JtLnZhbHVlO1xyXG4gICAgdGhpcy51c2VyRm9ybS5nZXQoXCJlbWFpbFwiKT8uZGlzYWJsZSgpO1xyXG4gICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZVVzZXJzKHVzZXIpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdChcclxuICAgICAgICAgICAgXCJVc2VyIGRldGFpbHMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiVW5hYmxlIHRvIHVwZGF0ZSBVc2VyIVwiKTtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yID8gZXJyPy5lcnJvcj8uZXJyb3IgOiBcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4geyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHVwZGF0ZVBlcm1pc3Npb25zQmFzZWRPblVzZXJUeXBlKHVzZXI6IGFueSkge1xyXG4gICAgdXNlci5yb2xlc3Blcm1pc3Npb24uZm9yRWFjaCgoZmVhdHVyZTogYW55KSA9PiB7XHJcbiAgICAgIGZlYXR1cmUubW9kdWxlcy5mb3JFYWNoKChtb2R1bGVzOiBhbnkpID0+IHtcclxuICAgICAgICAvLyBpZiAodXNlci51c2VyVHlwZSA9PT0gXCJzdXBlckFkbWluXCIpIHtcclxuICAgICAgICAvLyAgIG1vZHVsZXMuaXNBZGQgPSB0cnVlO1xyXG4gICAgICAgIC8vICAgbW9kdWxlcy5pc0VkaXQgPSB0cnVlO1xyXG4gICAgICAgIC8vICAgLy8gbW9kdWxlcy5pc0RlbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgLy8gfSBlbHNlIFxyXG4gICAgICAgIGlmICh1c2VyLnVzZXJUeXBlID09PSBcInVzZXJzXCIpIHtcclxuICAgICAgICAgIG1vZHVsZXMuaXNBZGQgPSBmYWxzZTtcclxuICAgICAgICAgIG1vZHVsZXMuaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAvLyBtb2R1bGVzLmlzRGVsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHVzZXI7XHJcbiAgfVxyXG4gIHJlbW92ZU51bGxWYWx1ZXMgPSAoZGF0YTogYW55KSA9PiB7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5yb2xlc3Blcm1pc3Npb24pKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlBlcm1pc3Npb24gaXMgbm90IGFuIGFycmF5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1hcCB0aHJvdWdoIHRoZSBwZXJtaXNzaW9ucyBhbmQgcHJvZHVjdHMgdG8gcmVtb3ZlIG51bGwgdmFsdWVzXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5kYXRhLFxyXG4gICAgICByb2xlc3Blcm1pc3Npb246IGRhdGEucm9sZXNwZXJtaXNzaW9uLm1hcCgoZmVhdHVyZTogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLmZlYXR1cmUsXHJcbiAgICAgICAgICBtb2R1bGVzOiBmZWF0dXJlLm1vZHVsZXMubWFwKChtb2R1bGVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3UHJvZHVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtb2R1bGVzKSkge1xyXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbmV3UHJvZHVjdFtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdQcm9kdWN0O1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9O1xyXG4gIGdldEFsbFRlYW1zTGlzdCgpIHtcclxuICAgIHRoaXMuc2VydmljZS5nZXRBbGxUZWFtc0xpc3QoeyBjbGllbnRJZDogdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnQgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95KSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudGVhbUxpc3QgPSByZXMuZGF0YS5yZXN1bHRcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG4gIGVkaXRVc2VyKCkge1xyXG4gICAgaWYgKHRoaXMudXNlcj8uaXNBY3RpdmUpIHtcclxuICAgICAgdGhpcy50eXBlID0gXCJlZGl0XCI7XHJcbiAgICAgIHRoaXMudXNlckZvcm0uZW5hYmxlKCk7XHJcbiAgICAgIHRoaXMudXNlckZvcm0uZ2V0KFwiZW1haWxcIik/LmRpc2FibGUoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy51c2VyPy5zdGF0dXMgPT09ICdhY3RpdmUnKSB7XHJcbiAgICAgIHRoaXMudHlwZSA9IFwidmlld1wiO1xyXG4gICAgICB0aGlzLnVzZXJGb3JtLmVuYWJsZSgpO1xyXG4gICAgICB0aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5kaXNhYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlzQnV0dG9uRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB7IHRlYW1MZWFkLCAuLi5jb250cm9sc1RvQ2hlY2sgfSA9IHRoaXMudXNlckZvcm0uY29udHJvbHM7XHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhjb250cm9sc1RvQ2hlY2spLnNvbWUoY29udHJvbCA9PiBjb250cm9sLmludmFsaWQpO1xyXG4gIH1cclxuICBzZXRUZWFtTGVhZHModGVhbUxpc3Q6IGFueVtdKSB7XHJcbiAgICBjb25zdCB0ZWFtTGVhZEFycmF5ID0gdGhpcy51c2VyRm9ybS5nZXQoJ3RlYW1MZWFkJykgYXMgRm9ybUFycmF5O1xyXG4gICAgY29uc29sZS5sb2codGVhbUxlYWRBcnJheSlcclxuICAgIHRlYW1MaXN0LmZvckVhY2godGVhbSA9PiB7XHJcbiAgICAgIC8vIFB1c2ggZWFjaCB0ZWFtIG9iamVjdCBhcyBhIG5ldyBGb3JtR3JvdXAgaW50byB0aGUgdGVhbUxlYWQgRm9ybUFycmF5XHJcbiAgICAgIGlmICh0ZWFtLmNsaWVudElkKSB7XHJcbiAgICAgICAgdGVhbUxlYWRBcnJheS5wdXNoKHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgX2lkOiBuZXcgRm9ybUNvbnRyb2wodGVhbS5faWQpLFxyXG4gICAgICAgICAgY2xpZW50SWQ6IG5ldyBGb3JtQ29udHJvbCh0ZWFtLmNsaWVudElkKSxcclxuICAgICAgICAgIHRlYW1OYW1lOiBuZXcgRm9ybUNvbnRyb2wodGVhbS50ZWFtTmFtZSksXHJcbiAgICAgICAgICB1c2Vyc0NvdW50OiBuZXcgRm9ybUNvbnRyb2wodGVhbS51c2Vyc0NvdW50KVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gIH1cclxufSIsIjxkaXYgY2xhc3M9XCJjYXJkIHB0LTAgcGItMyBzY3JvbGxcIj5cclxuICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTAgZC1mbGV4IGZsZXgtc3RhcnQgZmxleC1jb2x1bW4gcC05IFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm15LTUgZC1mbGV4XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzeW1ib2wgc3ltYm9sLTc1cHggc3ltYm9sLWNpcmNsZVwiPlxyXG4gICAgICAgIDxpbWcgYWx0PVwiUGljXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvYWRkLXN0b3JlLWljb24uc3ZnXCI+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMFwiPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwidHlwZSE9PSd2aWV3JyAmJiB0eXBlIT09J2VkaXQnXCIgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICA8YSBjbGFzcz1cImZzLTQgdGV4dC1ncmF5LTgwMCB0ZXh0LWhvdmVyLXByaW1hcnkgZnctYm9sZCBtYi0wIHRpdGxlIGN1cnNvci1wb2ludGVyXCI+QWRkXHJcbiAgICAgICAgICBVc2VyPC9hPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGl0bGVcIj5QbGVhc2UgYWRkIHlvdXIgdXNlciBkZXRhaWxzPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8IS0tIDxkaXYgKm5nSWY9XCJ0eXBlPT09J2VkaXQnXCIgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZnMtNCB0ZXh0LWdyYXktODAwIHRleHQtaG92ZXItcHJpbWFyeSBmdy1ib2xkIG1iLTAgdGl0bGUgY3Vyc29yLXBvaW50ZXJcIj5FZGl0IFVzZXIgRGV0YWlsczwvYT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGl0bGVcIj5QbGVhc2UgRWRpdCB5b3VyIHVzZXIgZGV0YWlsczwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlPT09J3ZpZXcnICYmIHR5cGUgIT09J2VkaXQnXCIgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgIDxhIGNsYXNzPVwiZnMtNCB0ZXh0LWdyYXktODAwIHRleHQtaG92ZXItcHJpbWFyeSBmdy1ib2xkIG1iLTAgdGl0bGUgY3Vyc29yLXBvaW50ZXJcIj5Vc2VyIERldGFpbHM8L2E+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10aXRsZVwiPlZpZXcgeW91ciB1c2VyIGRldGFpbHM8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcGVyYXRpb25UeXBlIT09J3ZpZXcnXCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8YXN5bmMpPy5HbG9iYWxfVXNlcl9pc0VkaXQgJiYgdHlwZSA9PT0ndmlldycgICYmIHR5cGUgIT09J2VkaXQnICYmIHVzZXI/LnJvbGUgIT09ICdzdXBlcmFkbWluJ1wiXHJcbiAgICAgICAgICBjbGFzcz1cImNvbC1tZC0zIHRleHQtZW5kIHB4LTBcIiAoY2xpY2spPVwiZWRpdFVzZXIoKVwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiXHJcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8zODMzXzg1OTA4KVwiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk05LjE2NjAyIDMuMzMzMkgzLjMzMjY4QzIuODkwNjUgMy4zMzMyIDIuNDY2NzMgMy41MDg3OSAyLjE1NDE3IDMuODIxMzVDMS44NDE2MSA0LjEzMzkxIDEuNjY2MDIgNC41NTc4NCAxLjY2NjAyIDQuOTk5ODZWMTYuNjY2NUMxLjY2NjAyIDE3LjEwODYgMS44NDE2MSAxNy41MzI1IDIuMTU0MTcgMTcuODQ1QzIuNDY2NzMgMTguMTU3NiAyLjg5MDY1IDE4LjMzMzIgMy4zMzI2OCAxOC4zMzMySDE0Ljk5OTNDMTUuNDQxNCAxOC4zMzMyIDE1Ljg2NTMgMTguMTU3NiAxNi4xNzc5IDE3Ljg0NUMxNi40OTA0IDE3LjUzMjUgMTYuNjY2IDE3LjEwODYgMTYuNjY2IDE2LjY2NjVWMTAuODMzMk0xNS40MTYgMi4wODMyQzE1Ljc0NzUgMS43NTE2OCAxNi4xOTcyIDEuNTY1NDMgMTYuNjY2IDEuNTY1NDNDMTcuMTM0OSAxLjU2NTQzIDE3LjU4NDUgMS43NTE2OCAxNy45MTYgMi4wODMyQzE4LjI0NzUgMi40MTQ3MiAxOC40MzM4IDIuODY0MzYgMTguNDMzOCAzLjMzMzJDMTguNDMzOCAzLjgwMjA0IDE4LjI0NzUgNC4yNTE2OCAxNy45MTYgNC41ODMyTDkuOTk5MzUgMTIuNDk5OUw2LjY2NjAyIDEzLjMzMzJMNy40OTkzNSA5Ljk5OTg2TDE1LjQxNiAyLjA4MzJaXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzM4MzNfODU5MDhcIj5cclxuICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICA8L3N2Zz48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlPT09J2VkaXQnICAmJiB0eXBlICE9PSd2aWV3J1wiIGNsYXNzPVwiY29sLW1kLTlcIj5cclxuICAgICAgICA8YSBjbGFzcz1cImZzLTQgdGV4dC1ncmF5LTgwMCB0ZXh0LWhvdmVyLXByaW1hcnkgZnctYm9sZCBtYi0wIHRpdGxlIGN1cnNvci1wb2ludGVyXCI+VXNlciBEZXRhaWxzPC9hPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGl0bGVcIj5FZGl0IHlvdXIgdXNlciBkZXRhaWxzPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgaC0wcHggc2Nyb2xsXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTVcIiAqbmdJZj1cInVzZXJGb3JtXCI+XHJcbiAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInVzZXJGb3JtXCIgbm92YWxpZGF0ZT1cIm5vdmFsaWRhdGVcIiBjbGFzcz1cIlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHB4LTAgbWUtM1wiPlxyXG4gICAgICAgICAgICAgIDwhLS0gVXNlciBOYW1lIEZpZWxkIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ1c2VybmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlVzZXIgTmFtZSA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwidXNlcm5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJ1c2VyTmFtZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJGb3JtLmdldCgndXNlck5hbWUnKT8uaW52YWxpZCAmJiAodXNlckZvcm0uZ2V0KCd1c2VyTmFtZScpPy5kaXJ0eSlcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgndXNlck5hbWUnKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5Vc2VyIE5hbWUgaXMgcmVxdWlyZWQuPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEVtYWlsIEZpZWxkIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlbWFpbFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkVtYWlsIDxzcGFuIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImVtYWlsXCIgZm9ybUNvbnRyb2xOYW1lPVwiZW1haWxcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ2VtYWlsJyk/LmludmFsaWQgJiYgdXNlckZvcm0uZ2V0KCdlbWFpbCcpPy50b3VjaGVkXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ2VtYWlsJyk/LmVycm9ycz8uWydyZXF1aXJlZCddXCI+RW1haWwgaXMgcmVxdWlyZWQuPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCdlbWFpbCcpPy5lcnJvcnM/LlsncGF0dGVybiddXCI+SW52YWxpZCBlbWFpbCBmb3JtYXQuPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIENvbnRhY3QgTnVtYmVyIEZpZWxkIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb250YWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Q29udGFjdCBOdW1iZXIgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkIHRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy00IGNvbC14bC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IHBzLTMgcGUtOFwiIGlkPVwiaW5wdXRHcm91cFNlbGVjdDAxXCIgZm9ybUNvbnRyb2xOYW1lPVwiY291bnRyeUNvZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvdW50cnkgb2YgY291bnRyeUxpc3RcIiBbdmFsdWVdPVwiY291bnRyeS5waG9uZWNvZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tjb3VudHJ5Lm5hbWV9fSAoe3tjb3VudHJ5LnBob25lY29kZX19KVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy04IGNvbC14bC04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAoa2V5cHJlc3MpPVwib21pdF9zcGVjaWFsX2NoYXIoJGV2ZW50KVwiIGlkPVwibW9iaWxlTnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGZvcm1Db250cm9sTmFtZT1cIm1vYmlsZU51bWJlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ21vYmlsZU51bWJlcicpPy5pbnZhbGlkICYmIHVzZXJGb3JtLmdldCgnbW9iaWxlTnVtYmVyJyk/LnRvdWNoZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCdtb2JpbGVOdW1iZXInKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5Db250YWN0IE51bWJlciBpc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCdtb2JpbGVOdW1iZXInKT8uZXJyb3JzPy5bJ21pbmxlbmd0aCddXCI+Q29udGFjdCBOdW1iZXIgbXVzdCBiZSBhdCBsZWFzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAxMCBkaWdpdHMuPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgnbW9iaWxlTnVtYmVyJyk/LmVycm9ycz8uWydtYXhsZW5ndGgnXVwiPkNvbnRhY3QgTnVtYmVyIGNhbm5vdCBleGNlZWQgMTNcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzLjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gUm9sZSBGaWVsZCAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IGNvbC14bC02IGNvbC14eGwtNiBtYi03XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicm9sZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlJvbGUgPHNwYW4gY2xhc3M9XCJhbGVydC1yZXF1aXJlZCB0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGZvcm1Db250cm9sTmFtZT1cInJvbGVcIiAoY2hhbmdlKT1cIm9uUm9sZUNoYW5nZSh1c2VyRm9ybS5nZXQoJ3JvbGUnKT8udmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhZG1pblwiPkFkbWluPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ1c2VyXCI+VXNlcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlckZvcm0uZ2V0KCdyb2xlJyk/LmludmFsaWQgJiYgdXNlckZvcm0uZ2V0KCdyb2xlJyk/LnRvdWNoZWRcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgncm9sZScpPy5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPlJvbGUgaXMgcmVxdWlyZWQuPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFVzZXIgVHlwZSBGaWVsZCAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IGNvbC14bC02IGNvbC14eGwtNiBtYi03XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGFuZ29Vc2VyVHlwZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlVzZXIgVHlwZSA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBmb3JtQ29udHJvbE5hbWU9XCJ0YW5nb1VzZXJUeXBlXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblJvbGVDaGFuZ2UodXNlckZvcm0uZ2V0KCd0YW5nb1VzZXJUeXBlJyk/LnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZGFzaGJvYXJkXCI+RGFzaGJvYXJkPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhdWRpdFwiPkF1ZGl0PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ3RhbmdvVXNlclR5cGUnKT8uaW52YWxpZCAmJiB1c2VyRm9ybS5nZXQoJ3RhbmdvVXNlclR5cGUnKT8udG91Y2hlZFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCd0YW5nb1VzZXJUeXBlJyk/LmVycm9ycz8uWydyZXF1aXJlZCddXCI+VXNlciBUeXBlIGlzIHJlcXVpcmVkLjwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBBZGQgdG8gVGVhbSBGaWVsZCAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy0xMiBjb2wteGwtMTIgY29sLXh4bC0xMiBtYi01XCIgKm5nSWY9XCJ0aGlzLnVzZXJUeXBlICE9PSd0YW5nbydcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0ZWFtTGVhZFwiIGNsYXNzPVwiZm9ybS1sYWJlbCB0ZWFtcy10aXRsZVwiPkFkZCB0byBhIHRlYW08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPHRlYW0tc2VsZWN0IFtpdGVtc109XCJ0ZWFtTGlzdFwiIFttdWx0aV09XCJ0cnVlXCIgW3NlYXJjaEZpZWxkXT1cIid0ZWFtTmFtZSdcIiBbaWRGaWVsZF09XCInX2lkJ1wiXHJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJvblN0b3JlU2VsZWN0KCRldmVudClcIiBbc2VsZWN0ZWRWYWx1ZXNdPVwic2VsZWN0ZWRVc2VyXCI+PC90ZWFtLXNlbGVjdD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlckZvcm0uZ2V0KCdyb2xlJyk/LnZhbHVlID09PSAnYWRtaW4nXCI+XHJcblxyXG4gICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRlYW1zLXRpdGxlXCIgKm5nSWY9XCJnZXRQZXJtaXNzaW9ucygpLmxlbmd0aFwiPkFjY2VzcyBmb3IgQWRtaW48L2gzPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRQZXJtaXNzaW9ucygpLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBmb3JtQXJyYXlOYW1lPVwicm9sZXNwZXJtaXNzaW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvbGVzcGVybWlzc2lvbiBvZiBnZXRQZXJtaXNzaW9ucygpLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmUgbXktMiBtZS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1oZWFkZXIgbXQtNCBtcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2FtZWxDYXNlVG9UZXh0KHJvbGVzcGVybWlzc2lvbi5nZXQoJ2ZlYXR1cmVOYW1lJyk/LnZhbHVlKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvbGVzcGVybWlzc2lvbi5nZXQoJ21vZHVsZXMnKVwiIGZvcm1BcnJheU5hbWU9XCJtb2R1bGVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbW9kdWxlcyBvZiBnZXRGZWF0dXJlUGVybWlzc2lvbnMocm9sZXNwZXJtaXNzaW9uKT8uY29udHJvbHM7IGxldCBqID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImpcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJyb2xlc3Blcm1pc3Npb24uZ2V0KCdmZWF0dXJlTmFtZScpPy52YWx1ZSAhPT0gJ1RhbmdvQWRtaW4nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidy01MFwiPnt7IGNhbWVsQ2FzZVRvVGV4dChtb2R1bGVzLmdldCgnbmFtZScpPy52YWx1ZSkgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtc3RhcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZm9ybUNvbnRyb2xOYW1lPVwiaXNBZGRcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZVZpZXdDaGFuZ2UobW9kdWxlcylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWxhYmVsIG1zLTIgbXQtYXV0b1wiPkFkZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtc3RhcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiaXNFZGl0XCIgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVFZGl0Q2hhbmdlKG1vZHVsZXMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1sYWJlbCBtcy0yIG10LWF1dG9cIj5FZGl0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm9sZXNwZXJtaXNzaW9uLmdldCgnZmVhdHVyZU5hbWUnKT8udmFsdWUgPT09ICdUYW5nb0FkbWluJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3cgdy0xMDAgdGV4dC1ub3dyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG1vZHVsZXMgb2YgZ2V0RmVhdHVyZVBlcm1pc3Npb25zKHJvbGVzcGVybWlzc2lvbik/LmNvbnRyb2xzOyBsZXQgaiA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImpcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWlubGluZS1mbGV4IG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0VkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWxhYmVsIG1iLTUgbXgtMiBtdC0xXCIgc3R5bGU9XCJ0ZXh0LXdyYXA6bm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2FtZWxDYXNlVG9UZXh0KG1vZHVsZXMuZ2V0KCduYW1lJyk/LnZhbHVlKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGUhPT0ndmlldydcIiBjbGFzcz1cImQtZmxleCBteS0xMFwiIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgdy0xMDAgbWUtM1wiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDAgbXMtM1wiIGlkPVwiYWxlcnQtdG9hc3RcIiAoY2xpY2spPVwib25TdWJtaXQoKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidXNlckZvcm0uaW52YWxpZCB8fCB0eXBlID09PSAndmlldydcIj5TdWJtaXQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+Il19
483
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXVzZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS11c2Vycy9zcmMvbGliL2NvbXBvbmVudHMtdjIvYWRkLXVzZXJzL2FkZC11c2Vycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtdXNlcnMvc3JjL2xpYi9jb21wb25lbnRzLXYyL2FkZC11c2Vycy9hZGQtdXNlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHeEQsT0FBTyxFQUEwQixXQUFXLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7QUFTNUYsTUFBTSxPQUFPLGlCQUFpQjtJQThEUjtJQUNWO0lBQ0Q7SUFDQztJQUNBO0lBQ0E7SUFDRDtJQW5FUSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUNoQyxJQUFJLENBQU07SUFDVixJQUFJLENBQU07SUFDVixRQUFRLENBQU07SUFDZCxJQUFJLENBQU07SUFDbkIsUUFBUSxDQUFZO0lBQ3BCLGFBQWEsR0FBVyxLQUFLLENBQUM7SUFDOUIsUUFBUSxHQUFRLEVBQUUsQ0FBQTtJQUNsQixXQUFXLENBQU07SUFDakIsWUFBWSxHQUFRLEVBQUUsQ0FBQztJQUN2QixVQUFVLEdBQVcsa0JBQWtCLENBQUM7SUFDeEMsVUFBVSxHQUFXLDRCQUE0QixDQUFDO0lBQ2xELFNBQVMsQ0FBTTtJQUNmLGNBQWMsQ0FBTTtJQUNILFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzFDLGVBQWUsR0FBRztRQUNoQjtZQUNFLFdBQVcsRUFBRSxRQUFR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QztZQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1NBQzlEO0lBQ0gsQ0FBQzt3R0ExZFksaUJBQWlCOzRGQUFqQixpQkFBaUIsaUlDYjlCLGlwYkF5S1U7OzRGRDVKRyxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0UsZUFBZTtvUUFNaEIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IE1hbmFnZVVzZXJzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzLXYyL21hbmFnZS11c2Vycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hZGQtdXNlcnMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGQtdXNlcnMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hZGQtdXNlcnMuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBZGRVc2Vyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25Jbml0IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kgPSBuZXcgU3ViamVjdCgpO1xyXG4gIEBJbnB1dCgpIHR5cGU6IGFueTtcclxuICBASW5wdXQoKSB1c2VyOiBhbnk7XHJcbiAgQElucHV0KCkgdXNlclR5cGU6IGFueTtcclxuICBASW5wdXQoKSBkYXRhOiBhbnk7XHJcbiAgdXNlckZvcm06IEZvcm1Hcm91cDtcclxuICBvcGVyYXRpb25UeXBlOiBzdHJpbmcgPSAnYWRkJztcclxuICB0ZWFtTGlzdDogYW55ID0gW11cclxuICBjb3VudHJ5TGlzdDogYW55O1xyXG4gIHNlbGVjdGVkVXNlcjogYW55ID0gW107XHJcbiAgcGhvbmVSZWdleDogUmVnRXhwID0gL14oXFxkezN9KT9cXGR7MTV9JC87XHJcbiAgZW1haWxSZWdleDogUmVnRXhwID0gL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC87XHJcbiAgdXNlcl9kYXRhOiBhbnk7XHJcbiAgJGhlYWRlckZpbHRlcnM6IGFueTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuICBwZXJtaXNzaW9uQXJyYXkgPSBbXHJcbiAgICB7XHJcbiAgICAgIGZlYXR1cmVOYW1lOiBcIkdsb2JhbFwiLFxyXG4gICAgICBtb2R1bGVzOiBbXHJcbiAgICAgICAgeyBuYW1lOiBcIlN0b3JlXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJVc2VyXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJDYW1lcmFcIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBuYW1lOiBcIkNvbmZpZ3VyYXRpb25cIiwgaXNBZGQ6IGZhbHNlLCBpc0VkaXQ6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBuYW1lOiBcIlN1YnNjcmlwdGlvblwiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgICB7IG5hbWU6IFwiQmlsbGluZ1wiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgXVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZmVhdHVyZU5hbWU6IFwiVGFuZ29FeWVcIixcclxuICAgICAgbW9kdWxlczogW1xyXG5cclxuICAgICAgICB7IG5hbWU6IFwiWm9uZVRhZ1wiLCBpc0FkZDogZmFsc2UsIGlzRWRpdDogZmFsc2UgfSxcclxuICAgICAgXVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZmVhdHVyZU5hbWU6IFwiVGFuZ29UcmF4XCIsXHJcbiAgICAgIG1vZHVsZXM6IFtcclxuICAgICAgICB7IG5hbWU6IFwiY2hlY2tsaXN0XCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJUYXNrXCIsIGlzQWRkOiBmYWxzZSwgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICBdXHJcbiAgICB9LFxyXG5cclxuICBdO1xyXG5cclxuICBoYW5kbGVWaWV3Q2hhbmdlKG1vZHVsZXM6IEZvcm1Hcm91cCB8IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCFtb2R1bGVzLmdldChcImlzQWRkXCIpPy52YWx1ZSkge1xyXG4gICAgICBtb2R1bGVzLmdldChcImlzRGVsZXRlXCIpPy5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAgIG1vZHVsZXMuZ2V0KFwiaXNFZGl0XCIpPy5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGhhbmRsZUVkaXRDaGFuZ2UobW9kdWxlczogRm9ybUdyb3VwIHwgYW55KTogdm9pZCB7XHJcbiAgICAvLyBpZiAoIW1vZHVsZXMuZ2V0KFwiaXNBZGRcIik/LnZhbHVlKSB7XHJcbiAgICAvLyAgIG1vZHVsZXMuZ2V0KFwiaXNEZWxldGVcIik/LnNldFZhbHVlKGZhbHNlKTtcclxuICAgIC8vICAgbW9kdWxlcy5nZXQoXCJpc0VkaXRcIik/LnNldFZhbHVlKGZhbHNlKTtcclxuICAgIC8vIH1cclxuICAgIGlmICghbW9kdWxlcy5nZXQoXCJpc0VkaXRcIik/LnZhbHVlKSB7XHJcbiAgICAgIC8vIG1vZHVsZXMuZ2V0KCdpc0Rvd25sb2FkJyk/LnNldFZhbHVlKGZhbHNlKTtcclxuICAgICAgbW9kdWxlcy5nZXQoXCJpc0RlbGV0ZVwiKT8uc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBNYW5hZ2VVc2Vyc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHB1YmxpYyBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0czogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHVibGljIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgKSB7XHJcblxyXG4gIH1cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmRlc3Ryb3kubmV4dChmYWxzZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kuY29tcGxldGUoKTtcclxuXHJcbiAgfVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2codGhpcy50eXBlKVxyXG4gICAgbGV0IGRhdGE6IGFueTtcclxuICAgIGlmIChcImhlYWRlci1maWx0ZXJzXCIgaW4gbG9jYWxTdG9yYWdlKSB7XHJcbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXItZmlsdGVycycpIHx8ICcnKTtcclxuICAgIH1cclxuICAgIHRoaXMudXNlcl9kYXRhID0gSlNPTj8ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXItaW5mbycpIHx8ICcnKTtcclxuICAgIHRoaXMuJGhlYWRlckZpbHRlcnMgPSBkYXRhID8gZGF0YSA6IHRoaXMudXNlcl9kYXRhO1xyXG4gICBcclxuICAgIHRoaXMuZ2V0Um9sZXMoKTtcclxuICAgIHRoaXMuZ2V0QWxsVGVhbXNMaXN0KClcclxuICAgIGlmICh0aGlzLnR5cGUgPT09IFwidmlld1wiIHx8ICh0aGlzLnR5cGUgPT09IFwiZWRpdFwiKSkge1xyXG4gICAgICAvLyB0aGlzLmFkZFNpbmdsZVVzZXIoKTtcclxuICAgICAgdGhpcy5sb2FkVXNlckZvcm0oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW5pdFVzZXJGb3JtKCk7XHJcbiAgICAgIC8vIHRoaXMuZ2V0QWxsVGVhbXNMaXN0KClcclxuICAgICAgLy8gdGhpcy5zaG93c2luZ2xldXNlciA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5nZXRDb3VudHJ5Q29kZXMoKTtcclxuICB9XHJcblxyXG4gIGdldFJvbGVzKCkge1xyXG4gICAgaWYgKHRoaXMudXNlclR5cGUgPT09ICd0YW5nbycpIHtcclxuICAgICAgdGhpcy5wZXJtaXNzaW9uQXJyYXkucHVzaCh7XHJcbiAgICAgICAgZmVhdHVyZU5hbWU6IFwiVGFuZ29BZG1pblwiLFxyXG4gICAgICAgIG1vZHVsZXM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogXCJpbnZvaWNlQXBwcm92YWxcIiwgaXNBZGQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0VkaXQ6IGZhbHNlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkVkaXRCaWxsaW5nXCIsIGlzQWRkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNFZGl0OiBmYWxzZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogXCJUaWNrZXRDb25maWd1cmF0aW9uXCIsIGlzQWRkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNFZGl0OiBmYWxzZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogXCJSZXBvcnRzXCIsIGlzQWRkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNFZGl0OiBmYWxzZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdXHJcbiAgICAgIH0sKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb21pdF9zcGVjaWFsX2NoYXIoZXZlbnQ6IGFueSkge1xyXG4gICAgdmFyIGs7XHJcbiAgICBrID0gZXZlbnQuY2hhckNvZGU7XHJcbiAgICByZXR1cm4gayA9PSA4IHx8IGsgPT0gMzIgfHwgKGsgPj0gNDggJiYgayA8PSA1Nyk7XHJcbiAgfVxyXG5cclxuICBvblJvbGVDaGFuZ2Uocm9sZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmdldFVzZXJQZXJtaXNzaW9uRGF0YShyb2xlLCB0aGlzLnVzZXJfZGF0YS51c2VyVHlwZSk7XHJcbiAgfVxyXG4gIGdldENvdW50cnlDb2RlcygpIHtcclxuICAgIHRoaXMuc2VydmljZS5nZXRBbGxDb3VudHJpZXMoKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb3VudHJ5TGlzdCA9IHJlcy5kYXRhXHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKClcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG4gIG9ucm9sZWNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQudGFyZ2V0LnZhbHVlID09PSAndXNlcicpIHtcclxuICAgICAgdGhpcy5wb3B1bGF0ZVBlcm1pc3Npb24odGhpcy5wZXJtaXNzaW9uQXJyYXkpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcbiAgb25TdG9yZVNlbGVjdChldmVudDogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkVXNlciA9IGV2ZW50XHJcbiAgICBjb25zdCB0ZWFtTGVhZEFycmF5ID0gdGhpcy51c2VyRm9ybS5nZXQoJ3RlYW1MZWFkJykgYXMgRm9ybUFycmF5O1xyXG4gICAgdGVhbUxlYWRBcnJheS5jbGVhcigpOyAvLyBDbGVhcnMgZXhpc3RpbmcgdmFsdWVzXHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZFVzZXIuZm9yRWFjaCgodXNlcjogYW55KSA9PiB7XHJcbiAgICAgIHRlYW1MZWFkQXJyYXkucHVzaChuZXcgRm9ybUNvbnRyb2wodXNlcikpOyAvLyBBZGRzIGVhY2ggdXNlciBpbiBzZWxlY3RlZFVzZXIgYXJyYXlcclxuICAgIH0pO1xyXG4gICAgO1xyXG4gICAgLy8gdGhpcy5zZXRUZWFtTGVhZHMoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsKCkge1xyXG4gICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICBjb25zdCB0cmlnZ2VyQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RyaWdnZXJCdXR0b25JZCcpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgdHJpZ2dlckJ1dHRvbj8uZm9jdXMoKTtcclxuICB9XHJcbiAgLy8gb25TdWJtaXQoKSB7XHJcbiAgLy8gICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuICAvLyB9XHJcblxyXG4gIG1hc2tFbWFpbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUgfHwgIXZhbHVlLmluY2x1ZGVzKCdAJykpIHJldHVybiAnJztcclxuICAgIGNvbnN0IFtsb2NhbCwgZG9tYWluXSA9IHZhbHVlLnNwbGl0KCdAJyk7XHJcbiAgICBjb25zdCB2aXNpYmxlTGVuZ3RoID0gTWF0aC5taW4oMywgbG9jYWwubGVuZ3RoKTtcclxuICAgIGNvbnN0IHZpc2libGVQYXJ0ID0gbG9jYWwuc2xpY2UoMCwgdmlzaWJsZUxlbmd0aCk7XHJcbiAgICBjb25zdCBtYXNrZWRQYXJ0ID0gJyonLnJlcGVhdChsb2NhbC5sZW5ndGggLSB2aXNpYmxlTGVuZ3RoKTtcclxuICAgIHJldHVybiBgJHt2aXNpYmxlUGFydH0ke21hc2tlZFBhcnR9QCR7ZG9tYWlufWA7XHJcbiAgfVxyXG4gIFxyXG4gIG1hc2tNb2JpbGUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA8PSA0KSByZXR1cm4gJyonLnJlcGVhdCh2YWx1ZS5sZW5ndGgpO1xyXG4gICAgY29uc3QgZmlyc3QyID0gdmFsdWUuc2xpY2UoMCwgMik7XHJcbiAgICBjb25zdCBsYXN0MiA9IHZhbHVlLnNsaWNlKC0yKTtcclxuICAgIGNvbnN0IG1hc2tlZE1pZGRsZSA9ICcqJy5yZXBlYXQodmFsdWUubGVuZ3RoIC0gNCk7XHJcbiAgICByZXR1cm4gYCR7Zmlyc3QyfSR7bWFza2VkTWlkZGxlfSR7bGFzdDJ9YDtcclxuICB9XHJcbiAgbG9hZFVzZXJGb3JtKCkge1xyXG4gICAgdGhpcy51c2VyU2VydmljZS5nZXRVc2VyKHRoaXMudXNlci5lbWFpbCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwICYmIHJlcy5kYXRhLnJlc3VsdCkge1xyXG4gICAgICAgICAgY29uc3QgdXNlckRhdGEgPSByZXMuZGF0YS5yZXN1bHQ7XHJcbiAgICAgICAgICBjb25zdCBpc1ZpZXdNb2RlID0gdGhpcy50eXBlID09PSAndmlldyc7XHJcbiAgICAgICAgICBjb25zdCBpc1N1cGVyYWRtaW4gPSB0aGlzLnVzZXJfZGF0YT8ucm9sZSA9PT0gJ3N1cGVyYWRtaW4nO1xyXG4gIFxyXG4gICAgICAgICAgY29uc3QgZW1haWwgPSAoaXNWaWV3TW9kZSAmJiAhaXNTdXBlcmFkbWluKSA/IHRoaXMubWFza0VtYWlsKHVzZXJEYXRhLmVtYWlsKSA6IHVzZXJEYXRhLmVtYWlsO1xyXG4gICAgICAgICAgY29uc3QgbW9iaWxlID0gKGlzVmlld01vZGUgJiYgIWlzU3VwZXJhZG1pbikgPyB0aGlzLm1hc2tNb2JpbGUodXNlckRhdGEubW9iaWxlTnVtYmVyKSA6IHVzZXJEYXRhLm1vYmlsZU51bWJlcjtcclxuICBcclxuICAgICAgICAgIHRoaXMudXNlckZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgdXNlck5hbWU6IFtyZXMuZGF0YS5yZXN1bHQudXNlck5hbWUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBlbWFpbDogW2VtYWlsLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICAgICAgVmFsaWRhdG9ycy5wYXR0ZXJuKFwiXlthLXpBLVowLTldKyhbLi1fXT9bYS16QS1aMC05XSspKkBbYS16QS1aMC05XSsoWy4tX10/W2EtekEtWl0rKSpbLl17MX1bYS16QS1aXXsyLH0kXCIpLFxyXG4gICAgICAgICAgXSldLFxyXG4gICAgICAgICAgICBtb2JpbGVOdW1iZXI6IFttb2JpbGUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg4KSxWYWxpZGF0b3JzLm1heExlbmd0aCgxMyldIF0sXHJcbiAgICAgICAgICAgIHJvbGU6IFtyZXMuZGF0YS5yZXN1bHQucm9sZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIHVzZXJUeXBlOiBbcmVzLmRhdGEucmVzdWx0LnVzZXJUeXBlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgcm9sZXNwZXJtaXNzaW9uOiB0aGlzLmZiLmFycmF5KFtdLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgICAgICAgdGVhbUxlYWQ6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICAgICAgICBjb3VudHJ5Q29kZTogW3Jlcy5kYXRhLnJlc3VsdC5jb3VudHJ5Q29kZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlVGFuZ291c2VyRmllbGQocmVzLmRhdGEucmVzdWx0LnRhbmdvVXNlclR5cGUpO1xyXG4gICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBcInZpZXdcIikge1xyXG4gICAgICAgICAgICB0aGlzLnVzZXJGb3JtLmRpc2FibGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMudXNlckZvcm0uZ2V0KFwiZW1haWxcIik/LmRpc2FibGUoKTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VyID0gcmVzLmRhdGEudGVhbXNMaXN0XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFVzZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VGVhbUxlYWRzKHRoaXMuc2VsZWN0ZWRVc2VyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgLy8gdGhpcy51c2VyRm9ybS5nZXQoJ3RlYW1MZWFkJyk/LnNldFZhbHVlKCk7XHJcbiAgICAgICAgICB0aGlzLnBvcHVsYXRlUGVybWlzc2lvbihyZXM/LmRhdGE/LnJlc3VsdD8ucm9sZXNwZXJtaXNzaW9uKTtcclxuICAgICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLm9wZXJhdGlvblR5cGUgPT0gXCJ2aWV3XCIpIHtcclxuICAgICAgICAgICAgdGhpcy51c2VyRm9ybS5kaXNhYmxlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIC8vIHRoaXMuZ2V0VXNlclBlcm1pc3Npb25EYXRhKHJlcy5kYXRhLnJlc3VsdC5yb2xlLHJlcy5kYXRhLnJlc3VsdC51c2VyVHlwZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuaW5pdFVzZXJGb3JtKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW5pdFVzZXJGb3JtKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVRhbmdvdXNlckZpZWxkKHRhbmdvVXNlclR5cGU6YW55KSB7XHJcbiAgICBpZiAodGhpcy51c2VyVHlwZSA9PT0gJ3RhbmdvJykge1xyXG4gICAgICBpZiAoIXRoaXMudXNlckZvcm0uY29udGFpbnMoJ3RhbmdvVXNlclR5cGUnKSkge1xyXG4gICAgICAgIHRoaXMudXNlckZvcm0uYWRkQ29udHJvbCgndGFuZ29Vc2VyVHlwZScsIHRoaXMuZmIuY29udHJvbCh0YW5nb1VzZXJUeXBlIHx8ICdkYXNoYm9hcmQnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLnVzZXJGb3JtLmNvbnRhaW5zKCd0YW5nb1VzZXJUeXBlJykpIHtcclxuICAgICAgICB0aGlzLnVzZXJGb3JtLnJlbW92ZUNvbnRyb2woJ3RhbmdvVXNlclR5cGUnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdFVzZXJGb3JtKCkge1xyXG4gICAgdGhpcy51c2VyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICB1c2VyTmFtZTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBlbWFpbDogW1wiXCIsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5wYXR0ZXJuKFwiXlthLXpBLVowLTldKyhbLi1fXT9bYS16QS1aMC05XSspKkBbYS16QS1aMC05XSsoWy4tX10/W2EtekEtWl0rKSpbLl17MX1bYS16QS1aXXsyLH0kXCIpLFxyXG4gICAgICBdKV0sXHJcbiAgICAgIG1vYmlsZU51bWJlcjogW1wiXCIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg4KSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTMpXV0sXHJcbiAgICAgIHJvbGU6IFtcInVzZXJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHVzZXJUeXBlOiBbdGhpcy51c2VyVHlwZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHJvbGVzcGVybWlzc2lvbjogdGhpcy5mYi5hcnJheShbXSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgIHRlYW1MZWFkOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgY291bnRyeUNvZGU6IFtcIjkxXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMudXNlclR5cGUgPT09ICd0YW5nbycpIHtcclxuICAgICAgaWYgKCF0aGlzLnVzZXJGb3JtLmNvbnRhaW5zKCd0YW5nb1VzZXJUeXBlJykpIHtcclxuICAgICAgICB0aGlzLnVzZXJGb3JtLmFkZENvbnRyb2woJ3RhbmdvVXNlclR5cGUnLCB0aGlzLmZiLmNvbnRyb2woJ2Rhc2hib2FyZCcsIFZhbGlkYXRvcnMucmVxdWlyZWQpKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMudXNlckZvcm0uY29udGFpbnMoJ3RhbmdvVXNlclR5cGUnKSkge1xyXG4gICAgICAgIHRoaXMudXNlckZvcm0ucmVtb3ZlQ29udHJvbCgndGFuZ29Vc2VyVHlwZScpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmdldFVzZXJQZXJtaXNzaW9uRGF0YShcInVzZXJcIiwgdGhpcy51c2VyX2RhdGEudXNlclR5cGUpO1xyXG4gIH1cclxuICBwb3B1bGF0ZVBlcm1pc3Npb24ocGVybWlzc2lvbnNEYXRhOiBhbnlbXSkge1xyXG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSB0aGlzLnVzZXJGb3JtLmdldChcInJvbGVzcGVybWlzc2lvblwiKSBhcyBGb3JtQXJyYXk7XHJcbiAgICBwZXJtaXNzaW9ucy5jbGVhcigpOyAgLy8gQ2xlYXIgZXhpc3RpbmcgZW50cmllc1xyXG5cclxuICAgIHBlcm1pc3Npb25zRGF0YS5mb3JFYWNoKChyb2xlc3Blcm1pc3Npb246IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBmZWF0dXJlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBmZWF0dXJlTmFtZTogW3JvbGVzcGVybWlzc2lvbj8uZmVhdHVyZU5hbWVdLFxyXG4gICAgICAgIG1vZHVsZXM6IHRoaXMuZmIuYXJyYXkoW10pLCAgLy8gSW5pdGlhbGl6ZSBtb2R1bGVzIGFzIGEgRm9ybUFycmF5XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgbW9kdWxlc0FycmF5ID0gZmVhdHVyZUdyb3VwLmdldChcIm1vZHVsZXNcIikgYXMgRm9ybUFycmF5O1xyXG4gICAgICByb2xlc3Blcm1pc3Npb24ubW9kdWxlcy5mb3JFYWNoKChtb2R1bGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1vZHVsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICBuYW1lOiBbbW9kdWxlLm5hbWVdLFxyXG4gICAgICAgICAgaXNBZGQ6IFt7IHZhbHVlOiBtb2R1bGUuaXNBZGQsIGRpc2FibGVkOiB0aGlzLnR5cGUgPT09ICd2aWV3JyB9XSwgLy8gU2V0IGRpc2FibGVkIGJhc2VkIG9uIHR5cGVcclxuICAgICAgICAgIGlzRWRpdDogW3sgdmFsdWU6IG1vZHVsZS5pc0VkaXQsIGRpc2FibGVkOiB0aGlzLnR5cGUgPT09ICd2aWV3JyB9XSwgLy8gU2V0IGRpc2FibGVkIGJhc2VkIG9uIHR5cGVcclxuICAgICAgICAgIC8vIGlzRGVsZXRlOiBbbW9kdWxlLmlzRGVsZXRlXSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBtb2R1bGVzQXJyYXkucHVzaChtb2R1bGVHcm91cCk7ICAvLyBBZGQgZWFjaCBtb2R1bGUgdG8gbW9kdWxlcyBhcnJheVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHBlcm1pc3Npb25zLnB1c2goZmVhdHVyZUdyb3VwKTsgIC8vIEFkZCBlYWNoIGZlYXR1cmUgZ3JvdXAgdG8gcGVybWlzc2lvbnNcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFRyaWdnZXIgdmFsaWRhdGlvbiBhZnRlciBwb3B1bGF0aW5nXHJcbiAgICBwZXJtaXNzaW9ucy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgfVxyXG5cclxuICBnZXRQZXJtaXNzaW9ucygpOiBGb3JtQXJyYXkge1xyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy51c2VyRm9ybS52YWx1ZSlcclxuICAgIHJldHVybiB0aGlzLnVzZXJGb3JtLmdldChcInJvbGVzcGVybWlzc2lvblwiKSBhcyBGb3JtQXJyYXk7XHJcblxyXG4gIH1cclxuICBnZXRGZWF0dXJlUGVybWlzc2lvbnMocm9sZXNwZXJtaXNzaW9uOiBGb3JtR3JvdXAgfCBhbnkpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHJvbGVzcGVybWlzc2lvbi5nZXQoXCJtb2R1bGVzXCIpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcbiAgZ2V0VXNlclBlcm1pc3Npb25EYXRhKHJvbGVOYW1lOiBzdHJpbmcsIHVzZXJUeXBlOiBzdHJpbmcpIHtcclxuICAgICh0aGlzLnVzZXJGb3JtPy5nZXQoXCJyb2xlc3Blcm1pc3Npb25cIikgYXMgRm9ybUFycmF5KS5jbGVhcigpO1xyXG4gICAgdGhpcy5wb3B1bGF0ZVBlcm1pc3Npb24odGhpcy5wZXJtaXNzaW9uQXJyYXkpO1xyXG4gIH1cclxuICBjYW1lbENhc2VUb1RleHQoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvKFtBLVpdKS9nLCAnICQxJylcclxuICAgICAgLnJlcGxhY2UoL14uLywgKHN0cikgPT4gc3RyLnRvVXBwZXJDYXNlKCkpXHJcbiAgICAgIC50cmltKCk7XHJcbiAgfVxyXG5cclxuICBhZGRVc2VyU3VibWl0KCkge1xyXG4gICAgbGV0IHZhbHVlID0gdGhpcy51cGRhdGVQZXJtaXNzaW9uc0Jhc2VkT25Vc2VyVHlwZSh0aGlzLnVzZXJGb3JtLnZhbHVlKVxyXG4gICAgY29uc3QgdXBkYXRlZERhdGEgPSB0aGlzLnJlbW92ZU51bGxWYWx1ZXModmFsdWUpO1xyXG4gICAgdGhpcy51c2VyU2VydmljZS5jcmVhdGVTaW5nbGVVc2Vycyh7IC4uLnVwZGF0ZWREYXRhLCAuLi57IGNsaWVudElkOiB0aGlzLiRoZWFkZXJGaWx0ZXJzLmNsaWVudCA/IHRoaXMuJGhlYWRlckZpbHRlcnMuY2xpZW50IDogdGhpcy51c2VyX2RhdGEuY2xpZW50SWQgfSB9KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoXCJVc2VyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICAgICAgdGhpcy5ncy5tYW5hZ2VSZWZyZXNoVHJpZ2dlci5uZXh0KHRydWUpXHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJVbmFibGUgdG8gY3JlYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yID8gZXJyPy5lcnJvcj8uZXJyb3IgOiBcIlVuYWJsZSB0byBjcmVhdGUgVXNlciFcIik7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4geyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIG9uU3VibWl0KCkge1xyXG4gICAgaWYgKHRoaXMudHlwZSA9PSBcImVkaXRcIikge1xyXG4gICAgICB0aGlzLnVzZXJVcGRhdGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWRkVXNlclN1Ym1pdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICB1c2VyVXBkYXRlKCkge1xyXG4gICAgdGhpcy51c2VyRm9ybS5nZXQoXCJlbWFpbFwiKT8uZW5hYmxlKCk7XHJcbiAgICBsZXQgdXNlcjogYW55ID0gdGhpcy51c2VyRm9ybS52YWx1ZTtcclxuICAgIHRoaXMudXNlckZvcm0uZ2V0KFwiZW1haWxcIik/LmRpc2FibGUoKTtcclxuICAgIHRoaXMuc2VydmljZS51cGRhdGVVc2Vycyh1c2VyKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoXHJcbiAgICAgICAgICAgIFwiVXNlciBkZXRhaWxzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byB1cGRhdGUgVXNlciFcIik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/IGVycj8uZXJyb3I/LmVycm9yIDogXCJVbmFibGUgdG8gdXBkYXRlIFVzZXIhXCIpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHsgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuICB1cGRhdGVQZXJtaXNzaW9uc0Jhc2VkT25Vc2VyVHlwZSh1c2VyOiBhbnkpIHtcclxuICAgIHVzZXIucm9sZXNwZXJtaXNzaW9uLmZvckVhY2goKGZlYXR1cmU6IGFueSkgPT4ge1xyXG4gICAgICBmZWF0dXJlLm1vZHVsZXMuZm9yRWFjaCgobW9kdWxlczogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gaWYgKHVzZXIudXNlclR5cGUgPT09IFwic3VwZXJBZG1pblwiKSB7XHJcbiAgICAgICAgLy8gICBtb2R1bGVzLmlzQWRkID0gdHJ1ZTtcclxuICAgICAgICAvLyAgIG1vZHVsZXMuaXNFZGl0ID0gdHJ1ZTtcclxuICAgICAgICAvLyAgIC8vIG1vZHVsZXMuaXNEZWxldGUgPSB0cnVlO1xyXG4gICAgICAgIC8vIH0gZWxzZSBcclxuICAgICAgICBpZiAodXNlci51c2VyVHlwZSA9PT0gXCJ1c2Vyc1wiKSB7XHJcbiAgICAgICAgICBtb2R1bGVzLmlzQWRkID0gZmFsc2U7XHJcbiAgICAgICAgICBtb2R1bGVzLmlzRWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgLy8gbW9kdWxlcy5pc0RlbGV0ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB1c2VyO1xyXG4gIH1cclxuICByZW1vdmVOdWxsVmFsdWVzID0gKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEucm9sZXNwZXJtaXNzaW9uKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQZXJtaXNzaW9uIGlzIG5vdCBhbiBhcnJheVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNYXAgdGhyb3VnaCB0aGUgcGVybWlzc2lvbnMgYW5kIHByb2R1Y3RzIHRvIHJlbW92ZSBudWxsIHZhbHVlc1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uZGF0YSxcclxuICAgICAgcm9sZXNwZXJtaXNzaW9uOiBkYXRhLnJvbGVzcGVybWlzc2lvbi5tYXAoKGZlYXR1cmU6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5mZWF0dXJlLFxyXG4gICAgICAgICAgbW9kdWxlczogZmVhdHVyZS5tb2R1bGVzLm1hcCgobW9kdWxlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1Byb2R1Y3Q6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobW9kdWxlcykpIHtcclxuICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIG5ld1Byb2R1Y3Rba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3UHJvZHVjdDtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgfTtcclxuICBnZXRBbGxUZWFtc0xpc3QoKSB7XHJcbiAgICB0aGlzLnNlcnZpY2UuZ2V0QWxsVGVhbXNMaXN0KHsgY2xpZW50SWQ6IHRoaXMuJGhlYWRlckZpbHRlcnMuY2xpZW50IH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSkpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRlYW1MaXN0ID0gcmVzLmRhdGEucmVzdWx0XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuICBlZGl0VXNlcigpIHtcclxuICAgIGlmICh0aGlzLnVzZXI/LmlzQWN0aXZlKSB7XHJcbiAgICAgIHRoaXMudHlwZSA9IFwiZWRpdFwiO1xyXG4gICAgICB0aGlzLnVzZXJGb3JtLmVuYWJsZSgpO1xyXG4gICAgICB0aGlzLnVzZXJGb3JtLmdldChcImVtYWlsXCIpPy5kaXNhYmxlKCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMudXNlcj8uc3RhdHVzID09PSAnYWN0aXZlJykge1xyXG4gICAgICB0aGlzLnR5cGUgPSBcInZpZXdcIjtcclxuICAgICAgdGhpcy51c2VyRm9ybS5lbmFibGUoKTtcclxuICAgICAgdGhpcy51c2VyRm9ybS5nZXQoXCJlbWFpbFwiKT8uZGlzYWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBpc0J1dHRvbkRpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgeyB0ZWFtTGVhZCwgLi4uY29udHJvbHNUb0NoZWNrIH0gPSB0aGlzLnVzZXJGb3JtLmNvbnRyb2xzO1xyXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoY29udHJvbHNUb0NoZWNrKS5zb21lKGNvbnRyb2wgPT4gY29udHJvbC5pbnZhbGlkKTtcclxuICB9XHJcbiAgc2V0VGVhbUxlYWRzKHRlYW1MaXN0OiBhbnlbXSkge1xyXG4gICAgY29uc3QgdGVhbUxlYWRBcnJheSA9IHRoaXMudXNlckZvcm0uZ2V0KCd0ZWFtTGVhZCcpIGFzIEZvcm1BcnJheTtcclxuICAgIHRlYW1MaXN0LmZvckVhY2godGVhbSA9PiB7XHJcbiAgICAgIC8vIFB1c2ggZWFjaCB0ZWFtIG9iamVjdCBhcyBhIG5ldyBGb3JtR3JvdXAgaW50byB0aGUgdGVhbUxlYWQgRm9ybUFycmF5XHJcbiAgICAgIGlmICh0ZWFtLmNsaWVudElkKSB7XHJcbiAgICAgICAgdGVhbUxlYWRBcnJheS5wdXNoKHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgX2lkOiBuZXcgRm9ybUNvbnRyb2wodGVhbS5faWQpLFxyXG4gICAgICAgICAgY2xpZW50SWQ6IG5ldyBGb3JtQ29udHJvbCh0ZWFtLmNsaWVudElkKSxcclxuICAgICAgICAgIHRlYW1OYW1lOiBuZXcgRm9ybUNvbnRyb2wodGVhbS50ZWFtTmFtZSksXHJcbiAgICAgICAgICB1c2Vyc0NvdW50OiBuZXcgRm9ybUNvbnRyb2wodGVhbS51c2Vyc0NvdW50KVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb21pdFNwZWNpYWxDaGFyKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XHJcbiAgICBjb25zdCByZWdleCA9IC9eW2EtekEtWjAtOSBfLV0kLztcclxuICAgIGlmICghcmVnZXgudGVzdChrZXkpKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAgIG9taXRTcGVjaWFsQ2hhclBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xyXG4gIGNvbnN0IGNsaXBib2FyZERhdGEgPSBldmVudC5jbGlwYm9hcmREYXRhIHx8ICAod2luZG93IGFzIGFueSlbJ2NsaXBib2FyZERhdGEnXTs7XHJcbiAgY29uc3QgcGFzdGVkVGV4dCA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xyXG4gIGNvbnN0IHJlZ2V4ID0gL15bYS16QS1aMC05IF8tXSokLztcclxuICBpZiAoIXJlZ2V4LnRlc3QocGFzdGVkVGV4dCkpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJTcGVjaWFsIGNoYXJhY3RlcnMgYXJlIG5vdCBhbGxvd2VkLlwiKTtcclxuICB9XHJcbn1cclxufSIsIjxkaXYgIGNsYXNzPVwiY2FyZCBwdC0wIHBiLTMgc2Nyb2xsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTAgZC1mbGV4IGZsZXgtc3RhcnQgZmxleC1jb2x1bW4gcC05IFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJteS01IGQtZmxleFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ltYm9sIHN5bWJvbC03NXB4IHN5bWJvbC1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgYWx0PVwiUGljXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvYWRkLXN0b3JlLWljb24uc3ZnXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMFwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHlwZSE9PSd2aWV3JyAmJiB0eXBlIT09J2VkaXQnXCIgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZnMtNCB0ZXh0LWdyYXktODAwIHRleHQtaG92ZXItcHJpbWFyeSBmdy1ib2xkIG1iLTAgdGl0bGUgY3Vyc29yLXBvaW50ZXJcIj5BZGRcclxuICAgICAgICAgICAgICAgICAgICBVc2VyPC9hPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10aXRsZVwiPlBsZWFzZSBhZGQgeW91ciB1c2VyIGRldGFpbHM8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInR5cGU9PT0nZWRpdCdcIiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmcy00IHRleHQtZ3JheS04MDAgdGV4dC1ob3Zlci1wcmltYXJ5IGZ3LWJvbGQgbWItMCB0aXRsZSBjdXJzb3ItcG9pbnRlclwiPkVkaXQgVXNlciBEZXRhaWxzPC9hPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10aXRsZVwiPlBsZWFzZSBFZGl0IHlvdXIgdXNlciBkZXRhaWxzPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGU9PT0ndmlldycgJiYgdHlwZSAhPT0nZWRpdCdcIiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImZzLTQgdGV4dC1ncmF5LTgwMCB0ZXh0LWhvdmVyLXByaW1hcnkgZnctYm9sZCBtYi0wIHRpdGxlIGN1cnNvci1wb2ludGVyXCI+VXNlciBEZXRhaWxzPC9hPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10aXRsZVwiPlZpZXcgeW91ciB1c2VyIGRldGFpbHM8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcGVyYXRpb25UeXBlIT09J3ZpZXcnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8YXN5bmMpPy5HbG9iYWxfVXNlcl9pc0VkaXQgJiYgdHlwZSA9PT0ndmlldycgICYmIHR5cGUgIT09J2VkaXQnICYmIHVzZXI/LnJvbGUgIT09ICdzdXBlcmFkbWluJ1wiIGNsYXNzPVwiY29sLW1kLTMgdGV4dC1lbmQgcHgtMFwiIChjbGljayk9XCJlZGl0VXNlcigpXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMzgzM184NTkwOClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05LjE2NjAyIDMuMzMzMkgzLjMzMjY4QzIuODkwNjUgMy4zMzMyIDIuNDY2NzMgMy41MDg3OSAyLjE1NDE3IDMuODIxMzVDMS44NDE2MSA0LjEzMzkxIDEuNjY2MDIgNC41NTc4NCAxLjY2NjAyIDQuOTk5ODZWMTYuNjY2NUMxLjY2NjAyIDE3LjEwODYgMS44NDE2MSAxNy41MzI1IDIuMTU0MTcgMTcuODQ1QzIuNDY2NzMgMTguMTU3NiAyLjg5MDY1IDE4LjMzMzIgMy4zMzI2OCAxOC4zMzMySDE0Ljk5OTNDMTUuNDQxNCAxOC4zMzMyIDE1Ljg2NTMgMTguMTU3NiAxNi4xNzc5IDE3Ljg0NUMxNi40OTA0IDE3LjUzMjUgMTYuNjY2IDE3LjEwODYgMTYuNjY2IDE2LjY2NjVWMTAuODMzMk0xNS40MTYgMi4wODMyQzE1Ljc0NzUgMS43NTE2OCAxNi4xOTcyIDEuNTY1NDMgMTYuNjY2IDEuNTY1NDNDMTcuMTM0OSAxLjU2NTQzIDE3LjU4NDUgMS43NTE2OCAxNy45MTYgMi4wODMyQzE4LjI0NzUgMi40MTQ3MiAxOC40MzM4IDIuODY0MzYgMTguNDMzOCAzLjMzMzJDMTguNDMzOCAzLjgwMjA0IDE4LjI0NzUgNC4yNTE2OCAxNy45MTYgNC41ODMyTDkuOTk5MzUgMTIuNDk5OUw2LjY2NjAyIDEzLjMzMzJMNy40OTkzNSA5Ljk5OTg2TDE1LjQxNiAyLjA4MzJaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8zODMzXzg1OTA4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGU9PT0nZWRpdCcgICYmIHR5cGUgIT09J3ZpZXcnXCIgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmcy00IHRleHQtZ3JheS04MDAgdGV4dC1ob3Zlci1wcmltYXJ5IGZ3LWJvbGQgbWItMCB0aXRsZSBjdXJzb3ItcG9pbnRlclwiPlVzZXIgRGV0YWlsczwvYT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGl0bGVcIj5FZGl0IHlvdXIgdXNlciBkZXRhaWxzPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgaC0wcHggc2Nyb2xsXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNVwiICpuZ0lmPVwidXNlckZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInVzZXJGb3JtXCIgbm92YWxpZGF0ZT1cIm5vdmFsaWRhdGVcIiBjbGFzcz1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHB4LTAgbWUtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBVc2VyIE5hbWUgRmllbGQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IGNvbC14bC02IGNvbC14eGwtNiBtYi03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ1c2VybmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlVzZXIgTmFtZSA8c3BhbiBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkIHRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwidXNlcm5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJ1c2VyTmFtZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChrZXlwcmVzcyk9XCJvbWl0U3BlY2lhbENoYXIoJGV2ZW50KVwiIChwYXN0ZSk9XCJvbWl0U3BlY2lhbENoYXJQYXN0ZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ3VzZXJOYW1lJyk/LmludmFsaWQgJiYgKHVzZXJGb3JtLmdldCgndXNlck5hbWUnKT8uZGlydHkpXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgndXNlck5hbWUnKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5Vc2VyIE5hbWUgaXMgcmVxdWlyZWQuPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRW1haWwgRmllbGQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IGNvbC14bC02IGNvbC14eGwtNiBtYi03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlbWFpbFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkVtYWlsIDxzcGFuIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZW1haWxcIiBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlckZvcm0uZ2V0KCdlbWFpbCcpPy5pbnZhbGlkICYmIHVzZXJGb3JtLmdldCgnZW1haWwnKT8udG91Y2hlZFwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ2VtYWlsJyk/LmVycm9ycz8uWydyZXF1aXJlZCddXCI+RW1haWwgaXMgcmVxdWlyZWQuPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ2VtYWlsJyk/LmVycm9ycz8uWydwYXR0ZXJuJ11cIj5JbnZhbGlkIGVtYWlsIGZvcm1hdC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb250YWN0IE51bWJlciBGaWVsZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvbnRhY3RcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Db250YWN0IE51bWJlciA8c3BhbiBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkIHRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNCBjb2wteGwtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IHBzLTMgcGUtOFwiIGlkPVwiaW5wdXRHcm91cFNlbGVjdDAxXCIgZm9ybUNvbnRyb2xOYW1lPVwiY291bnRyeUNvZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY291bnRyeSBvZiBjb3VudHJ5TGlzdFwiIFt2YWx1ZV09XCJjb3VudHJ5LnBob25lY29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y291bnRyeS5uYW1lfX0gKHt7Y291bnRyeS5waG9uZWNvZGV9fSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy04IGNvbC14bC04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIChrZXlwcmVzcyk9XCJvbWl0X3NwZWNpYWxfY2hhcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJtb2JpbGVOdW1iZXJcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBmb3JtQ29udHJvbE5hbWU9XCJtb2JpbGVOdW1iZXJcIiBtaW5sZW5ndGg9XCI4XCIgbWF4bGVuZ3RoPVwiMTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ21vYmlsZU51bWJlcicpPy5pbnZhbGlkICYmIHVzZXJGb3JtLmdldCgnbW9iaWxlTnVtYmVyJyk/LnRvdWNoZWRcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInVzZXJGb3JtLmdldCgnbW9iaWxlTnVtYmVyJyk/LmVycm9ycz8uWydyZXF1aXJlZCddXCI+Q29udGFjdCBOdW1iZXIgaXMgcmVxdWlyZWQuPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCdtb2JpbGVOdW1iZXInKT8uZXJyb3JzPy5bJ21pbmxlbmd0aCddXCI+Q29udGFjdCBOdW1iZXIgbXVzdCBiZSBhdCBsZWFzdCA4IGRpZ2l0cy48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ21vYmlsZU51bWJlcicpPy5lcnJvcnM/LlsnbWF4bGVuZ3RoJ11cIj5Db250YWN0IE51bWJlciBjYW5ub3QgZXhjZWVkIDEzIGRpZ2l0cy48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJvbGUgRmllbGQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IGNvbC14bC02IGNvbC14eGwtNiBtYi03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJyb2xlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Um9sZSA8c3BhbiBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkIHRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBmb3JtQ29udHJvbE5hbWU9XCJyb2xlXCIgKGNoYW5nZSk9XCJvblJvbGVDaGFuZ2UodXNlckZvcm0uZ2V0KCdyb2xlJyk/LnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhZG1pblwiPkFkbWluPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInVzZXJcIj5Vc2VyPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlckZvcm0uZ2V0KCdyb2xlJyk/LmludmFsaWQgJiYgdXNlckZvcm0uZ2V0KCdyb2xlJyk/LnRvdWNoZWRcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwidXNlckZvcm0uZ2V0KCdyb2xlJyk/LmVycm9ycz8uWydyZXF1aXJlZCddXCI+Um9sZSBpcyByZXF1aXJlZC48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgdG8gVGVhbSBGaWVsZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTEyIGNvbC14bC0xMiBjb2wteHhsLTEyIG1iLTVcIiAqbmdJZj1cInRoaXMudXNlclR5cGUgIT09J3RhbmdvJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGVhbUxlYWRcIiBjbGFzcz1cImZvcm0tbGFiZWwgdGVhbXMtdGl0bGVcIj5BZGQgdG8gYSB0ZWFtPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlYW0tc2VsZWN0IFtpdGVtc109XCJ0ZWFtTGlzdFwiIFttdWx0aV09XCJ0cnVlXCIgW3NlYXJjaEZpZWxkXT1cIid0ZWFtTmFtZSdcIiBbaWRGaWVsZF09XCInX2lkJ1wiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cIm9uU3RvcmVTZWxlY3QoJGV2ZW50KVwiIFtzZWxlY3RlZFZhbHVlc109XCJzZWxlY3RlZFVzZXJcIj48L3RlYW0tc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyRm9ybS5nZXQoJ3JvbGUnKT8udmFsdWUgPT09ICdhZG1pbidcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZWFtcy10aXRsZVwiICAqbmdJZj1cImdldFBlcm1pc3Npb25zKCkubGVuZ3RoXCI+QWNjZXNzIGZvciBBZG1pbjwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0UGVybWlzc2lvbnMoKS5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGZvcm1BcnJheU5hbWU9XCJyb2xlc3Blcm1pc3Npb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvbGVzcGVybWlzc2lvbiBvZiBnZXRQZXJtaXNzaW9ucygpLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZSBteS0yIG1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtaGVhZGVyIG10LTQgbXMtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjYW1lbENhc2VUb1RleHQocm9sZXNwZXJtaXNzaW9uLmdldCgnZmVhdHVyZU5hbWUnKT8udmFsdWUpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm9sZXNwZXJtaXNzaW9uLmdldCgnbW9kdWxlcycpXCIgZm9ybUFycmF5TmFtZT1cIm1vZHVsZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG1vZHVsZXMgb2YgZ2V0RmVhdHVyZVBlcm1pc3Npb25zKHJvbGVzcGVybWlzc2lvbik/LmNvbnRyb2xzOyBsZXQgaiA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwialwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdJZj1cInJvbGVzcGVybWlzc2lvbi5nZXQoJ2ZlYXR1cmVOYW1lJyk/LnZhbHVlICE9PSAnVGFuZ29BZG1pbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidy01MFwiPnt7IGNhbWVsQ2FzZVRvVGV4dChtb2R1bGVzLmdldCgnbmFtZScpPy52YWx1ZSkgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LXN0YXJ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZm9ybUNvbnRyb2xOYW1lPVwiaXNBZGRcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNoYW5nZSk9XCJoYW5kbGVWaWV3Q2hhbmdlKG1vZHVsZXMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnbG9iYWwtbGFiZWwgbXMtMiBtdC1hdXRvXCI+QWRkPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1zdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImlzRWRpdFwiIHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2hhbmdlKT1cImhhbmRsZUVkaXRDaGFuZ2UobW9kdWxlcylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1sYWJlbCBtcy0yIG10LWF1dG9cIj5FZGl0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvbGVzcGVybWlzc2lvbi5nZXQoJ2ZlYXR1cmVOYW1lJyk/LnZhbHVlID09PSAnVGFuZ29BZG1pbidcIiBjbGFzcz1cInJvdyB3LTEwMCB0ZXh0LW5vd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIiAqbmdGb3I9XCJsZXQgbW9kdWxlcyBvZiBnZXRGZWF0dXJlUGVybWlzc2lvbnMocm9sZXNwZXJtaXNzaW9uKT8uY29udHJvbHM7IGxldCBqID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJqXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtaW5saW5lLWZsZXggbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0VkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1sYWJlbCBtYi01IG14LTIgbXQtMVwiIHN0eWxlPVwidGV4dC13cmFwOm5vd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjYW1lbENhc2VUb1RleHQobW9kdWxlcy5nZXQoJ25hbWUnKT8udmFsdWUpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGUhPT0ndmlldydcIiBjbGFzcz1cImQtZmxleCBteS0xMFwiIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTEwMCBtZS0zXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB3LTEwMCBtcy0zXCIgaWQ9XCJhbGVydC10b2FzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU3VibWl0KClcIiBbZGlzYWJsZWRdPVwidXNlckZvcm0uaW52YWxpZCB8fCB0eXBlID09PSAndmlldydcIj5TdWJtaXQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+Il19