tango-app-ui-manage-users 3.7.0-alpha.7 → 3.7.0-alpha.9

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.
@@ -181,6 +181,9 @@ export class TeamsCreationComponent {
181
181
  this.ts.getPrimaryToast("Team Updated Successfully");
182
182
  this.activeModal.close('submit');
183
183
  }
184
+ }, (error) => {
185
+ console.log("error", error);
186
+ this.ts.getErrorToast(error?.error?.error?.error || error?.error?.error);
184
187
  });
185
188
  }
186
189
  else {
@@ -191,7 +194,7 @@ export class TeamsCreationComponent {
191
194
  }
192
195
  }, (error) => {
193
196
  console.log("error", error);
194
- this.ts.getErrorToast(error?.error?.error?.error);
197
+ this.ts.getErrorToast(error?.error?.error?.error || error?.error?.error);
195
198
  });
196
199
  }
197
200
  }
@@ -242,13 +245,10 @@ export class TeamsCreationComponent {
242
245
  return;
243
246
  }
244
247
  const requiredKeys = ['User Name/Email Id']; // Must always be present
245
- // const optionalKeys = ['userPhone', 'city'] : ['city'];
246
248
  const isValid = data.some((item) => {
247
249
  const keys = Object.keys(item);
248
250
  const hasRequiredKeys = requiredKeys.every(key => keys.includes(key));
249
- const allKeysAreAllowed = keys.every(key => requiredKeys.includes(key)
250
- // || optionalKeys.includes(key)
251
- );
251
+ const allKeysAreAllowed = keys.every(key => requiredKeys.includes(key));
252
252
  return hasRequiredKeys && allKeysAreAllowed;
253
253
  });
254
254
  if (!isValid) {
@@ -257,11 +257,6 @@ export class TeamsCreationComponent {
257
257
  }
258
258
  let processedArray = [];
259
259
  let errMsgs = [];
260
- // for (let i = 0; i < data.length; i++) {
261
- // processedArray.push({
262
- // value: data[i]['User Name/Email Id'],
263
- // })
264
- // }
265
260
  data?.forEach((element, index) => {
266
261
  if (element?.['User Name/Email Id'] == '' || element?.['User Name/Email Id'] == null) {
267
262
  error.push(`Invalid User Name/Email Id - C${index + 2}`);
@@ -294,6 +289,8 @@ export class TeamsCreationComponent {
294
289
  .subscribe({
295
290
  next: (res) => {
296
291
  if (res && res.code == 200) {
292
+ this.excelError = [];
293
+ this.uploadErrors = [];
297
294
  this.afterUpload = res?.data?.result;
298
295
  this.afterUplload();
299
296
  }
@@ -328,9 +325,6 @@ export class TeamsCreationComponent {
328
325
  },
329
326
  });
330
327
  }
331
- // .catch((error) => {
332
- // this.ts.getErrorToast("Unable to create stores!");
333
- // });
334
328
  };
335
329
  }
336
330
  }
@@ -346,7 +340,7 @@ export class TeamsCreationComponent {
346
340
  if (this.uploadPopUp) {
347
341
  this.uploadPopUp.dismiss();
348
342
  }
349
- this.uploadPopUp = this.modalService.open(this.afterValidation, { centered: true, backdrop: 'static' });
343
+ this.uploadPopUp = this.modalService.open(this.afterValidation, { centered: true, backdrop: 'static', size: 'lg', windowClass: 'custom-modal-width' });
350
344
  }
351
345
  getStoreCounts(data) {
352
346
  const uniqueUserNames = new Set(data?.map((item) => item['User Name/Email Id']));
@@ -367,11 +361,11 @@ export class TeamsCreationComponent {
367
361
  event.preventDefault(); // Stops the modal from closing
368
362
  }
369
363
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TeamsCreationComponent, deps: [{ token: i1.ToastService }, { token: i2.Router }, { token: i3.NgbActiveModal }, { token: i4.ManageUsersService }, { token: i5.GlobalStateService }, { token: i0.ChangeDetectorRef }, { token: i3.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
370
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TeamsCreationComponent, selector: "lib-teams-creation", inputs: { teamData: "teamData", type: "type", teamsUsers: "teamsUsers" }, viewQueries: [{ propertyName: "inputFile", first: true, predicate: ["inputFile"], descendants: true }, { propertyName: "afterValidation", first: true, predicate: ["afterValidation"], descendants: true }, { propertyName: "confirmDelete", first: true, predicate: ["confirmDelete"], descendants: true }], 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\">\r\n <div class=\"symbol symbol-75px symbol-circle\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M20.5 23.6816C18.8425 23.6816 17.5 22.2133 17.5 20.4004C17.5 18.5875 18.8425 17.1191 20.5 17.1191C22.1575 17.1191 23.5 18.5875 23.5 20.4004C23.5 22.2133 22.1575 23.6816 20.5 23.6816ZM35.6483 23.6816C33.9908 23.6816 32.6483 22.2133 32.6483 20.4004C32.6483 18.5875 33.9908 17.1191 35.6483 17.1191C37.3058 17.1191 38.6483 18.5875 38.6483 20.4004C38.6483 22.2133 37.3058 23.6816 35.6483 23.6816ZM31.509 26.3066C31.509 28.4805 29.8965 30.2441 27.909 30.2441C25.9215 30.2441 24.309 28.4805 24.309 26.3066C24.309 24.1328 25.9215 22.3691 27.909 22.3691C29.8965 22.3691 31.509 24.1328 31.509 26.3066Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M20.0013 25.7559C17.7925 25.7559 16 27.7164 16 30.1322C16 30.6121 16.36 31.0059 16.7988 31.0059H24.8013H24.8275C23.8338 30.042 23.2038 28.6352 23.2038 27.0684C23.2038 26.7566 23.2263 26.449 23.275 26.1537C22.765 25.8994 22.1988 25.7559 21.6025 25.7559H20.0013Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M31.1725 31.0059H31.1987H39.2012C39.64 31.0059 40 30.6162 40 30.1322C40 27.7164 38.2075 25.7559 35.9987 25.7559H34.3975C33.8012 25.7559 33.235 25.8953 32.725 26.1537C32.77 26.4531 32.7963 26.7566 32.7963 27.0684C32.7963 28.6352 32.17 30.042 31.1725 31.0059Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M25.7988 32.3183C23.0388 32.3183 20.8 34.767 20.8 37.7857C20.8 38.3928 21.25 38.8809 21.8013 38.8809H34.1987C34.7537 38.8809 35.2 38.3887 35.2 37.7857C35.2 34.767 32.9613 32.3183 30.2013 32.3183H25.7988Z\"\r\n fill=\"#00A3FF\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"row w-100\">\r\n <div class=\"col-md-12\" *ngIf=\"type === 'create'\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Create Team</a>\r\n <div class=\"sub-title\">Group multiple users to create a team for easier management</div>\r\n </div>\r\n <div class=\"col-md-12\" *ngIf=\"type === 'edit'\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Edit Team</a>\r\n <div class=\"sub-title\">Group multiple users to edit a team for easier management</div>\r\n </div>\r\n\r\n\r\n <div class=\"w-100 h-500px scroll\">\r\n <div class=\"mt-5\">\r\n <form (keydown.enter)=\"preventClose($event)\">\r\n <div class=\"row px-0 me-3\">\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-7\">\r\n <label for=\"teamName\" class=\"form-label\">Team Name<span class=\"mandtryclr ms-1\">*</span></label>\r\n <input type=\"text\" [(ngModel)]=\"teamName\" [ngModelOptions]=\"{standalone: true}\"\r\n class=\"form-control\" id=\"teamName\" autocomplete=\"off\" (keypress)=\"omitSpecialChar($event)\">\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label for=\"teamlead\" class=\"form-label\">Team Lead Email<span class=\"mandtryclr ms-1\">*</span></label>\r\n <!-- <team-select [items]=\"teamleadList\" [multi]=\"true\" [searchField]=\"'userName'\"\r\n [idField]=\"'userId'\" (selected)=\"onTeamSelect($event)\" (deselected)=\"TeamUnselect($event)\" (deselectedAll)=\"TeamUnselectAll($event)\"\r\n [selectedValues]=\"selectedTeam\"></team-select> -->\r\n <lib-chip-select [items]=\"teamleadList\" [multi]=\"true\" [searchField]=\"['userName']\" [searchKey]=\"['email']\"\r\n [idField]=\"'userId'\" (selected)=\"onTeamSelect($event)\" (removed)=\"removedChip($event)\"\r\n [selectedValues]=\"selectedTeam\"></lib-chip-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label for=\"userlead\" class=\"form-label\">Select Users<span class=\"mandtryclr ms-1\">*</span>\r\n </label>\r\n <team-select [items]=\"userList\" [multi]=\"true\" [searchField]=\"'userName'\"\r\n [idField]=\"'userId'\" (selected)=\"onUserSelect($event)\" (deselected)=\"UserUnselect($event)\" (deselectedAll)=\"UserUnselectAll($event)\"\r\n [selectedValues]=\"selectedUsers\"></team-select>\r\n </div>\r\n <p class=\"text-gray-400 fw-bold my-3\">\r\n <span class=\"line-bg \"><svg width=\"280\" height=\"2\" viewBox=\"0 0 280 2\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"0.5\" width=\"280\" height=\"1\" fill=\"#EAECF0\" />\r\n </svg>\r\n </span><span class=\"mx-15 or-color\">Or </span> <span class=\"line-bg \"><svg width=\"280\"\r\n height=\"2\" viewBox=\"0 0 280 2\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"0.5\" width=\"280\" height=\"1\" fill=\"#EAECF0\" />\r\n </svg>\r\n </span>\r\n </p>\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <div class=\"fw-bold text-gray-500 my-6\">\r\n <ol class=\"custom-ordered-list text-gray-400 fw-bold fs-6\">\r\n <li class=\"user-text\">Use the template to upload multiple users at once.</li>\r\n <li class=\"user-text my-3\"><span class=\"user-text\">Download the template here -\r\n </span>\r\n <a class=\"ms-1\" href=\"../../../assets/files/teamsUploadTemplate.xlsx\"\r\n download>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"template ms-2\">Download Template</span>\r\n </a>\r\n </li>\r\n <li class=\"user-text my-3\">Add your data to the Template File</li>\r\n <li class=\"user-text my-3\">Upload it below for processing</li>\r\n </ol>\r\n </div>\r\n </div>\r\n <div\r\n class=\"mt-3 ms-3 right-bar py-10 d-flex justify-content-center align-items-center flex-column\">\r\n <input name=\"accountType\" type=\"radio\" id=\"kt_account_team_size_select_upload\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\r\n value=\"personal\" class=\"btn-check\" ng-reflect-name=\"accountType\"\r\n ng-reflect-form-control-name=\"accountType\" (change)=\"onUploadTemplate($event)\"\r\n ng-reflect-value=\"personal\" type=\"file\" #inputFile />\r\n <label for=\"kt_account_team_size_select_upload\" class=\" w-50 p-4\"><span\r\n class=\"fw-bold text-center w-100 fs-4\">\r\n <div class=\"d-flex justify-content-center align-items-center w-100\">\r\n <svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\" />\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\"\r\n stroke-width=\"6\" />\r\n <g clip-path=\"url(#clip0_4047_40566)\">\r\n <path\r\n d=\"M26.3333 26.3334L23 23M23 23L19.6666 26.3334M23 23V30.5M29.9916 28.325C30.8044 27.8819 31.4465 27.1808 31.8165 26.3322C32.1866 25.4837 32.2635 24.5361 32.0351 23.6389C31.8068 22.7418 31.2862 21.9463 30.5555 21.3779C29.8248 20.8095 28.9257 20.5006 28 20.5H26.95C26.6977 19.5244 26.2276 18.6186 25.5749 17.8509C24.9222 17.0831 24.104 16.4732 23.1817 16.0672C22.2594 15.6612 21.2571 15.4695 20.2501 15.5066C19.243 15.5437 18.2575 15.8086 17.3676 16.2814C16.4777 16.7542 15.7066 17.4226 15.1122 18.2363C14.5177 19.0501 14.1155 19.988 13.9358 20.9795C13.756 21.9711 13.8034 22.9905 14.0743 23.9611C14.3452 24.9317 14.8327 25.8282 15.5 26.5834\"\r\n stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4047_40566\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(13 13)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\">Click to\r\n upload</span>\r\n <!-- <span class=\"ms-2\">or drag and drop</span> -->\r\n </div>\r\n <div class=\"nodata-sub\">the data added template file for processing.</div>\r\n </span>\r\n </label>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5 mt-5\">\r\n <label for=\"userlead\" class=\"form-label\">Description (optional)</label>\r\n <textarea id=\"description\" [(ngModel)]=\"description\"\r\n [ngModelOptions]=\"{standalone: true}\" name=\"description\" class=\"form-control\"\r\n rows=\"5\" cols=\"50\" placeholder=\"Enter a description...\"></textarea>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"mt-3 ms-3 right-bar py-10 d-flex justify-content-center align-items-center flex-column\" >\r\n <svg width=\"47\" height=\"46\" viewBox=\"0 0 47 46\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3.5\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\"/>\r\n <rect x=\"3.5\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\" stroke-width=\"6\"/>\r\n <g clip-path=\"url(#clip0_2176_18901)\">\r\n <path d=\"M26.8333 26.3332L23.5 22.9999M23.5 22.9999L20.1666 26.3332M23.5 22.9999V30.4999M30.4916 28.3249C31.3044 27.8818 31.9465 27.1806 32.3165 26.3321C32.6866 25.4835 32.7635 24.5359 32.5351 23.6388C32.3068 22.7417 31.7862 21.9462 31.0555 21.3778C30.3248 20.8094 29.4257 20.5005 28.5 20.4999H27.45C27.1977 19.5243 26.7276 18.6185 26.0749 17.8507C25.4222 17.0829 24.604 16.4731 23.6817 16.0671C22.7594 15.661 21.7571 15.4694 20.7501 15.5065C19.743 15.5436 18.7575 15.8085 17.8676 16.2813C16.9777 16.7541 16.2066 17.4225 15.6122 18.2362C15.0177 19.05 14.6155 19.9879 14.4358 20.9794C14.256 21.9709 14.3034 22.9903 14.5743 23.961C14.8452 24.9316 15.3327 25.8281 16 26.5832\" stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2176_18901\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" transform=\"translate(13.5 13)\"/>\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\"><input name=\"accountType\" type=\"radio\" id=\"kt_create_account_form_account_type_personal\" value=\"personal\"\r\n class=\"btn-check\" ng-reflect-name=\"accountType\" ng-reflect-form-control-name=\"accountType\"\r\n (change)=\"onUploadTemplate($event)\"\r\n ng-reflect-value=\"personal\" type=\"file\" #inputFile />Click to upload</span> <span class=\"ms-2\">or drag and drop</span></div>\r\n <div class=\"nodata-sub\">the data added template file for processing.</div>\r\n </div> -->\r\n </div>\r\n <div 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\" *ngIf=\"!isEdit\"\r\n (click)=\"onCreateTeam()\" [disabled]=\"!selectedUsers.length||!selectedTeam.length|| !teamName\">Create\r\n Team</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" *ngIf=\"isEdit\"\r\n (click)=\"onCreateTeam()\" [disabled]=\"!selectedUsers.length ||!selectedTeam.length||!teamName\">Update\r\n Team</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Add Users</span></div>\r\n </div>\r\n <div class=\"card-body popup-scroll pt-0\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total Records</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div [ngClass]=\"excelError ? 'error-heading':''\" class=\"fw-semibold config-heading w-100\">{{excelError?.error?.length || 0}}</div>\r\n <div [ngClass]=\"excelError ? 'excel-error':''\" class=\"fw-semibold subtitle mt-1\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!excelError\" class=\"table-header mt-5\" style=\"font-weight: 400;\">\r\n <div >You're about to add {{getStoreCounts(excelData)}} clusters. Are you sure want to proceed?</div>\r\n \r\n </div>\r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"uploadErrors?.doesNotExists?.length\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Data not exists !</div>\r\n <!-- <div class=\"subtitle mt-5\">Please provide correct information.</div> -->\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of uploadErrors?.doesNotExists; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"uploadErrors?.inActive?.length\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Data inactive !</div>\r\n <!-- <div class=\"subtitle mt-5\">Please provide correct information.</div> -->\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of uploadErrors?.inActive; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup()\">Cancel</button>\r\n <button *ngIf=\"!excelError\" class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"validateDetails();model.close()\">Proceed</button>\r\n <button *ngIf=\"excelError\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"file1.click()\">Reupload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_upload\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\r\n (change)=\"onUploadTemplate($event)\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n", 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}.or-color{color:var(--Gray-700, #344054)!important;text-align:center;font-size:12px;font-style:normal;font-weight:500;line-height:18px}.custom-ordered-list{list-style-type:decimal}.user-text{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.right-bar{border-radius:12px;border:1px solid var(--Gray-300, #D0D5DD)}.click-upload{color:var(--Primary-700, #009BF3)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-decoration-line:underline;text-transform:capitalize}.mandtryclr{color:red}.table-header{color:var(--Gray-800, #1D2939);font-size:16px;font-weight:600;line-height:24px}.text-error{color:var(--Error-700, #B42318)!important;font-size:14px;font-weight:500;line-height:20px}.excel-error{color:var(--Error-600, #D92D20);font-size:14px;font-weight:500;line-height:20px}.error-heading{color:var(--Error-600, #D92D20);font-size:20px;font-weight:500;line-height:30px}.border-error{border:1px solid var(--Error-300, #FDA29B)!important;background:var(--Error-25, #FFFBFA)!important}.popup-card{border-radius:6px;border:1px solid var(--Gray-300, #D0D5DD);background:#fff;box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}.popup-scroll{min-height:auto;max-height:400px;overflow-y:auto}.config-heading{color:var(--Gray-900, #101828);font-size:18px;font-weight:600;line-height:28px}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i8.CustomSelectComponent, selector: "team-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected", "deselected", "deselectedAll"] }, { kind: "component", type: i9.ChipSelectComponent, selector: "lib-chip-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label", "badgeValue", "searchKey"], outputs: ["selected"] }] });
364
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TeamsCreationComponent, selector: "lib-teams-creation", inputs: { teamData: "teamData", type: "type", teamsUsers: "teamsUsers" }, viewQueries: [{ propertyName: "inputFile", first: true, predicate: ["inputFile"], descendants: true }, { propertyName: "afterValidation", first: true, predicate: ["afterValidation"], descendants: true }, { propertyName: "confirmDelete", first: true, predicate: ["confirmDelete"], descendants: true }], 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\">\r\n <div class=\"symbol symbol-75px symbol-circle\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M20.5 23.6816C18.8425 23.6816 17.5 22.2133 17.5 20.4004C17.5 18.5875 18.8425 17.1191 20.5 17.1191C22.1575 17.1191 23.5 18.5875 23.5 20.4004C23.5 22.2133 22.1575 23.6816 20.5 23.6816ZM35.6483 23.6816C33.9908 23.6816 32.6483 22.2133 32.6483 20.4004C32.6483 18.5875 33.9908 17.1191 35.6483 17.1191C37.3058 17.1191 38.6483 18.5875 38.6483 20.4004C38.6483 22.2133 37.3058 23.6816 35.6483 23.6816ZM31.509 26.3066C31.509 28.4805 29.8965 30.2441 27.909 30.2441C25.9215 30.2441 24.309 28.4805 24.309 26.3066C24.309 24.1328 25.9215 22.3691 27.909 22.3691C29.8965 22.3691 31.509 24.1328 31.509 26.3066Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M20.0013 25.7559C17.7925 25.7559 16 27.7164 16 30.1322C16 30.6121 16.36 31.0059 16.7988 31.0059H24.8013H24.8275C23.8338 30.042 23.2038 28.6352 23.2038 27.0684C23.2038 26.7566 23.2263 26.449 23.275 26.1537C22.765 25.8994 22.1988 25.7559 21.6025 25.7559H20.0013Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M31.1725 31.0059H31.1987H39.2012C39.64 31.0059 40 30.6162 40 30.1322C40 27.7164 38.2075 25.7559 35.9987 25.7559H34.3975C33.8012 25.7559 33.235 25.8953 32.725 26.1537C32.77 26.4531 32.7963 26.7566 32.7963 27.0684C32.7963 28.6352 32.17 30.042 31.1725 31.0059Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M25.7988 32.3183C23.0388 32.3183 20.8 34.767 20.8 37.7857C20.8 38.3928 21.25 38.8809 21.8013 38.8809H34.1987C34.7537 38.8809 35.2 38.3887 35.2 37.7857C35.2 34.767 32.9613 32.3183 30.2013 32.3183H25.7988Z\"\r\n fill=\"#00A3FF\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"row w-100\">\r\n <div class=\"col-md-12\" *ngIf=\"type === 'create'\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Create Team</a>\r\n <div class=\"sub-title\">Group multiple users to create a team for easier management</div>\r\n </div>\r\n <div class=\"col-md-12\" *ngIf=\"type === 'edit'\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Edit Team</a>\r\n <div class=\"sub-title\">Group multiple users to edit a team for easier management</div>\r\n </div>\r\n\r\n\r\n <div class=\"w-100 h-500px scroll\">\r\n <div class=\"mt-5\">\r\n <form (keydown.enter)=\"preventClose($event)\">\r\n <div class=\"row px-0 me-3\">\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-7\">\r\n <label for=\"teamName\" class=\"form-label\">Team Name<span class=\"mandtryclr ms-1\">*</span></label>\r\n <input type=\"text\" [(ngModel)]=\"teamName\" [ngModelOptions]=\"{standalone: true}\"\r\n class=\"form-control\" id=\"teamName\" autocomplete=\"off\" (keypress)=\"omitSpecialChar($event)\">\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label for=\"teamlead\" class=\"form-label\">Team Lead Email<span class=\"mandtryclr ms-1\">*</span></label>\r\n <lib-chip-select [items]=\"teamleadList\" [multi]=\"true\" [searchField]=\"['userName']\" [searchKey]=\"['email']\"\r\n [idField]=\"'userId'\" (selected)=\"onTeamSelect($event)\" (removed)=\"removedChip($event)\"\r\n [selectedValues]=\"selectedTeam\"></lib-chip-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label for=\"userlead\" class=\"form-label\">Select Users<span class=\"mandtryclr ms-1\">*</span>\r\n </label>\r\n <team-select [items]=\"userList\" [multi]=\"true\" [searchField]=\"'userName'\"\r\n [idField]=\"'userId'\" (selected)=\"onUserSelect($event)\" (deselected)=\"UserUnselect($event)\" (deselectedAll)=\"UserUnselectAll($event)\"\r\n [selectedValues]=\"selectedUsers\"></team-select>\r\n </div>\r\n <p class=\"text-gray-400 fw-bold my-3\">\r\n <span class=\"line-bg \"><svg width=\"280\" height=\"2\" viewBox=\"0 0 280 2\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"0.5\" width=\"280\" height=\"1\" fill=\"#EAECF0\" />\r\n </svg>\r\n </span><span class=\"mx-15 or-color\">Or </span> <span class=\"line-bg \"><svg width=\"280\"\r\n height=\"2\" viewBox=\"0 0 280 2\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"0.5\" width=\"280\" height=\"1\" fill=\"#EAECF0\" />\r\n </svg>\r\n </span>\r\n </p>\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <div class=\"fw-bold text-gray-500 my-6\">\r\n <ol class=\"custom-ordered-list text-gray-400 fw-bold fs-6\">\r\n <li class=\"user-text\">Use the template to upload multiple users at once.</li>\r\n <li class=\"user-text my-3\"><span class=\"user-text\">Download the template here -\r\n </span>\r\n <a class=\"ms-1\" href=\"../../../assets/files/teamsUploadTemplate.xlsx\"\r\n download>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"template ms-2\">Download Template</span>\r\n </a>\r\n </li>\r\n <li class=\"user-text my-3\">Add your data to the Template File</li>\r\n <li class=\"user-text my-3\">Upload it below for processing</li>\r\n </ol>\r\n </div>\r\n </div>\r\n <div\r\n class=\"mt-3 ms-3 right-bar py-10 d-flex justify-content-center align-items-center flex-column\">\r\n <input name=\"accountType\" type=\"radio\" id=\"kt_account_team_size_select_upload\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\r\n value=\"personal\" class=\"btn-check\" ng-reflect-name=\"accountType\"\r\n ng-reflect-form-control-name=\"accountType\" (change)=\"onUploadTemplate($event)\"\r\n ng-reflect-value=\"personal\" type=\"file\" #inputFile />\r\n <label for=\"kt_account_team_size_select_upload\" class=\" w-50 p-4\"><span\r\n class=\"fw-bold text-center w-100 fs-4\">\r\n <div class=\"d-flex justify-content-center align-items-center w-100\">\r\n <svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\" />\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\"\r\n stroke-width=\"6\" />\r\n <g clip-path=\"url(#clip0_4047_40566)\">\r\n <path\r\n d=\"M26.3333 26.3334L23 23M23 23L19.6666 26.3334M23 23V30.5M29.9916 28.325C30.8044 27.8819 31.4465 27.1808 31.8165 26.3322C32.1866 25.4837 32.2635 24.5361 32.0351 23.6389C31.8068 22.7418 31.2862 21.9463 30.5555 21.3779C29.8248 20.8095 28.9257 20.5006 28 20.5H26.95C26.6977 19.5244 26.2276 18.6186 25.5749 17.8509C24.9222 17.0831 24.104 16.4732 23.1817 16.0672C22.2594 15.6612 21.2571 15.4695 20.2501 15.5066C19.243 15.5437 18.2575 15.8086 17.3676 16.2814C16.4777 16.7542 15.7066 17.4226 15.1122 18.2363C14.5177 19.0501 14.1155 19.988 13.9358 20.9795C13.756 21.9711 13.8034 22.9905 14.0743 23.9611C14.3452 24.9317 14.8327 25.8282 15.5 26.5834\"\r\n stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4047_40566\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(13 13)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\">Click to\r\n upload</span>\r\n <!-- <span class=\"ms-2\">or drag and drop</span> -->\r\n </div>\r\n <div class=\"nodata-sub\">the data added template file for processing.</div>\r\n </span>\r\n </label>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5 mt-5\">\r\n <label for=\"userlead\" class=\"form-label\">Description (optional)</label>\r\n <textarea id=\"description\" [(ngModel)]=\"description\"\r\n [ngModelOptions]=\"{standalone: true}\" name=\"description\" class=\"form-control\"\r\n rows=\"5\" cols=\"50\" placeholder=\"Enter a description...\"></textarea>\r\n </div>\r\n\r\n\r\n </div>\r\n <div 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\" *ngIf=\"!isEdit\"\r\n (click)=\"onCreateTeam()\" [disabled]=\"!selectedUsers.length||!selectedTeam.length|| !teamName\">Create\r\n Team</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" *ngIf=\"isEdit\"\r\n (click)=\"onCreateTeam()\" [disabled]=\"!selectedUsers.length ||!selectedTeam.length||!teamName\">Update\r\n Team</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Add Users</span></div>\r\n </div>\r\n <div class=\"card-body popup-scroll pt-0\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total Records</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div [ngClass]=\"excelError \r\n ? 'fw-semibold text-error w-100 error-heading' \r\n : 'fw-semibold w-100 config-heading'\">\r\n {{ uploadErrors?.doesNotExists?.length +uploadErrors?.duplicate?.length +uploadErrors?.inActive?.length || 0 }}\r\n </div>\r\n <div [ngClass]=\"excelError \r\n ? 'fw-semibold text-error mt-1 excel-error' \r\n : 'fw-semibold subtitle mt-1'\">\r\n Error\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!excelError\" class=\"table-header mt-5\" style=\"font-weight: 400;\">\r\n <div >You're about to add {{getStoreCounts(excelData)}} {{getStoreCounts(excelData) > 1 ? 'Users' : 'User'}}. Are you sure want to proceed?</div>\r\n \r\n </div>\r\n <div *ngIf=\"excelError?.length\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"uploadErrors?.doesNotExists?.length\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">User doesn't exists !</div>\r\n <!-- <div class=\"subtitle mt-5\">Please provide correct information.</div> -->\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of uploadErrors?.doesNotExists; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"uploadErrors?.duplicate?.length\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Duplicate records found !</div>\r\n <!-- <div class=\"subtitle mt-5\">Please provide correct information.</div> -->\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of uploadErrors?.duplicate; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"uploadErrors?.inActive?.length\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">User is inactive !</div>\r\n <!-- <div class=\"subtitle mt-5\">Please provide correct information.</div> -->\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of uploadErrors?.inActive; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 d-flex justify-content-end flex-wrap gap-2 pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup()\">Cancel</button>\r\n <button *ngIf=\"!excelError\" class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"validateDetails();model.close()\">Proceed</button>\r\n <button *ngIf=\"excelError\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"file1.click()\">Reupload</button>\r\n <input style=\"display: none;\" #file1 type=\"file\" id=\"kt_account_team_size_select_upload\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\r\n (change)=\"onUploadTemplate($event)\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n", 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}.or-color{color:var(--Gray-700, #344054)!important;text-align:center;font-size:12px;font-style:normal;font-weight:500;line-height:18px}.custom-ordered-list{list-style-type:decimal}.user-text{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.right-bar{border-radius:12px;border:1px solid var(--Gray-300, #D0D5DD)}.click-upload{color:var(--Primary-700, #009BF3)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-decoration-line:underline;text-transform:capitalize}.mandtryclr{color:red}.table-header{color:var(--Gray-800, #1D2939);font-size:16px;font-weight:600;line-height:24px}.text-error{color:var(--Error-700, #B42318)!important;font-size:14px;font-weight:500;line-height:20px}.excel-error{color:var(--Error-600, #D92D20);font-size:14px;font-weight:500;line-height:20px}.error-heading{color:var(--Error-600, #D92D20);font-size:20px;font-weight:500;line-height:30px}.border-error{border:1px solid var(--Error-300, #FDA29B)!important;background:var(--Error-25, #FFFBFA)!important}.popup-card{border-radius:6px;border:1px solid var(--Gray-300, #D0D5DD);background:#fff;box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}.popup-scroll{min-height:auto;max-height:400px;overflow-y:auto}.config-heading{color:var(--Gray-900, #101828);font-size:18px;font-weight:600;line-height:28px}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i8.CustomSelectComponent, selector: "team-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected", "deselected", "deselectedAll"] }, { kind: "component", type: i9.ChipSelectComponent, selector: "lib-chip-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label", "badgeValue", "searchKey"], outputs: ["selected"] }] });
371
365
  }
372
366
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TeamsCreationComponent, decorators: [{
373
367
  type: Component,
374
- args: [{ selector: 'lib-teams-creation', 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\">\r\n <div class=\"symbol symbol-75px symbol-circle\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M20.5 23.6816C18.8425 23.6816 17.5 22.2133 17.5 20.4004C17.5 18.5875 18.8425 17.1191 20.5 17.1191C22.1575 17.1191 23.5 18.5875 23.5 20.4004C23.5 22.2133 22.1575 23.6816 20.5 23.6816ZM35.6483 23.6816C33.9908 23.6816 32.6483 22.2133 32.6483 20.4004C32.6483 18.5875 33.9908 17.1191 35.6483 17.1191C37.3058 17.1191 38.6483 18.5875 38.6483 20.4004C38.6483 22.2133 37.3058 23.6816 35.6483 23.6816ZM31.509 26.3066C31.509 28.4805 29.8965 30.2441 27.909 30.2441C25.9215 30.2441 24.309 28.4805 24.309 26.3066C24.309 24.1328 25.9215 22.3691 27.909 22.3691C29.8965 22.3691 31.509 24.1328 31.509 26.3066Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M20.0013 25.7559C17.7925 25.7559 16 27.7164 16 30.1322C16 30.6121 16.36 31.0059 16.7988 31.0059H24.8013H24.8275C23.8338 30.042 23.2038 28.6352 23.2038 27.0684C23.2038 26.7566 23.2263 26.449 23.275 26.1537C22.765 25.8994 22.1988 25.7559 21.6025 25.7559H20.0013Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M31.1725 31.0059H31.1987H39.2012C39.64 31.0059 40 30.6162 40 30.1322C40 27.7164 38.2075 25.7559 35.9987 25.7559H34.3975C33.8012 25.7559 33.235 25.8953 32.725 26.1537C32.77 26.4531 32.7963 26.7566 32.7963 27.0684C32.7963 28.6352 32.17 30.042 31.1725 31.0059Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M25.7988 32.3183C23.0388 32.3183 20.8 34.767 20.8 37.7857C20.8 38.3928 21.25 38.8809 21.8013 38.8809H34.1987C34.7537 38.8809 35.2 38.3887 35.2 37.7857C35.2 34.767 32.9613 32.3183 30.2013 32.3183H25.7988Z\"\r\n fill=\"#00A3FF\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"row w-100\">\r\n <div class=\"col-md-12\" *ngIf=\"type === 'create'\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Create Team</a>\r\n <div class=\"sub-title\">Group multiple users to create a team for easier management</div>\r\n </div>\r\n <div class=\"col-md-12\" *ngIf=\"type === 'edit'\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Edit Team</a>\r\n <div class=\"sub-title\">Group multiple users to edit a team for easier management</div>\r\n </div>\r\n\r\n\r\n <div class=\"w-100 h-500px scroll\">\r\n <div class=\"mt-5\">\r\n <form (keydown.enter)=\"preventClose($event)\">\r\n <div class=\"row px-0 me-3\">\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-7\">\r\n <label for=\"teamName\" class=\"form-label\">Team Name<span class=\"mandtryclr ms-1\">*</span></label>\r\n <input type=\"text\" [(ngModel)]=\"teamName\" [ngModelOptions]=\"{standalone: true}\"\r\n class=\"form-control\" id=\"teamName\" autocomplete=\"off\" (keypress)=\"omitSpecialChar($event)\">\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label for=\"teamlead\" class=\"form-label\">Team Lead Email<span class=\"mandtryclr ms-1\">*</span></label>\r\n <!-- <team-select [items]=\"teamleadList\" [multi]=\"true\" [searchField]=\"'userName'\"\r\n [idField]=\"'userId'\" (selected)=\"onTeamSelect($event)\" (deselected)=\"TeamUnselect($event)\" (deselectedAll)=\"TeamUnselectAll($event)\"\r\n [selectedValues]=\"selectedTeam\"></team-select> -->\r\n <lib-chip-select [items]=\"teamleadList\" [multi]=\"true\" [searchField]=\"['userName']\" [searchKey]=\"['email']\"\r\n [idField]=\"'userId'\" (selected)=\"onTeamSelect($event)\" (removed)=\"removedChip($event)\"\r\n [selectedValues]=\"selectedTeam\"></lib-chip-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label for=\"userlead\" class=\"form-label\">Select Users<span class=\"mandtryclr ms-1\">*</span>\r\n </label>\r\n <team-select [items]=\"userList\" [multi]=\"true\" [searchField]=\"'userName'\"\r\n [idField]=\"'userId'\" (selected)=\"onUserSelect($event)\" (deselected)=\"UserUnselect($event)\" (deselectedAll)=\"UserUnselectAll($event)\"\r\n [selectedValues]=\"selectedUsers\"></team-select>\r\n </div>\r\n <p class=\"text-gray-400 fw-bold my-3\">\r\n <span class=\"line-bg \"><svg width=\"280\" height=\"2\" viewBox=\"0 0 280 2\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"0.5\" width=\"280\" height=\"1\" fill=\"#EAECF0\" />\r\n </svg>\r\n </span><span class=\"mx-15 or-color\">Or </span> <span class=\"line-bg \"><svg width=\"280\"\r\n height=\"2\" viewBox=\"0 0 280 2\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"0.5\" width=\"280\" height=\"1\" fill=\"#EAECF0\" />\r\n </svg>\r\n </span>\r\n </p>\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <div class=\"fw-bold text-gray-500 my-6\">\r\n <ol class=\"custom-ordered-list text-gray-400 fw-bold fs-6\">\r\n <li class=\"user-text\">Use the template to upload multiple users at once.</li>\r\n <li class=\"user-text my-3\"><span class=\"user-text\">Download the template here -\r\n </span>\r\n <a class=\"ms-1\" href=\"../../../assets/files/teamsUploadTemplate.xlsx\"\r\n download>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"template ms-2\">Download Template</span>\r\n </a>\r\n </li>\r\n <li class=\"user-text my-3\">Add your data to the Template File</li>\r\n <li class=\"user-text my-3\">Upload it below for processing</li>\r\n </ol>\r\n </div>\r\n </div>\r\n <div\r\n class=\"mt-3 ms-3 right-bar py-10 d-flex justify-content-center align-items-center flex-column\">\r\n <input name=\"accountType\" type=\"radio\" id=\"kt_account_team_size_select_upload\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\r\n value=\"personal\" class=\"btn-check\" ng-reflect-name=\"accountType\"\r\n ng-reflect-form-control-name=\"accountType\" (change)=\"onUploadTemplate($event)\"\r\n ng-reflect-value=\"personal\" type=\"file\" #inputFile />\r\n <label for=\"kt_account_team_size_select_upload\" class=\" w-50 p-4\"><span\r\n class=\"fw-bold text-center w-100 fs-4\">\r\n <div class=\"d-flex justify-content-center align-items-center w-100\">\r\n <svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\" />\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\"\r\n stroke-width=\"6\" />\r\n <g clip-path=\"url(#clip0_4047_40566)\">\r\n <path\r\n d=\"M26.3333 26.3334L23 23M23 23L19.6666 26.3334M23 23V30.5M29.9916 28.325C30.8044 27.8819 31.4465 27.1808 31.8165 26.3322C32.1866 25.4837 32.2635 24.5361 32.0351 23.6389C31.8068 22.7418 31.2862 21.9463 30.5555 21.3779C29.8248 20.8095 28.9257 20.5006 28 20.5H26.95C26.6977 19.5244 26.2276 18.6186 25.5749 17.8509C24.9222 17.0831 24.104 16.4732 23.1817 16.0672C22.2594 15.6612 21.2571 15.4695 20.2501 15.5066C19.243 15.5437 18.2575 15.8086 17.3676 16.2814C16.4777 16.7542 15.7066 17.4226 15.1122 18.2363C14.5177 19.0501 14.1155 19.988 13.9358 20.9795C13.756 21.9711 13.8034 22.9905 14.0743 23.9611C14.3452 24.9317 14.8327 25.8282 15.5 26.5834\"\r\n stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4047_40566\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(13 13)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\">Click to\r\n upload</span>\r\n <!-- <span class=\"ms-2\">or drag and drop</span> -->\r\n </div>\r\n <div class=\"nodata-sub\">the data added template file for processing.</div>\r\n </span>\r\n </label>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5 mt-5\">\r\n <label for=\"userlead\" class=\"form-label\">Description (optional)</label>\r\n <textarea id=\"description\" [(ngModel)]=\"description\"\r\n [ngModelOptions]=\"{standalone: true}\" name=\"description\" class=\"form-control\"\r\n rows=\"5\" cols=\"50\" placeholder=\"Enter a description...\"></textarea>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"mt-3 ms-3 right-bar py-10 d-flex justify-content-center align-items-center flex-column\" >\r\n <svg width=\"47\" height=\"46\" viewBox=\"0 0 47 46\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3.5\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\"/>\r\n <rect x=\"3.5\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\" stroke-width=\"6\"/>\r\n <g clip-path=\"url(#clip0_2176_18901)\">\r\n <path d=\"M26.8333 26.3332L23.5 22.9999M23.5 22.9999L20.1666 26.3332M23.5 22.9999V30.4999M30.4916 28.3249C31.3044 27.8818 31.9465 27.1806 32.3165 26.3321C32.6866 25.4835 32.7635 24.5359 32.5351 23.6388C32.3068 22.7417 31.7862 21.9462 31.0555 21.3778C30.3248 20.8094 29.4257 20.5005 28.5 20.4999H27.45C27.1977 19.5243 26.7276 18.6185 26.0749 17.8507C25.4222 17.0829 24.604 16.4731 23.6817 16.0671C22.7594 15.661 21.7571 15.4694 20.7501 15.5065C19.743 15.5436 18.7575 15.8085 17.8676 16.2813C16.9777 16.7541 16.2066 17.4225 15.6122 18.2362C15.0177 19.05 14.6155 19.9879 14.4358 20.9794C14.256 21.9709 14.3034 22.9903 14.5743 23.961C14.8452 24.9316 15.3327 25.8281 16 26.5832\" stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2176_18901\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" transform=\"translate(13.5 13)\"/>\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\"><input name=\"accountType\" type=\"radio\" id=\"kt_create_account_form_account_type_personal\" value=\"personal\"\r\n class=\"btn-check\" ng-reflect-name=\"accountType\" ng-reflect-form-control-name=\"accountType\"\r\n (change)=\"onUploadTemplate($event)\"\r\n ng-reflect-value=\"personal\" type=\"file\" #inputFile />Click to upload</span> <span class=\"ms-2\">or drag and drop</span></div>\r\n <div class=\"nodata-sub\">the data added template file for processing.</div>\r\n </div> -->\r\n </div>\r\n <div 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\" *ngIf=\"!isEdit\"\r\n (click)=\"onCreateTeam()\" [disabled]=\"!selectedUsers.length||!selectedTeam.length|| !teamName\">Create\r\n Team</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" *ngIf=\"isEdit\"\r\n (click)=\"onCreateTeam()\" [disabled]=\"!selectedUsers.length ||!selectedTeam.length||!teamName\">Update\r\n Team</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Add Users</span></div>\r\n </div>\r\n <div class=\"card-body popup-scroll pt-0\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total Records</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div [ngClass]=\"excelError ? 'error-heading':''\" class=\"fw-semibold config-heading w-100\">{{excelError?.error?.length || 0}}</div>\r\n <div [ngClass]=\"excelError ? 'excel-error':''\" class=\"fw-semibold subtitle mt-1\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!excelError\" class=\"table-header mt-5\" style=\"font-weight: 400;\">\r\n <div >You're about to add {{getStoreCounts(excelData)}} clusters. Are you sure want to proceed?</div>\r\n \r\n </div>\r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"uploadErrors?.doesNotExists?.length\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Data not exists !</div>\r\n <!-- <div class=\"subtitle mt-5\">Please provide correct information.</div> -->\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of uploadErrors?.doesNotExists; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"uploadErrors?.inActive?.length\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Data inactive !</div>\r\n <!-- <div class=\"subtitle mt-5\">Please provide correct information.</div> -->\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of uploadErrors?.inActive; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup()\">Cancel</button>\r\n <button *ngIf=\"!excelError\" class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"validateDetails();model.close()\">Proceed</button>\r\n <button *ngIf=\"excelError\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"file1.click()\">Reupload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_upload\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\r\n (change)=\"onUploadTemplate($event)\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n", 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}.or-color{color:var(--Gray-700, #344054)!important;text-align:center;font-size:12px;font-style:normal;font-weight:500;line-height:18px}.custom-ordered-list{list-style-type:decimal}.user-text{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.right-bar{border-radius:12px;border:1px solid var(--Gray-300, #D0D5DD)}.click-upload{color:var(--Primary-700, #009BF3)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-decoration-line:underline;text-transform:capitalize}.mandtryclr{color:red}.table-header{color:var(--Gray-800, #1D2939);font-size:16px;font-weight:600;line-height:24px}.text-error{color:var(--Error-700, #B42318)!important;font-size:14px;font-weight:500;line-height:20px}.excel-error{color:var(--Error-600, #D92D20);font-size:14px;font-weight:500;line-height:20px}.error-heading{color:var(--Error-600, #D92D20);font-size:20px;font-weight:500;line-height:30px}.border-error{border:1px solid var(--Error-300, #FDA29B)!important;background:var(--Error-25, #FFFBFA)!important}.popup-card{border-radius:6px;border:1px solid var(--Gray-300, #D0D5DD);background:#fff;box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}.popup-scroll{min-height:auto;max-height:400px;overflow-y:auto}.config-heading{color:var(--Gray-900, #101828);font-size:18px;font-weight:600;line-height:28px}\n"] }]
368
+ args: [{ selector: 'lib-teams-creation', 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\">\r\n <div class=\"symbol symbol-75px symbol-circle\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M20.5 23.6816C18.8425 23.6816 17.5 22.2133 17.5 20.4004C17.5 18.5875 18.8425 17.1191 20.5 17.1191C22.1575 17.1191 23.5 18.5875 23.5 20.4004C23.5 22.2133 22.1575 23.6816 20.5 23.6816ZM35.6483 23.6816C33.9908 23.6816 32.6483 22.2133 32.6483 20.4004C32.6483 18.5875 33.9908 17.1191 35.6483 17.1191C37.3058 17.1191 38.6483 18.5875 38.6483 20.4004C38.6483 22.2133 37.3058 23.6816 35.6483 23.6816ZM31.509 26.3066C31.509 28.4805 29.8965 30.2441 27.909 30.2441C25.9215 30.2441 24.309 28.4805 24.309 26.3066C24.309 24.1328 25.9215 22.3691 27.909 22.3691C29.8965 22.3691 31.509 24.1328 31.509 26.3066Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M20.0013 25.7559C17.7925 25.7559 16 27.7164 16 30.1322C16 30.6121 16.36 31.0059 16.7988 31.0059H24.8013H24.8275C23.8338 30.042 23.2038 28.6352 23.2038 27.0684C23.2038 26.7566 23.2263 26.449 23.275 26.1537C22.765 25.8994 22.1988 25.7559 21.6025 25.7559H20.0013Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M31.1725 31.0059H31.1987H39.2012C39.64 31.0059 40 30.6162 40 30.1322C40 27.7164 38.2075 25.7559 35.9987 25.7559H34.3975C33.8012 25.7559 33.235 25.8953 32.725 26.1537C32.77 26.4531 32.7963 26.7566 32.7963 27.0684C32.7963 28.6352 32.17 30.042 31.1725 31.0059Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M25.7988 32.3183C23.0388 32.3183 20.8 34.767 20.8 37.7857C20.8 38.3928 21.25 38.8809 21.8013 38.8809H34.1987C34.7537 38.8809 35.2 38.3887 35.2 37.7857C35.2 34.767 32.9613 32.3183 30.2013 32.3183H25.7988Z\"\r\n fill=\"#00A3FF\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"row w-100\">\r\n <div class=\"col-md-12\" *ngIf=\"type === 'create'\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Create Team</a>\r\n <div class=\"sub-title\">Group multiple users to create a team for easier management</div>\r\n </div>\r\n <div class=\"col-md-12\" *ngIf=\"type === 'edit'\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Edit Team</a>\r\n <div class=\"sub-title\">Group multiple users to edit a team for easier management</div>\r\n </div>\r\n\r\n\r\n <div class=\"w-100 h-500px scroll\">\r\n <div class=\"mt-5\">\r\n <form (keydown.enter)=\"preventClose($event)\">\r\n <div class=\"row px-0 me-3\">\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-7\">\r\n <label for=\"teamName\" class=\"form-label\">Team Name<span class=\"mandtryclr ms-1\">*</span></label>\r\n <input type=\"text\" [(ngModel)]=\"teamName\" [ngModelOptions]=\"{standalone: true}\"\r\n class=\"form-control\" id=\"teamName\" autocomplete=\"off\" (keypress)=\"omitSpecialChar($event)\">\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label for=\"teamlead\" class=\"form-label\">Team Lead Email<span class=\"mandtryclr ms-1\">*</span></label>\r\n <lib-chip-select [items]=\"teamleadList\" [multi]=\"true\" [searchField]=\"['userName']\" [searchKey]=\"['email']\"\r\n [idField]=\"'userId'\" (selected)=\"onTeamSelect($event)\" (removed)=\"removedChip($event)\"\r\n [selectedValues]=\"selectedTeam\"></lib-chip-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label for=\"userlead\" class=\"form-label\">Select Users<span class=\"mandtryclr ms-1\">*</span>\r\n </label>\r\n <team-select [items]=\"userList\" [multi]=\"true\" [searchField]=\"'userName'\"\r\n [idField]=\"'userId'\" (selected)=\"onUserSelect($event)\" (deselected)=\"UserUnselect($event)\" (deselectedAll)=\"UserUnselectAll($event)\"\r\n [selectedValues]=\"selectedUsers\"></team-select>\r\n </div>\r\n <p class=\"text-gray-400 fw-bold my-3\">\r\n <span class=\"line-bg \"><svg width=\"280\" height=\"2\" viewBox=\"0 0 280 2\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"0.5\" width=\"280\" height=\"1\" fill=\"#EAECF0\" />\r\n </svg>\r\n </span><span class=\"mx-15 or-color\">Or </span> <span class=\"line-bg \"><svg width=\"280\"\r\n height=\"2\" viewBox=\"0 0 280 2\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"0.5\" width=\"280\" height=\"1\" fill=\"#EAECF0\" />\r\n </svg>\r\n </span>\r\n </p>\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <div class=\"fw-bold text-gray-500 my-6\">\r\n <ol class=\"custom-ordered-list text-gray-400 fw-bold fs-6\">\r\n <li class=\"user-text\">Use the template to upload multiple users at once.</li>\r\n <li class=\"user-text my-3\"><span class=\"user-text\">Download the template here -\r\n </span>\r\n <a class=\"ms-1\" href=\"../../../assets/files/teamsUploadTemplate.xlsx\"\r\n download>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"template ms-2\">Download Template</span>\r\n </a>\r\n </li>\r\n <li class=\"user-text my-3\">Add your data to the Template File</li>\r\n <li class=\"user-text my-3\">Upload it below for processing</li>\r\n </ol>\r\n </div>\r\n </div>\r\n <div\r\n class=\"mt-3 ms-3 right-bar py-10 d-flex justify-content-center align-items-center flex-column\">\r\n <input name=\"accountType\" type=\"radio\" id=\"kt_account_team_size_select_upload\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\r\n value=\"personal\" class=\"btn-check\" ng-reflect-name=\"accountType\"\r\n ng-reflect-form-control-name=\"accountType\" (change)=\"onUploadTemplate($event)\"\r\n ng-reflect-value=\"personal\" type=\"file\" #inputFile />\r\n <label for=\"kt_account_team_size_select_upload\" class=\" w-50 p-4\"><span\r\n class=\"fw-bold text-center w-100 fs-4\">\r\n <div class=\"d-flex justify-content-center align-items-center w-100\">\r\n <svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\" />\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\"\r\n stroke-width=\"6\" />\r\n <g clip-path=\"url(#clip0_4047_40566)\">\r\n <path\r\n d=\"M26.3333 26.3334L23 23M23 23L19.6666 26.3334M23 23V30.5M29.9916 28.325C30.8044 27.8819 31.4465 27.1808 31.8165 26.3322C32.1866 25.4837 32.2635 24.5361 32.0351 23.6389C31.8068 22.7418 31.2862 21.9463 30.5555 21.3779C29.8248 20.8095 28.9257 20.5006 28 20.5H26.95C26.6977 19.5244 26.2276 18.6186 25.5749 17.8509C24.9222 17.0831 24.104 16.4732 23.1817 16.0672C22.2594 15.6612 21.2571 15.4695 20.2501 15.5066C19.243 15.5437 18.2575 15.8086 17.3676 16.2814C16.4777 16.7542 15.7066 17.4226 15.1122 18.2363C14.5177 19.0501 14.1155 19.988 13.9358 20.9795C13.756 21.9711 13.8034 22.9905 14.0743 23.9611C14.3452 24.9317 14.8327 25.8282 15.5 26.5834\"\r\n stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4047_40566\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(13 13)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\">Click to\r\n upload</span>\r\n <!-- <span class=\"ms-2\">or drag and drop</span> -->\r\n </div>\r\n <div class=\"nodata-sub\">the data added template file for processing.</div>\r\n </span>\r\n </label>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5 mt-5\">\r\n <label for=\"userlead\" class=\"form-label\">Description (optional)</label>\r\n <textarea id=\"description\" [(ngModel)]=\"description\"\r\n [ngModelOptions]=\"{standalone: true}\" name=\"description\" class=\"form-control\"\r\n rows=\"5\" cols=\"50\" placeholder=\"Enter a description...\"></textarea>\r\n </div>\r\n\r\n\r\n </div>\r\n <div 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\" *ngIf=\"!isEdit\"\r\n (click)=\"onCreateTeam()\" [disabled]=\"!selectedUsers.length||!selectedTeam.length|| !teamName\">Create\r\n Team</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" *ngIf=\"isEdit\"\r\n (click)=\"onCreateTeam()\" [disabled]=\"!selectedUsers.length ||!selectedTeam.length||!teamName\">Update\r\n Team</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Add Users</span></div>\r\n </div>\r\n <div class=\"card-body popup-scroll pt-0\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total Records</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div [ngClass]=\"excelError \r\n ? 'fw-semibold text-error w-100 error-heading' \r\n : 'fw-semibold w-100 config-heading'\">\r\n {{ uploadErrors?.doesNotExists?.length +uploadErrors?.duplicate?.length +uploadErrors?.inActive?.length || 0 }}\r\n </div>\r\n <div [ngClass]=\"excelError \r\n ? 'fw-semibold text-error mt-1 excel-error' \r\n : 'fw-semibold subtitle mt-1'\">\r\n Error\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!excelError\" class=\"table-header mt-5\" style=\"font-weight: 400;\">\r\n <div >You're about to add {{getStoreCounts(excelData)}} {{getStoreCounts(excelData) > 1 ? 'Users' : 'User'}}. Are you sure want to proceed?</div>\r\n \r\n </div>\r\n <div *ngIf=\"excelError?.length\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"uploadErrors?.doesNotExists?.length\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">User doesn't exists !</div>\r\n <!-- <div class=\"subtitle mt-5\">Please provide correct information.</div> -->\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of uploadErrors?.doesNotExists; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"uploadErrors?.duplicate?.length\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Duplicate records found !</div>\r\n <!-- <div class=\"subtitle mt-5\">Please provide correct information.</div> -->\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of uploadErrors?.duplicate; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"uploadErrors?.inActive?.length\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">User is inactive !</div>\r\n <!-- <div class=\"subtitle mt-5\">Please provide correct information.</div> -->\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of uploadErrors?.inActive; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 d-flex justify-content-end flex-wrap gap-2 pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup()\">Cancel</button>\r\n <button *ngIf=\"!excelError\" class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"validateDetails();model.close()\">Proceed</button>\r\n <button *ngIf=\"excelError\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"file1.click()\">Reupload</button>\r\n <input style=\"display: none;\" #file1 type=\"file\" id=\"kt_account_team_size_select_upload\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\r\n (change)=\"onUploadTemplate($event)\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n", 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}.or-color{color:var(--Gray-700, #344054)!important;text-align:center;font-size:12px;font-style:normal;font-weight:500;line-height:18px}.custom-ordered-list{list-style-type:decimal}.user-text{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.right-bar{border-radius:12px;border:1px solid var(--Gray-300, #D0D5DD)}.click-upload{color:var(--Primary-700, #009BF3)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-decoration-line:underline;text-transform:capitalize}.mandtryclr{color:red}.table-header{color:var(--Gray-800, #1D2939);font-size:16px;font-weight:600;line-height:24px}.text-error{color:var(--Error-700, #B42318)!important;font-size:14px;font-weight:500;line-height:20px}.excel-error{color:var(--Error-600, #D92D20);font-size:14px;font-weight:500;line-height:20px}.error-heading{color:var(--Error-600, #D92D20);font-size:20px;font-weight:500;line-height:30px}.border-error{border:1px solid var(--Error-300, #FDA29B)!important;background:var(--Error-25, #FFFBFA)!important}.popup-card{border-radius:6px;border:1px solid var(--Gray-300, #D0D5DD);background:#fff;box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}.popup-scroll{min-height:auto;max-height:400px;overflow-y:auto}.config-heading{color:var(--Gray-900, #101828);font-size:18px;font-weight:600;line-height:28px}\n"] }]
375
369
  }], ctorParameters: () => [{ type: i1.ToastService }, { type: i2.Router }, { type: i3.NgbActiveModal }, { type: i4.ManageUsersService }, { type: i5.GlobalStateService }, { type: i0.ChangeDetectorRef }, { type: i3.NgbModal }], propDecorators: { inputFile: [{
376
370
  type: ViewChild,
377
371
  args: ["inputFile"]
@@ -388,4 +382,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
388
382
  }], teamsUsers: [{
389
383
  type: Input
390
384
  }] } });
391
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVhbXMtY3JlYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLXVzZXJzL3NyYy9saWIvY29tcG9uZW50cy12Mi90ZWFtcy1jcmVhdGlvbi90ZWFtcy1jcmVhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtdXNlcnMvc3JjL2xpYi9jb21wb25lbnRzLXYyL3RlYW1zLWNyZWF0aW9uL3RlYW1zLWNyZWF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWlDLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTlHLE9BQU8sRUFBRSxPQUFPLEVBQWdCLFNBQVMsR0FBdUMsTUFBTSxNQUFNLENBQUM7QUFHN0YsT0FBTyxFQUFZLElBQUksRUFBRSxLQUFLLEVBQWEsTUFBTSxNQUFNLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7OztBQVE3QyxNQUFNLE9BQU8sc0JBQXNCO0lBcUJiO0lBQTBCO0lBQXVCO0lBQzNEO0lBQXdDO0lBQWdDO0lBQTZCO0lBckJ2RixTQUFTLENBQWE7SUFDaEIsZUFBZSxDQUFNO0lBQ3ZCLGFBQWEsQ0FBTTtJQUM5QixPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUN6QyxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakMsVUFBVSxDQUFNO0lBQ2pCLFNBQVMsR0FBUSxFQUFFLENBQUE7SUFDVixRQUFRLENBQU07SUFDZCxJQUFJLENBQU07SUFDVixVQUFVLENBQU07SUFDekIsWUFBWSxHQUFVLEVBQUUsQ0FBQztJQUN6QixRQUFRLEdBQVUsRUFBRSxDQUFDO0lBQ3JCLFlBQVksR0FBUSxF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c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUNBLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZTtnQkFLakIsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEVsZW1lbnRSZWYsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsLCBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGFrZVVudGlsLCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBNYW5hZ2VVc2Vyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy12Mi9tYW5hZ2UtdXNlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFdvcmtCb29rLCByZWFkLCB1dGlscywgV29ya1NoZWV0IH0gZnJvbSBcInhsc3hcIjtcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXRlYW1zLWNyZWF0aW9uJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGVhbXMtY3JlYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi90ZWFtcy1jcmVhdGlvbi5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFRlYW1zQ3JlYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQFZpZXdDaGlsZChcImlucHV0RmlsZVwiKSBpbnB1dEZpbGU6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnYWZ0ZXJWYWxpZGF0aW9uJykgYWZ0ZXJWYWxpZGF0aW9uOiBhbnk7XHJcbiAgQFZpZXdDaGlsZCgnY29uZmlybURlbGV0ZScpIGNvbmZpcm1EZWxldGU6IGFueTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kgPSBuZXcgU3ViamVjdCgpO1xyXG4gIHNlYXJjaElucHV0ID0gbmV3IEZvcm1Db250cm9sKFwiXCIpO1xyXG4gICBleGNlbEVycm9yOiBhbnk7XHJcbiAgZXhjZWxEYXRhOiBhbnkgPSBbXVxyXG4gIEBJbnB1dCgpIHRlYW1EYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgdHlwZTogYW55O1xyXG4gIEBJbnB1dCgpIHRlYW1zVXNlcnM6IGFueTtcclxuICB0ZWFtbGVhZExpc3Q6IGFueVtdID0gW107XHJcbiAgdXNlckxpc3Q6IGFueVtdID0gW107XHJcbiAgc2VsZWN0ZWRUZWFtOiBhbnkgPSBbXTtcclxuICBzZWxlY3RlZFVzZXJzOiBhbnkgPSBbXTtcclxuICAkaGVhZGVyRmlsdGVyczogYW55O1xyXG4gIHRlYW1OYW1lOiBhbnk7XHJcbiAgaXNFZGl0OiBib29sZWFuID0gZmFsc2VcclxuICBkZXNjcmlwdGlvbjogYW55O1xyXG4gIGZpbGVlcnJvcjogYm9vbGVhbiA9IGZhbHNlXHJcbiAgdXBsb2FkUG9wVXA6IGFueTtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRzOiBUb2FzdFNlcnZpY2UsIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsIHB1YmxpYyBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBNYW5hZ2VVc2Vyc1NlcnZpY2UsIHB1YmxpYyBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLCBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixwdWJsaWMgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbFxyXG4gICkge1xyXG5cclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveS5jb21wbGV0ZSgpO1xyXG5cclxuICB9XHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdzPy5kYXRhUmFuZ2VWYWx1ZT8ucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95KSk/LnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgY29uc3QgdXNlckRhdGE6IGFueSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ1c2VyLWluZm9cIikgfHwgXCJ7fVwiKTtcclxuICAgICAgICAgIHRoaXMuJGhlYWRlckZpbHRlcnMgPSB1c2VyRGF0YTtcclxuICAgICAgICAgIHRoaXMuJGhlYWRlckZpbHRlcnMuY2xpZW50ID0gdXNlckRhdGEuY2xpZW50SWRcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy4kaGVhZGVyRmlsdGVycyA9IGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ2V0dXNlckxpc3QoKTtcclxuXHJcbiAgfVxyXG4gIGdldFRlYW1EYXRhKGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy51c2VyU2VydmljZS5lZGl0VGVhbXNkYXRhKGRhdGEpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSkpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLmlzRWRpdCA9IHRydWVcclxuICAgICAgICAgIGlmIChyZXMuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVhbU5hbWUgPSByZXMuZGF0YVswXS50ZWFtTmFtZVxyXG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gcmVzLmRhdGFbMF0uZGVzY3JpcHRpb25cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRlYW0gPSByZXMuZGF0YVswXS5UZWFtbGVhZFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlcnMgPSByZXMuZGF0YVswXS51c2Vyc1xyXG5cclxuICAgICAgICAgICAgdGhpcy50ZWFtbGVhZExpc3QgPSB0aGlzLnRlYW1sZWFkTGlzdC5maWx0ZXIoKGl0ZW0yOiBhbnkpID0+XHJcbiAgICAgICAgICAgICAgIXRoaXMuc2VsZWN0ZWRVc2Vycy5zb21lKChpdGVtMTogYW55KSA9PiBpdGVtMS51c2VySWQgPT09IGl0ZW0yLnVzZXJJZClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnRlYW1sZWFkTGlzdClcclxuICAgICAgICAgICAgICB0aGlzLnVzZXJMaXN0ID0gdGhpcy51c2VyTGlzdC5maWx0ZXIoKGl0ZW0yOiBhbnkpID0+XHJcbiAgICAgICAgICAgICAgICAhdGhpcy5zZWxlY3RlZFRlYW0uc29tZSgoaXRlbTE6IGFueSkgPT4gaXRlbTEudXNlcklkID09PSBpdGVtMi51c2VySWQpXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnVzZXJMaXN0KVxyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG4gIGdldHVzZXJMaXN0KCkge1xyXG5cclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICBjbGllbnRJZDogdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnRcclxuICAgIH1cclxuICAgIHRoaXMudXNlclNlcnZpY2UuZ2V0YWxsdXNlcnNMaXN0KHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSkpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRlYW1sZWFkTGlzdCA9IHJlcy5kYXRhLmZpbHRlcigoZTogYW55KSA9PiBlLnJvbGUgIT0gJ3N1cGVyYWRtaW4nKTtcclxuICAgICAgICAgIHRoaXMudXNlckxpc3QgPSByZXMuZGF0YS5maWx0ZXIoKGU6IGFueSkgPT4gZS5yb2xlICE9ICdzdXBlcmFkbWluJyk7IFxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnRlYW1EYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VGVhbURhdGEodGhpcy50ZWFtRGF0YSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIFxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnRlYW1zVXNlcnMgJiYgdGhpcy50ZWFtc1VzZXJzLmxlbmd0aCA+IDAgJiYgIXRoaXMuaXNFZGl0KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMudGVhbXNVc2VycylcclxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZHVzZXJzID0gdGhpcy50ZWFtc1VzZXJzLm1hcCgodXNlcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGVtYWlsOiB1c2VyLmVtYWlsLFxyXG4gICAgICAgICAgICAgICAgdXNlcklkOiB1c2VyLnVzZXJJZFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlcnMgPSB1cGRhdGVkdXNlcnNcclxuICAgICAgICAgICAgdGhpcy5tYXJrQ2hlY2tlZFN0b3JlcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGZpbHRlcmVkVXNlcnM6IGFueTtcclxuICBtYXJrQ2hlY2tlZFN0b3JlcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNsdXN0ZXJTdG9yZUlkcyA9IHRoaXMudGVhbXNVc2Vycz8ubWFwKCh1c2VyOiBhbnkpID0+IHVzZXIuX2lkKTtcclxuICAgIHRoaXMudXNlckxpc3QgPSB0aGlzLnVzZXJMaXN0Py5tYXAodXNlciA9PiB7XHJcbiAgICAgIHVzZXIuY2hlY2tlZCA9IGNsdXN0ZXJTdG9yZUlkcy5pbmNsdWRlcyh1c2VyLnVzZXJJZCk7XHJcbiAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkVXNlcnMgPSB0aGlzLnVzZXJMaXN0LmZpbHRlcih1c2VyID0+IHVzZXIuY2hlY2tlZCk7XHJcbiAgICB0aGlzLnRlYW1sZWFkTGlzdCA9IHRoaXMudGVhbWxlYWRMaXN0LmZpbHRlcigoaXRlbTI6IGFueSkgPT5cclxuICAgICAgIXRoaXMuc2VsZWN0ZWRVc2Vycy5zb21lKChpdGVtMTogYW55KSA9PiBpdGVtMS51c2VySWQgPT09IGl0ZW0yLnVzZXJJZClcclxuICAgICk7XHJcbiAgICAgIFxyXG4gIH1cclxuICBUZWFtVW5zZWxlY3RBbGwoZXZlbnQ6YW55KXtcclxuICAgIHRoaXMudXNlckxpc3QgPSBbLi4udGhpcy51c2VyTGlzdCwuLi5ldmVudF1cclxuICAgIGNvbnNvbGUubG9nKFwidGVhbWxlYWQgdW5zZWxlY3RhbGxcIiwgdGhpcy51c2VyTGlzdClcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICB9XHJcblxyXG4gIFRlYW1VbnNlbGVjdChldmVudDphbnkpe1xyXG4gICAgdGhpcy51c2VyTGlzdC5wdXNoKGV2ZW50KVxyXG4gICAgY29uc29sZS5sb2coXCJ0ZWFtbGVhZCB1bnNlbGVjdFwiLCB0aGlzLnVzZXJMaXN0KVxyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gIH1cclxuICBVc2VyVW5zZWxlY3QoZXZlbnQ6YW55KXtcclxuICAgIGNvbnNvbGUubG9nKFwidXNlciB1bnNlbGVjdFwiLCBldmVudClcclxuICAgIHRoaXMudGVhbWxlYWRMaXN0LnB1c2goZXZlbnQpXHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgfVxyXG4gIFVzZXJVbnNlbGVjdEFsbChldmVudDphbnkpe1xyXG4gICAgdGhpcy50ZWFtbGVhZExpc3QgPSBbLi4udGhpcy50ZWFtbGVhZExpc3QsLi4uZXZlbnRdXHJcbiAgICBjb25zb2xlLmxvZyhcInVzZXIgdW5zZWxlY3RhbGxcIiwgdGhpcy50ZWFtbGVhZExpc3QpXHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgfVxyXG4gIG9uVGVhbVNlbGVjdChldmVudDogYW55KSB7XHJcbiAgICBjb25zb2xlLmxvZyhcInRlYW1sZWFkIHNlbGVjdFwiLCBldmVudClcclxuICAgIHRoaXMuc2VsZWN0ZWRUZWFtID0gZXZlbnQgICAgICAgIFxyXG4gICAgaWYodGhpcy5zZWxlY3RlZFRlYW0ubGVuZ3RoPjApe1xyXG4gICAgICB0aGlzLnVzZXJMaXN0ID0gdGhpcy51c2VyTGlzdC5maWx0ZXIoKGl0ZW0yOiBhbnkpID0+XHJcbiAgICAgICAgIXRoaXMuc2VsZWN0ZWRUZWFtLnNvbWUoKGl0ZW0xOiBhbnkpID0+IGl0ZW0xLnVzZXJJZCA9PT0gaXRlbTIudXNlcklkKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIG9uVXNlclNlbGVjdChldmVudDogYW55KSB7XHJcbiAgICBjb25zb2xlLmxvZyhcInVzZXIgc2VsZWN0XCIsIGV2ZW50KVxyXG4gICAgXHJcbiAgICB0aGlzLnNlbGVjdGVkVXNlcnMgPSBldmVudFxyXG4gICAgaWYodGhpcy5zZWxlY3RlZFVzZXJzLmxlbmd0aD4wKXtcclxuICAgIHRoaXMudGVhbWxlYWRMaXN0ID0gdGhpcy50ZWFtbGVhZExpc3QuZmlsdGVyKChpdGVtMjogYW55KSA9PlxyXG4gICAgICAhdGhpcy5zZWxlY3RlZFVzZXJzLnNvbWUoKGl0ZW0xOiBhbnkpID0+IGl0ZW0xLnVzZXJJZCA9PT0gaXRlbTIudXNlcklkKVxyXG4gICAgKTtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMudGVhbWxlYWRMaXN0KVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICB9XHJcbiAgY2FuY2VsKCkge1xyXG4gICAgdGhpcy50ZWFtc1VzZXJzID0gW11cclxuICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKVxyXG4gIH1cclxuXHJcbiAgb25DcmVhdGVUZWFtKCkge1xyXG4gICAgbGV0IGFkbWluY291bnQgPSB0aGlzLnNlbGVjdGVkVXNlcnMuZmlsdGVyKCh1c2VyOiBhbnkpID0+IHVzZXIucm9sZSA9PSAnYWRtaW4nKS5sZW5ndGhcclxuICAgIGxldCBsZWFkVXNlcmNvdW50ID0gdGhpcy5zZWxlY3RlZFRlYW0uZmlsdGVyKCh1c2VyOiBhbnkpID0+IHVzZXIucm9sZSA9PSAndXNlcicpLmxlbmd0aFxyXG4gICAgaWYgKGFkbWluY291bnQgPiAwICYmIGxlYWRVc2VyY291bnQgPiAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRzLmdldEVycm9yVG9hc3QoJ1VzZXIgY2Fubm90IGJlIHRlYW0gbGVhZCB3aGVuIGFkbWlucyBhcyBhIHVzZXJzJylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBwYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgICAgY2xpZW50SWQ6IHRoaXMuJGhlYWRlckZpbHRlcnMuY2xpZW50LFxyXG4gICAgICAgIHRlYW1OYW1lOiB0aGlzLnRlYW1OYW1lLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgIHVzZXJzOiB0aGlzLnNlbGVjdGVkVXNlcnMsXHJcbiAgICAgICAgVGVhbWxlYWQ6IHRoaXMuc2VsZWN0ZWRUZWFtLFxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICAgIHBheWxvYWQudGVhbUlkID0gdGhpcy50ZWFtRGF0YT8uX2lkXHJcbiAgICAgICAgdGhpcy51c2VyU2VydmljZS51cGRhdGVUZWFtKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSkpLnN1YnNjcmliZShcclxuICAgICAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgICB0aGlzLnRzLmdldFByaW1hcnlUb2FzdChcIlRlYW0gVXBkYXRlZCBTdWNjZXNzZnVsbHlcIilcclxuICAgICAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudXNlclNlcnZpY2UuY3JlYXRlVGVhbXMocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95KSkuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMudHMuZ2V0UHJpbWFyeVRvYXN0KFwiVGVhbSBDcmVhdGVkIFN1Y2Nlc3NmdWxseVwiKVxyXG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3JcIiwgZXJyb3IpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGVycm9yPy5lcnJvcj8uZXJyb3I/LmVycm9yKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGFmdGVyVXBsb2FkOiBhbnkgPSBbXTtcclxuICB1cGxvYWRFcnJvcnM6IGFueSA9IFtdO1xyXG5cclxuICBvblVwbG9hZFRlbXBsYXRlKGU6IGFueSkge1xyXG4gICAgbGV0IGRhdGE6IGFueVtdID0gW107XHJcbiAgICBsZXQgZXJyb3I6IGFueSA9IFtdO1xyXG4gICAgbGV0IHNoZWV0TmFtZTogYW55ID0gJyc7XHJcblxyXG4gICAgY29uc3QgZmlsZTogRmlsZSA9IGUudGFyZ2V0LmZpbGVzWzBdO1xyXG4gIGNvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gL1xcLih4bHN8eGxzeHxjc3YpJC9pO1xyXG4gIGNvbnN0IGFsbG93ZWRUeXBlcyA9IFtcclxuICAgIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXRcIiwgXHJcbiAgICBcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbFwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgXCJ0ZXh0L2NzdlwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgXCJhcHBsaWNhdGlvbi9jc3ZcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICBdO1xyXG5cclxuICBpZiAoIWFsbG93ZWRFeHRlbnNpb25zLnRlc3QoZmlsZS5uYW1lKSB8fCAhYWxsb3dlZFR5cGVzLmluY2x1ZGVzKGZpbGUudHlwZSkpIHtcclxuICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIk9ubHkgLnhsc3gsIG9yIC5jc3YgZmlsZXMgYXJlIGFsbG93ZWQuXCIpO1xyXG4gICAgdGhpcy5pbnB1dEZpbGUubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiXCI7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICAgIGNvbnN0IHRhcmdldDogRGF0YVRyYW5zZmVyID0gPERhdGFUcmFuc2Zlcj5lLnRhcmdldDtcclxuICAgIGlmICh0YXJnZXQuZmlsZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICB0aGlzLmlucHV0RmlsZS5uYXRpdmVFbGVtZW50LnZhbHVlID0gXCJcIjtcclxuICAgIH1cclxuICAgIGlmICghIXRhcmdldC5maWxlc1swXS5uYW1lLm1hdGNoKC8oLnhsc3wueGxzeCkvKSkge1xyXG4gICAgICBjb25zdCByZWFkZXI6IEZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJzdHI6IHN0cmluZyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgICBjb25zdCB3YjogV29ya0Jvb2sgPSByZWFkKGJzdHIsIHsgdHlwZTogXCJiaW5hcnlcIiB9KTtcclxuICAgICAgICBjb25zdCB3c25hbWU6IHN0cmluZyA9IHdiLlNoZWV0TmFtZXNbMF07XHJcbiAgICAgICAgY29uc3Qgd3M6IFdvcmtTaGVldCA9IHdiLlNoZWV0c1t3c25hbWVdO1xyXG5cclxuICAgICAgICBkYXRhID0gdXRpbHMuc2hlZXRfdG9fanNvbih3cyk7XHJcbiAgICAgICAgdGhpcy5leGNlbERhdGEgPSBkYXRhO1xyXG4gICAgICAgIHNoZWV0TmFtZSA9IHdiLlNoZWV0TmFtZXNbMF07XHJcbiAgICAgIH07XHJcbiAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcodGFyZ2V0LmZpbGVzWzBdKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGFzeW5jIChlKSA9PiB7XHJcblxyXG4gICAgICAgIGlmIChzaGVldE5hbWUgIT0gXCJVc2Vyc1wiKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbGVlcnJvciA9IHRydWVcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIkNhbiB5b3UgY29uZmlybSB3aGV0aGVyIHRoZSBzaGVldCBuYW1lIGlzIFVzZXJzID9cIik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWRhdGE/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJQbGVhc2UgdXBsb2FkIGEgdmFsaWQgZmlsZS5cIik7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zdCByZXF1aXJlZEtleXMgPSBbJ1VzZXIgTmFtZS9FbWFpbCBJZCddIC8vIE11c3QgYWx3YXlzIGJlIHByZXNlbnRcclxuICAgICAgICAvLyBjb25zdCBvcHRpb25hbEtleXMgPSBbJ3VzZXJQaG9uZScsICdjaXR5J10gOiBbJ2NpdHknXTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBpc1ZhbGlkID0gZGF0YS5zb21lKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpdGVtKTtcclxuICAgICAgICAgIGNvbnN0IGhhc1JlcXVpcmVkS2V5cyA9IHJlcXVpcmVkS2V5cy5ldmVyeShrZXkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKTtcclxuICAgICAgICAgIGNvbnN0IGFsbEtleXNBcmVBbGxvd2VkID0ga2V5cy5ldmVyeShrZXkgPT4gXHJcbiAgICAgICAgICAgIHJlcXVpcmVkS2V5cy5pbmNsdWRlcyhrZXkpXHJcbiAgICAgICAgICAgIC8vIHx8IG9wdGlvbmFsS2V5cy5pbmNsdWRlcyhrZXkpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuIGhhc1JlcXVpcmVkS2V5cyAmJiBhbGxLZXlzQXJlQWxsb3dlZDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoJ1BsZWFzZSB1cGxvYWQgYSB2YWxpZCBmaWxlLicpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHByb2Nlc3NlZEFycmF5OiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGxldCBlcnJNc2dzOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgLy8gcHJvY2Vzc2VkQXJyYXkucHVzaCh7XHJcbiAgICAgICAgICAvLyAgIHZhbHVlOiBkYXRhW2ldWydVc2VyIE5hbWUvRW1haWwgSWQnXSxcclxuICAgICAgICAgIC8vIH0pXHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIGRhdGE/LmZvckVhY2goKGVsZW1lbnQ6IGFueSwgaW5kZXg6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudD8uWydVc2VyIE5hbWUvRW1haWwgSWQnXSA9PSAnJyB8fCBlbGVtZW50Py5bJ1VzZXIgTmFtZS9FbWFpbCBJZCddID09IG51bGwpIHtcclxuICAgICAgICAgICAgICBlcnJvci5wdXNoKGBJbnZhbGlkIFVzZXIgTmFtZS9FbWFpbCBJZCAtIEMke2luZGV4ICsgMn1gKVxyXG4gICAgICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgICAgICBwcm9jZXNzZWRBcnJheS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhW2luZGV4XVsnVXNlciBOYW1lL0VtYWlsIElkJ10sXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgXHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICBpZih0aGlzLmZpbGVlcnJvcil7XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlcnJvci5sZW5ndGgpIHtcclxuICAgICAgICAgIGNvbnN0IHBvcHVwY29udGVudCA9IHtcclxuICAgICAgICAgICAgZGlzcGxheXByb3A6IGZhbHNlLFxyXG4gICAgICAgICAgICBpbWFnZXNyYzogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI1NlwiIHZpZXdCb3g9XCIwIDAgNTYgNTZcIiBmaWxsPVwibm9uZVwiPjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNGRUYwQzdcIi8+PHBhdGggZD1cIk0yNy45OTk4IDI0LjAwMTJWMjguMDAxMk0yNy45OTk4IDMyLjAwMTJIMjguMDA5OE0yNi4yODk4IDE4Ljg2MTJMMTcuODE5OCAzMy4wMDEyQzE3LjY0NTEgMzMuMzAzNiAxNy41NTI3IDMzLjY0NjUgMTcuNTUxOCAzMy45OTU3QzE3LjU1MDggMzQuMzQ0OSAxNy42NDEzIDM0LjY4ODMgMTcuODE0MiAzNC45OTE3QzE3Ljk4NzEgMzUuMjk1MSAxOC4yMzY1IDM1LjU0NzkgMTguNTM3NSAzNS43MjVDMTguODM4NSAzNS45MDIxIDE5LjE4MDYgMzUuOTk3MyAxOS41Mjk4IDM2LjAwMTJIMzYuNDY5OEMzNi44MTkgMzUuOTk3MyAzNy4xNjExIDM1LjkwMjEgMzcuNDYyMSAzNS43MjVDMzcuNzYzMSAzNS41NDc5IDM4LjAxMjQgMzUuMjk1MSAzOC4xODU0IDM0Ljk5MTdDMzguMzU4MyAzNC42ODgzIDM4LjQ0ODggMzQuMzQ0OSAzOC40NDc4IDMzLjk5NTdDMzguNDQ2OCAzMy42NDY1IDM4LjM1NDQgMzMuMzAzNiAzOC4xNzk4IDMzLjAwMTJMMjkuNzA5OCAxOC44NjEyQzI5LjUzMTUgMTguNTY3MyAyOS4yODA1IDE4LjMyNDMgMjguOTgxIDE4LjE1NTdDMjguNjgxNCAxNy45ODcgMjguMzQzNSAxNy44OTg0IDI3Ljk5OTggMTcuODk4NEMyNy42NTYgMTcuODk4NCAyNy4zMTgxIDE3Ljk4NyAyNy4wMTg2IDE4LjE1NTdDMjYuNzE5MSAxOC4zMjQzIDI2LjQ2OCAxOC41NjczIDI2LjI4OTggMTguODYxMlpcIiBzdHJva2U9XCIjREM2ODAzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNGRkZBRUJcIiBzdHJva2Utd2lkdGg9XCI4XCIvPjwvc3ZnPmAsXHJcbiAgICAgICAgICAgIHRpdGxlOiBgSW52YWxpZCBkZXRhaWxzIWAsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGBQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGFuZCBjb21wbGV0ZSBzdG9yZSBpbmZvcm1hdGlvbi5gLFxyXG4gICAgICAgICAgICBidXR0b250eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgICBlcnJvcjogZXJyb3JcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKHBvcHVwY29udGVudClcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgIHRoaXMudXNlclNlcnZpY2VcclxuICAgICAgICAgIC50ZWFtQnVsa1VwbG9hZCh7XHJcbiAgICAgICAgICAgIHVzZXJzOiBwcm9jZXNzZWRBcnJheSxcclxuICAgICAgICAgICAgY2xpZW50SWQ6IHRoaXMuJGhlYWRlckZpbHRlcnM/LmNsaWVudCA/IHRoaXMuJGhlYWRlckZpbHRlcnM/LmNsaWVudCA6IHRoaXMuJGhlYWRlckZpbHRlcnM/LmNsaWVudElkLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlclVwbG9hZCA9IHJlcz8uZGF0YT8ucmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlclVwbGxvYWQoKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiVGhlIGdpdmVuIFVzZXIgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJyYW5kXCIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlcnIuZXJyb3IuY29kZSA9PSA0MDApIHsgLy8gdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIuZXJyb3IuZXJyb3IuZHVwbGljYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3B1cGNvbnRlbnQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlwcm9wOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzcmM6IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIj48cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIGZpbGw9XCIjRkVGMEM3XCIvPjxwYXRoIGQ9XCJNMjcuOTk5OCAyNC4wMDEyVjI4LjAwMTJNMjcuOTk5OCAzMi4wMDEySDI4LjAwOThNMjYuMjg5OCAxOC44NjEyTDE3LjgxOTggMzMuMDAxMkMxNy42NDUxIDMzLjMwMzYgMTcuNTUyNyAzMy42NDY1IDE3LjU1MTggMzMuOTk1N0MxNy41NTA4IDM0LjM0NDkgMTcuNjQxMyAzNC42ODgzIDE3LjgxNDIgMzQuOTkxN0MxNy45ODcxIDM1LjI5NTEgMTguMjM2NSAzNS41NDc5IDE4LjUzNzUgMzUuNzI1QzE4LjgzODUgMzUuOTAyMSAxOS4xODA2IDM1Ljk5NzMgMTkuNTI5OCAzNi4wMDEySDM2LjQ2OThDMzYuODE5IDM1Ljk5NzMgMzcuMTYxMSAzNS45MDIxIDM3LjQ2MjEgMzUuNzI1QzM3Ljc2MzEgMzUuNTQ3OSAzOC4wMTI0IDM1LjI5NTEgMzguMTg1NCAzNC45OTE3QzM4LjM1ODMgMzQuNjg4MyAzOC40NDg4IDM0LjM0NDkgMzguNDQ3OCAzMy45OTU3QzM4LjQ0NjggMzMuNjQ2NSAzOC4zNTQ0IDMzLjMwMzYgMzguMTc5OCAzMy4wMDEyTDI5LjcwOTggMTguODYxMkMyOS41MzE1IDE4LjU2NzMgMjkuMjgwNSAxOC4zMjQzIDI4Ljk4MSAxOC4xNTU3QzI4LjY4MTQgMTcuOTg3IDI4LjM0MzUgMTcuODk4NCAyNy45OTk4IDE3Ljg5ODRDMjcuNjU2IDE3Ljg5ODQgMjcuMzE4MSAxNy45ODcgMjcuMDE4NiAxOC4xNTU3QzI2LjcxOTEgMTguMzI0MyAyNi40NjggMTguNTY3MyAyNi4yODk4IDE4Ljg2MTJaXCIgc3Ryb2tlPVwiI0RDNjgwM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRkZGQUVCXCIgc3Ryb2tlLXdpZHRoPVwiOFwiLz48L3N2Zz5gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYEludmFsaWQgZGV0YWlscyFgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBgUGxlYXNlIHByb3ZpZGUgY29ycmVjdCBhbmQgY29tcGxldGUgc3RvcmUgaW5mb3JtYXRpb24uYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9udHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVyci5lcnJvci5lcnJvci5kdXBsaWNhdGVcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRXJyb3JzID0gZXJyLmVycm9yLmVycm9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZnRlclVwbGxvYWQocG9wdXBjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZEVycm9ycyA9IGVyci5lcnJvci5lcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dEZpbGUubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGVyci5lcnJvci5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dEZpbGUubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IFxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAvLyAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byBjcmVhdGUgc3RvcmVzIVwiKTtcclxuICAgICAgICAvLyB9KTtcclxuICAgICAgfTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG4gIG9taXRTcGVjaWFsQ2hhcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgY29uc3Qga2V5ID0gZXZlbnQua2V5O1xyXG4gICAgY29uc3QgcmVnZXggPSAvXlthLXpBLVowLTkgXy1dJC87XHJcbiAgICBpZiAoIXJlZ2V4LnRlc3Qoa2V5KSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWZ0ZXJVcGxsb2FkKGRhdGE/OiBhbnkpIHtcclxuICAgIHRoaXMuZXhjZWxFcnJvciA9IGRhdGE7XHJcbiAgICAgaWYgKHRoaXMudXBsb2FkUG9wVXApIHtcclxuICAgICAgdGhpcy51cGxvYWRQb3BVcC5kaXNtaXNzKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwbG9hZFBvcFVwID0gdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmFmdGVyVmFsaWRhdGlvbiwgeyBjZW50ZXJlZDogdHJ1ZSwgYmFja2Ryb3A6ICdzdGF0aWMnIH0pO1xyXG4gIH1cclxuXHJcbiAgIGdldFN0b3JlQ291bnRzKGRhdGE6IGFueSkge1xyXG5cclxuICAgIGNvbnN0IHVuaXF1ZVVzZXJOYW1lcyA9IG5ldyBTZXQoZGF0YT8ubWFwKChpdGVtOiBhbnkpID0+IGl0ZW1bJ1VzZXIgTmFtZS9FbWFpbCBJZCddKSk7XHJcbiAgICByZXR1cm4gdW5pcXVlVXNlck5hbWVzLnNpemU7XHJcblxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVEZXRhaWxzKGRhdGE/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmFmdGVyVXBsb2FkKSB7XHJcbiAgICAgICAgY29uc3QgdW5pcXVlVXNlcnMgPSB0aGlzLmFmdGVyVXBsb2FkLmZpbHRlcigoaXRlbTogeyB1c2VySWQ6IHN0cmluZyB9LCBpbmRleDogbnVtYmVyLCBzZWxmOiB7IHVzZXJJZDogc3RyaW5nIH1bXSkgPT5cclxuICAgICAgICAgICAgICAgICAgaW5kZXggPT09IHNlbGYuZmluZEluZGV4KCh0KSA9PiB0LnVzZXJJZCA9PT0gaXRlbS51c2VySWQpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJzID0gdW5pcXVlVXNlcnNcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlYWN0aXZlcG9wdXAoKSB7XHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVkQ2hpcChkYXRhOiBhbnkpIHtcclxuICAgIFxyXG4gIH1cclxuXHJcbiAgcHJldmVudENsb3NlKGV2ZW50OiBFdmVudCkge1xyXG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIFN0b3BzIHRoZSBtb2RhbCBmcm9tIGNsb3NpbmdcclxufVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2FyZCBwdC0wIHBiLTMgc2Nyb2xsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTAgZC1mbGV4IGZsZXgtc3RhcnQgZmxleC1jb2x1bW4gcC05IFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJteS01XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzeW1ib2wgc3ltYm9sLTc1cHggc3ltYm9sLWNpcmNsZVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRUFGOEZGXCIgc3Ryb2tlLXdpZHRoPVwiOFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC41IDIzLjY4MTZDMTguODQyNSAyMy42ODE2IDE3LjUgMjIuMjEzMyAxNy41IDIwLjQwMDRDMTcuNSAxOC41ODc1IDE4Ljg0MjUgMTcuMTE5MSAyMC41IDE3LjExOTFDMjIuMTU3NSAxNy4xMTkxIDIzLjUgMTguNTg3NSAyMy41IDIwLjQwMDRDMjMuNSAyMi4yMTMzIDIyLjE1NzUgMjMuNjgxNiAyMC41IDIzLjY4MTZaTTM1LjY0ODMgMjMuNjgxNkMzMy45OTA4IDIzLjY4MTYgMzIuNjQ4MyAyMi4yMTMzIDMyLjY0ODMgMjAuNDAwNEMzMi42NDgzIDE4LjU4NzUgMzMuOTkwOCAxNy4xMTkxIDM1LjY0ODMgMTcuMTE5MUMzNy4zMDU4IDE3LjExOTEgMzguNjQ4MyAxOC41ODc1IDM4LjY0ODMgMjAuNDAwNEMzOC42NDgzIDIyLjIxMzMgMzcuMzA1OCAyMy42ODE2IDM1LjY0ODMgMjMuNjgxNlpNMzEuNTA5IDI2LjMwNjZDMzEuNTA5IDI4LjQ4MDUgMjkuODk2NSAzMC4yNDQxIDI3LjkwOSAzMC4yNDQxQzI1LjkyMTUgMzAuMjQ0MSAyNC4zMDkgMjguNDgwNSAyNC4zMDkgMjYuMzA2NkMyNC4zMDkgMjQuMTMyOCAyNS45MjE1IDIyLjM2OTEgMjcuOTA5IDIyLjM2OTFDMjkuODk2NSAyMi4zNjkxIDMxLjUwOSAyNC4xMzI4IDMxLjUwOSAyNi4zMDY2WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMDBBM0ZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIwLjAwMTMgMjUuNzU1OUMxNy43OTI1IDI1Ljc1NTkgMTYgMjcuNzE2NCAxNiAzMC4xMzIyQzE2IDMwLjYxMjEgMTYuMzYgMzEuMDA1OSAxNi43OTg4IDMxLjAwNTlIMjQuODAxM0gyNC44Mjc1QzIzLjgzMzggMzAuMDQyIDIzLjIwMzggMjguNjM1MiAyMy4yMDM4IDI3LjA2ODRDMjMuMjAzOCAyNi43NTY2IDIzLjIyNjMgMjYuNDQ5IDIzLjI3NSAyNi4xNTM3QzIyLjc2NSAyNS44OTk0IDIyLjE5ODggMjUuNzU1OSAyMS42MDI1IDI1Ljc1NTlIMjAuMDAxM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwQTNGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zMS4xNzI1IDMxLjAwNTlIMzEuMTk4N0gzOS4yMDEyQzM5LjY0IDMxLjAwNTkgNDAgMzAuNjE2MiA0MCAzMC4xMzIyQzQwIDI3LjcxNjQgMzguMjA3NSAyNS43NTU5IDM1Ljk5ODcgMjUuNzU1OUgzNC4zOTc1QzMzLjgwMTIgMjUuNzU1OSAzMy4yMzUgMjUuODk1MyAzMi43MjUgMjYuMTUzN0MzMi43NyAyNi40NTMxIDMyLjc5NjMgMjYuNzU2NiAzMi43OTYzIDI3LjA2ODRDMzIuNzk2MyAyOC42MzUyIDMyLjE3IDMwLjA0MiAzMS4xNzI1IDMxLjAwNTlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMwMEEzRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjUuNzk4OCAzMi4zMTgzQzIzLjAzODggMzIuMzE4MyAyMC44IDM0Ljc2NyAyMC44IDM3Ljc4NTdDMjAuOCAzOC4zOTI4IDIxLjI1IDM4Ljg4MDkgMjEuODAxMyAzOC44ODA5SDM0LjE5ODdDMzQuNzUzNyAzOC44ODA5IDM1LjIgMzguMzg4NyAzNS4yIDM3Ljc4NTdDMzUuMiAzNC43NjcgMzIuOTYxMyAzMi4zMTgzIDMwLjIwMTMgMzIuMzE4M0gyNS43OTg4WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMDBBM0ZGXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiAqbmdJZj1cInR5cGUgPT09ICdjcmVhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImZzLTQgdGV4dC1ncmF5LTgwMCB0ZXh0LWhvdmVyLXByaW1hcnkgZnctYm9sZCBtYi0wIHRpdGxlIGN1cnNvci1wb2ludGVyXCI+Q3JlYXRlIFRlYW08L2E+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRpdGxlXCI+R3JvdXAgbXVsdGlwbGUgdXNlcnMgdG8gY3JlYXRlIGEgdGVhbSBmb3IgZWFzaWVyIG1hbmFnZW1lbnQ8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiAqbmdJZj1cInR5cGUgPT09ICdlZGl0J1wiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmcy00IHRleHQtZ3JheS04MDAgdGV4dC1ob3Zlci1wcmltYXJ5IGZ3LWJvbGQgbWItMCB0aXRsZSBjdXJzb3ItcG9pbnRlclwiPkVkaXQgVGVhbTwvYT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGl0bGVcIj5Hcm91cCBtdWx0aXBsZSB1c2VycyB0byBlZGl0IGEgdGVhbSBmb3IgZWFzaWVyIG1hbmFnZW1lbnQ8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGgtNTAwcHggc2Nyb2xsXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtIChrZXlkb3duLmVudGVyKT1cInByZXZlbnRDbG9zZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHgtMCBtZS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy0xMiBjb2wteGwtMTIgY29sLXh4bC0xMiBtYi03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRlYW1OYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+VGVhbSBOYW1lPHNwYW4gY2xhc3M9XCJtYW5kdHJ5Y2xyIG1zLTFcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJ0ZWFtTmFtZVwiIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwidGVhbU5hbWVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAoa2V5cHJlc3MpPVwib21pdFNwZWNpYWxDaGFyKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgY29sLXhsLTEyIGNvbC14eGwtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0ZWFtbGVhZFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlRlYW0gTGVhZCBFbWFpbDxzcGFuIGNsYXNzPVwibWFuZHRyeWNsciBtcy0xXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHRlYW0tc2VsZWN0IFtpdGVtc109XCJ0ZWFtbGVhZExpc3RcIiBbbXVsdGldPVwidHJ1ZVwiIFtzZWFyY2hGaWVsZF09XCIndXNlck5hbWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ3VzZXJJZCdcIiAoc2VsZWN0ZWQpPVwib25UZWFtU2VsZWN0KCRldmVudClcIiAoZGVzZWxlY3RlZCk9XCJUZWFtVW5zZWxlY3QoJGV2ZW50KVwiIChkZXNlbGVjdGVkQWxsKT1cIlRlYW1VbnNlbGVjdEFsbCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkVmFsdWVzXT1cInNlbGVjdGVkVGVhbVwiPjwvdGVhbS1zZWxlY3Q+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItY2hpcC1zZWxlY3QgW2l0ZW1zXT1cInRlYW1sZWFkTGlzdFwiIFttdWx0aV09XCJ0cnVlXCIgW3NlYXJjaEZpZWxkXT1cIlsndXNlck5hbWUnXVwiIFtzZWFyY2hLZXldPVwiWydlbWFpbCddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ3VzZXJJZCdcIiAoc2VsZWN0ZWQpPVwib25UZWFtU2VsZWN0KCRldmVudClcIiAocmVtb3ZlZCk9XCJyZW1vdmVkQ2hpcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkVmFsdWVzXT1cInNlbGVjdGVkVGVhbVwiPjwvbGliLWNoaXAtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy0xMiBjb2wteGwtMTIgY29sLXh4bC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInVzZXJsZWFkXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U2VsZWN0IFVzZXJzPHNwYW4gY2xhc3M9XCJtYW5kdHJ5Y2xyIG1zLTFcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlYW0tc2VsZWN0IFtpdGVtc109XCJ1c2VyTGlzdFwiIFttdWx0aV09XCJ0cnVlXCIgW3NlYXJjaEZpZWxkXT1cIid1c2VyTmFtZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndXNlcklkJ1wiIChzZWxlY3RlZCk9XCJvblVzZXJTZWxlY3QoJGV2ZW50KVwiIChkZXNlbGVjdGVkKT1cIlVzZXJVbnNlbGVjdCgkZXZlbnQpXCIgKGRlc2VsZWN0ZWRBbGwpPVwiVXNlclVuc2VsZWN0QWxsKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRWYWx1ZXNdPVwic2VsZWN0ZWRVc2Vyc1wiPjwvdGVhbS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1ncmF5LTQwMCBmdy1ib2xkIG15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpbmUtYmcgXCI+PHN2ZyB3aWR0aD1cIjI4MFwiIGhlaWdodD1cIjJcIiB2aWV3Qm94PVwiMCAwIDI4MCAyXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeT1cIjAuNVwiIHdpZHRoPVwiMjgwXCIgaGVpZ2h0PVwiMVwiIGZpbGw9XCIjRUFFQ0YwXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPjxzcGFuIGNsYXNzPVwibXgtMTUgb3ItY29sb3JcIj5PciA8L3NwYW4+IDxzcGFuIGNsYXNzPVwibGluZS1iZyBcIj48c3ZnIHdpZHRoPVwiMjgwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjJcIiB2aWV3Qm94PVwiMCAwIDI4MCAyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB5PVwiMC41XCIgd2lkdGg9XCIyODBcIiBoZWlnaHQ9XCIxXCIgZmlsbD1cIiNFQUVDRjBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LWJvbGQgdGV4dC1ncmF5LTUwMCBteS02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvbCBjbGFzcz1cImN1c3RvbS1vcmRlcmVkLWxpc3QgdGV4dC1ncmF5LTQwMCBmdy1ib2xkIGZzLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInVzZXItdGV4dFwiPlVzZSB0aGUgdGVtcGxhdGUgdG8gdXBsb2FkIG11bHRpcGxlIHVzZXJzIGF0IG9uY2UuPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInVzZXItdGV4dCBteS0zXCI+PHNwYW4gY2xhc3M9XCJ1c2VyLXRleHRcIj5Eb3dubG9hZCB0aGUgdGVtcGxhdGUgaGVyZSAtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibXMtMVwiIGhyZWY9XCIuLi8uLi8uLi9hc3NldHMvZmlsZXMvdGVhbXNVcGxvYWRUZW1wbGF0ZS54bHN4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTUuODMzMzMgOC4zMzMzM0wxMCAxMi41TTEwIDEyLjVMMTQuMTY2NyA4LjMzMzMzTTEwIDEyLjVWMi41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDA5QkYzXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGVtcGxhdGUgbXMtMlwiPkRvd25sb2FkIFRlbXBsYXRlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJ1c2VyLXRleHQgbXktM1wiPkFkZCB5b3VyIGRhdGEgdG8gdGhlIFRlbXBsYXRlIEZpbGU8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInVzZXItdGV4dCBteS0zXCI+VXBsb2FkIGl0IGJlbG93IGZvciBwcm9jZXNzaW5nPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtMyBtcy0zIHJpZ2h0LWJhciBweS0xMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT1cImFjY291bnRUeXBlXCIgdHlwZT1cInJhZGlvXCIgaWQ9XCJrdF9hY2NvdW50X3RlYW1fc2l6ZV9zZWxlY3RfdXBsb2FkXCIgYWNjZXB0ID0gXCIuY3N2LCBhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCwgYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJwZXJzb25hbFwiIGNsYXNzPVwiYnRuLWNoZWNrXCIgbmctcmVmbGVjdC1uYW1lPVwiYWNjb3VudFR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1yZWZsZWN0LWZvcm0tY29udHJvbC1uYW1lPVwiYWNjb3VudFR5cGVcIiAoY2hhbmdlKT1cIm9uVXBsb2FkVGVtcGxhdGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLXJlZmxlY3QtdmFsdWU9XCJwZXJzb25hbFwiIHR5cGU9XCJmaWxlXCIgI2lucHV0RmlsZSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJrdF9hY2NvdW50X3RlYW1fc2l6ZV9zZWxlY3RfdXBsb2FkXCIgY2xhc3M9XCIgdy01MCBwLTRcIj48c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmdy1ib2xkIHRleHQtY2VudGVyIHctMTAwIGZzLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDZcIiBoZWlnaHQ9XCI0NlwiIHZpZXdCb3g9XCIwIDAgNDYgNDZcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjNcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjIwXCIgZmlsbD1cIiNGMkY0RjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjNcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjIwXCIgc3Ryb2tlPVwiI0Y5RkFGQlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNDA0N180MDU2NilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjYuMzMzMyAyNi4zMzM0TDIzIDIzTTIzIDIzTDE5LjY2NjYgMjYuMzMzNE0yMyAyM1YzMC41TTI5Ljk5MTYgMjguMzI1QzMwLjgwNDQgMjcuODgxOSAzMS40NDY1IDI3LjE4MDggMzEuODE2NSAyNi4zMzIyQzMyLjE4NjYgMjUuNDgzNyAzMi4yNjM1IDI0LjUzNjEgMzIuMDM1MSAyMy42Mzg5QzMxLjgwNjggMjIuNzQxOCAzMS4yODYyIDIxLjk0NjMgMzAuNTU1NSAyMS4zNzc5QzI5LjgyNDggMjAuODA5NSAyOC45MjU3IDIwLjUwMDYgMjggMjAuNUgyNi45NUMyNi42OTc3IDE5LjUyNDQgMjYuMjI3NiAxOC42MTg2IDI1LjU3NDkgMTcuODUwOUMyNC45MjIyIDE3LjA4MzEgMjQuMTA0IDE2LjQ3MzIgMjMuMTgxNyAxNi4wNjcyQzIyLjI1OTQgMTUuNjYxMiAyMS4yNTcxIDE1LjQ2OTUgMjAuMjUwMSAxNS41MDY2QzE5LjI0MyAxNS41NDM3IDE4LjI1NzUgMTUuODA4NiAxNy4zNjc2IDE2LjI4MTRDMTYuNDc3NyAxNi43NTQyIDE1LjcwNjYgMTcuNDIyNiAxNS4xMTIyIDE4LjIzNjNDMTQuNTE3NyAxOS4wNTAxIDE0LjExNTUgMTkuOTg4IDEzLjkzNTggMjAuOTc5NUMxMy43NTYgMjEuOTcxMSAxMy44MDM0IDIyLjk5MDUgMTQuMDc0MyAyMy45NjExQzE0LjM0NTIgMjQuOTMxNyAxNC44MzI3IDI1LjgyODIgMTUuNSAyNi41ODM0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF80MDQ3XzQwNTY2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxMyAxMylcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtdGl0bGVcIj48c3BhbiBjbGFzcz1cImNsaWNrLXVwbG9hZCBjdXJzb3ItcG9pbnRlclwiPkNsaWNrIHRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cIm1zLTJcIj5vciBkcmFnIGFuZCBkcm9wPC9zcGFuPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtc3ViXCI+dGhlIGRhdGEgYWRkZWQgdGVtcGxhdGUgZmlsZSBmb3IgcHJvY2Vzc2luZy48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTEyIGNvbC14bC0xMiBjb2wteHhsLTEyIG1iLTUgbXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ1c2VybGVhZFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkRlc2NyaXB0aW9uIChvcHRpb25hbCk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImRlc2NyaXB0aW9uXCIgWyhuZ01vZGVsKV09XCJkZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIiBuYW1lPVwiZGVzY3JpcHRpb25cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3M9XCI1XCIgY29scz1cIjUwXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBhIGRlc2NyaXB0aW9uLi4uXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtdC0zIG1zLTMgcmlnaHQtYmFyIHB5LTEwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ3XCIgaGVpZ2h0PVwiNDZcIiB2aWV3Qm94PVwiMCAwIDQ3IDQ2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzLjVcIiB5PVwiM1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiMjBcIiBmaWxsPVwiI0YyRjRGN1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjMuNVwiIHk9XCIzXCIgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgcng9XCIyMFwiIHN0cm9rZT1cIiNGOUZBRkJcIiBzdHJva2Utd2lkdGg9XCI2XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzIxNzZfMTg5MDEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjYuODMzMyAyNi4zMzMyTDIzLjUgMjIuOTk5OU0yMy41IDIyLjk5OTlMMjAuMTY2NiAyNi4zMzMyTTIzLjUgMjIuOTk5OVYzMC40OTk5TTMwLjQ5MTYgMjguMzI0OUMzMS4zMDQ0IDI3Ljg4MTggMzEuOTQ2NSAyNy4xODA2IDMyLjMxNjUgMjYuMzMyMUMzMi42ODY2IDI1LjQ4MzUgMzIuNzYzNSAyNC41MzU5IDMyLjUzNTEgMjMuNjM4OEMzMi4zMDY4IDIyLjc0MTcgMzEuNzg2MiAyMS45NDYyIDMxLjA1NTUgMjEuMzc3OEMzMC4zMjQ4IDIwLjgwOTQgMjkuNDI1NyAyMC41MDA1IDI4LjUgMjAuNDk5OUgyNy40NUMyNy4xOTc3IDE5LjUyNDMgMjYuNzI3NiAxOC42MTg1IDI2LjA3NDkgMTcuODUwN0MyNS40MjIyIDE3LjA4MjkgMjQuNjA0IDE2LjQ3MzEgMjMuNjgxNyAxNi4wNjcxQzIyLjc1OTQgMTUuNjYxIDIxLjc1NzEgMTUuNDY5NCAyMC43NTAxIDE1LjUwNjVDMTkuNzQzIDE1LjU0MzYgMTguNzU3NSAxNS44MDg1IDE3Ljg2NzYgMTYuMjgxM0MxNi45Nzc3IDE2Ljc1NDEgMTYuMjA2NiAxNy40MjI1IDE1LjYxMjIgMTguMjM2MkMxNS4wMTc3IDE5LjA1IDE0LjYxNTUgMTkuOTg3OSAxNC40MzU4IDIwLjk3OTRDMTQuMjU2IDIxLjk3MDkgMTQuMzAzNCAyMi45OTAzIDE0LjU3NDMgMjMuOTYxQzE0Ljg0NTIgMjQuOTMxNiAxNS4zMzI3IDI1LjgyODEgMTYgMjYuNTgzMlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8yMTc2XzE4OTAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxMy41IDEzKVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhLXRpdGxlXCI+PHNwYW4gY2xhc3M9XCJjbGljay11cGxvYWQgY3Vyc29yLXBvaW50ZXJcIj48aW5wdXQgbmFtZT1cImFjY291bnRUeXBlXCIgdHlwZT1cInJhZGlvXCIgaWQ9XCJrdF9jcmVhdGVfYWNjb3VudF9mb3JtX2FjY291bnRfdHlwZV9wZXJzb25hbFwiIHZhbHVlPVwicGVyc29uYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1jaGVja1wiIG5nLXJlZmxlY3QtbmFtZT1cImFjY291bnRUeXBlXCIgbmctcmVmbGVjdC1mb3JtLWNvbnRyb2wtbmFtZT1cImFjY291bnRUeXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblVwbG9hZFRlbXBsYXRlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1yZWZsZWN0LXZhbHVlPVwicGVyc29uYWxcIiB0eXBlPVwiZmlsZVwiICNpbnB1dEZpbGUgLz5DbGljayB0byB1cGxvYWQ8L3NwYW4+IDxzcGFuIGNsYXNzPVwibXMtMlwiPm9yIGRyYWcgYW5kIGRyb3A8L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YS1zdWJcIj50aGUgZGF0YSBhZGRlZCB0ZW1wbGF0ZSBmaWxlIGZvciBwcm9jZXNzaW5nLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBteS0xMFwiIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTEwMCBtZS0zXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwIG1zLTNcIiBpZD1cImFsZXJ0LXRvYXN0XCIgKm5nSWY9XCIhaXNFZGl0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DcmVhdGVUZWFtKClcIiBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkVXNlcnMubGVuZ3RofHwhc2VsZWN0ZWRUZWFtLmxlbmd0aHx8ICF0ZWFtTmFtZVwiPkNyZWF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDAgbXMtM1wiIGlkPVwiYWxlcnQtdG9hc3RcIiAqbmdJZj1cImlzRWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ3JlYXRlVGVhbSgpXCIgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZFVzZXJzLmxlbmd0aCB8fCFzZWxlY3RlZFRlYW0ubGVuZ3RofHwhdGVhbU5hbWVcIj5VcGRhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjYWZ0ZXJWYWxpZGF0aW9uIGxldC1tb2RlbD5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci0wXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJvcmRlci0wIG10LTBcIj5cclxuICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRpdGxlIG10LTNcIj48c3BhbiBjbGFzcz1cImNvbmZpZy1oZWFkaW5nIGZ3LXNlbWlib2xkIHctYXV0b1wiPkFkZCBVc2Vyczwvc3Bhbj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHBvcHVwLXNjcm9sbCBwdC0wXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNhcmQgcm91bmRlZC0zIHAtMyBmbGV4LWNvbHVtbiBoLTcwcHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1zZW1pYm9sZCBjb25maWctaGVhZGluZyB3LTEwMFwiPnt7Z2V0U3RvcmVDb3VudHMoZXhjZWxEYXRhKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgc3VidGl0bGUgbXQtMVwiPlRvdGFsIFJlY29yZHM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtY2FyZCByb3VuZGVkLTMgcC0zIGZsZXgtY29sdW1uIGgtNzBweFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmcgdy0xMDBcIj57e2V4Y2VsRGF0YT8ubGVuZ3RofX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkIHN1YnRpdGxlIG10LTFcIj5Sb3dzIHByb2Nlc3NlZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNhcmQgcm91bmRlZC0zIHAtMyBmbGV4LWNvbHVtbiBoLTcwcHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJleGNlbEVycm9yID8gJ2Vycm9yLWhlYWRpbmcnOicnXCIgY2xhc3M9XCJmdy1zZW1pYm9sZCBjb25maWctaGVhZGluZyB3LTEwMFwiPnt7ZXhjZWxFcnJvcj8uZXJyb3I/Lmxlbmd0aCB8fCAwfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJleGNlbEVycm9yID8gJ2V4Y2VsLWVycm9yJzonJ1wiIGNsYXNzPVwiZnctc2VtaWJvbGQgc3VidGl0bGUgbXQtMVwiPkVycm9yPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWV4Y2VsRXJyb3JcIiBjbGFzcz1cInRhYmxlLWhlYWRlciBtdC01XCIgc3R5bGU9XCJmb250LXdlaWdodDogNDAwO1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiA+WW91J3JlIGFib3V0IHRvIGFkZCB7e2dldFN0b3JlQ291bnRzKGV4Y2VsRGF0YSl9fSBjbHVzdGVycy4gQXJlIHlvdSBzdXJlIHdhbnQgdG8gcHJvY2VlZD88L2Rpdj5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZXhjZWxFcnJvclwiIGNsYXNzPVwiZmxleC1jb2x1bW4gbXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1oZWFkaW5nIGZ3LWJvbGRcIj5JbnZhbGlkIERldGFpbHMgITwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlIG10LTVcIj5QbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGluZm9ybWF0aW9uLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtNSB3LTEwMCByb3VuZGVkLTMgYm9yZGVyLWVycm9yIG10LTUgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlcnJvciBvZiBleGNlbEVycm9yPy5lcnJvcjsgbGV0IGkgPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0XCIgW25nQ2xhc3NdPVwiIWxhc3QgPyAnbWItMicgOiAnJ1wiIGNsYXNzPVwidGV4dC1lcnJvclwiPnt7aSArIDF9fSkge3tlcnJvcn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1cGxvYWRFcnJvcnM/LmRvZXNOb3RFeGlzdHM/Lmxlbmd0aFwiIGNsYXNzPVwiZmxleC1jb2x1bW4gbXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1oZWFkaW5nIGZ3LWJvbGRcIj5EYXRhIG5vdCBleGlzdHMgITwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwic3VidGl0bGUgbXQtNVwiPlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgaW5mb3JtYXRpb24uPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtNSB3LTEwMCByb3VuZGVkLTMgYm9yZGVyLWVycm9yIG10LTUgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlcnJvciBvZiB1cGxvYWRFcnJvcnM/LmRvZXNOb3RFeGlzdHM7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiIFtuZ0NsYXNzXT1cIiFsYXN0ID8gJ21iLTInIDogJydcIiBjbGFzcz1cInRleHQtZXJyb3JcIj57e2kgKyAxfX0pIHt7ZXJyb3J9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVwbG9hZEVycm9ycz8uaW5BY3RpdmU/Lmxlbmd0aFwiIGNsYXNzPVwiZmxleC1jb2x1bW4gbXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1oZWFkaW5nIGZ3LWJvbGRcIj5EYXRhIGluYWN0aXZlICE8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInN1YnRpdGxlIG10LTVcIj5QbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGluZm9ybWF0aW9uLjwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTUgdy0xMDAgcm91bmRlZC0zIGJvcmRlci1lcnJvciBtdC01IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgdXBsb2FkRXJyb3JzPy5pbkFjdGl2ZTsgbGV0IGkgPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0XCIgW25nQ2xhc3NdPVwiIWxhc3QgPyAnbWItMicgOiAnJ1wiIGNsYXNzPVwidGV4dC1lcnJvclwiPnt7aSArIDF9fSkge3tlcnJvcn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBib3JkZXItMCB0ZXh0LWVuZCBwdC0wXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW1kIGJ0bi1kZWZhdWx0IGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cImNsb3NlYWN0aXZlcG9wdXAoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWV4Y2VsRXJyb3JcIiBjbGFzcz1cImJ0biBidG4tbWQgcHktMyBidG4tZGVmYXVsdCBtcy0zIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInZhbGlkYXRlRGV0YWlscygpO21vZGVsLmNsb3NlKClcIj5Qcm9jZWVkPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJleGNlbEVycm9yXCIgY2xhc3M9XCJidG4gcHktMyBidG4tbWQgYnRuLWRlZmF1bHQgbXMtMyBidG4tZGFuZ2VyXCIgKGNsaWNrKT1cImZpbGUxLmNsaWNrKClcIj5SZXVwbG9hZDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47XCIgI2ZpbGUxIHR5cGU9XCJmaWxlXCIgaWQ9XCJrdF9hY2NvdW50X3RlYW1fc2l6ZV9zZWxlY3RfdXBsb2FkXCIgYWNjZXB0ID0gXCIuY3N2LCBhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCwgYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVXBsb2FkVGVtcGxhdGUoJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiJdfQ==
385
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVhbXMtY3JlYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLXVzZXJzL3NyYy9saWIvY29tcG9uZW50cy12Mi90ZWFtcy1jcmVhdGlvbi90ZWFtcy1jcmVhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtdXNlcnMvc3JjL2xpYi9jb21wb25lbnRzLXYyL3RlYW1zLWNyZWF0aW9uL3RlYW1zLWNyZWF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWlDLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTlHLE9BQU8sRUFBRSxPQUFPLEVBQWdCLFNBQVMsR0FBdUMsTUFBTSxNQUFNLENBQUM7QUFHN0YsT0FBTyxFQUFZLElBQUksRUFBRSxLQUFLLEVBQWEsTUFBTSxNQUFNLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7OztBQVE3QyxNQUFNLE9BQU8sc0JBQXNCO0lBcUJiO0lBQTBCO0lBQXVCO0lBQzNEO0lBQXdDO0lBQWdDO0lBQTZCO0lBckJ2RixTQUFTLENBQWE7SUFDaEIsZUFBZSxDQUFNO0lBQ3ZCLGFBQWEsQ0FBTTtJQUM5QixPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUN6QyxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakMsVUFBVSxDQUFNO0lBQ2pCLFNBQVMsR0FBUSxFQUFFLENBQUE7SUFDVixRQUFRLENBQU07SUFDZCxJQUFJLENBQU07SUFDVixVQUFVLENBQU07SUFDekIsWUFBWSxHQUFVLEVBQUUsQ0FBQztJQUN6QixRQUFRLEdBQVUsRUFBRSxDQUFDO0lBQ3JCLFlBQVksR0FBUSxF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QUVyQixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQVk7UUFDekIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsK0JBQStCO0lBQ3pELENBQUM7d0dBNVlZLHNCQUFzQjs0RkFBdEIsc0JBQXNCLGtiQ2hCbkMscXNsQkFtT0E7OzRGRG5OYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9COzRQQUtOLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDUSxlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDQSxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBS2pCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIENoYW5nZURldGVjdG9yUmVmLCBFbGVtZW50UmVmLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCwgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRha2VVbnRpbCwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgTWFuYWdlVXNlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMtdjIvbWFuYWdlLXVzZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXb3JrQm9vaywgcmVhZCwgdXRpbHMsIFdvcmtTaGVldCB9IGZyb20gXCJ4bHN4XCI7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi10ZWFtcy1jcmVhdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RlYW1zLWNyZWF0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vdGVhbXMtY3JlYXRpb24uY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUZWFtc0NyZWF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoXCJpbnB1dEZpbGVcIikgaW5wdXRGaWxlOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2FmdGVyVmFsaWRhdGlvbicpIGFmdGVyVmFsaWRhdGlvbjogYW55O1xyXG4gIEBWaWV3Q2hpbGQoJ2NvbmZpcm1EZWxldGUnKSBjb25maXJtRGVsZXRlOiBhbnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95ID0gbmV3IFN1YmplY3QoKTtcclxuICBzZWFyY2hJbnB1dCA9IG5ldyBGb3JtQ29udHJvbChcIlwiKTtcclxuICAgZXhjZWxFcnJvcjogYW55O1xyXG4gIGV4Y2VsRGF0YTogYW55ID0gW11cclxuICBASW5wdXQoKSB0ZWFtRGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIHR5cGU6IGFueTtcclxuICBASW5wdXQoKSB0ZWFtc1VzZXJzOiBhbnk7XHJcbiAgdGVhbWxlYWRMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHVzZXJMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHNlbGVjdGVkVGVhbTogYW55ID0gW107XHJcbiAgc2VsZWN0ZWRVc2VyczogYW55ID0gW107XHJcbiAgJGhlYWRlckZpbHRlcnM6IGFueTtcclxuICB0ZWFtTmFtZTogYW55O1xyXG4gIGlzRWRpdDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgZGVzY3JpcHRpb246IGFueTtcclxuICBmaWxlZXJyb3I6IGJvb2xlYW4gPSBmYWxzZVxyXG4gIHVwbG9hZFBvcFVwOiBhbnk7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0czogVG9hc3RTZXJ2aWNlLCBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxyXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogTWFuYWdlVXNlcnNTZXJ2aWNlLCBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSwgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYscHVibGljIG1vZGFsU2VydmljZTogTmdiTW9kYWxcclxuICApIHtcclxuXHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95Lm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kuY29tcGxldGUoKTtcclxuXHJcbiAgfVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncz8uZGF0YVJhbmdlVmFsdWU/LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSkpPy5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcclxuICAgICAgICAgIGNvbnN0IHVzZXJEYXRhOiBhbnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwidXNlci1pbmZvXCIpIHx8IFwie31cIik7XHJcbiAgICAgICAgICB0aGlzLiRoZWFkZXJGaWx0ZXJzID0gdXNlckRhdGE7XHJcbiAgICAgICAgICB0aGlzLiRoZWFkZXJGaWx0ZXJzLmNsaWVudCA9IHVzZXJEYXRhLmNsaWVudElkXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuJGhlYWRlckZpbHRlcnMgPSBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdldHVzZXJMaXN0KCk7XHJcblxyXG4gIH1cclxuICBnZXRUZWFtRGF0YShkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMudXNlclNlcnZpY2UuZWRpdFRlYW1zZGF0YShkYXRhKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy5pc0VkaXQgPSB0cnVlXHJcbiAgICAgICAgICBpZiAocmVzLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRlYW1OYW1lID0gcmVzLmRhdGFbMF0udGVhbU5hbWVcclxuICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IHJlcy5kYXRhWzBdLmRlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUZWFtID0gcmVzLmRhdGFbMF0uVGVhbWxlYWRcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJzID0gcmVzLmRhdGFbMF0udXNlcnNcclxuXHJcbiAgICAgICAgICAgIHRoaXMudGVhbWxlYWRMaXN0ID0gdGhpcy50ZWFtbGVhZExpc3QuZmlsdGVyKChpdGVtMjogYW55KSA9PlxyXG4gICAgICAgICAgICAgICF0aGlzLnNlbGVjdGVkVXNlcnMuc29tZSgoaXRlbTE6IGFueSkgPT4gaXRlbTEudXNlcklkID09PSBpdGVtMi51c2VySWQpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy50ZWFtbGVhZExpc3QpXHJcbiAgICAgICAgICAgICAgdGhpcy51c2VyTGlzdCA9IHRoaXMudXNlckxpc3QuZmlsdGVyKChpdGVtMjogYW55KSA9PlxyXG4gICAgICAgICAgICAgICAgIXRoaXMuc2VsZWN0ZWRUZWFtLnNvbWUoKGl0ZW0xOiBhbnkpID0+IGl0ZW0xLnVzZXJJZCA9PT0gaXRlbTIudXNlcklkKVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy51c2VyTGlzdClcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuICBnZXR1c2VyTGlzdCgpIHtcclxuXHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuJGhlYWRlckZpbHRlcnMuY2xpZW50XHJcbiAgICB9XHJcbiAgICB0aGlzLnVzZXJTZXJ2aWNlLmdldGFsbHVzZXJzTGlzdChwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50ZWFtbGVhZExpc3QgPSByZXMuZGF0YS5maWx0ZXIoKGU6IGFueSkgPT4gZS5yb2xlICE9ICdzdXBlcmFkbWluJyk7XHJcbiAgICAgICAgICB0aGlzLnVzZXJMaXN0ID0gcmVzLmRhdGEuZmlsdGVyKChlOiBhbnkpID0+IGUucm9sZSAhPSAnc3VwZXJhZG1pbicpOyBcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy50ZWFtRGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldFRlYW1EYXRhKHRoaXMudGVhbURhdGEpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy50ZWFtc1VzZXJzICYmIHRoaXMudGVhbXNVc2Vycy5sZW5ndGggPiAwICYmICF0aGlzLmlzRWRpdCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnRlYW1zVXNlcnMpXHJcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWR1c2VycyA9IHRoaXMudGVhbXNVc2Vycy5tYXAoKHVzZXI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBlbWFpbDogdXNlci5lbWFpbCxcclxuICAgICAgICAgICAgICAgIHVzZXJJZDogdXNlci51c2VySWRcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJzID0gdXBkYXRlZHVzZXJzXHJcbiAgICAgICAgICAgIHRoaXMubWFya0NoZWNrZWRTdG9yZXMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBmaWx0ZXJlZFVzZXJzOiBhbnk7XHJcbiAgbWFya0NoZWNrZWRTdG9yZXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjbHVzdGVyU3RvcmVJZHMgPSB0aGlzLnRlYW1zVXNlcnM/Lm1hcCgodXNlcjogYW55KSA9PiB1c2VyLl9pZCk7XHJcbiAgICB0aGlzLnVzZXJMaXN0ID0gdGhpcy51c2VyTGlzdD8ubWFwKHVzZXIgPT4ge1xyXG4gICAgICB1c2VyLmNoZWNrZWQgPSBjbHVzdGVyU3RvcmVJZHMuaW5jbHVkZXModXNlci51c2VySWQpO1xyXG4gICAgICByZXR1cm4gdXNlcjtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zZWxlY3RlZFVzZXJzID0gdGhpcy51c2VyTGlzdC5maWx0ZXIodXNlciA9PiB1c2VyLmNoZWNrZWQpO1xyXG4gICAgdGhpcy50ZWFtbGVhZExpc3QgPSB0aGlzLnRlYW1sZWFkTGlzdC5maWx0ZXIoKGl0ZW0yOiBhbnkpID0+XHJcbiAgICAgICF0aGlzLnNlbGVjdGVkVXNlcnMuc29tZSgoaXRlbTE6IGFueSkgPT4gaXRlbTEudXNlcklkID09PSBpdGVtMi51c2VySWQpXHJcbiAgICApO1xyXG4gICAgICBcclxuICB9XHJcbiAgVGVhbVVuc2VsZWN0QWxsKGV2ZW50OmFueSl7XHJcbiAgICB0aGlzLnVzZXJMaXN0ID0gWy4uLnRoaXMudXNlckxpc3QsLi4uZXZlbnRdXHJcbiAgICBjb25zb2xlLmxvZyhcInRlYW1sZWFkIHVuc2VsZWN0YWxsXCIsIHRoaXMudXNlckxpc3QpXHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgfVxyXG5cclxuICBUZWFtVW5zZWxlY3QoZXZlbnQ6YW55KXtcclxuICAgIHRoaXMudXNlckxpc3QucHVzaChldmVudClcclxuICAgIGNvbnNvbGUubG9nKFwidGVhbWxlYWQgdW5zZWxlY3RcIiwgdGhpcy51c2VyTGlzdClcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICB9XHJcbiAgVXNlclVuc2VsZWN0KGV2ZW50OmFueSl7XHJcbiAgICBjb25zb2xlLmxvZyhcInVzZXIgdW5zZWxlY3RcIiwgZXZlbnQpXHJcbiAgICB0aGlzLnRlYW1sZWFkTGlzdC5wdXNoKGV2ZW50KVxyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gIH1cclxuICBVc2VyVW5zZWxlY3RBbGwoZXZlbnQ6YW55KXtcclxuICAgIHRoaXMudGVhbWxlYWRMaXN0ID0gWy4uLnRoaXMudGVhbWxlYWRMaXN0LC4uLmV2ZW50XVxyXG4gICAgY29uc29sZS5sb2coXCJ1c2VyIHVuc2VsZWN0YWxsXCIsIHRoaXMudGVhbWxlYWRMaXN0KVxyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gIH1cclxuICBvblRlYW1TZWxlY3QoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc29sZS5sb2coXCJ0ZWFtbGVhZCBzZWxlY3RcIiwgZXZlbnQpXHJcbiAgICB0aGlzLnNlbGVjdGVkVGVhbSA9IGV2ZW50ICAgICAgICBcclxuICAgIGlmKHRoaXMuc2VsZWN0ZWRUZWFtLmxlbmd0aD4wKXtcclxuICAgICAgdGhpcy51c2VyTGlzdCA9IHRoaXMudXNlckxpc3QuZmlsdGVyKChpdGVtMjogYW55KSA9PlxyXG4gICAgICAgICF0aGlzLnNlbGVjdGVkVGVhbS5zb21lKChpdGVtMTogYW55KSA9PiBpdGVtMS51c2VySWQgPT09IGl0ZW0yLnVzZXJJZClcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICBvblVzZXJTZWxlY3QoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc29sZS5sb2coXCJ1c2VyIHNlbGVjdFwiLCBldmVudClcclxuICAgIFxyXG4gICAgdGhpcy5zZWxlY3RlZFVzZXJzID0gZXZlbnRcclxuICAgIGlmKHRoaXMuc2VsZWN0ZWRVc2Vycy5sZW5ndGg+MCl7XHJcbiAgICB0aGlzLnRlYW1sZWFkTGlzdCA9IHRoaXMudGVhbWxlYWRMaXN0LmZpbHRlcigoaXRlbTI6IGFueSkgPT5cclxuICAgICAgIXRoaXMuc2VsZWN0ZWRVc2Vycy5zb21lKChpdGVtMTogYW55KSA9PiBpdGVtMS51c2VySWQgPT09IGl0ZW0yLnVzZXJJZClcclxuICAgICk7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLnRlYW1sZWFkTGlzdClcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgfVxyXG4gIGNhbmNlbCgpIHtcclxuICAgIHRoaXMudGVhbXNVc2VycyA9IFtdXHJcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKClcclxuICB9XHJcblxyXG4gIG9uQ3JlYXRlVGVhbSgpIHtcclxuICAgIGxldCBhZG1pbmNvdW50ID0gdGhpcy5zZWxlY3RlZFVzZXJzLmZpbHRlcigodXNlcjogYW55KSA9PiB1c2VyLnJvbGUgPT0gJ2FkbWluJykubGVuZ3RoXHJcbiAgICBsZXQgbGVhZFVzZXJjb3VudCA9IHRoaXMuc2VsZWN0ZWRUZWFtLmZpbHRlcigodXNlcjogYW55KSA9PiB1c2VyLnJvbGUgPT0gJ3VzZXInKS5sZW5ndGhcclxuICAgIGlmIChhZG1pbmNvdW50ID4gMCAmJiBsZWFkVXNlcmNvdW50ID4gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50cy5nZXRFcnJvclRvYXN0KCdVc2VyIGNhbm5vdCBiZSB0ZWFtIGxlYWQgd2hlbiBhZG1pbnMgYXMgYSB1c2VycycpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgcGF5bG9hZDogYW55ID0ge1xyXG4gICAgICAgIGNsaWVudElkOiB0aGlzLiRoZWFkZXJGaWx0ZXJzLmNsaWVudCxcclxuICAgICAgICB0ZWFtTmFtZTogdGhpcy50ZWFtTmFtZSxcclxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcclxuICAgICAgICB1c2VyczogdGhpcy5zZWxlY3RlZFVzZXJzLFxyXG4gICAgICAgIFRlYW1sZWFkOiB0aGlzLnNlbGVjdGVkVGVhbSxcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5pc0VkaXQpIHtcclxuICAgICAgICBwYXlsb2FkLnRlYW1JZCA9IHRoaXMudGVhbURhdGE/Ll9pZFxyXG4gICAgICAgIHRoaXMudXNlclNlcnZpY2UudXBkYXRlVGVhbShwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy50cy5nZXRQcmltYXJ5VG9hc3QoXCJUZWFtIFVwZGF0ZWQgU3VjY2Vzc2Z1bGx5XCIpXHJcbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0JylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSwoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yXCIsIGVycm9yKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnJvcj8uZXJyb3I/LmVycm9yPy5lcnJvciB8fCBlcnJvcj8uZXJyb3I/LmVycm9yKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZVRlYW1zKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSkpLnN1YnNjcmliZShcclxuICAgICAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgICB0aGlzLnRzLmdldFByaW1hcnlUb2FzdChcIlRlYW0gQ3JlYXRlZCBTdWNjZXNzZnVsbHlcIilcclxuICAgICAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yXCIsIGVycm9yKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnJvcj8uZXJyb3I/LmVycm9yPy5lcnJvciB8fCBlcnJvcj8uZXJyb3I/LmVycm9yIClcclxuICAgICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBhZnRlclVwbG9hZDogYW55ID0gW107XHJcbiAgdXBsb2FkRXJyb3JzOiBhbnkgPSBbXTtcclxuXHJcbiAgb25VcGxvYWRUZW1wbGF0ZShlOiBhbnkpIHtcclxuICAgIGxldCBkYXRhOiBhbnlbXSA9IFtdO1xyXG4gICAgbGV0IGVycm9yOiBhbnkgPSBbXTtcclxuICAgIGxldCBzaGVldE5hbWU6IGFueSA9ICcnO1xyXG5cclxuICAgIGNvbnN0IGZpbGU6IEZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcclxuICBjb25zdCBhbGxvd2VkRXh0ZW5zaW9ucyA9IC9cXC4oeGxzfHhsc3h8Y3N2KSQvaTtcclxuICBjb25zdCBhbGxvd2VkVHlwZXMgPSBbXHJcbiAgICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0XCIsIFxyXG4gICAgXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWxcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgIFwidGV4dC9jc3ZcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgIFwiYXBwbGljYXRpb24vY3N2XCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgXTtcclxuXHJcbiAgaWYgKCFhbGxvd2VkRXh0ZW5zaW9ucy50ZXN0KGZpbGUubmFtZSkgfHwgIWFsbG93ZWRUeXBlcy5pbmNsdWRlcyhmaWxlLnR5cGUpKSB7XHJcbiAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJPbmx5IC54bHN4LCBvciAuY3N2IGZpbGVzIGFyZSBhbGxvd2VkLlwiKTtcclxuICAgIHRoaXMuaW5wdXRGaWxlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBcIlwiO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgICBjb25zdCB0YXJnZXQ6IERhdGFUcmFuc2ZlciA9IDxEYXRhVHJhbnNmZXI+ZS50YXJnZXQ7XHJcbiAgICBpZiAodGFyZ2V0LmZpbGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5pbnB1dEZpbGUubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICBpZiAoISF0YXJnZXQuZmlsZXNbMF0ubmFtZS5tYXRjaCgvKC54bHN8Lnhsc3gpLykpIHtcclxuICAgICAgY29uc3QgcmVhZGVyOiBGaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBic3RyOiBzdHJpbmcgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgY29uc3Qgd2I6IFdvcmtCb29rID0gcmVhZChic3RyLCB7IHR5cGU6IFwiYmluYXJ5XCIgfSk7XHJcbiAgICAgICAgY29uc3Qgd3NuYW1lOiBzdHJpbmcgPSB3Yi5TaGVldE5hbWVzWzBdO1xyXG4gICAgICAgIGNvbnN0IHdzOiBXb3JrU2hlZXQgPSB3Yi5TaGVldHNbd3NuYW1lXTtcclxuXHJcbiAgICAgICAgZGF0YSA9IHV0aWxzLnNoZWV0X3RvX2pzb24od3MpO1xyXG4gICAgICAgIHRoaXMuZXhjZWxEYXRhID0gZGF0YTtcclxuICAgICAgICBzaGVldE5hbWUgPSB3Yi5TaGVldE5hbWVzWzBdO1xyXG4gICAgICB9O1xyXG4gICAgICByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKHRhcmdldC5maWxlc1swXSk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBhc3luYyAoZSkgPT4ge1xyXG5cclxuICAgICAgICBpZiAoc2hlZXROYW1lICE9IFwiVXNlcnNcIikge1xyXG4gICAgICAgICAgdGhpcy5maWxlZXJyb3IgPSB0cnVlXHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJDYW4geW91IGNvbmZpcm0gd2hldGhlciB0aGUgc2hlZXQgbmFtZSBpcyBVc2VycyA/XCIpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFkYXRhPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiUGxlYXNlIHVwbG9hZCBhIHZhbGlkIGZpbGUuXCIpO1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgcmVxdWlyZWRLZXlzID0gWydVc2VyIE5hbWUvRW1haWwgSWQnXSAvLyBNdXN0IGFsd2F5cyBiZSBwcmVzZW50XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgaXNWYWxpZCA9IGRhdGEuc29tZSgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXRlbSk7XHJcbiAgICAgICAgICBjb25zdCBoYXNSZXF1aXJlZEtleXMgPSByZXF1aXJlZEtleXMuZXZlcnkoa2V5ID0+IGtleXMuaW5jbHVkZXMoa2V5KSk7XHJcbiAgICAgICAgICBjb25zdCBhbGxLZXlzQXJlQWxsb3dlZCA9IGtleXMuZXZlcnkoa2V5ID0+IFxyXG4gICAgICAgICAgICByZXF1aXJlZEtleXMuaW5jbHVkZXMoa2V5KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybiBoYXNSZXF1aXJlZEtleXMgJiYgYWxsS2V5c0FyZUFsbG93ZWQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICghaXNWYWxpZCkge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KCdQbGVhc2UgdXBsb2FkIGEgdmFsaWQgZmlsZS4nKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwcm9jZXNzZWRBcnJheTogYW55W10gPSBbXTtcclxuICAgICAgICBsZXQgZXJyTXNnczogYW55W10gPSBbXTtcclxuICAgICAgICBkYXRhPy5mb3JFYWNoKChlbGVtZW50OiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQ/LlsnVXNlciBOYW1lL0VtYWlsIElkJ10gPT0gJycgfHwgZWxlbWVudD8uWydVc2VyIE5hbWUvRW1haWwgSWQnXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgZXJyb3IucHVzaChgSW52YWxpZCBVc2VyIE5hbWUvRW1haWwgSWQgLSBDJHtpbmRleCArIDJ9YClcclxuICAgICAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgICAgICAgcHJvY2Vzc2VkQXJyYXkucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZGF0YVtpbmRleF1bJ1VzZXIgTmFtZS9FbWFpbCBJZCddLFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgIFxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgaWYodGhpcy5maWxlZXJyb3Ipe1xyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXJyb3IubGVuZ3RoKSB7XHJcbiAgICAgICAgICBjb25zdCBwb3B1cGNvbnRlbnQgPSB7XHJcbiAgICAgICAgICAgIGRpc3BsYXlwcm9wOiBmYWxzZSxcclxuICAgICAgICAgICAgaW1hZ2VzcmM6IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIj48cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIGZpbGw9XCIjRkVGMEM3XCIvPjxwYXRoIGQ9XCJNMjcuOTk5OCAyNC4wMDEyVjI4LjAwMTJNMjcuOTk5OCAzMi4wMDEySDI4LjAwOThNMjYuMjg5OCAxOC44NjEyTDE3LjgxOTggMzMuMDAxMkMxNy42NDUxIDMzLjMwMzYgMTcuNTUyNyAzMy42NDY1IDE3LjU1MTggMzMuOTk1N0MxNy41NTA4IDM0LjM0NDkgMTcuNjQxMyAzNC42ODgzIDE3LjgxNDIgMzQuOTkxN0MxNy45ODcxIDM1LjI5NTEgMTguMjM2NSAzNS41NDc5IDE4LjUzNzUgMzUuNzI1QzE4LjgzODUgMzUuOTAyMSAxOS4xODA2IDM1Ljk5NzMgMTkuNTI5OCAzNi4wMDEySDM2LjQ2OThDMzYuODE5IDM1Ljk5NzMgMzcuMTYxMSAzNS45MDIxIDM3LjQ2MjEgMzUuNzI1QzM3Ljc2MzEgMzUuNTQ3OSAzOC4wMTI0IDM1LjI5NTEgMzguMTg1NCAzNC45OTE3QzM4LjM1ODMgMzQuNjg4MyAzOC40NDg4IDM0LjM0NDkgMzguNDQ3OCAzMy45OTU3QzM4LjQ0NjggMzMuNjQ2NSAzOC4zNTQ0IDMzLjMwMzYgMzguMTc5OCAzMy4wMDEyTDI5LjcwOTggMTguODYxMkMyOS41MzE1IDE4LjU2NzMgMjkuMjgwNSAxOC4zMjQzIDI4Ljk4MSAxOC4xNTU3QzI4LjY4MTQgMTcuOTg3IDI4LjM0MzUgMTcuODk4NCAyNy45OTk4IDE3Ljg5ODRDMjcuNjU2IDE3Ljg5ODQgMjcuMzE4MSAxNy45ODcgMjcuMDE4NiAxOC4xNTU3QzI2LjcxOTEgMTguMzI0MyAyNi40NjggMTguNTY3MyAyNi4yODk4IDE4Ljg2MTJaXCIgc3Ryb2tlPVwiI0RDNjgwM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRkZGQUVCXCIgc3Ryb2tlLXdpZHRoPVwiOFwiLz48L3N2Zz5gLFxyXG4gICAgICAgICAgICB0aXRsZTogYEludmFsaWQgZGV0YWlscyFgLFxyXG4gICAgICAgICAgICBjb250ZW50OiBgUGxlYXNlIHByb3ZpZGUgY29ycmVjdCBhbmQgY29tcGxldGUgc3RvcmUgaW5mb3JtYXRpb24uYCxcclxuICAgICAgICAgICAgYnV0dG9udHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgICAgZXJyb3I6IGVycm9yXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmFmdGVyVXBsbG9hZChwb3B1cGNvbnRlbnQpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlXHJcbiAgICAgICAgICAudGVhbUJ1bGtVcGxvYWQoe1xyXG4gICAgICAgICAgICB1c2VyczogcHJvY2Vzc2VkQXJyYXksXHJcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLiRoZWFkZXJGaWx0ZXJzPy5jbGllbnQgPyB0aGlzLiRoZWFkZXJGaWx0ZXJzPy5jbGllbnQgOiB0aGlzLiRoZWFkZXJGaWx0ZXJzPy5jbGllbnRJZCxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgICAgICAgICB0aGlzLmV4Y2VsRXJyb3IgPSBbXVxyXG4gICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRXJyb3JzID0gW11cclxuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxvYWQgPSByZXM/LmRhdGE/LnJlc3VsdDtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlRoZSBnaXZlbiBVc2VyIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBicmFuZFwiKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoZXJyLmVycm9yLmNvZGUgPT0gNDAwKSB7IC8vIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLmVycm9yLmVycm9yLmR1cGxpY2F0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9wdXBjb250ZW50ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5cHJvcDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlc3JjOiBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCI+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0ZFRjBDN1wiLz48cGF0aCBkPVwiTTI3Ljk5OTggMjQuMDAxMlYyOC4wMDEyTTI3Ljk5OTggMzIuMDAxMkgyOC4wMDk4TTI2LjI4OTggMTguODYxMkwxNy44MTk4IDMzLjAwMTJDMTcuNjQ1MSAzMy4zMDM2IDE3LjU1MjcgMzMuNjQ2NSAxNy41NTE4IDMzLjk5NTdDMTcuNTUwOCAzNC4zNDQ5IDE3LjY0MTMgMzQuNjg4MyAxNy44MTQyIDM0Ljk5MTdDMTcuOTg3MSAzNS4yOTUxIDE4LjIzNjUgMzUuNTQ3OSAxOC41Mzc1IDM1LjcyNUMxOC44Mzg1IDM1LjkwMjEgMTkuMTgwNiAzNS45OTczIDE5LjUyOTggMzYuMDAxMkgzNi40Njk4QzM2LjgxOSAzNS45OTczIDM3LjE2MTEgMzUuOTAyMSAzNy40NjIxIDM1LjcyNUMzNy43NjMxIDM1LjU0NzkgMzguMDEyNCAzNS4yOTUxIDM4LjE4NTQgMzQuOTkxN0MzOC4zNTgzIDM0LjY4ODMgMzguNDQ4OCAzNC4zNDQ5IDM4LjQ0NzggMzMuOTk1N0MzOC40NDY4IDMzLjY0NjUgMzguMzU0NCAzMy4zMDM2IDM4LjE3OTggMzMuMDAxMkwyOS43MDk4IDE4Ljg2MTJDMjkuNTMxNSAxOC41NjczIDI5LjI4MDUgMTguMzI0MyAyOC45ODEgMTguMTU1N0MyOC42ODE0IDE3Ljk4NyAyOC4zNDM1IDE3Ljg5ODQgMjcuOTk5OCAxNy44OTg0QzI3LjY1NiAxNy44OTg0IDI3LjMxODEgMTcuOTg3IDI3LjAxODYgMTguMTU1N0MyNi43MTkxIDE4LjMyNDMgMjYuNDY4IDE4LjU2NzMgMjYuMjg5OCAxOC44NjEyWlwiIHN0cm9rZT1cIiNEQzY4MDNcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0ZGRkFFQlwiIHN0cm9rZS13aWR0aD1cIjhcIi8+PC9zdmc+YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGBJbnZhbGlkIGRldGFpbHMhYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogYFBsZWFzZSBwcm92aWRlIGNvcnJlY3QgYW5kIGNvbXBsZXRlIHN0b3JlIGluZm9ybWF0aW9uLmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIuZXJyb3IuZXJyb3IuZHVwbGljYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZEVycm9ycyA9IGVyci5lcnJvci5lcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKHBvcHVwY29udGVudClcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRFcnJvcnMgPSBlcnIuZXJyb3IuZXJyb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFmdGVyVXBsbG9hZCgpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRGaWxlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnIuZXJyb3IuZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRGaWxlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBcclxuICAgICAgfTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG4gIG9taXRTcGVjaWFsQ2hhcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgY29uc3Qga2V5ID0gZXZlbnQua2V5O1xyXG4gICAgY29uc3QgcmVnZXggPSAvXlthLXpBLVowLTkgXy1dJC87XHJcbiAgICBpZiAoIXJlZ2V4LnRlc3Qoa2V5KSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWZ0ZXJVcGxsb2FkKGRhdGE/OiBhbnkpIHtcclxuICAgIHRoaXMuZXhjZWxFcnJvciA9IGRhdGE7XHJcbiAgICAgaWYgKHRoaXMudXBsb2FkUG9wVXApIHtcclxuICAgICAgdGhpcy51cGxvYWRQb3BVcC5kaXNtaXNzKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwbG9hZFBvcFVwID0gdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmFmdGVyVmFsaWRhdGlvbiwgeyBjZW50ZXJlZDogdHJ1ZSwgYmFja2Ryb3A6ICdzdGF0aWMnLCBzaXplOiAnbGcnLCB3aW5kb3dDbGFzczogJ2N1c3RvbS1tb2RhbC13aWR0aCcgfSk7XHJcbiAgfVxyXG5cclxuICAgZ2V0U3RvcmVDb3VudHMoZGF0YTogYW55KSB7XHJcblxyXG4gICAgY29uc3QgdW5pcXVlVXNlck5hbWVzID0gbmV3IFNldChkYXRhPy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbVsnVXNlciBOYW1lL0VtYWlsIElkJ10pKTtcclxuICAgIHJldHVybiB1bmlxdWVVc2VyTmFtZXMuc2l6ZTtcclxuXHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZURldGFpbHMoZGF0YT86IGFueSkge1xyXG4gICAgaWYgKHRoaXMuYWZ0ZXJVcGxvYWQpIHtcclxuICAgICAgICBjb25zdCB1bmlxdWVVc2VycyA9IHRoaXMuYWZ0ZXJVcGxvYWQuZmlsdGVyKChpdGVtOiB7IHVzZXJJZDogc3RyaW5nIH0sIGluZGV4OiBudW1iZXIsIHNlbGY6IHsgdXNlcklkOiBzdHJpbmcgfVtdKSA9PlxyXG4gICAgICAgICAgICAgICAgICBpbmRleCA9PT0gc2VsZi5maW5kSW5kZXgoKHQpID0+IHQudXNlcklkID09PSBpdGVtLnVzZXJJZClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXNlcnMgPSB1bmlxdWVVc2Vyc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2VhY3RpdmVwb3B1cCgpIHtcclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZWRDaGlwKGRhdGE6IGFueSkge1xyXG4gICAgXHJcbiAgfVxyXG5cclxuICBwcmV2ZW50Q2xvc2UoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gU3RvcHMgdGhlIG1vZGFsIGZyb20gY2xvc2luZ1xyXG59XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjYXJkIHB0LTAgcGItMyBzY3JvbGxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHktMCBkLWZsZXggZmxleC1zdGFydCBmbGV4LWNvbHVtbiBwLTkgXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN5bWJvbCBzeW1ib2wtNzVweCBzeW1ib2wtY2lyY2xlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI1NlwiIHZpZXdCb3g9XCIwIDAgNTYgNTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIGZpbGw9XCIjREFGMUZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNFQUY4RkZcIiBzdHJva2Utd2lkdGg9XCI4XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIwLjUgMjMuNjgxNkMxOC44NDI1IDIzLjY4MTYgMTcuNSAyMi4yMTMzIDE3LjUgMjAuNDAwNEMxNy41IDE4LjU4NzUgMTguODQyNSAxNy4xMTkxIDIwLjUgMTcuMTE5MUMyMi4xNTc1IDE3LjExOTEgMjMuNSAxOC41ODc1IDIzLjUgMjAuNDAwNEMyMy41IDIyLjIxMzMgMjIuMTU3NSAyMy42ODE2IDIwLjUgMjMuNjgxNlpNMzUuNjQ4MyAyMy42ODE2QzMzLjk5MDggMjMuNjgxNiAzMi42NDgzIDIyLjIxMzMgMzIuNjQ4MyAyMC40MDA0QzMyLjY0ODMgMTguNTg3NSAzMy45OTA4IDE3LjExOTEgMzUuNjQ4MyAxNy4xMTkxQzM3LjMwNTggMTcuMTE5MSAzOC42NDgzIDE4LjU4NzUgMzguNjQ4MyAyMC40MDA0QzM4LjY0ODMgMjIuMjEzMyAzNy4zMDU4IDIzLjY4MTYgMzUuNjQ4MyAyMy42ODE2Wk0zMS41MDkgMjYuMzA2NkMzMS41MDkgMjguNDgwNSAyOS44OTY1IDMwLjI0NDEgMjcuOTA5IDMwLjI0NDFDMjUuOTIxNSAzMC4yNDQxIDI0LjMwOSAyOC40ODA1IDI0LjMwOSAyNi4zMDY2QzI0LjMwOSAyNC4xMzI4IDI1LjkyMTUgMjIuMzY5MSAyNy45MDkgMjIuMzY5MUMyOS44OTY1IDIyLjM2OTEgMzEuNTA5IDI0LjEzMjggMzEuNTA5IDI2LjMwNjZaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMwMEEzRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuMDAxMyAyNS43NTU5QzE3Ljc5MjUgMjUuNzU1OSAxNiAyNy43MTY0IDE2IDMwLjEzMjJDMTYgMzAuNjEyMSAxNi4zNiAzMS4wMDU5IDE2Ljc5ODggMzEuMDA1OUgyNC44MDEzSDI0LjgyNzVDMjMuODMzOCAzMC4wNDIgMjMuMjAzOCAyOC42MzUyIDIzLjIwMzggMjcuMDY4NEMyMy4yMDM4IDI2Ljc1NjYgMjMuMjI2MyAyNi40NDkgMjMuMjc1IDI2LjE1MzdDMjIuNzY1IDI1Ljg5OTQgMjIuMTk4OCAyNS43NTU5IDIxLjYwMjUgMjUuNzU1OUgyMC4wMDEzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMDBBM0ZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTMxLjE3MjUgMzEuMDA1OUgzMS4xOTg3SDM5LjIwMTJDMzkuNjQgMzEuMDA1OSA0MCAzMC42MTYyIDQwIDMwLjEzMjJDNDAgMjcuNzE2NCAzOC4yMDc1IDI1Ljc1NTkgMzUuOTk4NyAyNS43NTU5SDM0LjM5NzVDMzMuODAxMiAyNS43NTU5IDMzLjIzNSAyNS44OTUzIDMyLjcyNSAyNi4xNTM3QzMyLjc3IDI2LjQ1MzEgMzIuNzk2MyAyNi43NTY2IDMyLjc5NjMgMjcuMDY4NEMzMi43OTYzIDI4LjYzNTIgMzIuMTcgMzAuMDQyIDMxLjE3MjUgMzEuMDA1OVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwQTNGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yNS43OTg4IDMyLjMxODNDMjMuMDM4OCAzMi4zMTgzIDIwLjggMzQuNzY3IDIwLjggMzcuNzg1N0MyMC44IDM4LjM5MjggMjEuMjUgMzguODgwOSAyMS44MDEzIDM4Ljg4MDlIMzQuMTk4N0MzNC43NTM3IDM4Ljg4MDkgMzUuMiAzOC4zODg3IDM1LjIgMzcuNzg1N0MzNS4yIDM0Ljc2NyAzMi45NjEzIDMyLjMxODMgMzAuMjAxMyAzMi4zMTgzSDI1Ljc5ODhaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMwMEEzRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiICpuZ0lmPVwidHlwZSA9PT0gJ2NyZWF0ZSdcIj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZnMtNCB0ZXh0LWdyYXktODAwIHRleHQtaG92ZXItcHJpbWFyeSBmdy1ib2xkIG1iLTAgdGl0bGUgY3Vyc29yLXBvaW50ZXJcIj5DcmVhdGUgVGVhbTwvYT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGl0bGVcIj5Hcm91cCBtdWx0aXBsZSB1c2VycyB0byBjcmVhdGUgYSB0ZWFtIGZvciBlYXNpZXIgbWFuYWdlbWVudDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiICpuZ0lmPVwidHlwZSA9PT0gJ2VkaXQnXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImZzLTQgdGV4dC1ncmF5LTgwMCB0ZXh0LWhvdmVyLXByaW1hcnkgZnctYm9sZCBtYi0wIHRpdGxlIGN1cnNvci1wb2ludGVyXCI+RWRpdCBUZWFtPC9hPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10aXRsZVwiPkdyb3VwIG11bHRpcGxlIHVzZXJzIHRvIGVkaXQgYSB0ZWFtIGZvciBlYXNpZXIgbWFuYWdlbWVudDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgaC01MDBweCBzY3JvbGxcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gKGtleWRvd24uZW50ZXIpPVwicHJldmVudENsb3NlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBweC0wIG1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTEyIGNvbC14bC0xMiBjb2wteHhsLTEyIG1iLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGVhbU5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5UZWFtIE5hbWU8c3BhbiBjbGFzcz1cIm1hbmR0cnljbHIgbXMtMVwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInRlYW1OYW1lXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJ0ZWFtTmFtZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChrZXlwcmVzcyk9XCJvbWl0U3BlY2lhbENoYXIoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy0xMiBjb2wteGwtMTIgY29sLXh4bC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRlYW1sZWFkXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+VGVhbSBMZWFkIEVtYWlsPHNwYW4gY2xhc3M9XCJtYW5kdHJ5Y2xyIG1zLTFcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1jaGlwLXNlbGVjdCBbaXRlbXNdPVwidGVhbWxlYWRMaXN0XCIgW211bHRpXT1cInRydWVcIiBbc2VhcmNoRmllbGRdPVwiWyd1c2VyTmFtZSddXCIgW3NlYXJjaEtleV09XCJbJ2VtYWlsJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndXNlcklkJ1wiIChzZWxlY3RlZCk9XCJvblRlYW1TZWxlY3QoJGV2ZW50KVwiIChyZW1vdmVkKT1cInJlbW92ZWRDaGlwKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRWYWx1ZXNdPVwic2VsZWN0ZWRUZWFtXCI+PC9saWItY2hpcC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTEyIGNvbC14bC0xMiBjb2wteHhsLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidXNlcmxlYWRcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5TZWxlY3QgVXNlcnM8c3BhbiBjbGFzcz1cIm1hbmR0cnljbHIgbXMtMVwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVhbS1zZWxlY3QgW2l0ZW1zXT1cInVzZXJMaXN0XCIgW211bHRpXT1cInRydWVcIiBbc2VhcmNoRmllbGRdPVwiJ3VzZXJOYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIid1c2VySWQnXCIgKHNlbGVjdGVkKT1cIm9uVXNlclNlbGVjdCgkZXZlbnQpXCIgKGRlc2VsZWN0ZWQpPVwiVXNlclVuc2VsZWN0KCRldmVudClcIiAoZGVzZWxlY3RlZEFsbCk9XCJVc2VyVW5zZWxlY3RBbGwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlc109XCJzZWxlY3RlZFVzZXJzXCI+PC90ZWFtLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWdyYXktNDAwIGZ3LWJvbGQgbXktM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGluZS1iZyBcIj48c3ZnIHdpZHRoPVwiMjgwXCIgaGVpZ2h0PVwiMlwiIHZpZXdCb3g9XCIwIDAgMjgwIDJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB5PVwiMC41XCIgd2lkdGg9XCIyODBcIiBoZWlnaHQ9XCIxXCIgZmlsbD1cIiNFQUVDRjBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+PHNwYW4gY2xhc3M9XCJteC0xNSBvci1jb2xvclwiPk9yIDwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJsaW5lLWJnIFwiPjxzdmcgd2lkdGg9XCIyODBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMlwiIHZpZXdCb3g9XCIwIDAgMjgwIDJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHk9XCIwLjVcIiB3aWR0aD1cIjI4MFwiIGhlaWdodD1cIjFcIiBmaWxsPVwiI0VBRUNGMFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctYm9sZCB0ZXh0LWdyYXktNTAwIG15LTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9sIGNsYXNzPVwiY3VzdG9tLW9yZGVyZWQtbGlzdCB0ZXh0LWdyYXktNDAwIGZ3LWJvbGQgZnMtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwidXNlci10ZXh0XCI+VXNlIHRoZSB0ZW1wbGF0ZSB0byB1cGxvYWQgbXVsdGlwbGUgdXNlcnMgYXQgb25jZS48L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwidXNlci10ZXh0IG15LTNcIj48c3BhbiBjbGFzcz1cInVzZXItdGV4dFwiPkRvd25sb2FkIHRoZSB0ZW1wbGF0ZSBoZXJlIC1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJtcy0xXCIgaHJlZj1cIi4uLy4uLy4uL2Fzc2V0cy9maWxlcy90ZWFtc1VwbG9hZFRlbXBsYXRlLnhsc3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNNS44MzMzMyA4LjMzMzMzTDEwIDEyLjVNMTAgMTIuNUwxNC4xNjY3IDguMzMzMzNNMTAgMTIuNVYyLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMDlCRjNcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZW1wbGF0ZSBtcy0yXCI+RG93bmxvYWQgVGVtcGxhdGU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInVzZXItdGV4dCBteS0zXCI+QWRkIHlvdXIgZGF0YSB0byB0aGUgVGVtcGxhdGUgRmlsZTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwidXNlci10ZXh0IG15LTNcIj5VcGxvYWQgaXQgYmVsb3cgZm9yIHByb2Nlc3Npbmc8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29sPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtdC0zIG1zLTMgcmlnaHQtYmFyIHB5LTEwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPVwiYWNjb3VudFR5cGVcIiB0eXBlPVwicmFkaW9cIiBpZD1cImt0X2FjY291bnRfdGVhbV9zaXplX3NlbGVjdF91cGxvYWRcIiBhY2NlcHQgPSBcIi5jc3YsIGFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0LCBhcHBsaWNhdGlvbi92bmQubXMtZXhjZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInBlcnNvbmFsXCIgY2xhc3M9XCJidG4tY2hlY2tcIiBuZy1yZWZsZWN0LW5hbWU9XCJhY2NvdW50VHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLXJlZmxlY3QtZm9ybS1jb250cm9sLW5hbWU9XCJhY2NvdW50VHlwZVwiIChjaGFuZ2UpPVwib25VcGxvYWRUZW1wbGF0ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctcmVmbGVjdC12YWx1ZT1cInBlcnNvbmFsXCIgdHlwZT1cImZpbGVcIiAjaW5wdXRGaWxlIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImt0X2FjY291bnRfdGVhbV9zaXplX3NlbGVjdF91cGxvYWRcIiBjbGFzcz1cIiB3LTUwIHAtNFwiPjxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZ3LWJvbGQgdGV4dC1jZW50ZXIgdy0xMDAgZnMtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0NlwiIGhlaWdodD1cIjQ2XCIgdmlld0JveD1cIjAgMCA0NiA0NlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjNcIiB5PVwiM1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiMjBcIiBmaWxsPVwiI0YyRjRGN1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjNcIiB5PVwiM1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiMjBcIiBzdHJva2U9XCIjRjlGQUZCXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiNlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80MDQ3XzQwNTY2KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yNi4zMzMzIDI2LjMzMzRMMjMgMjNNMjMgMjNMMTkuNjY2NiAyNi4zMzM0TTIzIDIzVjMwLjVNMjkuOTkxNiAyOC4zMjVDMzAuODA0NCAyNy44ODE5IDMxLjQ0NjUgMjcuMTgwOCAzMS44MTY1IDI2LjMzMjJDMzIuMTg2NiAyNS40ODM3IDMyLjI2MzUgMjQuNTM2MSAzMi4wMzUxIDIzLjYzODlDMzEuODA2OCAyMi43NDE4IDMxLjI4NjIgMjEuOTQ2MyAzMC41NTU1IDIxLjM3NzlDMjkuODI0OCAyMC44MDk1IDI4LjkyNTcgMjAuNTAwNiAyOCAyMC41SDI2Ljk1QzI2LjY5NzcgMTkuNTI0NCAyNi4yMjc2IDE4LjYxODYgMjUuNTc0OSAxNy44NTA5QzI0LjkyMjIgMTcuMDgzMSAyNC4xMDQgMTYuNDczMiAyMy4xODE3IDE2LjA2NzJDMjIuMjU5NCAxNS42NjEyIDIxLjI1NzEgMTUuNDY5NSAyMC4yNTAxIDE1LjUwNjZDMTkuMjQzIDE1LjU0MzcgMTguMjU3NSAxNS44MDg2IDE3LjM2NzYgMTYuMjgxNEMxNi40Nzc3IDE2Ljc1NDIgMTUuNzA2NiAxNy40MjI2IDE1LjExMjIgMTguMjM2M0MxNC41MTc3IDE5LjA1MDEgMTQuMTE1NSAxOS45ODggMTMuOTM1OCAyMC45Nzk1QzEzLjc1NiAyMS45NzExIDEzLjgwMzQgMjIuOTkwNSAxNC4wNzQzIDIzLjk2MTFDMTQuMzQ1MiAyNC45MzE3IDE0LjgzMjcgMjUuODI4MiAxNS41IDI2LjU4MzRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzQwNDdfNDA1NjZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDEzIDEzKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YS10aXRsZVwiPjxzcGFuIGNsYXNzPVwiY2xpY2stdXBsb2FkIGN1cnNvci1wb2ludGVyXCI+Q2xpY2sgdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwibXMtMlwiPm9yIGRyYWcgYW5kIGRyb3A8L3NwYW4+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YS1zdWJcIj50aGUgZGF0YSBhZGRlZCB0ZW1wbGF0ZSBmaWxlIGZvciBwcm9jZXNzaW5nLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgY29sLXhsLTEyIGNvbC14eGwtMTIgbWItNSBtdC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInVzZXJsZWFkXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+RGVzY3JpcHRpb24gKG9wdGlvbmFsKTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwiZGVzY3JpcHRpb25cIiBbKG5nTW9kZWwpXT1cImRlc2NyaXB0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiIG5hbWU9XCJkZXNjcmlwdGlvblwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cz1cIjVcIiBjb2xzPVwiNTBcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGEgZGVzY3JpcHRpb24uLi5cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbXktMTBcIiByb2xlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgdy0xMDAgbWUtM1wiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB3LTEwMCBtcy0zXCIgaWQ9XCJhbGVydC10b2FzdFwiICpuZ0lmPVwiIWlzRWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ3JlYXRlVGVhbSgpXCIgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZFVzZXJzLmxlbmd0aHx8IXNlbGVjdGVkVGVhbS5sZW5ndGh8fCAhdGVhbU5hbWVcIj5DcmVhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwIG1zLTNcIiBpZD1cImFsZXJ0LXRvYXN0XCIgKm5nSWY9XCJpc0VkaXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNyZWF0ZVRlYW0oKVwiIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRVc2Vycy5sZW5ndGggfHwhc2VsZWN0ZWRUZWFtLmxlbmd0aHx8IXRlYW1OYW1lXCI+VXBkYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI2FmdGVyVmFsaWRhdGlvbiBsZXQtbW9kZWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMCBtdC0wXCI+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZSBtdC0zXCI+PHNwYW4gY2xhc3M9XCJjb25maWctaGVhZGluZyBmdy1zZW1pYm9sZCB3LWF1dG9cIj5BZGQgVXNlcnM8L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwb3B1cC1zY3JvbGwgcHQtMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIj5cclxuICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1jYXJkIHJvdW5kZWQtMyBwLTMgZmxleC1jb2x1bW4gaC03MHB4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmcgdy0xMDBcIj57e2dldFN0b3JlQ291bnRzKGV4Y2VsRGF0YSl9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkIHN1YnRpdGxlIG10LTFcIj5Ub3RhbCBSZWNvcmRzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNhcmQgcm91bmRlZC0zIHAtMyBmbGV4LWNvbHVtbiBoLTcwcHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkIGNvbmZpZy1oZWFkaW5nIHctMTAwXCI+e3tleGNlbERhdGE/Lmxlbmd0aH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1zZW1pYm9sZCBzdWJ0aXRsZSBtdC0xXCI+Um93cyBwcm9jZXNzZWQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1jYXJkIHJvdW5kZWQtMyBwLTMgZmxleC1jb2x1bW4gaC03MHB4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJleGNlbEVycm9yIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnZnctc2VtaWJvbGQgdGV4dC1lcnJvciB3LTEwMCBlcnJvci1oZWFkaW5nJyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2Z3LXNlbWlib2xkIHctMTAwIGNvbmZpZy1oZWFkaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyB1cGxvYWRFcnJvcnM/LmRvZXNOb3RFeGlzdHM/Lmxlbmd0aCArdXBsb2FkRXJyb3JzPy5kdXBsaWNhdGU/Lmxlbmd0aCArdXBsb2FkRXJyb3JzPy5pbkFjdGl2ZT8ubGVuZ3RoIHx8IDAgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImV4Y2VsRXJyb3IgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdmdy1zZW1pYm9sZCB0ZXh0LWVycm9yIG10LTEgZXhjZWwtZXJyb3InIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnZnctc2VtaWJvbGQgc3VidGl0bGUgbXQtMSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZXhjZWxFcnJvclwiIGNsYXNzPVwidGFibGUtaGVhZGVyIG10LTVcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA0MDA7XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ID5Zb3UncmUgYWJvdXQgdG8gYWRkIHt7Z2V0U3RvcmVDb3VudHMoZXhjZWxEYXRhKX19IHt7Z2V0U3RvcmVDb3VudHMoZXhjZWxEYXRhKSA+IDEgPyAnVXNlcnMnIDogJ1VzZXInfX0uIEFyZSB5b3Ugc3VyZSB3YW50IHRvIHByb2NlZWQ/PC9kaXY+XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImV4Y2VsRXJyb3I/Lmxlbmd0aFwiIGNsYXNzPVwiZmxleC1jb2x1bW4gbXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1oZWFkaW5nIGZ3LWJvbGRcIj5JbnZhbGlkIERldGFpbHMgITwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlIG10LTVcIj5QbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGluZm9ybWF0aW9uLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtNSB3LTEwMCByb3VuZGVkLTMgYm9yZGVyLWVycm9yIG10LTUgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlcnJvciBvZiBleGNlbEVycm9yPy5lcnJvcjsgbGV0IGkgPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0XCIgW25nQ2xhc3NdPVwiIWxhc3QgPyAnbWItMicgOiAnJ1wiIGNsYXNzPVwidGV4dC1lcnJvclwiPnt7aSArIDF9fSkge3tlcnJvcn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1cGxvYWRFcnJvcnM/LmRvZXNOb3RFeGlzdHM/Lmxlbmd0aFwiIGNsYXNzPVwiZmxleC1jb2x1bW4gbXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1oZWFkaW5nIGZ3LWJvbGRcIj5Vc2VyIGRvZXNuJ3QgZXhpc3RzICE8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInN1YnRpdGxlIG10LTVcIj5QbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGluZm9ybWF0aW9uLjwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTUgdy0xMDAgcm91bmRlZC0zIGJvcmRlci1lcnJvciBtdC01IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgdXBsb2FkRXJyb3JzPy5kb2VzTm90RXhpc3RzOyBsZXQgaSA9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3RcIiBbbmdDbGFzc109XCIhbGFzdCA/ICdtYi0yJyA6ICcnXCIgY2xhc3M9XCJ0ZXh0LWVycm9yXCI+e3tpICsgMX19KSB7e2Vycm9yfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1cGxvYWRFcnJvcnM/LmR1cGxpY2F0ZT8ubGVuZ3RoXCIgY2xhc3M9XCJmbGV4LWNvbHVtbiBtdC01XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWhlYWRpbmcgZnctYm9sZFwiPkR1cGxpY2F0ZSByZWNvcmRzIGZvdW5kICE8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInN1YnRpdGxlIG10LTVcIj5QbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGluZm9ybWF0aW9uLjwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTUgdy0xMDAgcm91bmRlZC0zIGJvcmRlci1lcnJvciBtdC01IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgdXBsb2FkRXJyb3JzPy5kdXBsaWNhdGU7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiIFtuZ0NsYXNzXT1cIiFsYXN0ID8gJ21iLTInIDogJydcIiBjbGFzcz1cInRleHQtZXJyb3JcIj57e2kgKyAxfX0pIHt7ZXJyb3J9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVwbG9hZEVycm9ycz8uaW5BY3RpdmU/Lmxlbmd0aFwiIGNsYXNzPVwiZmxleC1jb2x1bW4gbXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1oZWFkaW5nIGZ3LWJvbGRcIj5Vc2VyIGlzIGluYWN0aXZlICE8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInN1YnRpdGxlIG10LTVcIj5QbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGluZm9ybWF0aW9uLjwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTUgdy0xMDAgcm91bmRlZC0zIGJvcmRlci1lcnJvciBtdC01IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgdXBsb2FkRXJyb3JzPy5pbkFjdGl2ZTsgbGV0IGkgPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0XCIgW25nQ2xhc3NdPVwiIWxhc3QgPyAnbWItMicgOiAnJ1wiIGNsYXNzPVwidGV4dC1lcnJvclwiPnt7aSArIDF9fSkge3tlcnJvcn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBib3JkZXItMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBmbGV4LXdyYXAgZ2FwLTIgcHQtMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1tZCBidG4tZGVmYXVsdCBidG4tb3V0bGluZVwiIChjbGljayk9XCJjbG9zZWFjdGl2ZXBvcHVwKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFleGNlbEVycm9yXCIgY2xhc3M9XCJidG4gYnRuLW1kIHB5LTMgYnRuLWRlZmF1bHQgbXMtMyBidG4tcHJpbWFyeVwiIChjbGljayk9XCJ2YWxpZGF0ZURldGFpbHMoKTttb2RlbC5jbG9zZSgpXCI+UHJvY2VlZDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZXhjZWxFcnJvclwiIGNsYXNzPVwiYnRuIHB5LTMgYnRuLW1kIGJ0bi1kZWZhdWx0IG1zLTMgYnRuLWRhbmdlclwiIChjbGljayk9XCJmaWxlMS5jbGljaygpXCI+UmV1cGxvYWQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAjZmlsZTEgdHlwZT1cImZpbGVcIiBpZD1cImt0X2FjY291bnRfdGVhbV9zaXplX3NlbGVjdF91cGxvYWRcIiBhY2NlcHQgPSBcIi5jc3YsIGFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0LCBhcHBsaWNhdGlvbi92bmQubXMtZXhjZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25VcGxvYWRUZW1wbGF0ZSgkZXZlbnQpXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuIl19