verben-ticketing-ui 0.8.1 → 0.8.3

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.
@@ -24,12 +24,14 @@ export class AddTicketComponent {
24
24
  activeApp = null;
25
25
  activeTenant = null;
26
26
  selectedTicket = null;
27
+ isDisabled = false;
27
28
  isVisible = false;
28
29
  onOpen = new EventEmitter();
29
30
  onClose = new EventEmitter();
30
31
  onSave = new EventEmitter();
31
32
  priorityOptions = [];
32
33
  statusOptions = Object.keys(TicketStatus);
34
+ pendingRef = TicketStatus.Pending;
33
35
  fileData = [];
34
36
  fileUrls = [];
35
37
  //attachedMessage: TicketMessage | null = null;
@@ -42,17 +44,26 @@ export class AddTicketComponent {
42
44
  this.sharedService = sharedService;
43
45
  this.envSvc = envSvc;
44
46
  this.createTicketForm = this.fb.group({
45
- Title: new FormControl(null, Validators.required),
46
- Description: new FormControl(null, Validators.required),
47
- CurrentHandler: new FormControl({
47
+ Title: new FormControl({
48
48
  value: null,
49
- disabled: true,
50
- }),
51
- LastHandler: new FormControl({
49
+ disabled: this.isDisabled,
50
+ }, Validators.required),
51
+ Description: new FormControl({
52
52
  value: null,
53
- disabled: true,
54
- }),
55
- Priority: new FormControl(null, Validators.required),
53
+ disabled: this.isDisabled,
54
+ }, Validators.required),
55
+ // CurrentHandler: new FormControl<string | null>({
56
+ // value: null,
57
+ // disabled: true,
58
+ // }),
59
+ // LastHandler: new FormControl<string | null>({
60
+ // value: null,
61
+ // disabled: true,
62
+ // }),
63
+ Priority: new FormControl({
64
+ value: null,
65
+ disabled: this.isDisabled,
66
+ }, Validators.required),
56
67
  Status: new FormControl({ value: TicketStatus.Pending, disabled: true }, Validators.required),
57
68
  });
58
69
  // this.createTicketForm.controls['CurrentHandler'].disable();
@@ -64,8 +75,8 @@ export class AddTicketComponent {
64
75
  this.createTicketForm.patchValue({
65
76
  Title: this.selectedTicket.Title,
66
77
  Description: this.selectedTicket.Description,
67
- CurrentHandler: this.selectedTicket.CurrentHandler,
68
- LastHandler: this.selectedTicket.LastHandler,
78
+ // CurrentHandler: this.selectedTicket.CurrentHandler,
79
+ // LastHandler: this.selectedTicket.LastHandler,
69
80
  Priority: this.selectedTicket.Priority,
70
81
  Status: this.selectedTicket.Status,
71
82
  });
@@ -76,14 +87,24 @@ export class AddTicketComponent {
76
87
  this.createTicketForm.patchValue({
77
88
  Title: null,
78
89
  Description: null,
79
- CurrentHandler: null,
80
- LastHandler: null,
90
+ // CurrentHandler: null,
91
+ // LastHandler: null,
81
92
  Priority: null,
82
93
  Status: TicketStatus.Pending,
83
94
  });
84
95
  this.fileUrls = [];
85
96
  this.fileData = [];
86
97
  }
98
+ if (this.isDisabled) {
99
+ this.createTicketForm.get('Title')?.disable({ emitEvent: false });
100
+ this.createTicketForm.get('Description')?.disable({ emitEvent: false });
101
+ this.createTicketForm.get('Priority')?.disable({ emitEvent: false });
102
+ }
103
+ else {
104
+ this.createTicketForm.get('Title')?.enable({ emitEvent: false });
105
+ this.createTicketForm.get('Description')?.enable({ emitEvent: false });
106
+ this.createTicketForm.get('Priority')?.enable({ emitEvent: false });
107
+ }
87
108
  if (changes['activeTenant'] && this.activeTenant) {
88
109
  const options = await this.sharedService.getAllPrioritiesForTenant(this.activeTenant);
89
110
  if (options) {
@@ -281,17 +302,19 @@ export class AddTicketComponent {
281
302
  };
282
303
  }
283
304
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AddTicketComponent, deps: [{ token: i1.FormBuilder }, { token: i2.UtilService }, { token: i2.HttpWebRequestService }, { token: i2.SharedService }, { token: i2.EnvironmentService }], target: i0.ɵɵFactoryTarget.Component });
284
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AddTicketComponent, selector: "app-add-ticket", inputs: { activeApp: "activeApp", activeTenant: "activeTenant", selectedTicket: "selectedTicket", isVisible: "isVisible", defaultCompany: "defaultCompany" }, outputs: { onOpen: "onOpen", onClose: "onClose", onSave: "onSave" }, usesOnChanges: true, ngImport: i0, template: "<verben-dialogue\n [showCloseIcon]=\"false\"\n [dismissOutsideClick]=\"false\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'ticket-dialog'\"\n [disableFooter]=\"true\"\n (openModal)=\"onModalOpen($event)\"\n [isVisible]=\"isVisible\"\n [bodyTemplate]=\"bodyTemplate\"\n (closeModal)=\"onModalClose($event)\"\n>\n <ng-template #bodyTemplate>\n <div class=\"dialog-body p-[25px] flex flex-col gap-4\">\n <div class=\"dialog-header flex flex-col gap-1\">\n <div class=\"dialog-title font-bold text-xl\">\n {{ this.selectedTicket ? \"Edit Ticket\" : \"Create Ticket\" }}\n </div>\n <div class=\"dialog-subtitle\">\n {{\n this.selectedTicket\n ? \"Fill the form below to edit selected ticket\"\n : \"Fill the form below to create a ticket\"\n }}\n </div>\n </div>\n <!-- <verbena-textarea name=\"Test\" [(ngModel)]=\"test\" />\n <button (click)=\"logTest()\">Log</button> -->\n <div\n [formGroup]=\"createTicketForm\"\n class=\"add-app-form main-form-container flex flex-col gap-2\"\n >\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Title</div>\n <verbena-input\n name=\"Title\"\n placeHolder=\"Title\"\n formControlName=\"Title\"\n />\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Description</div>\n <verbena-input name=\"Description\" formControlName=\"Description\" />\n </div>\n <div\n *ngIf=\"this.selectedTicket\"\n class=\"form-input-container flex flex-col gap-1\"\n >\n <div class=\"font-medium\">Current Handler</div>\n <verbena-input\n name=\"CurrentHandler\"\n placeHolder=\"Current Handler\"\n formControlName=\"CurrentHandler\"\n />\n </div>\n <div\n *ngIf=\"this.selectedTicket\"\n class=\"form-input-container flex flex-col gap-1\"\n >\n <div class=\"font-medium\">Last Handler</div>\n <verbena-input\n name=\"LastHandler\"\n placeHolder=\"Last Handler\"\n formControlName=\"LastHandler\"\n />\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Priority</div>\n <verben-drop-down\n width=\"100%\"\n name=\"Priority\"\n placeholder=\"Select Priority\"\n [options]=\"priorityOptions\"\n optionLabel=\"Name\"\n optionValue=\"Code\"\n formControlName=\"Priority\"\n >\n </verben-drop-down>\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Status</div>\n <verben-drop-down\n width=\"100%\"\n name=\"Status\"\n [disabled]=\"true\"\n placeholder=\"Select Status\"\n [options]=\"statusOptions\"\n formControlName=\"Status\"\n >\n </verben-drop-down>\n </div>\n <div class=\"attachment-section p-2 flex flex-col gap-3\">\n <div class=\"attachments-container grid grid-cols-3 gap-2\">\n <ng-container *ngFor=\"let file of this.fileUrls\">\n <app-file-render [fileUrl]=\"file\"></app-file-render>\n </ng-container>\n </div>\n <div\n class=\"upload-section flex flex-col flex-1 items-center justify-center gap-2\"\n >\n <div class=\"flex justify-center\">\n <verbena-button\n [useIcon]=\"true\"\n [icon]=\"'upload'\"\n class=\"verben-secondary-button\"\n [text]=\"'Upload'\"\n (click)=\"triggerFileUpload()\"\n ></verbena-button>\n </div>\n <div class=\"upload-caption text-sm text-center\">\n Include Attachments\n </div>\n </div>\n </div>\n </div>\n <div class=\"dialog-button-container flex justify-end gap-2\">\n <verbena-button\n width=\"100%\"\n class=\"verben-secondary-button\"\n [text]=\"'Close'\"\n (click)=\"onModalClose($event)\"\n >\n </verbena-button>\n <verbena-button\n [disable]=\"!this.checkForm()\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Save'\"\n (click)=\"save()\"\n >\n </verbena-button>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n", styles: [".attachment-section{border:1px solid #ccc6fbb2;border-radius:5px}::ng-deep .ticket-dialog{max-width:60vw}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.VerbenaButtonComponent, selector: "verbena-button", inputs: ["text", "icon", "useIcon", "svgPosition", "iconPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "svgSize", "weight", "variant", "styleType", "svg", "svgWidth", "svgHeight", "iconColor", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "component", type: i4.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i4.VerbenDialogueComponent, selector: "verben-dialogue", inputs: ["dialogueWidth", "headerTemplate", "bodyTemplate", "footerTemplate", "showCloseIcon", "dismissOutsideClick", "closeOnEscape", "isVisible", "size", "backdropColor", "customClass", "disableFooter", "margin", "padding", "borderRadius", "dialogueBgColor", "width", "closeIconClass", "boxShadow", "enableTransition", "modalData", "mode", "position", "drawerWidth"], outputs: ["openModal", "closeModal"] }, { kind: "component", type: i4.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i5.FileRenderComponent, selector: "app-file-render", inputs: ["fileUrl"] }] });
305
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AddTicketComponent, selector: "app-add-ticket", inputs: { activeApp: "activeApp", activeTenant: "activeTenant", selectedTicket: "selectedTicket", isDisabled: "isDisabled", isVisible: "isVisible", defaultCompany: "defaultCompany" }, outputs: { onOpen: "onOpen", onClose: "onClose", onSave: "onSave" }, usesOnChanges: true, ngImport: i0, template: "<verben-dialogue\n [showCloseIcon]=\"false\"\n [dismissOutsideClick]=\"false\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'ticket-dialog'\"\n [disableFooter]=\"true\"\n (openModal)=\"onModalOpen($event)\"\n [isVisible]=\"isVisible\"\n [bodyTemplate]=\"bodyTemplate\"\n (closeModal)=\"onModalClose($event)\"\n>\n <ng-template #bodyTemplate>\n <div class=\"dialog-body p-[25px] flex flex-col gap-4\">\n <div class=\"dialog-header flex flex-col gap-1\">\n <div class=\"dialog-title font-bold text-xl\">\n {{ this.selectedTicket ? \"Edit Ticket\" : \"Create Ticket\" }}\n </div>\n <div class=\"dialog-subtitle\">\n {{\n this.selectedTicket\n ? \"Fill the form below to edit selected ticket\"\n : \"Fill the form below to create a ticket\"\n }}\n </div>\n </div>\n <!-- <verbena-textarea name=\"Test\" [(ngModel)]=\"test\" />\n <button (click)=\"logTest()\">Log</button> -->\n <div\n [formGroup]=\"createTicketForm\"\n class=\"add-app-form main-form-container flex flex-col gap-2\"\n >\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Title</div>\n <verbena-input\n name=\"Title\"\n placeHolder=\"Title\"\n formControlName=\"Title\"\n />\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Description</div>\n <verbena-input name=\"Description\" formControlName=\"Description\" />\n </div>\n <!-- <div\n *ngIf=\"this.selectedTicket\"\n class=\"form-input-container flex flex-col gap-1\"\n >\n <div class=\"font-medium\">Current Handler</div>\n <verbena-input\n name=\"CurrentHandler\"\n placeHolder=\"Current Handler\"\n [value]=\"createTicketForm.get('CurrentHandler')?.value\"\n [disable]=\"true\"\n />\n </div>\n <div\n *ngIf=\"this.selectedTicket\"\n class=\"form-input-container flex flex-col gap-1\"\n >\n <div class=\"font-medium\">Last Handler</div>\n <verbena-input\n name=\"LastHandler\"\n placeHolder=\"Last Handler\"\n [value]=\"createTicketForm.get('LastHandler')?.value\"\n [disable]=\"true\"\n />\n </div> -->\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Priority</div>\n <verben-drop-down\n width=\"100%\"\n name=\"Priority\"\n placeholder=\"Select Priority\"\n [options]=\"priorityOptions\"\n optionLabel=\"Name\"\n optionValue=\"Code\"\n formControlName=\"Priority\"\n >\n </verben-drop-down>\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Status</div>\n <verben-drop-down\n width=\"100%\"\n name=\"Status\"\n [disabled]=\"true\"\n placeholder=\"Select Status\"\n [options]=\"statusOptions\"\n formControlName=\"Status\"\n >\n </verben-drop-down>\n </div>\n <div class=\"attachment-section p-2 flex flex-col gap-3\">\n <div class=\"attachments-container grid grid-cols-3 gap-2\">\n <ng-container *ngFor=\"let file of this.fileUrls\">\n <app-file-render [fileUrl]=\"file\"></app-file-render>\n </ng-container>\n </div>\n <div\n class=\"upload-section flex flex-col flex-1 items-center justify-center gap-2\"\n >\n <div class=\"flex justify-center\">\n <verbena-button\n [useIcon]=\"true\"\n [icon]=\"'upload'\"\n class=\"verben-secondary-button\"\n [text]=\"'Upload'\"\n (click)=\"triggerFileUpload()\"\n [disable]=\"isDisabled\"\n ></verbena-button>\n </div>\n <div class=\"upload-caption text-sm text-center\">\n Include Attachments\n </div>\n </div>\n </div>\n </div>\n <div class=\"dialog-button-container flex justify-end gap-2\">\n <verbena-button\n width=\"100%\"\n class=\"verben-secondary-button\"\n [text]=\"'Close'\"\n (click)=\"onModalClose($event)\"\n >\n </verbena-button>\n <verbena-button\n [disable]=\"!this.checkForm()\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Save'\"\n (click)=\"save()\"\n >\n </verbena-button>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n", styles: [".attachment-section{border:1px solid #ccc6fbb2;border-radius:5px}::ng-deep .ticket-dialog{max-width:60vw}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.VerbenaButtonComponent, selector: "verbena-button", inputs: ["text", "icon", "useIcon", "svgPosition", "iconPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "svgSize", "weight", "variant", "styleType", "svg", "svgWidth", "svgHeight", "iconColor", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "component", type: i4.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i4.VerbenDialogueComponent, selector: "verben-dialogue", inputs: ["dialogueWidth", "headerTemplate", "bodyTemplate", "footerTemplate", "showCloseIcon", "dismissOutsideClick", "closeOnEscape", "isVisible", "size", "backdropColor", "customClass", "disableFooter", "margin", "padding", "borderRadius", "dialogueBgColor", "width", "closeIconClass", "boxShadow", "enableTransition", "modalData", "mode", "position", "drawerWidth"], outputs: ["openModal", "closeModal"] }, { kind: "component", type: i4.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i5.FileRenderComponent, selector: "app-file-render", inputs: ["fileUrl"] }] });
285
306
  }
286
307
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AddTicketComponent, decorators: [{
287
308
  type: Component,
288
- args: [{ selector: 'app-add-ticket', template: "<verben-dialogue\n [showCloseIcon]=\"false\"\n [dismissOutsideClick]=\"false\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'ticket-dialog'\"\n [disableFooter]=\"true\"\n (openModal)=\"onModalOpen($event)\"\n [isVisible]=\"isVisible\"\n [bodyTemplate]=\"bodyTemplate\"\n (closeModal)=\"onModalClose($event)\"\n>\n <ng-template #bodyTemplate>\n <div class=\"dialog-body p-[25px] flex flex-col gap-4\">\n <div class=\"dialog-header flex flex-col gap-1\">\n <div class=\"dialog-title font-bold text-xl\">\n {{ this.selectedTicket ? \"Edit Ticket\" : \"Create Ticket\" }}\n </div>\n <div class=\"dialog-subtitle\">\n {{\n this.selectedTicket\n ? \"Fill the form below to edit selected ticket\"\n : \"Fill the form below to create a ticket\"\n }}\n </div>\n </div>\n <!-- <verbena-textarea name=\"Test\" [(ngModel)]=\"test\" />\n <button (click)=\"logTest()\">Log</button> -->\n <div\n [formGroup]=\"createTicketForm\"\n class=\"add-app-form main-form-container flex flex-col gap-2\"\n >\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Title</div>\n <verbena-input\n name=\"Title\"\n placeHolder=\"Title\"\n formControlName=\"Title\"\n />\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Description</div>\n <verbena-input name=\"Description\" formControlName=\"Description\" />\n </div>\n <div\n *ngIf=\"this.selectedTicket\"\n class=\"form-input-container flex flex-col gap-1\"\n >\n <div class=\"font-medium\">Current Handler</div>\n <verbena-input\n name=\"CurrentHandler\"\n placeHolder=\"Current Handler\"\n formControlName=\"CurrentHandler\"\n />\n </div>\n <div\n *ngIf=\"this.selectedTicket\"\n class=\"form-input-container flex flex-col gap-1\"\n >\n <div class=\"font-medium\">Last Handler</div>\n <verbena-input\n name=\"LastHandler\"\n placeHolder=\"Last Handler\"\n formControlName=\"LastHandler\"\n />\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Priority</div>\n <verben-drop-down\n width=\"100%\"\n name=\"Priority\"\n placeholder=\"Select Priority\"\n [options]=\"priorityOptions\"\n optionLabel=\"Name\"\n optionValue=\"Code\"\n formControlName=\"Priority\"\n >\n </verben-drop-down>\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Status</div>\n <verben-drop-down\n width=\"100%\"\n name=\"Status\"\n [disabled]=\"true\"\n placeholder=\"Select Status\"\n [options]=\"statusOptions\"\n formControlName=\"Status\"\n >\n </verben-drop-down>\n </div>\n <div class=\"attachment-section p-2 flex flex-col gap-3\">\n <div class=\"attachments-container grid grid-cols-3 gap-2\">\n <ng-container *ngFor=\"let file of this.fileUrls\">\n <app-file-render [fileUrl]=\"file\"></app-file-render>\n </ng-container>\n </div>\n <div\n class=\"upload-section flex flex-col flex-1 items-center justify-center gap-2\"\n >\n <div class=\"flex justify-center\">\n <verbena-button\n [useIcon]=\"true\"\n [icon]=\"'upload'\"\n class=\"verben-secondary-button\"\n [text]=\"'Upload'\"\n (click)=\"triggerFileUpload()\"\n ></verbena-button>\n </div>\n <div class=\"upload-caption text-sm text-center\">\n Include Attachments\n </div>\n </div>\n </div>\n </div>\n <div class=\"dialog-button-container flex justify-end gap-2\">\n <verbena-button\n width=\"100%\"\n class=\"verben-secondary-button\"\n [text]=\"'Close'\"\n (click)=\"onModalClose($event)\"\n >\n </verbena-button>\n <verbena-button\n [disable]=\"!this.checkForm()\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Save'\"\n (click)=\"save()\"\n >\n </verbena-button>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n", styles: [".attachment-section{border:1px solid #ccc6fbb2;border-radius:5px}::ng-deep .ticket-dialog{max-width:60vw}\n"] }]
309
+ args: [{ selector: 'app-add-ticket', template: "<verben-dialogue\n [showCloseIcon]=\"false\"\n [dismissOutsideClick]=\"false\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'ticket-dialog'\"\n [disableFooter]=\"true\"\n (openModal)=\"onModalOpen($event)\"\n [isVisible]=\"isVisible\"\n [bodyTemplate]=\"bodyTemplate\"\n (closeModal)=\"onModalClose($event)\"\n>\n <ng-template #bodyTemplate>\n <div class=\"dialog-body p-[25px] flex flex-col gap-4\">\n <div class=\"dialog-header flex flex-col gap-1\">\n <div class=\"dialog-title font-bold text-xl\">\n {{ this.selectedTicket ? \"Edit Ticket\" : \"Create Ticket\" }}\n </div>\n <div class=\"dialog-subtitle\">\n {{\n this.selectedTicket\n ? \"Fill the form below to edit selected ticket\"\n : \"Fill the form below to create a ticket\"\n }}\n </div>\n </div>\n <!-- <verbena-textarea name=\"Test\" [(ngModel)]=\"test\" />\n <button (click)=\"logTest()\">Log</button> -->\n <div\n [formGroup]=\"createTicketForm\"\n class=\"add-app-form main-form-container flex flex-col gap-2\"\n >\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Title</div>\n <verbena-input\n name=\"Title\"\n placeHolder=\"Title\"\n formControlName=\"Title\"\n />\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Description</div>\n <verbena-input name=\"Description\" formControlName=\"Description\" />\n </div>\n <!-- <div\n *ngIf=\"this.selectedTicket\"\n class=\"form-input-container flex flex-col gap-1\"\n >\n <div class=\"font-medium\">Current Handler</div>\n <verbena-input\n name=\"CurrentHandler\"\n placeHolder=\"Current Handler\"\n [value]=\"createTicketForm.get('CurrentHandler')?.value\"\n [disable]=\"true\"\n />\n </div>\n <div\n *ngIf=\"this.selectedTicket\"\n class=\"form-input-container flex flex-col gap-1\"\n >\n <div class=\"font-medium\">Last Handler</div>\n <verbena-input\n name=\"LastHandler\"\n placeHolder=\"Last Handler\"\n [value]=\"createTicketForm.get('LastHandler')?.value\"\n [disable]=\"true\"\n />\n </div> -->\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Priority</div>\n <verben-drop-down\n width=\"100%\"\n name=\"Priority\"\n placeholder=\"Select Priority\"\n [options]=\"priorityOptions\"\n optionLabel=\"Name\"\n optionValue=\"Code\"\n formControlName=\"Priority\"\n >\n </verben-drop-down>\n </div>\n <div class=\"form-input-container flex flex-col gap-1\">\n <div class=\"font-medium\">Status</div>\n <verben-drop-down\n width=\"100%\"\n name=\"Status\"\n [disabled]=\"true\"\n placeholder=\"Select Status\"\n [options]=\"statusOptions\"\n formControlName=\"Status\"\n >\n </verben-drop-down>\n </div>\n <div class=\"attachment-section p-2 flex flex-col gap-3\">\n <div class=\"attachments-container grid grid-cols-3 gap-2\">\n <ng-container *ngFor=\"let file of this.fileUrls\">\n <app-file-render [fileUrl]=\"file\"></app-file-render>\n </ng-container>\n </div>\n <div\n class=\"upload-section flex flex-col flex-1 items-center justify-center gap-2\"\n >\n <div class=\"flex justify-center\">\n <verbena-button\n [useIcon]=\"true\"\n [icon]=\"'upload'\"\n class=\"verben-secondary-button\"\n [text]=\"'Upload'\"\n (click)=\"triggerFileUpload()\"\n [disable]=\"isDisabled\"\n ></verbena-button>\n </div>\n <div class=\"upload-caption text-sm text-center\">\n Include Attachments\n </div>\n </div>\n </div>\n </div>\n <div class=\"dialog-button-container flex justify-end gap-2\">\n <verbena-button\n width=\"100%\"\n class=\"verben-secondary-button\"\n [text]=\"'Close'\"\n (click)=\"onModalClose($event)\"\n >\n </verbena-button>\n <verbena-button\n [disable]=\"!this.checkForm()\"\n width=\"100%\"\n class=\"verben-primary-button\"\n [text]=\"'Save'\"\n (click)=\"save()\"\n >\n </verbena-button>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n", styles: [".attachment-section{border:1px solid #ccc6fbb2;border-radius:5px}::ng-deep .ticket-dialog{max-width:60vw}\n"] }]
289
310
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.UtilService }, { type: i2.HttpWebRequestService }, { type: i2.SharedService }, { type: i2.EnvironmentService }], propDecorators: { activeApp: [{
290
311
  type: Input
291
312
  }], activeTenant: [{
292
313
  type: Input
293
314
  }], selectedTicket: [{
294
315
  type: Input
316
+ }], isDisabled: [{
317
+ type: Input
295
318
  }], isVisible: [{
296
319
  type: Input
297
320
  }], onOpen: [{
@@ -303,4 +326,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
303
326
  }], defaultCompany: [{
304
327
  type: Input
305
328
  }] } });
306
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXRpY2tldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9hZGQtdGlja2V0L2FkZC10aWNrZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbXBvbmVudHMvYWRkLXRpY2tldC9hZGQtdGlja2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLFdBQVcsRUFFWCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRWpFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQVNsRSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQzs7Ozs7OztBQVMzRixNQUFNLE9BQU8sa0JBQWtCO0lBdUJuQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBMUJWLHFCQUFxQjtJQUNyQixjQUFjO0lBQ2Qsc0NBQXNDO0lBQ3RDLElBQUk7SUFDSixnQkFBZ0IsQ0FBWTtJQUNuQixTQUFTLEdBQWtCLElBQUksQ0FBQztJQUNoQyxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUNuQyxjQUFjLEdBQWtCLElBQUksQ0FBQztJQUNyQyxTQUFTLEdBQVksS0FBSyxDQUFDO0lBQzFCLE1BQU0sR0FBd0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUNqRCxPQUFPLEdBQXdCLElBQUksWUFBWSxF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O1FBQzdELGNBQWM7UUFDZCxNQUFNO1FBQ04sSUFBSTtRQUVKLGtDQUFrQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7WUFDbkIsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQWdCLENBQUM7WUFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FDOUMsVUFBVSxFQUNWLENBQUMsRUFDRCxZQUFZLENBQ2IsQ0FBQztZQUNGLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ25DLGtDQUFrQztZQUNwQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDO0lBQ0osQ0FBQzt3R0F6U1Usa0JBQWtCOzRGQUFsQixrQkFBa0IsOFNDckMvQiw2dEpBd0lBOzs0RkRuR2Esa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGdCQUFnQjsyTUFVakIsU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDSSxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBUUUsY0FBYztzQkFBdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRm9ybUJ1aWxkZXIsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IEVycm9yUmVzcG9uc2UgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IE9iamVjdFN0YXRlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBUaWNrZXQgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFRpY2tldFN0YXR1cyB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHtcbiAgVXRpbFNlcnZpY2UgYXMgQXBwVXRpbFNlcnZpY2UsXG4gIEVudmlyb25tZW50U2VydmljZSxcbn0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL3NlcnZpY2VzJztcbmltcG9ydCB7IEh0dHBXZWJSZXF1ZXN0U2VydmljZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5cbmltcG9ydCB7IFRlbmFudFByaW9yaXR5IH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBUaWNrZXRNZXNzYWdlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBERUZBVUxUX01FU1NBR0VfRk9SX0lOSVRJQUxfVVBMT0FEIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBGaWxlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBTaGFyZWRTZXJ2aWNlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL3NlcnZpY2VzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFkZC10aWNrZXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWRkLXRpY2tldC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9hZGQtdGlja2V0LmNvbXBvbmVudC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBBZGRUaWNrZXRDb21wb25lbnQge1xuICAvLyB0ZXN0OiBzdHJpbmcgPSAnJztcbiAgLy8gbG9nVGVzdCgpIHtcbiAgLy8gICBjb25zb2xlLmxvZyh7IFRlc3Q6IHRoaXMudGVzdCB9KTtcbiAgLy8gfVxuICBjcmVhdGVUaWNrZXRGb3JtOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIGFjdGl2ZUFwcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGFjdGl2ZVRlbmFudDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHNlbGVjdGVkVGlja2V0OiBUaWNrZXQgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgaXNWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBvbk9wZW46IEV2ZW50RW1pdHRlcjxFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbkNsb3NlOiBFdmVudEVtaXR0ZXI8RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25TYXZlOiBFdmVudEVtaXR0ZXI8VGlja2V0PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwcmlvcml0eU9wdGlvbnM6IFRlbmFudFByaW9yaXR5W10gPSBbXTtcbiAgc3RhdHVzT3B0aW9uczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhUaWNrZXRTdGF0dXMpO1xuICBmaWxlRGF0YTogRmlsZVtdID0gW107XG4gIGZpbGVVcmxzOiBzdHJpbmdbXSA9IFtdO1xuICAvL2F0dGFjaGVkTWVzc2FnZTogVGlja2V0TWVzc2FnZSB8IG51bGwgPSBudWxsO1xuICBtYXhGaWxlU2l6ZSA9IDE1ICogMTAyNCAqIDEwMjQ7XG4gIEBJbnB1dCgpIGRlZmF1bHRDb21wYW55OiBzdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHV0aWxTZXJ2aWNlOiBBcHBVdGlsU2VydmljZSxcbiAgICBwcml2YXRlIHNlcnZlcjogSHR0cFdlYlJlcXVlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcbiAgICBwcml2YXRlIGVudlN2YzogRW52aXJvbm1lbnRTZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLmNyZWF0ZVRpY2tldEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIFRpdGxlOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBEZXNjcmlwdGlvbjogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgQ3VycmVudEhhbmRsZXI6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPih7XG4gICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgTGFzdEhhbmRsZXI6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPih7XG4gICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgUHJpb3JpdHk6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIFN0YXR1czogbmV3IEZvcm1Db250cm9sPFRpY2tldFN0YXR1cz4oXG4gICAgICAgIHsgdmFsdWU6IFRpY2tldFN0YXR1cy5QZW5kaW5nLCBkaXNhYmxlZDogdHJ1ZSB9LFxuICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgKSxcbiAgICB9KTtcblxuICAgIC8vIHRoaXMuY3JlYXRlVGlja2V0Rm9ybS5jb250cm9sc1snQ3VycmVudEhhbmRsZXInXS5kaXNhYmxlKCk7XG4gICAgLy8gdGhpcy5jcmVhdGVUaWNrZXRGb3JtLmNvbnRyb2xzWydMYXN0SGFuZGxlciddLmRpc2FibGUoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge31cblxuICBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkVGlja2V0J10gJiYgdGhpcy5zZWxlY3RlZFRpY2tldCkge1xuICAgICAgdGhpcy5jcmVhdGVUaWNrZXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBUaXRsZTogdGhpcy5zZWxlY3RlZFRpY2tldC5UaXRsZSxcbiAgICAgICAgRGVzY3JpcHRpb246IHRoaXMuc2VsZWN0ZWRUaWNrZXQuRGVzY3JpcHRpb24sXG4gICAgICAgIEN1cnJlbnRIYW5kbGVyOiB0aGlzLnNlbGVjdGVkVGlja2V0LkN1cnJlbnRIYW5kbGVyLFxuICAgICAgICBMYXN0SGFuZGxlcjogdGhpcy5zZWxlY3RlZFRpY2tldC5MYXN0SGFuZGxlcixcbiAgICAgICAgUHJpb3JpdHk6IHRoaXMuc2VsZWN0ZWRUaWNrZXQuUHJpb3JpdHksXG4gICAgICAgIFN0YXR1czogdGhpcy5zZWxlY3RlZFRpY2tldC5TdGF0dXMsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZmlsZVVybHMgPSBbLi4udGhpcy5zZWxlY3RlZFRpY2tldC5GaWxlVXJsc107XG4gICAgICB0aGlzLmZpbGVEYXRhID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JlYXRlVGlja2V0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgVGl0bGU6IG51bGwsXG4gICAgICAgIERlc2NyaXB0aW9uOiBudWxsLFxuICAgICAgICBDdXJyZW50SGFuZGxlcjogbnVsbCxcbiAgICAgICAgTGFzdEhhbmRsZXI6IG51bGwsXG4gICAgICAgIFByaW9yaXR5OiBudWxsLFxuICAgICAgICBTdGF0dXM6IFRpY2tldFN0YXR1cy5QZW5kaW5nLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmZpbGVVcmxzID0gW107XG4gICAgICB0aGlzLmZpbGVEYXRhID0gW107XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ2FjdGl2ZVRlbmFudCddICYmIHRoaXMuYWN0aXZlVGVuYW50KSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldEFsbFByaW9yaXRpZXNGb3JUZW5hbnQoXG4gICAgICAgIHRoaXMuYWN0aXZlVGVuYW50LFxuICAgICAgKTtcbiAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMucHJpb3JpdHlPcHRpb25zID0gb3B0aW9ucy5SZXN1bHQ7XG4gICAgICB9XG4gICAgICAvLyAgY29uc29sZS5sb2coeyBDaGFuZ2VkOiB0aGlzLnByaW9yaXR5T3B0aW9ucyB9KTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZXNbJ2FjdGl2ZVRlbmFudCddICYmICF0aGlzLmFjdGl2ZVRlbmFudCkge1xuICAgICAgdGhpcy5wcmlvcml0eU9wdGlvbnMgPSBbXTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKHsgVGVuYW50OiB0aGlzLmFjdGl2ZVRlbmFudCwgUmVzZXQ6IHRoaXMucHJpb3JpdHlPcHRpb25zIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrRm9ybSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jcmVhdGVUaWNrZXRGb3JtLnZhbGlkID09IHRydWUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvbk1vZGFsT3BlbihldmVudDogYW55KSB7XG4gICAgdGhpcy5vbk9wZW4uZW1pdCgpO1xuICB9XG5cbiAgb25Nb2RhbENsb3NlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm9uQ2xvc2UuZW1pdChldmVudCk7XG4gIH1cblxuICAvLyBmaWx0ZXJNZXNzYWdlKG1lc3NhZ2U6IFRpY2tldE1lc3NhZ2UpOiBUaWNrZXRNZXNzYWdlIHtcbiAgLy8gICByZXR1cm4ge1xuICAvLyAgICAgLi4ubWVzc2FnZSxcbiAgLy8gICAgIEF0dGFjaG1lbnRVcmxzOiBtZXNzYWdlLkF0dGFjaG1lbnRVcmxzLmZpbHRlcihcbiAgLy8gICAgICAgKHgpID0+IHguc3BsaXQoJy8nKS5sZW5ndGggPiAxXG4gIC8vICAgICApLFxuICAvLyAgIH07XG4gIC8vIH1cblxuICBhc3luYyBzYXZlKCkge1xuICAgIGlmICghdGhpcy5hY3RpdmVBcHApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmFjdGl2ZVRlbmFudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBpZiAodGhpcy5zZWxlY3RlZFRpY2tldCAmJiB0aGlzLmF0dGFjaGVkTWVzc2FnZSkge1xuICAgIC8vICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgLy8gICAgIHRoaXMuc2VsZWN0ZWRUaWNrZXQuTWVzc2FnZXNbaWR4XSA9IHRoaXMuZmlsdGVyTWVzc2FnZShcbiAgICAvLyAgICAgICB0aGlzLmF0dGFjaGVkTWVzc2FnZVxuICAgIC8vICAgICApO1xuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgaWYgKHRoaXMuYXR0YWNoZWRNZXNzYWdlLkF0dGFjaG1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAvLyAgICAgICB0aGlzLnNlbGVjdGVkVGlja2V0Lk1lc3NhZ2VzLnVuc2hpZnQoXG4gICAgLy8gICAgICAgICB0aGlzLmZpbHRlck1lc3NhZ2UodGhpcy5hdHRhY2hlZE1lc3NhZ2UpXG4gICAgLy8gICAgICAgKTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIGNvbnN0IGl0ZW06IFRpY2tldCA9IHtcbiAgICAgIFRpdGxlOiB0aGlzLmNyZWF0ZVRpY2tldEZvcm0uY29udHJvbHNbJ1RpdGxlJ10udmFsdWUsXG4gICAgICBEZXNjcmlwdGlvbjogdGhpcy5jcmVhdGVUaWNrZXRGb3JtLmNvbnRyb2xzWydEZXNjcmlwdGlvbiddLnZhbHVlLFxuICAgICAgQ3VycmVudEhhbmRsZXI6IHRoaXMuc2VsZWN0ZWRUaWNrZXRcbiAgICAgICAgPyB0aGlzLnNlbGVjdGVkVGlja2V0LkN1cnJlbnRIYW5kbGVyXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgTGFzdEhhbmRsZXI6IHRoaXMuc2VsZWN0ZWRUaWNrZXRcbiAgICAgICAgPyB0aGlzLnNlbGVjdGVkVGlja2V0Lkxhc3RIYW5kbGVyXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgUHJpb3JpdHk6IHRoaXMuY3JlYXRlVGlja2V0Rm9ybS5jb250cm9sc1snUHJpb3JpdHknXS52YWx1ZSxcbiAgICAgIEFwcDogdGhpcy5hY3RpdmVBcHAsXG4gICAgICBpZDogJycsXG4gICAgICBTdGF0dXM6IHRoaXMuY3JlYXRlVGlja2V0Rm9ybS5jb250cm9sc1snU3RhdHVzJ10udmFsdWUsXG4gICAgICBDb21wYW55OiB0aGlzLmRlZmF1bHRDb21wYW55LFxuICAgICAgTWVzc2FnZXM6IHRoaXMuc2VsZWN0ZWRUaWNrZXQgPyB0aGlzLnNlbGVjdGVkVGlja2V0Lk1lc3NhZ2VzIDogW10sXG4gICAgICBGaWxlRGF0YTogdGhpcy5maWxlRGF0YSxcbiAgICAgIEZpbGVVcmxzOiB0aGlzLnNlbGVjdGVkVGlja2V0ID8gdGhpcy5zZWxlY3RlZFRpY2tldC5GaWxlVXJscyA6IFtdLFxuICAgICAgSWQ6ICcnLFxuICAgICAgRXhlY3V0aW9uVGltZTogdGhpcy5zZWxlY3RlZFRpY2tldFxuICAgICAgICA/IHRoaXMuc2VsZWN0ZWRUaWNrZXQuRXhlY3V0aW9uVGltZVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIENvZGU6IHRoaXMuc2VsZWN0ZWRUaWNrZXQgPyB0aGlzLnNlbGVjdGVkVGlja2V0LkNvZGUgOiAnJyxcbiAgICAgIFRlbmFudElkOiB0aGlzLnNlbGVjdGVkVGlja2V0XG4gICAgICAgID8gdGhpcy5zZWxlY3RlZFRpY2tldC5UZW5hbnRJZFxuICAgICAgICA6IHRoaXMuYWN0aXZlVGVuYW50LFxuICAgICAgU2VydmljZU5hbWU6IHRoaXMuc2VsZWN0ZWRUaWNrZXQgPyB0aGlzLnNlbGVjdGVkVGlja2V0LlNlcnZpY2VOYW1lIDogJycsXG4gICAgICBDcmVhdGVkQXQ6IHRoaXMuc2VsZWN0ZWRUaWNrZXRcbiAgICAgICAgPyB0aGlzLnNlbGVjdGVkVGlja2V0LkNyZWF0ZWRBdFxuICAgICAgICA6IG5ldyBEYXRlKCksXG4gICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICBEYXRhU3RhdGU6IHRoaXMuc2VsZWN0ZWRUaWNrZXQgPyBPYmplY3RTdGF0ZS5DaGFuZ2VkIDogT2JqZWN0U3RhdGUuTmV3LFxuICAgIH07XG5cbiAgICBpZiAoaXRlbS5EZXNjcmlwdGlvbi50cmltKCkubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0luZm8oJ0Rlc2NyaXB0aW9uIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgYFRpY2tldC9TYXZlVGlja2V0YCxcbiAgICAgIFtpdGVtXSxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dTdWNjZXNzKCdUaWNrZXQgc2F2ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXMgYXMgVGlja2V0W107XG4gICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIHJlc3VsdEl0ZW0gPSByZXN1bHRbMF07XG4gICAgICAgIHRoaXMub25TYXZlLmVtaXQocmVzdWx0SXRlbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vbkNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIGdlbmVyYXRlU2l4RGlnaXROdW1iZXIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcigxMDAwMDAgKyBNYXRoLnJhbmRvbSgpICogOTAwMDAwKTtcbiAgfVxuXG4gIGdldFRpY2tldE1lc3NhZ2UoKTogVGlja2V0TWVzc2FnZSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUaWNrZXQpIHtcbiAgICAgIGNvbnN0IGluaXRpYWxNZXNzYWdlID0gdGhpcy5zZWxlY3RlZFRpY2tldC5NZXNzYWdlcy5maW5kKFxuICAgICAgICAoeCkgPT4geC5TdWJqZWN0ID09IERFRkFVTFRfTUVTU0FHRV9GT1JfSU5JVElBTF9VUExPQUQsXG4gICAgICApO1xuICAgICAgaWYgKGluaXRpYWxNZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmluaXRpYWxNZXNzYWdlLCBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLkNoYW5nZWQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld01lc3NhZ2U6IFRpY2tldE1lc3NhZ2UgPSB7XG4gICAgICAgICAgVGlja2V0Q29kZTogJycsXG4gICAgICAgICAgU3ViamVjdDogREVGQVVMVF9NRVNTQUdFX0ZPUl9JTklUSUFMX1VQTE9BRCxcbiAgICAgICAgICBDb250ZW50OiAnJyxcbiAgICAgICAgICBBdHRhY2htZW50czogW10sXG4gICAgICAgICAgQXR0YWNobWVudFVybHM6IFtdLFxuICAgICAgICAgIENvbXBhbnk6IHRoaXMuZGVmYXVsdENvbXBhbnksXG4gICAgICAgICAgSWQ6ICcnLFxuICAgICAgICAgIENvZGU6ICcnLFxuICAgICAgICAgIFRlbmFudElkOiAnJyxcbiAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgU2VydmljZU5hbWU6ICcnLFxuICAgICAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXdNZXNzYWdlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZXdNZXNzYWdlOiBUaWNrZXRNZXNzYWdlID0ge1xuICAgICAgICBUaWNrZXRDb2RlOiAnJyxcbiAgICAgICAgU3ViamVjdDogREVGQVVMVF9NRVNTQUdFX0ZPUl9JTklUSUFMX1VQTE9BRCxcbiAgICAgICAgQ29udGVudDogJycsXG4gICAgICAgIEF0dGFjaG1lbnRzOiBbXSxcbiAgICAgICAgQXR0YWNobWVudFVybHM6IFtdLFxuICAgICAgICBDb21wYW55OiB0aGlzLmRlZmF1bHRDb21wYW55LFxuICAgICAgICBJZDogJycsXG4gICAgICAgIGlkOiAnJyxcbiAgICAgICAgQ29kZTogJycsXG4gICAgICAgIFRlbmFudElkOiAnJyxcbiAgICAgICAgU2VydmljZU5hbWU6ICcnLFxuICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ld01lc3NhZ2U7XG4gICAgfVxuICB9XG5cbiAgdHJpZ2dlckZpbGVVcGxvYWQoKTogdm9pZCB7XG4gICAgY29uc3QgZmlsZUlucHV0OiBIVE1MSW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBmaWxlSW5wdXQudHlwZSA9ICdmaWxlJztcbiAgICBmaWxlSW5wdXQuYWNjZXB0ID0gJy5wbmcsIC5qcGcsIC5qcGVnLCAucGRmJztcbiAgICBmaWxlSW5wdXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgLy8gSGlkZGVuIGZpbGUgaW5wdXRcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZpbGVJbnB1dCk7IC8vIFRlbXBvcmFyaWx5IGFkZCB0byBET01cblxuICAgIGZpbGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlID0gZmlsZUlucHV0LmZpbGVzPy5bMF07XG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICB0aGlzLnByb2Nlc3NGaWxlKGZpbGUpO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmaWxlSW5wdXQpOyAvLyBDbGVhbiB1cCBhZnRlciB1c2VcbiAgICB9KTtcblxuICAgIGZpbGVJbnB1dC5jbGljaygpOyAvLyBQcm9ncmFtbWF0aWNhbGx5IHRyaWdnZXIgY2xpY2tcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0ZpbGUoc2VsZWN0ZWRGaWxlOiBnbG9iYWxUaGlzLkZpbGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBmaWxlIHNpemVcbiAgICBpZiAoc2VsZWN0ZWRGaWxlLnNpemUgPiB0aGlzLm1heEZpbGVTaXplKSB7XG4gICAgICBjb25zdCBsaW1pdEluTUIgPSB0aGlzLm1heEZpbGVTaXplIC8gMTAyNCAvIDEwMjQ7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dJbmZvKGBGaWxlIHNpemUgbGltaXQgb2YgJHtsaW1pdEluTUJ9bWIgZXhjZWVkZWRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBsZXQgZmlsZVRvUHJvY2VzczogZ2xvYmFsVGhpcy5GaWxlIHwgbnVsbCA9IHNlbGVjdGVkRmlsZTtcbiAgICAvLyBjb25zdCBzYWZlTnVtYmVyOiBudW1iZXIgPSAxICogMTAyNCAqIDEwMjQ7XG4gICAgLy8gaWYgKGZpbGVUb1Byb2Nlc3Muc2l6ZSA+IHNhZmVOdW1iZXIpIHtcbiAgICAvLyAgIGZpbGVUb1Byb2Nlc3MgPSBhd2FpdCB0aGlzLnV0aWxTZXJ2aWNlLmNvbXByZXNzSW1hZ2Uoc2VsZWN0ZWRGaWxlKTtcbiAgICAvLyAgIGlmICghZmlsZVRvUHJvY2Vzcykge1xuICAgIC8vICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcignRXJyb3IgY29tcHJlc3NpbmcgaW1hZ2UnKTtcbiAgICAvLyAgICAgcmV0dXJuO1xuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIC8vIFJlYWQgZmlsZSBhbmQgY29udmVydCB0byBiYXNlNjRcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKHNlbGVjdGVkRmlsZSk7XG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2U2NGRhdGEgPSByZWFkZXIucmVzdWx0IGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLnNoYXJlZFNlcnZpY2UuY3JlYXRlQ3VzdG9tRmlsZShcbiAgICAgICAgYmFzZTY0ZGF0YSxcbiAgICAgICAgMCxcbiAgICAgICAgc2VsZWN0ZWRGaWxlLFxuICAgICAgKTtcbiAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgIHRoaXMuZmlsZURhdGEucHVzaChmaWxlKTtcbiAgICAgICAgdGhpcy5maWxlVXJscy5wdXNoKGAke2ZpbGUuTmFtZX1gKTtcbiAgICAgICAgLy8gdGhpcy5wcm9maWxlSW1hZ2UgPSBiYXNlNjRkYXRhO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbiIsIjx2ZXJiZW4tZGlhbG9ndWVcbiAgW3Nob3dDbG9zZUljb25dPVwiZmFsc2VcIlxuICBbZGlzbWlzc091dHNpZGVDbGlja109XCJmYWxzZVwiXG4gIFtjbG9zZU9uRXNjYXBlXT1cInRydWVcIlxuICBbc2l6ZV09XCInbWVkaXVtJ1wiXG4gIFttb2RlXT1cIidkaWFsb2d1ZSdcIlxuICBbY3VzdG9tQ2xhc3NdPVwiJ3RpY2tldC1kaWFsb2cnXCJcbiAgW2Rpc2FibGVGb290ZXJdPVwidHJ1ZVwiXG4gIChvcGVuTW9kYWwpPVwib25Nb2RhbE9wZW4oJGV2ZW50KVwiXG4gIFtpc1Zpc2libGVdPVwiaXNWaXNpYmxlXCJcbiAgW2JvZHlUZW1wbGF0ZV09XCJib2R5VGVtcGxhdGVcIlxuICAoY2xvc2VNb2RhbCk9XCJvbk1vZGFsQ2xvc2UoJGV2ZW50KVwiXG4+XG4gIDxuZy10ZW1wbGF0ZSAjYm9keVRlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYm9keSBwLVsyNXB4XSBmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWhlYWRlciBmbGV4IGZsZXgtY29sIGdhcC0xXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGUgZm9udC1ib2xkIHRleHQteGxcIj5cbiAgICAgICAgICB7eyB0aGlzLnNlbGVjdGVkVGlja2V0ID8gXCJFZGl0IFRpY2tldFwiIDogXCJDcmVhdGUgVGlja2V0XCIgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctc3VidGl0bGVcIj5cbiAgICAgICAgICB7e1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRpY2tldFxuICAgICAgICAgICAgICA/IFwiRmlsbCB0aGUgZm9ybSBiZWxvdyB0byBlZGl0IHNlbGVjdGVkIHRpY2tldFwiXG4gICAgICAgICAgICAgIDogXCJGaWxsIHRoZSBmb3JtIGJlbG93IHRvIGNyZWF0ZSBhIHRpY2tldFwiXG4gICAgICAgICAgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gPHZlcmJlbmEtdGV4dGFyZWEgbmFtZT1cIlRlc3RcIiBbKG5nTW9kZWwpXT1cInRlc3RcIiAvPlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibG9nVGVzdCgpXCI+TG9nPC9idXR0b24+IC0tPlxuICAgICAgPGRpdlxuICAgICAgICBbZm9ybUdyb3VwXT1cImNyZWF0ZVRpY2tldEZvcm1cIlxuICAgICAgICBjbGFzcz1cImFkZC1hcHAtZm9ybSBtYWluLWZvcm0tY29udGFpbmVyIGZsZXggZmxleC1jb2wgZ2FwLTJcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbnB1dC1jb250YWluZXIgZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPlRpdGxlPC9kaXY+XG4gICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgIG5hbWU9XCJUaXRsZVwiXG4gICAgICAgICAgICBwbGFjZUhvbGRlcj1cIlRpdGxlXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIlRpdGxlXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taW5wdXQtY29udGFpbmVyIGZsZXggZmxleC1jb2wgZ2FwLTFcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1tZWRpdW1cIj5EZXNjcmlwdGlvbjwvZGl2PlxuICAgICAgICAgIDx2ZXJiZW5hLWlucHV0IG5hbWU9XCJEZXNjcmlwdGlvblwiIGZvcm1Db250cm9sTmFtZT1cIkRlc2NyaXB0aW9uXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cInRoaXMuc2VsZWN0ZWRUaWNrZXRcIlxuICAgICAgICAgIGNsYXNzPVwiZm9ybS1pbnB1dC1jb250YWluZXIgZmxleCBmbGV4LWNvbCBnYXAtMVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1tZWRpdW1cIj5DdXJyZW50IEhhbmRsZXI8L2Rpdj5cbiAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgbmFtZT1cIkN1cnJlbnRIYW5kbGVyXCJcbiAgICAgICAgICAgIHBsYWNlSG9sZGVyPVwiQ3VycmVudCBIYW5kbGVyXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIkN1cnJlbnRIYW5kbGVyXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwidGhpcy5zZWxlY3RlZFRpY2tldFwiXG4gICAgICAgICAgY2xhc3M9XCJmb3JtLWlucHV0LWNvbnRhaW5lciBmbGV4IGZsZXgtY29sIGdhcC0xXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPkxhc3QgSGFuZGxlcjwvZGl2PlxuICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICBuYW1lPVwiTGFzdEhhbmRsZXJcIlxuICAgICAgICAgICAgcGxhY2VIb2xkZXI9XCJMYXN0IEhhbmRsZXJcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiTGFzdEhhbmRsZXJcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbnB1dC1jb250YWluZXIgZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPlByaW9yaXR5PC9kaXY+XG4gICAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICBuYW1lPVwiUHJpb3JpdHlcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgUHJpb3JpdHlcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwicHJpb3JpdHlPcHRpb25zXCJcbiAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwiTmFtZVwiXG4gICAgICAgICAgICBvcHRpb25WYWx1ZT1cIkNvZGVcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiUHJpb3JpdHlcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3ZlcmJlbi1kcm9wLWRvd24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbnB1dC1jb250YWluZXIgZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPlN0YXR1czwvZGl2PlxuICAgICAgICAgIDx2ZXJiZW4tZHJvcC1kb3duXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgbmFtZT1cIlN0YXR1c1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBTdGF0dXNcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwic3RhdHVzT3B0aW9uc1wiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJTdGF0dXNcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3ZlcmJlbi1kcm9wLWRvd24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0YWNobWVudC1zZWN0aW9uIHAtMiBmbGV4IGZsZXgtY29sIGdhcC0zXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF0dGFjaG1lbnRzLWNvbnRhaW5lciBncmlkIGdyaWQtY29scy0zIGdhcC0yXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWxlIG9mIHRoaXMuZmlsZVVybHNcIj5cbiAgICAgICAgICAgICAgPGFwcC1maWxlLXJlbmRlciBbZmlsZVVybF09XCJmaWxlXCI+PC9hcHAtZmlsZS1yZW5kZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInVwbG9hZC1zZWN0aW9uIGZsZXggZmxleC1jb2wgZmxleC0xIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMlwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICAgICAgICAgICAgW3VzZUljb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2ljb25dPVwiJ3VwbG9hZCdcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidmVyYmVuLXNlY29uZGFyeS1idXR0b25cIlxuICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidVcGxvYWQnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlckZpbGVVcGxvYWQoKVwiXG4gICAgICAgICAgICAgID48L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkLWNhcHRpb24gdGV4dC1zbSB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICBJbmNsdWRlIEF0dGFjaG1lbnRzXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBmbGV4IGp1c3RpZnktZW5kIGdhcC0yXCI+XG4gICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgY2xhc3M9XCJ2ZXJiZW4tc2Vjb25kYXJ5LWJ1dHRvblwiXG4gICAgICAgICAgW3RleHRdPVwiJ0Nsb3NlJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uTW9kYWxDbG9zZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgICBbZGlzYWJsZV09XCIhdGhpcy5jaGVja0Zvcm0oKVwiXG4gICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICBjbGFzcz1cInZlcmJlbi1wcmltYXJ5LWJ1dHRvblwiXG4gICAgICAgICAgW3RleHRdPVwiJ1NhdmUnXCJcbiAgICAgICAgICAoY2xpY2spPVwic2F2ZSgpXCJcbiAgICAgICAgPlxuICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L3ZlcmJlbi1kaWFsb2d1ZT5cbiJdfQ==
329
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXRpY2tldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9hZGQtdGlja2V0L2FkZC10aWNrZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbXBvbmVudHMvYWRkLXRpY2tldC9hZGQtdGlja2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLFdBQVcsRUFFWCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRWpFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQVNsRSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQzs7Ozs7OztBQVMzRixNQUFNLE9BQU8sa0JBQWtCO0lBeUJuQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBNUJWLHFCQUFxQjtJQUNyQixjQUFjO0lBQ2Qsc0NBQXNDO0lBQ3RDLElBQUk7SUFDSixnQkFBZ0IsQ0FBWTtJQUNuQixTQUFTLEdBQWtCLElBQUksQ0FBQztJQUNoQyxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUNuQyxjQUFjLEdBQWtCLElBQUksQ0FBQztJQUNyQyxVQUFVLEdBQVksS0FBSyxDQUFDO0lBQzVCLFNBQVMsR0FBWSxLQUFLLENBQUM7SUFDMUIsTUFBTSxHQUF3QixJQUFJLFlBQVksRUFBRSxDQUFDO0lB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QixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBZ0IsQ0FBQztZQUMzQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUM5QyxVQUFVLEVBQ1YsQ0FBQyxFQUNELFlBQVksQ0FDYixDQUFDO1lBQ0YsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDbkMsa0NBQWtDO1lBQ3BDLENBQUM7UUFDSCxDQUFDLENBQUM7SUFDSixDQUFDO3dHQXZVVSxrQkFBa0I7NEZBQWxCLGtCQUFrQix3VUNyQy9CLDgzSkEySUE7OzRGRHRHYSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZ0JBQWdCOzJNQVVqQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQVNFLGNBQWM7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1CdWlsZGVyLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbiB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBPYmplY3RTdGF0ZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgVGlja2V0IH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBUaWNrZXRTdGF0dXMgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7XG4gIFV0aWxTZXJ2aWNlIGFzIEFwcFV0aWxTZXJ2aWNlLFxuICBFbnZpcm9ubWVudFNlcnZpY2UsXG59IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBIdHRwV2ViUmVxdWVzdFNlcnZpY2UgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvc2VydmljZXMnO1xuXG5pbXBvcnQgeyBUZW5hbnRQcmlvcml0eSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgVGlja2V0TWVzc2FnZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgREVGQVVMVF9NRVNTQUdFX0ZPUl9JTklUSUFMX1VQTE9BRCB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRmlsZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hZGQtdGlja2V0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC10aWNrZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYWRkLXRpY2tldC5jb21wb25lbnQuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQWRkVGlja2V0Q29tcG9uZW50IHtcbiAgLy8gdGVzdDogc3RyaW5nID0gJyc7XG4gIC8vIGxvZ1Rlc3QoKSB7XG4gIC8vICAgY29uc29sZS5sb2coeyBUZXN0OiB0aGlzLnRlc3QgfSk7XG4gIC8vIH1cbiAgY3JlYXRlVGlja2V0Rm9ybTogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBhY3RpdmVBcHA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBhY3RpdmVUZW5hbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBzZWxlY3RlZFRpY2tldDogVGlja2V0IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGlzRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBvbk9wZW46IEV2ZW50RW1pdHRlcjxFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbkNsb3NlOiBFdmVudEVtaXR0ZXI8RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25TYXZlOiBFdmVudEVtaXR0ZXI8VGlja2V0PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwcmlvcml0eU9wdGlvbnM6IFRlbmFudFByaW9yaXR5W10gPSBbXTtcbiAgc3RhdHVzT3B0aW9uczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhUaWNrZXRTdGF0dXMpO1xuICBwZW5kaW5nUmVmOiBUaWNrZXRTdGF0dXMgPSBUaWNrZXRTdGF0dXMuUGVuZGluZztcbiAgZmlsZURhdGE6IEZpbGVbXSA9IFtdO1xuICBmaWxlVXJsczogc3RyaW5nW10gPSBbXTtcbiAgLy9hdHRhY2hlZE1lc3NhZ2U6IFRpY2tldE1lc3NhZ2UgfCBudWxsID0gbnVsbDtcbiAgbWF4RmlsZVNpemUgPSAxNSAqIDEwMjQgKiAxMDI0O1xuICBASW5wdXQoKSBkZWZhdWx0Q29tcGFueTogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSB1dGlsU2VydmljZTogQXBwVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZXJ2ZXI6IEh0dHBXZWJSZXF1ZXN0U2VydmljZSxcbiAgICBwcml2YXRlIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbnZTdmM6IEVudmlyb25tZW50U2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5jcmVhdGVUaWNrZXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBUaXRsZTogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEaXNhYmxlZCxcbiAgICAgICAgfSxcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICksXG4gICAgICBEZXNjcmlwdGlvbjogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEaXNhYmxlZCxcbiAgICAgICAgfSxcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICksXG4gICAgICAvLyBDdXJyZW50SGFuZGxlcjogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KHtcbiAgICAgIC8vICAgdmFsdWU6IG51bGwsXG4gICAgICAvLyAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgLy8gfSksXG4gICAgICAvLyBMYXN0SGFuZGxlcjogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KHtcbiAgICAgIC8vICAgdmFsdWU6IG51bGwsXG4gICAgICAvLyAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgLy8gfSksXG4gICAgICBQcmlvcml0eTogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEaXNhYmxlZCxcbiAgICAgICAgfSxcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICksXG4gICAgICBTdGF0dXM6IG5ldyBGb3JtQ29udHJvbDxUaWNrZXRTdGF0dXM+KFxuICAgICAgICB7IHZhbHVlOiBUaWNrZXRTdGF0dXMuUGVuZGluZywgZGlzYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICAvLyB0aGlzLmNyZWF0ZVRpY2tldEZvcm0uY29udHJvbHNbJ0N1cnJlbnRIYW5kbGVyJ10uZGlzYWJsZSgpO1xuICAgIC8vIHRoaXMuY3JlYXRlVGlja2V0Rm9ybS5jb250cm9sc1snTGFzdEhhbmRsZXInXS5kaXNhYmxlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XG5cbiAgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFRpY2tldCddICYmIHRoaXMuc2VsZWN0ZWRUaWNrZXQpIHtcbiAgICAgIHRoaXMuY3JlYXRlVGlja2V0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgVGl0bGU6IHRoaXMuc2VsZWN0ZWRUaWNrZXQuVGl0bGUsXG4gICAgICAgIERlc2NyaXB0aW9uOiB0aGlzLnNlbGVjdGVkVGlja2V0LkRlc2NyaXB0aW9uLFxuICAgICAgICAvLyBDdXJyZW50SGFuZGxlcjogdGhpcy5zZWxlY3RlZFRpY2tldC5DdXJyZW50SGFuZGxlcixcbiAgICAgICAgLy8gTGFzdEhhbmRsZXI6IHRoaXMuc2VsZWN0ZWRUaWNrZXQuTGFzdEhhbmRsZXIsXG4gICAgICAgIFByaW9yaXR5OiB0aGlzLnNlbGVjdGVkVGlja2V0LlByaW9yaXR5LFxuICAgICAgICBTdGF0dXM6IHRoaXMuc2VsZWN0ZWRUaWNrZXQuU3RhdHVzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmZpbGVVcmxzID0gWy4uLnRoaXMuc2VsZWN0ZWRUaWNrZXQuRmlsZVVybHNdO1xuICAgICAgdGhpcy5maWxlRGF0YSA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyZWF0ZVRpY2tldEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIFRpdGxlOiBudWxsLFxuICAgICAgICBEZXNjcmlwdGlvbjogbnVsbCxcbiAgICAgICAgLy8gQ3VycmVudEhhbmRsZXI6IG51bGwsXG4gICAgICAgIC8vIExhc3RIYW5kbGVyOiBudWxsLFxuICAgICAgICBQcmlvcml0eTogbnVsbCxcbiAgICAgICAgU3RhdHVzOiBUaWNrZXRTdGF0dXMuUGVuZGluZyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5maWxlVXJscyA9IFtdO1xuICAgICAgdGhpcy5maWxlRGF0YSA9IFtdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuY3JlYXRlVGlja2V0Rm9ybS5nZXQoJ1RpdGxlJyk/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5jcmVhdGVUaWNrZXRGb3JtLmdldCgnRGVzY3JpcHRpb24nKT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB0aGlzLmNyZWF0ZVRpY2tldEZvcm0uZ2V0KCdQcmlvcml0eScpPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcmVhdGVUaWNrZXRGb3JtLmdldCgnVGl0bGUnKT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMuY3JlYXRlVGlja2V0Rm9ybS5nZXQoJ0Rlc2NyaXB0aW9uJyk/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB0aGlzLmNyZWF0ZVRpY2tldEZvcm0uZ2V0KCdQcmlvcml0eScpPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydhY3RpdmVUZW5hbnQnXSAmJiB0aGlzLmFjdGl2ZVRlbmFudCkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMuc2hhcmVkU2VydmljZS5nZXRBbGxQcmlvcml0aWVzRm9yVGVuYW50KFxuICAgICAgICB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgICk7XG4gICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICB0aGlzLnByaW9yaXR5T3B0aW9ucyA9IG9wdGlvbnMuUmVzdWx0O1xuICAgICAgfVxuICAgICAgLy8gIGNvbnNvbGUubG9nKHsgQ2hhbmdlZDogdGhpcy5wcmlvcml0eU9wdGlvbnMgfSk7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VzWydhY3RpdmVUZW5hbnQnXSAmJiAhdGhpcy5hY3RpdmVUZW5hbnQpIHtcbiAgICAgIHRoaXMucHJpb3JpdHlPcHRpb25zID0gW107XG4gICAgICAvLyBjb25zb2xlLmxvZyh7IFRlbmFudDogdGhpcy5hY3RpdmVUZW5hbnQsIFJlc2V0OiB0aGlzLnByaW9yaXR5T3B0aW9ucyB9KTtcbiAgICB9XG4gIH1cblxuICBjaGVja0Zvcm0oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY3JlYXRlVGlja2V0Rm9ybS52YWxpZCA9PSB0cnVlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb25Nb2RhbE9wZW4oZXZlbnQ6IGFueSkge1xuICAgIHRoaXMub25PcGVuLmVtaXQoKTtcbiAgfVxuXG4gIG9uTW9kYWxDbG9zZShldmVudDogYW55KSB7XG4gICAgdGhpcy5vbkNsb3NlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLy8gZmlsdGVyTWVzc2FnZShtZXNzYWdlOiBUaWNrZXRNZXNzYWdlKTogVGlja2V0TWVzc2FnZSB7XG4gIC8vICAgcmV0dXJuIHtcbiAgLy8gICAgIC4uLm1lc3NhZ2UsXG4gIC8vICAgICBBdHRhY2htZW50VXJsczogbWVzc2FnZS5BdHRhY2htZW50VXJscy5maWx0ZXIoXG4gIC8vICAgICAgICh4KSA9PiB4LnNwbGl0KCcvJykubGVuZ3RoID4gMVxuICAvLyAgICAgKSxcbiAgLy8gICB9O1xuICAvLyB9XG5cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlQXBwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5hY3RpdmVUZW5hbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gaWYgKHRoaXMuc2VsZWN0ZWRUaWNrZXQgJiYgdGhpcy5hdHRhY2hlZE1lc3NhZ2UpIHtcbiAgICAvLyAgIGlmIChpZHggPiAtMSkge1xuICAgIC8vICAgICB0aGlzLnNlbGVjdGVkVGlja2V0Lk1lc3NhZ2VzW2lkeF0gPSB0aGlzLmZpbHRlck1lc3NhZ2UoXG4gICAgLy8gICAgICAgdGhpcy5hdHRhY2hlZE1lc3NhZ2VcbiAgICAvLyAgICAgKTtcbiAgICAvLyAgIH0gZWxzZSB7XG4gICAgLy8gICAgIGlmICh0aGlzLmF0dGFjaGVkTWVzc2FnZS5BdHRhY2htZW50cy5sZW5ndGggPiAwKSB7XG4gICAgLy8gICAgICAgdGhpcy5zZWxlY3RlZFRpY2tldC5NZXNzYWdlcy51bnNoaWZ0KFxuICAgIC8vICAgICAgICAgdGhpcy5maWx0ZXJNZXNzYWdlKHRoaXMuYXR0YWNoZWRNZXNzYWdlKVxuICAgIC8vICAgICAgICk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH1cbiAgICAvLyB9XG5cbiAgICBjb25zdCBpdGVtOiBUaWNrZXQgPSB7XG4gICAgICBUaXRsZTogdGhpcy5jcmVhdGVUaWNrZXRGb3JtLmNvbnRyb2xzWydUaXRsZSddLnZhbHVlLFxuICAgICAgRGVzY3JpcHRpb246IHRoaXMuY3JlYXRlVGlja2V0Rm9ybS5jb250cm9sc1snRGVzY3JpcHRpb24nXS52YWx1ZSxcbiAgICAgIEN1cnJlbnRIYW5kbGVyOiB0aGlzLnNlbGVjdGVkVGlja2V0XG4gICAgICAgID8gdGhpcy5zZWxlY3RlZFRpY2tldC5DdXJyZW50SGFuZGxlclxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIExhc3RIYW5kbGVyOiB0aGlzLnNlbGVjdGVkVGlja2V0XG4gICAgICAgID8gdGhpcy5zZWxlY3RlZFRpY2tldC5MYXN0SGFuZGxlclxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIFByaW9yaXR5OiB0aGlzLmNyZWF0ZVRpY2tldEZvcm0uY29udHJvbHNbJ1ByaW9yaXR5J10udmFsdWUsXG4gICAgICBBcHA6IHRoaXMuYWN0aXZlQXBwLFxuICAgICAgaWQ6ICcnLFxuICAgICAgU3RhdHVzOiB0aGlzLmNyZWF0ZVRpY2tldEZvcm0uY29udHJvbHNbJ1N0YXR1cyddLnZhbHVlLFxuICAgICAgQ29tcGFueTogdGhpcy5kZWZhdWx0Q29tcGFueSxcbiAgICAgIE1lc3NhZ2VzOiB0aGlzLnNlbGVjdGVkVGlja2V0ID8gdGhpcy5zZWxlY3RlZFRpY2tldC5NZXNzYWdlcyA6IFtdLFxuICAgICAgRmlsZURhdGE6IHRoaXMuZmlsZURhdGEsXG4gICAgICBGaWxlVXJsczogdGhpcy5zZWxlY3RlZFRpY2tldCA/IHRoaXMuc2VsZWN0ZWRUaWNrZXQuRmlsZVVybHMgOiBbXSxcbiAgICAgIElkOiAnJyxcbiAgICAgIEV4ZWN1dGlvblRpbWU6IHRoaXMuc2VsZWN0ZWRUaWNrZXRcbiAgICAgICAgPyB0aGlzLnNlbGVjdGVkVGlja2V0LkV4ZWN1dGlvblRpbWVcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBDb2RlOiB0aGlzLnNlbGVjdGVkVGlja2V0ID8gdGhpcy5zZWxlY3RlZFRpY2tldC5Db2RlIDogJycsXG4gICAgICBUZW5hbnRJZDogdGhpcy5zZWxlY3RlZFRpY2tldFxuICAgICAgICA/IHRoaXMuc2VsZWN0ZWRUaWNrZXQuVGVuYW50SWRcbiAgICAgICAgOiB0aGlzLmFjdGl2ZVRlbmFudCxcbiAgICAgIFNlcnZpY2VOYW1lOiB0aGlzLnNlbGVjdGVkVGlja2V0ID8gdGhpcy5zZWxlY3RlZFRpY2tldC5TZXJ2aWNlTmFtZSA6ICcnLFxuICAgICAgQ3JlYXRlZEF0OiB0aGlzLnNlbGVjdGVkVGlja2V0XG4gICAgICAgID8gdGhpcy5zZWxlY3RlZFRpY2tldC5DcmVhdGVkQXRcbiAgICAgICAgOiBuZXcgRGF0ZSgpLFxuICAgICAgVXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgRGF0YVN0YXRlOiB0aGlzLnNlbGVjdGVkVGlja2V0ID8gT2JqZWN0U3RhdGUuQ2hhbmdlZCA6IE9iamVjdFN0YXRlLk5ldyxcbiAgICB9O1xuXG4gICAgaWYgKGl0ZW0uRGVzY3JpcHRpb24udHJpbSgpLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dJbmZvKCdEZXNjcmlwdGlvbiBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgIGBUaWNrZXQvU2F2ZVRpY2tldGAsXG4gICAgICBbaXRlbV0sXG4gICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93U3VjY2VzcygnVGlja2V0IHNhdmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzIGFzIFRpY2tldFtdO1xuICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciByZXN1bHRJdGVtID0gcmVzdWx0WzBdO1xuICAgICAgICB0aGlzLm9uU2F2ZS5lbWl0KHJlc3VsdEl0ZW0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub25DbG9zZS5lbWl0KCk7XG4gIH1cblxuICBnZW5lcmF0ZVNpeERpZ2l0TnVtYmVyKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoMTAwMDAwICsgTWF0aC5yYW5kb20oKSAqIDkwMDAwMCk7XG4gIH1cblxuICBnZXRUaWNrZXRNZXNzYWdlKCk6IFRpY2tldE1lc3NhZ2Uge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkVGlja2V0KSB7XG4gICAgICBjb25zdCBpbml0aWFsTWVzc2FnZSA9IHRoaXMuc2VsZWN0ZWRUaWNrZXQuTWVzc2FnZXMuZmluZChcbiAgICAgICAgKHgpID0+IHguU3ViamVjdCA9PSBERUZBVUxUX01FU1NBR0VfRk9SX0lOSVRJQUxfVVBMT0FELFxuICAgICAgKTtcbiAgICAgIGlmIChpbml0aWFsTWVzc2FnZSkge1xuICAgICAgICByZXR1cm4geyAuLi5pbml0aWFsTWVzc2FnZSwgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5DaGFuZ2VkIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdNZXNzYWdlOiBUaWNrZXRNZXNzYWdlID0ge1xuICAgICAgICAgIFRpY2tldENvZGU6ICcnLFxuICAgICAgICAgIFN1YmplY3Q6IERFRkFVTFRfTUVTU0FHRV9GT1JfSU5JVElBTF9VUExPQUQsXG4gICAgICAgICAgQ29udGVudDogJycsXG4gICAgICAgICAgQXR0YWNobWVudHM6IFtdLFxuICAgICAgICAgIEF0dGFjaG1lbnRVcmxzOiBbXSxcbiAgICAgICAgICBDb21wYW55OiB0aGlzLmRlZmF1bHRDb21wYW55LFxuICAgICAgICAgIElkOiAnJyxcbiAgICAgICAgICBDb2RlOiAnJyxcbiAgICAgICAgICBUZW5hbnRJZDogJycsXG4gICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgVXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3TWVzc2FnZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV3TWVzc2FnZTogVGlja2V0TWVzc2FnZSA9IHtcbiAgICAgICAgVGlja2V0Q29kZTogJycsXG4gICAgICAgIFN1YmplY3Q6IERFRkFVTFRfTUVTU0FHRV9GT1JfSU5JVElBTF9VUExPQUQsXG4gICAgICAgIENvbnRlbnQ6ICcnLFxuICAgICAgICBBdHRhY2htZW50czogW10sXG4gICAgICAgIEF0dGFjaG1lbnRVcmxzOiBbXSxcbiAgICAgICAgQ29tcGFueTogdGhpcy5kZWZhdWx0Q29tcGFueSxcbiAgICAgICAgSWQ6ICcnLFxuICAgICAgICBpZDogJycsXG4gICAgICAgIENvZGU6ICcnLFxuICAgICAgICBUZW5hbnRJZDogJycsXG4gICAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgICAgQ3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgICAgfTtcbiAgICAgIHJldHVybiBuZXdNZXNzYWdlO1xuICAgIH1cbiAgfVxuXG4gIHRyaWdnZXJGaWxlVXBsb2FkKCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbGVJbnB1dDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgZmlsZUlucHV0LnR5cGUgPSAnZmlsZSc7XG4gICAgZmlsZUlucHV0LmFjY2VwdCA9ICcucG5nLCAuanBnLCAuanBlZywgLnBkZic7XG4gICAgZmlsZUlucHV0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IC8vIEhpZGRlbiBmaWxlIGlucHV0XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmaWxlSW5wdXQpOyAvLyBUZW1wb3JhcmlseSBhZGQgdG8gRE9NXG5cbiAgICBmaWxlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IGZpbGVJbnB1dC5maWxlcz8uWzBdO1xuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzRmlsZShmaWxlKTtcbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZmlsZUlucHV0KTsgLy8gQ2xlYW4gdXAgYWZ0ZXIgdXNlXG4gICAgfSk7XG5cbiAgICBmaWxlSW5wdXQuY2xpY2soKTsgLy8gUHJvZ3JhbW1hdGljYWxseSB0cmlnZ2VyIGNsaWNrXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NGaWxlKHNlbGVjdGVkRmlsZTogZ2xvYmFsVGhpcy5GaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2hlY2sgZmlsZSBzaXplXG4gICAgaWYgKHNlbGVjdGVkRmlsZS5zaXplID4gdGhpcy5tYXhGaWxlU2l6ZSkge1xuICAgICAgY29uc3QgbGltaXRJbk1CID0gdGhpcy5tYXhGaWxlU2l6ZSAvIDEwMjQgLyAxMDI0O1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93SW5mbyhgRmlsZSBzaXplIGxpbWl0IG9mICR7bGltaXRJbk1CfW1iIGV4Y2VlZGVkYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gbGV0IGZpbGVUb1Byb2Nlc3M6IGdsb2JhbFRoaXMuRmlsZSB8IG51bGwgPSBzZWxlY3RlZEZpbGU7XG4gICAgLy8gY29uc3Qgc2FmZU51bWJlcjogbnVtYmVyID0gMSAqIDEwMjQgKiAxMDI0O1xuICAgIC8vIGlmIChmaWxlVG9Qcm9jZXNzLnNpemUgPiBzYWZlTnVtYmVyKSB7XG4gICAgLy8gICBmaWxlVG9Qcm9jZXNzID0gYXdhaXQgdGhpcy51dGlsU2VydmljZS5jb21wcmVzc0ltYWdlKHNlbGVjdGVkRmlsZSk7XG4gICAgLy8gICBpZiAoIWZpbGVUb1Byb2Nlc3MpIHtcbiAgICAvLyAgICAgdGhpcy51dGlsU2VydmljZS5zaG93RXJyb3IoJ0Vycm9yIGNvbXByZXNzaW5nIGltYWdlJyk7XG4gICAgLy8gICAgIHJldHVybjtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG5cbiAgICAvLyBSZWFkIGZpbGUgYW5kIGNvbnZlcnQgdG8gYmFzZTY0XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChzZWxlY3RlZEZpbGUpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBiYXNlNjRkYXRhID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBmaWxlID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNyZWF0ZUN1c3RvbUZpbGUoXG4gICAgICAgIGJhc2U2NGRhdGEsXG4gICAgICAgIDAsXG4gICAgICAgIHNlbGVjdGVkRmlsZSxcbiAgICAgICk7XG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICB0aGlzLmZpbGVEYXRhLnB1c2goZmlsZSk7XG4gICAgICAgIHRoaXMuZmlsZVVybHMucHVzaChgJHtmaWxlLk5hbWV9YCk7XG4gICAgICAgIC8vIHRoaXMucHJvZmlsZUltYWdlID0gYmFzZTY0ZGF0YTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gZ2V0IGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gIC8vICAgaWYgKCF0aGlzLnNlbGVjdGVkVGlja2V0KSB7XG4gIC8vICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgfVxuICAvLyAgIHJldHVybiAhKHRoaXMuc2VsZWN0ZWRUaWNrZXQuU3RhdHVzID09IHRoaXMucGVuZGluZ1JlZik7XG4gIC8vIH1cbn1cbiIsIjx2ZXJiZW4tZGlhbG9ndWVcbiAgW3Nob3dDbG9zZUljb25dPVwiZmFsc2VcIlxuICBbZGlzbWlzc091dHNpZGVDbGlja109XCJmYWxzZVwiXG4gIFtjbG9zZU9uRXNjYXBlXT1cInRydWVcIlxuICBbc2l6ZV09XCInbWVkaXVtJ1wiXG4gIFttb2RlXT1cIidkaWFsb2d1ZSdcIlxuICBbY3VzdG9tQ2xhc3NdPVwiJ3RpY2tldC1kaWFsb2cnXCJcbiAgW2Rpc2FibGVGb290ZXJdPVwidHJ1ZVwiXG4gIChvcGVuTW9kYWwpPVwib25Nb2RhbE9wZW4oJGV2ZW50KVwiXG4gIFtpc1Zpc2libGVdPVwiaXNWaXNpYmxlXCJcbiAgW2JvZHlUZW1wbGF0ZV09XCJib2R5VGVtcGxhdGVcIlxuICAoY2xvc2VNb2RhbCk9XCJvbk1vZGFsQ2xvc2UoJGV2ZW50KVwiXG4+XG4gIDxuZy10ZW1wbGF0ZSAjYm9keVRlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYm9keSBwLVsyNXB4XSBmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWhlYWRlciBmbGV4IGZsZXgtY29sIGdhcC0xXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGUgZm9udC1ib2xkIHRleHQteGxcIj5cbiAgICAgICAgICB7eyB0aGlzLnNlbGVjdGVkVGlja2V0ID8gXCJFZGl0IFRpY2tldFwiIDogXCJDcmVhdGUgVGlja2V0XCIgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctc3VidGl0bGVcIj5cbiAgICAgICAgICB7e1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRpY2tldFxuICAgICAgICAgICAgICA/IFwiRmlsbCB0aGUgZm9ybSBiZWxvdyB0byBlZGl0IHNlbGVjdGVkIHRpY2tldFwiXG4gICAgICAgICAgICAgIDogXCJGaWxsIHRoZSBmb3JtIGJlbG93IHRvIGNyZWF0ZSBhIHRpY2tldFwiXG4gICAgICAgICAgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gPHZlcmJlbmEtdGV4dGFyZWEgbmFtZT1cIlRlc3RcIiBbKG5nTW9kZWwpXT1cInRlc3RcIiAvPlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibG9nVGVzdCgpXCI+TG9nPC9idXR0b24+IC0tPlxuICAgICAgPGRpdlxuICAgICAgICBbZm9ybUdyb3VwXT1cImNyZWF0ZVRpY2tldEZvcm1cIlxuICAgICAgICBjbGFzcz1cImFkZC1hcHAtZm9ybSBtYWluLWZvcm0tY29udGFpbmVyIGZsZXggZmxleC1jb2wgZ2FwLTJcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbnB1dC1jb250YWluZXIgZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPlRpdGxlPC9kaXY+XG4gICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgIG5hbWU9XCJUaXRsZVwiXG4gICAgICAgICAgICBwbGFjZUhvbGRlcj1cIlRpdGxlXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIlRpdGxlXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taW5wdXQtY29udGFpbmVyIGZsZXggZmxleC1jb2wgZ2FwLTFcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1tZWRpdW1cIj5EZXNjcmlwdGlvbjwvZGl2PlxuICAgICAgICAgIDx2ZXJiZW5hLWlucHV0IG5hbWU9XCJEZXNjcmlwdGlvblwiIGZvcm1Db250cm9sTmFtZT1cIkRlc2NyaXB0aW9uXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gPGRpdlxuICAgICAgICAgICpuZ0lmPVwidGhpcy5zZWxlY3RlZFRpY2tldFwiXG4gICAgICAgICAgY2xhc3M9XCJmb3JtLWlucHV0LWNvbnRhaW5lciBmbGV4IGZsZXgtY29sIGdhcC0xXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPkN1cnJlbnQgSGFuZGxlcjwvZGl2PlxuICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICBuYW1lPVwiQ3VycmVudEhhbmRsZXJcIlxuICAgICAgICAgICAgcGxhY2VIb2xkZXI9XCJDdXJyZW50IEhhbmRsZXJcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImNyZWF0ZVRpY2tldEZvcm0uZ2V0KCdDdXJyZW50SGFuZGxlcicpPy52YWx1ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwidGhpcy5zZWxlY3RlZFRpY2tldFwiXG4gICAgICAgICAgY2xhc3M9XCJmb3JtLWlucHV0LWNvbnRhaW5lciBmbGV4IGZsZXgtY29sIGdhcC0xXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bVwiPkxhc3QgSGFuZGxlcjwvZGl2PlxuICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICBuYW1lPVwiTGFzdEhhbmRsZXJcIlxuICAgICAgICAgICAgcGxhY2VIb2xkZXI9XCJMYXN0IEhhbmRsZXJcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImNyZWF0ZVRpY2tldEZvcm0uZ2V0KCdMYXN0SGFuZGxlcicpPy52YWx1ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWlucHV0LWNvbnRhaW5lciBmbGV4IGZsZXgtY29sIGdhcC0xXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtbWVkaXVtXCI+UHJpb3JpdHk8L2Rpdj5cbiAgICAgICAgICA8dmVyYmVuLWRyb3AtZG93blxuICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgIG5hbWU9XCJQcmlvcml0eVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBQcmlvcml0eVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJwcmlvcml0eU9wdGlvbnNcIlxuICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJOYW1lXCJcbiAgICAgICAgICAgIG9wdGlvblZhbHVlPVwiQ29kZVwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJQcmlvcml0eVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvdmVyYmVuLWRyb3AtZG93bj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWlucHV0LWNvbnRhaW5lciBmbGV4IGZsZXgtY29sIGdhcC0xXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtbWVkaXVtXCI+U3RhdHVzPC9kaXY+XG4gICAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICBuYW1lPVwiU3RhdHVzXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFN0YXR1c1wiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzdGF0dXNPcHRpb25zXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIlN0YXR1c1wiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvdmVyYmVuLWRyb3AtZG93bj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdHRhY2htZW50LXNlY3Rpb24gcC0yIGZsZXggZmxleC1jb2wgZ2FwLTNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0YWNobWVudHMtY29udGFpbmVyIGdyaWQgZ3JpZC1jb2xzLTMgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpbGUgb2YgdGhpcy5maWxlVXJsc1wiPlxuICAgICAgICAgICAgICA8YXBwLWZpbGUtcmVuZGVyIFtmaWxlVXJsXT1cImZpbGVcIj48L2FwcC1maWxlLXJlbmRlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwidXBsb2FkLXNlY3Rpb24gZmxleCBmbGV4LWNvbCBmbGV4LTEgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0yXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgICAgICAgICBbdXNlSWNvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCIndXBsb2FkJ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ2ZXJiZW4tc2Vjb25kYXJ5LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW3RleHRdPVwiJ1VwbG9hZCdcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0cmlnZ2VyRmlsZVVwbG9hZCgpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJpc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgPjwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtY2FwdGlvbiB0ZXh0LXNtIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgIEluY2x1ZGUgQXR0YWNobWVudHNcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy1idXR0b24tY29udGFpbmVyIGZsZXgganVzdGlmeS1lbmQgZ2FwLTJcIj5cbiAgICAgICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICBjbGFzcz1cInZlcmJlbi1zZWNvbmRhcnktYnV0dG9uXCJcbiAgICAgICAgICBbdGV4dF09XCInQ2xvc2UnXCJcbiAgICAgICAgICAoY2xpY2spPVwib25Nb2RhbENsb3NlKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgIDwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgIFtkaXNhYmxlXT1cIiF0aGlzLmNoZWNrRm9ybSgpXCJcbiAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgIGNsYXNzPVwidmVyYmVuLXByaW1hcnktYnV0dG9uXCJcbiAgICAgICAgICBbdGV4dF09XCInU2F2ZSdcIlxuICAgICAgICAgIChjbGljayk9XCJzYXZlKClcIlxuICAgICAgICA+XG4gICAgICAgIDwvdmVyYmVuYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvdmVyYmVuLWRpYWxvZ3VlPlxuIl19