@bizdoc/core 2.3.20 → 2.3.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -133,11 +133,11 @@ export class BrowseFilterComponent {
133
133
  this._destroy.complete();
134
134
  }
135
135
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: BrowseFilterComponent, deps: [{ token: i1.FormBuilder }, { token: i2.SessionService }, { token: i0.ChangeDetectorRef }, { token: i3.MailboxService }, { token: i4.AccountService }, { token: BIZDOC_CONFIG }], target: i0.ɵɵFactoryTarget.Component }); }
136
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.1", type: BrowseFilterComponent, selector: "bizdoc-browse-filter", inputs: { values: "values", folderId: "folderId", exclude: "exclude" }, outputs: { valuesChange: "valuesChange" }, viewQueries: [{ propertyName: "chips", first: true, predicate: MatChipListbox, descendants: true, static: true }, { propertyName: "contains", first: true, predicate: ["contains"], descendants: true, read: ElementRef, static: true }, { propertyName: "sender", first: true, predicate: ["sender"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"form\" class=\"column\">\n @if (!exclude || exclude.indexOf('contains') < 0) {\n <mat-form-field subscriptSizing=\"dynamic\">\n <input matInput formControlName=\"contains\" autocomplete=\"off\" placeholder=\"{{'Contains' | translate}}\" #contains>\n @if (form.value.contains) {\n <button matSuffix mat-icon-button aria-label=\"\" (click)=\"form.controls.contains.setValue(null)\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n }\n <mat-form-field subscriptSizing=\"dynamic\">\n <input matInput [matAutocomplete]=\"senders\" [placeholder]=\"'Sender' | translate\" [formControl]=\"senderId\" #sender />\n <mat-autocomplete #senders [displayWith]=\"displayFn\" (optionSelected)=\"senderSelected($event)\">\n @for (u of senders$ | async; track u) {\n <mat-option [value]=\"u\">\n <span>{{u.name}}</span>\n </mat-option>\n }\n </mat-autocomplete>\n @if (senderId.value) {\n <button matSuffix mat-icon-button (click)=\"clearSender()\"><mat-icon>clear</mat-icon></button>\n }\n </mat-form-field>\n <mat-form-field subscriptSizing=\"dynamic\">\n <mat-select [placeholder]=\"'Status'|translate\" formControlName=\"state\">\n <mat-option>\n {{ 'All' | translate }}\n </mat-option>\n @for (s of states; track s) {\n <mat-option [value]=\"s.name\">\n {{s.title}}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-form-field subscriptSizing=\"dynamic\">\n <mat-select [placeholder]=\"'Form' | translate\" formControlName=\"form\">\n <mat-option>\n {{ 'All' | translate }}\n </mat-option>\n @for (f of forms; track f) {\n <mat-option [value]=\"f.name\">{{f.title}}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-chip-listbox id=\"tags\" (change)=\"toggleTag($event)\">\n @for (tag of tags; track tag) {\n <mat-chip-option color=\"accent\">\n {{tag}}\n </mat-chip-option>\n }\n </mat-chip-listbox>\n @if (filters) {\n <bizdoc-cube-filter class=\"cube-filter\"\n [cube]=\"filters.cube\"\n [include]=\"filters.axes\"\n [axes]=\"values\"\n (axesChange)=\"axesChange($event)\"></bizdoc-cube-filter>\n }\n</form>\n", styles: [".cube-filter ::ng-deep form{padding:0}\n"], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["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: i5.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i5.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i9.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i13.CubeFilterComponent, selector: "bizdoc-cube-filter", inputs: ["cube", "exclude", "include", "axes"], outputs: ["axesChange"] }, { kind: "pipe", type: i14.AsyncPipe, name: "async" }, { kind: "pipe", type: i15.TranslatePipe, name: "translate" }] }); }
136
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.1", type: BrowseFilterComponent, selector: "bizdoc-browse-filter", inputs: { values: "values", folderId: "folderId", exclude: "exclude" }, outputs: { valuesChange: "valuesChange" }, viewQueries: [{ propertyName: "chips", first: true, predicate: MatChipListbox, descendants: true, static: true }, { propertyName: "contains", first: true, predicate: ["contains"], descendants: true, read: ElementRef, static: true }, { propertyName: "sender", first: true, predicate: ["sender"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"form\" class=\"column gap\">\n @if (!exclude || exclude.indexOf('contains') < 0) {\n <mat-form-field subscriptSizing=\"dynamic\">\n <input matInput formControlName=\"contains\" autocomplete=\"off\" placeholder=\"{{'Contains' | translate}}\" #contains>\n @if (form.value.contains) {\n <button matSuffix mat-icon-button aria-label=\"\" (click)=\"form.controls.contains.setValue(null)\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n }\n <mat-form-field subscriptSizing=\"dynamic\">\n <input matInput [matAutocomplete]=\"senders\" [placeholder]=\"'Sender' | translate\" [formControl]=\"senderId\" #sender />\n <mat-autocomplete #senders [displayWith]=\"displayFn\" (optionSelected)=\"senderSelected($event)\">\n @for (u of senders$ | async; track u) {\n <mat-option [value]=\"u\">\n <span>{{u.name}}</span>\n </mat-option>\n }\n </mat-autocomplete>\n @if (senderId.value) {\n <button matSuffix mat-icon-button (click)=\"clearSender()\"><mat-icon>clear</mat-icon></button>\n }\n </mat-form-field>\n <mat-form-field subscriptSizing=\"dynamic\">\n <mat-select [placeholder]=\"'Status'|translate\" formControlName=\"state\">\n <mat-option>\n {{ 'All' | translate }}\n </mat-option>\n @for (s of states; track s) {\n <mat-option [value]=\"s.name\">\n {{s.title}}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-form-field subscriptSizing=\"dynamic\">\n <mat-select [placeholder]=\"'Form' | translate\" formControlName=\"form\">\n <mat-option>\n {{ 'All' | translate }}\n </mat-option>\n @for (f of forms; track f) {\n <mat-option [value]=\"f.name\">{{f.title}}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-chip-listbox id=\"tags\" (change)=\"toggleTag($event)\">\n @for (tag of tags; track tag) {\n <mat-chip-option color=\"accent\">\n {{tag}}\n </mat-chip-option>\n }\n </mat-chip-listbox>\n @if (filters) {\n <bizdoc-cube-filter class=\"cube-filter\"\n [cube]=\"filters.cube\"\n [include]=\"filters.axes\"\n [axes]=\"values\"\n (axesChange)=\"axesChange($event)\"></bizdoc-cube-filter>\n }\n</form>\n", styles: [".cube-filter ::ng-deep form{padding:0}\n"], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["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: i5.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i5.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i9.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i13.CubeFilterComponent, selector: "bizdoc-cube-filter", inputs: ["cube", "exclude", "include", "axes"], outputs: ["axesChange"] }, { kind: "pipe", type: i14.AsyncPipe, name: "async" }, { kind: "pipe", type: i15.TranslatePipe, name: "translate" }] }); }
137
137
  }
138
138
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: BrowseFilterComponent, decorators: [{
139
139
  type: Component,
140
- args: [{ selector: 'bizdoc-browse-filter', template: "<form [formGroup]=\"form\" class=\"column\">\n @if (!exclude || exclude.indexOf('contains') < 0) {\n <mat-form-field subscriptSizing=\"dynamic\">\n <input matInput formControlName=\"contains\" autocomplete=\"off\" placeholder=\"{{'Contains' | translate}}\" #contains>\n @if (form.value.contains) {\n <button matSuffix mat-icon-button aria-label=\"\" (click)=\"form.controls.contains.setValue(null)\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n }\n <mat-form-field subscriptSizing=\"dynamic\">\n <input matInput [matAutocomplete]=\"senders\" [placeholder]=\"'Sender' | translate\" [formControl]=\"senderId\" #sender />\n <mat-autocomplete #senders [displayWith]=\"displayFn\" (optionSelected)=\"senderSelected($event)\">\n @for (u of senders$ | async; track u) {\n <mat-option [value]=\"u\">\n <span>{{u.name}}</span>\n </mat-option>\n }\n </mat-autocomplete>\n @if (senderId.value) {\n <button matSuffix mat-icon-button (click)=\"clearSender()\"><mat-icon>clear</mat-icon></button>\n }\n </mat-form-field>\n <mat-form-field subscriptSizing=\"dynamic\">\n <mat-select [placeholder]=\"'Status'|translate\" formControlName=\"state\">\n <mat-option>\n {{ 'All' | translate }}\n </mat-option>\n @for (s of states; track s) {\n <mat-option [value]=\"s.name\">\n {{s.title}}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-form-field subscriptSizing=\"dynamic\">\n <mat-select [placeholder]=\"'Form' | translate\" formControlName=\"form\">\n <mat-option>\n {{ 'All' | translate }}\n </mat-option>\n @for (f of forms; track f) {\n <mat-option [value]=\"f.name\">{{f.title}}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-chip-listbox id=\"tags\" (change)=\"toggleTag($event)\">\n @for (tag of tags; track tag) {\n <mat-chip-option color=\"accent\">\n {{tag}}\n </mat-chip-option>\n }\n </mat-chip-listbox>\n @if (filters) {\n <bizdoc-cube-filter class=\"cube-filter\"\n [cube]=\"filters.cube\"\n [include]=\"filters.axes\"\n [axes]=\"values\"\n (axesChange)=\"axesChange($event)\"></bizdoc-cube-filter>\n }\n</form>\n", styles: [".cube-filter ::ng-deep form{padding:0}\n"] }]
140
+ args: [{ selector: 'bizdoc-browse-filter', template: "<form [formGroup]=\"form\" class=\"column gap\">\n @if (!exclude || exclude.indexOf('contains') < 0) {\n <mat-form-field subscriptSizing=\"dynamic\">\n <input matInput formControlName=\"contains\" autocomplete=\"off\" placeholder=\"{{'Contains' | translate}}\" #contains>\n @if (form.value.contains) {\n <button matSuffix mat-icon-button aria-label=\"\" (click)=\"form.controls.contains.setValue(null)\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n }\n <mat-form-field subscriptSizing=\"dynamic\">\n <input matInput [matAutocomplete]=\"senders\" [placeholder]=\"'Sender' | translate\" [formControl]=\"senderId\" #sender />\n <mat-autocomplete #senders [displayWith]=\"displayFn\" (optionSelected)=\"senderSelected($event)\">\n @for (u of senders$ | async; track u) {\n <mat-option [value]=\"u\">\n <span>{{u.name}}</span>\n </mat-option>\n }\n </mat-autocomplete>\n @if (senderId.value) {\n <button matSuffix mat-icon-button (click)=\"clearSender()\"><mat-icon>clear</mat-icon></button>\n }\n </mat-form-field>\n <mat-form-field subscriptSizing=\"dynamic\">\n <mat-select [placeholder]=\"'Status'|translate\" formControlName=\"state\">\n <mat-option>\n {{ 'All' | translate }}\n </mat-option>\n @for (s of states; track s) {\n <mat-option [value]=\"s.name\">\n {{s.title}}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-form-field subscriptSizing=\"dynamic\">\n <mat-select [placeholder]=\"'Form' | translate\" formControlName=\"form\">\n <mat-option>\n {{ 'All' | translate }}\n </mat-option>\n @for (f of forms; track f) {\n <mat-option [value]=\"f.name\">{{f.title}}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-chip-listbox id=\"tags\" (change)=\"toggleTag($event)\">\n @for (tag of tags; track tag) {\n <mat-chip-option color=\"accent\">\n {{tag}}\n </mat-chip-option>\n }\n </mat-chip-listbox>\n @if (filters) {\n <bizdoc-cube-filter class=\"cube-filter\"\n [cube]=\"filters.cube\"\n [include]=\"filters.axes\"\n [axes]=\"values\"\n (axesChange)=\"axesChange($event)\"></bizdoc-cube-filter>\n }\n</form>\n", styles: [".cube-filter ::ng-deep form{padding:0}\n"] }]
141
141
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.SessionService }, { type: i0.ChangeDetectorRef }, { type: i3.MailboxService }, { type: i4.AccountService }, { type: undefined, decorators: [{
142
142
  type: Inject,
143
143
  args: [BIZDOC_CONFIG]
@@ -159,4 +159,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImpor
159
159
  type: ViewChild,
160
160
  args: ['sender', { static: true, read: ElementRef }]
161
161
  }] } });
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvYnJvd3NlL2ZpbHRlci9maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUvc3JjL2xpYi9icm93c2UvZmlsdGVyL2ZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXFCLFNBQVMsRUFBNEIsS0FBSyxFQUFFLFVBQVUsRUFBb0MsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSXJMLE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFJekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFnQixhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUF3QixNQUFNLHlCQUF5QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQUUvRSxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFPNUIsNkJBQTZCO0FBQzdCLE1BQU0sT0FBTyxxQkFBcUI7SUEyQmhDLHlCQUF5QjtJQUN6QixZQUFvQixHQUFnQixFQUMxQixRQUF3QixFQUN4QixHQUFzQixFQUN0QixRQUF3QixFQUN4QixTQUF5QixFQUNGLE9BQXFCO1FBTGxDLFFBQUcsR0FBSCxHQUFHLENBQWE7UUFDMUIsYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFDeEIsUUFBRyxHQUFILEdBQUcs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ZW50LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBJbnB1dCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcclxuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwsIHN3aXRjaE1hcCwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBTdGF0ZSwgRm9ybSwgVXNlckluZm8sIEF4ZXNNYXAgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscyc7XHJcbmltcG9ydCB7IGNsZWFudXAsIGlzU3RyaW5nIH0gZnJvbSAnLi4vLi4vY29yZS9mdW5jdGlvbnMnO1xyXG5pbXBvcnQgeyBTZXNzaW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2Vzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWFpbGJveFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL21haWxib3guc2VydmljZSc7XHJcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9hY2NvdW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBWElTX1ZBTFVFX1BBVFRFUk4gfSBmcm9tICcuLi8uLi9jdWJlL2N1YmUuc2VydmljZSc7XHJcbmltcG9ydCB7IEJpekRvY0NvbmZpZywgQklaRE9DX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvcmUvY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7IE1hdENoaXBMaXN0Ym94LCBNYXRDaGlwTGlzdGJveENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcclxuXHJcbmNvbnN0IEZJTFRFUl9ERUJPVU5DRSA9IDI1MDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYml6ZG9jLWJyb3dzZS1maWx0ZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2ZpbHRlci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbi8qKiBicm93c2UtZmlsdGVyIGNvbXBvbmVudCovXHJcbmV4cG9ydCBjbGFzcyBCcm93c2VGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICByZWFkb25seSBwYXR0ZXJuID0gQVhJU19WQUxVRV9QQVRURVJOO1xyXG4gIEBJbnB1dCgpIHZhbHVlczogQnJvd3NlRmlsdGVyQXJncztcclxuICBASW5wdXQoKSBmb2xkZXJJZD86IHN0cmluZztcclxuICBASW5wdXQoKSBleGNsdWRlPzogc3RyaW5nW107XHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHZhbHVlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QnJvd3NlRmlsdGVyQXJncz4oKTtcclxuICByZWFkb25seSBzZW5kZXJJZCA9IHRoaXMuX2ZiLmNvbnRyb2wobnVsbCk7XHJcbiAgcmVhZG9ubHkgZm9ybSA9IHRoaXMuX2ZiLmdyb3VwPEJyb3dzZUZpbHRlckFyZ3M+KHtcclxuICAgIGNvbnRhaW5zOiBudWxsLFxyXG4gICAgZm9ybTogbnVsbCxcclxuICAgIHN0YXRlOiBudWxsLFxyXG4gICAgc2VuZGVySWQ6IG51bGwsXHJcbiAgICB0YWc6IG51bGxcclxuICB9KTtcclxuICBmb3JtczogRm9ybVtdO1xyXG4gIHN0YXRlczogU3RhdGVbXTtcclxuICBzZW5kZXJzJDogT2JzZXJ2YWJsZTxVc2VySW5mb1tdPjtcclxuICB0YWdzOiBzdHJpbmdbXTtcclxuICBmaWx0ZXJzOiB7XHJcbiAgICBjdWJlPzogc3RyaW5nO1xyXG4gICAgYXhlczogc3RyaW5nW107XHJcbiAgfTtcclxuICBAVmlld0NoaWxkKE1hdENoaXBMaXN0Ym94LCB7IHN0YXRpYzogdHJ1ZSB9KSBjaGlwczogTWF0Q2hpcExpc3Rib3g7XHJcbiAgQFZpZXdDaGlsZCgnY29udGFpbnMnLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9KSBjb250YWluczogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdzZW5kZXInLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9KSBzZW5kZXI6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcbiAgcmVhZG9ubHkgc291cmNlczogeyBbZGF0YXR5cGU6IHN0cmluZ106IE9ic2VydmFibGU8eyBbbmFtZTogc3RyaW5nXTogYW55IH0+IH0gPSB7fTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAvKiogYnJvd3NlLWZpbHRlciBjdG9yICovXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIF9tYWlsYm94OiBNYWlsYm94U2VydmljZSxcclxuICAgIHByaXZhdGUgX2FjY291bnRzOiBBY2NvdW50U2VydmljZSxcclxuICAgIEBJbmplY3QoQklaRE9DX0NPTkZJRykgcHJpdmF0ZSBfY29uZmlnOiBCaXpEb2NDb25maWcpIHtcclxuICAgIHRoaXMuc3RhdGVzID0gX3Nlc3Npb24ucHJvZmlsZS5zdGF0ZXM7XHJcbiAgICB0aGlzLmZvcm1zID0gX3Nlc3Npb24ucHJvZmlsZS5mb3JtcztcclxuICAgIHRoaXMudGFncyA9IF9zZXNzaW9uLnByb2ZpbGUub3B0aW9ucy50YWdzO1xyXG4gIH1cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlbmRlcklkKSB0aGlzLnNlbmRlcnMkID0gdGhpcy5zZW5kZXJJZC52YWx1ZUNoYW5nZXMuXHJcbiAgICAgIHBpcGUoZGVib3VuY2VUaW1lKDI1MCksXHJcbiAgICAgICAgZmlsdGVyKHYgPT4gaXNTdHJpbmcodikpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSwgc3dpdGNoTWFwKHYgPT4gdGhpcy5fbWFpbGJveC5zZW5kZXJzKHYpKSk7XHJcbiAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpLCBkZWJvdW5jZVRpbWUoRklMVEVSX0RFQk9VTkNFKSkuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICBjb25zdCB2YWx1ZTogQnJvd3NlRmlsdGVyQXJncyA9IHsgLi4udiB9O1xyXG4gICAgICBjbGVhbnVwKHZhbHVlKTtcclxuICAgICAgdGhpcy52YWx1ZXNDaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX2luaXRpYWxpemUoKTtcclxuICAgIHRoaXMuc2V0VmFsdWUodGhpcy52YWx1ZXMpO1xyXG4gIH1cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZvY3VzKCk7XHJcbiAgfVxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIHRoaXMuX2luaXRpYWxpemUoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZSgpIHtcclxuICAgIGlmICh0aGlzLmZvbGRlcklkKSB7XHJcbiAgICAgIGNvbnN0IGZvbGRlciA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5mb2xkZXJzLmZpbmQoZiA9PiBmLm5hbWUgPT09IHRoaXMuZm9sZGVySWQpO1xyXG4gICAgICBpZiAoZm9sZGVyLmZpbHRlcnMpXHJcbiAgICAgICAgdGhpcy5maWx0ZXJzID0gZm9sZGVyLmZpbHRlcnM7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9jb25maWcuZm9sZGVycyAmJiB0aGlzLl9jb25maWcuZm9sZGVycy5heGVzKSB7XHJcbiAgICAgIGNvbnN0IHsgYXhlcywgY3ViZSB9ID0gdGhpcy5fY29uZmlnLmZvbGRlcnM7XHJcbiAgICAgIHRoaXMuZmlsdGVycyA9IHsgYXhlcywgY3ViZSB9O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmZpbHRlcnMgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgZGlzcGxheShrZXlWYWx1ZSkge1xyXG4gICAgcmV0dXJuIGtleVZhbHVlID8ga2V5VmFsdWUudmFsdWUgOiBudWxsO1xyXG4gIH1cclxuICBjaGFuZ2UoYXhpczogc3RyaW5nLCBldnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpIHtcclxuICAgIHRoaXMuZm9ybS5jb250cm9sc1theGlzXS5zZXRWYWx1ZShldnQub3B0aW9uLnZhbHVlLmtleSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXRWYWx1ZSh2YWx1ZTogQnJvd3NlRmlsdGVyQXJncykge1xyXG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgIGNvbnRhaW5zOiBudWxsLFxyXG4gICAgICBmb3JtOiBudWxsLFxyXG4gICAgICBzdGF0ZTogbnVsbCxcclxuICAgICAgc2VuZGVySWQ6IG51bGwsXHJcbiAgICAgIGZsYWc6IG51bGwsXHJcbiAgICAgIHRhZzogbnVsbFxyXG4gICAgfSwgdmFsdWUpLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICBpZiAodmFsdWUuc2VuZGVySWQpXHJcbiAgICAgIHRoaXMuX2FjY291bnRzLmdldCh2YWx1ZS5zZW5kZXJJZCkuc3Vic2NyaWJlKHUgPT4gdGhpcy5zZW5kZXJJZC5zZXRWYWx1ZSh1LCB7IGVtaXRFdmVudDogZmFsc2UgfSkpO1xyXG4gICAgdGhpcy5jaGlwcy52YWx1ZSA9IHZhbHVlLnRhZztcclxuICB9XHJcbiAgY2xlYXJTZW5kZXIoKSB7XHJcbiAgICB0aGlzLnNlbmRlcklkLnNldFZhbHVlKG51bGwpO1xyXG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyBzZW5kZXJJZDogbnVsbCB9KTtcclxuICB9XHJcbiAgYXhlc0NoYW5nZShheGVzOiBBeGVzTWFwKSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHsgLi4udGhpcy5mb3JtLnZhbHVlLCAuLi5heGVzIH07XHJcbiAgICBjbGVhbnVwKHZhbHVlKTtcclxuICAgIHRoaXMudmFsdWVzQ2hhbmdlLmVtaXQodmFsdWUpO1xyXG4gIH1cclxuICB0b2dnbGVUYWcoZXZ0OiBNYXRDaGlwTGlzdGJveENoYW5nZSkge1xyXG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzLnRhZy5zZXRWYWx1ZSh0aGlzLmZvcm0uY29udHJvbHMudGFnLnZhbHVlICE9PSBldnQudmFsdWUgPyBldnQudmFsdWUgOiBudWxsKTtcclxuICB9XHJcbiAgZGlzcGxheUZuKGl0ZW06IFVzZXJJbmZvKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiBpdGVtID8gaXRlbS5uYW1lIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuICBkcm9wKGV2dDogQ2RrRHJhZ0Ryb3A8c3RyaW5nLCBhbnk+KSB7XHJcbiAgICBldnQuaXRlbS5kYXRhO1xyXG4gIH1cclxuICBzZW5kZXJTZWxlY3RlZChlOiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KSB7XHJcbiAgICBjb25zdCBpbmZvID0gZS5vcHRpb24udmFsdWUgYXMgVXNlckluZm87XHJcbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IHNlbmRlcklkOiBpbmZvID8gaW5mby5pZCA6IG51bGwgfSk7XHJcbiAgfVxyXG4gIGZvY3VzKCkge1xyXG4gICAgaWYgKHRoaXMuY29udGFpbnMpIHRoaXMuY29udGFpbnMubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5zZW5kZXIpIHRoaXMuc2VuZGVyLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGVzdHJveS5uZXh0KCk7XHJcbiAgICB0aGlzLl9kZXN0cm95LmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgQnJvd3NlRmlsdGVyQXJncyB7XHJcbiAgZm9ybT86IHN0cmluZztcclxuICBmbGFnPzogYm9vbGVhbjtcclxuICBzdGF0ZT86IHN0cmluZztcclxuICBjb250YWlucz86IHN0cmluZztcclxuICBzZW5kZXJJZD86IHN0cmluZztcclxuICB0YWc/OiBzdHJpbmc7XHJcbn1cclxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJjb2x1bW5cIj5cbiAgQGlmICghZXhjbHVkZSB8fCBleGNsdWRlLmluZGV4T2YoJ2NvbnRhaW5zJykgPCAwKSB7XG4gIDxtYXQtZm9ybS1maWVsZCBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XG4gICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImNvbnRhaW5zXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgcGxhY2Vob2xkZXI9XCJ7eydDb250YWlucycgfCB0cmFuc2xhdGV9fVwiICNjb250YWlucz5cbiAgICBAaWYgKGZvcm0udmFsdWUuY29udGFpbnMpIHtcbiAgICA8YnV0dG9uIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cIlwiIChjbGljayk9XCJmb3JtLmNvbnRyb2xzLmNvbnRhaW5zLnNldFZhbHVlKG51bGwpXCI+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9tYXQtZm9ybS1maWVsZD5cbiAgfVxuICA8bWF0LWZvcm0tZmllbGQgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgIDxpbnB1dCBtYXRJbnB1dCBbbWF0QXV0b2NvbXBsZXRlXT1cInNlbmRlcnNcIiBbcGxhY2Vob2xkZXJdPVwiJ1NlbmRlcicgfCB0cmFuc2xhdGVcIiBbZm9ybUNvbnRyb2xdPVwic2VuZGVySWRcIiAjc2VuZGVyIC8+XG4gICAgPG1hdC1hdXRvY29tcGxldGUgI3NlbmRlcnMgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlGblwiIChvcHRpb25TZWxlY3RlZCk9XCJzZW5kZXJTZWxlY3RlZCgkZXZlbnQpXCI+XG4gICAgICBAZm9yICh1IG9mIHNlbmRlcnMkIHwgYXN5bmM7IHRyYWNrIHUpIHtcbiAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJ1XCI+XG4gICAgICAgIDxzcGFuPnt7dS5uYW1lfX08L3NwYW4+XG4gICAgICA8L21hdC1vcHRpb24+XG4gICAgICB9XG4gICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgIEBpZiAoc2VuZGVySWQudmFsdWUpIHtcbiAgICA8YnV0dG9uIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImNsZWFyU2VuZGVyKClcIj48bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPjwvYnV0dG9uPlxuICAgIH1cbiAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPG1hdC1mb3JtLWZpZWxkIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICA8bWF0LXNlbGVjdCBbcGxhY2Vob2xkZXJdPVwiJ1N0YXR1cyd8dHJhbnNsYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhdGVcIj5cbiAgICAgIDxtYXQtb3B0aW9uPlxuICAgICAgICB7eyAnQWxsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgQGZvciAocyBvZiBzdGF0ZXM7IHRyYWNrIHMpIHtcbiAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJzLm5hbWVcIj5cbiAgICAgICAge3tzLnRpdGxlfX1cbiAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIH1cbiAgICA8L21hdC1zZWxlY3Q+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDxtYXQtZm9ybS1maWVsZCBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XG4gICAgPG1hdC1zZWxlY3QgW3BsYWNlaG9sZGVyXT1cIidGb3JtJyB8IHRyYW5zbGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cImZvcm1cIj5cbiAgICAgIDxtYXQtb3B0aW9uPlxuICAgICAgICB7eyAnQWxsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgQGZvciAoZiBvZiBmb3JtczsgdHJhY2sgZikge1xuICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImYubmFtZVwiPnt7Zi50aXRsZX19PC9tYXQtb3B0aW9uPlxuICAgICAgfVxuICAgIDwvbWF0LXNlbGVjdD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPG1hdC1jaGlwLWxpc3Rib3ggaWQ9XCJ0YWdzXCIgKGNoYW5nZSk9XCJ0b2dnbGVUYWcoJGV2ZW50KVwiPlxuICAgIEBmb3IgKHRhZyBvZiB0YWdzOyB0cmFjayB0YWcpIHtcbiAgICA8bWF0LWNoaXAtb3B0aW9uIGNvbG9yPVwiYWNjZW50XCI+XG4gICAgICB7e3RhZ319XG4gICAgPC9tYXQtY2hpcC1vcHRpb24+XG4gICAgfVxuICA8L21hdC1jaGlwLWxpc3Rib3g+XG4gIEBpZiAoZmlsdGVycykge1xuICA8Yml6ZG9jLWN1YmUtZmlsdGVyIGNsYXNzPVwiY3ViZS1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjdWJlXT1cImZpbHRlcnMuY3ViZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2luY2x1ZGVdPVwiZmlsdGVycy5heGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXhlc109XCJ2YWx1ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgIChheGVzQ2hhbmdlKT1cImF4ZXNDaGFuZ2UoJGV2ZW50KVwiPjwvYml6ZG9jLWN1YmUtZmlsdGVyPlxuICB9XG48L2Zvcm0+XG4iXX0=
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvYnJvd3NlL2ZpbHRlci9maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUvc3JjL2xpYi9icm93c2UvZmlsdGVyL2ZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXFCLFNBQVMsRUFBNEIsS0FBSyxFQUFFLFVBQVUsRUFBb0MsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSXJMLE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFJekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFnQixhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUF3QixNQUFNLHlCQUF5QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQUUvRSxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFPNUIsNkJBQTZCO0FBQzdCLE1BQU0sT0FBTyxxQkFBcUI7SUEyQmhDLHlCQUF5QjtJQUN6QixZQUFvQixHQUFnQixFQUMxQixRQUF3QixFQUN4QixHQUFzQixFQUN0QixRQUF3QixFQUN4QixTQUF5QixFQUNGLE9BQXFCO1FBTGxDLFFBQUcsR0FBSCxHQUFHLENBQWE7UUFDMUIsYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFDeEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFDeEIsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7UUFDRixZQUFPLEdBQVAsT0FBTyxDQUFjO1FBaEM3QyxZQUFPLEdBQUcsa0JBQWtCLENBQUM7UUFJbkIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztRQUM5RCxhQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsU0FBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFtQjtZQUMvQyxRQUFRLEVBQUUsSUFBSTtZQUNkLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLEdBQUcsRUFBRSxJQUFJO1NBQ1YsQ0FBQyxDQUFDO1FBWU0sWUFBTyxHQUFnRSxFQUFFLENBQUM7UUFDbEUsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFROUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUN0QyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQzVDLENBQUM7SUFDRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZO2dCQUMzRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNwQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDeEIsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2pHLE1BQU0sS0FBSyxHQUFxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUNELGVBQWU7UUFDYixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBQ0QsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQ08sV0FBVztRQUNqQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakYsSUFBSSxNQUFNLENBQUMsT0FBTztnQkFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQ2hDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0RCxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQzVDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDaEMsQ0FBQzs7WUFFQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQVE7UUFDZCxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFDLENBQUM7SUFDRCxNQUFNLENBQUMsSUFBWSxFQUFFLEdBQWlDO1FBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBQ00sUUFBUSxDQUFDLEtBQXVCO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDakMsUUFBUSxFQUFFLElBQUk7WUFDZCxJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxJQUFJLEVBQUUsSUFBSTtZQUNWLEdBQUcsRUFBRSxJQUFJO1NBQ1YsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksS0FBSyxDQUFDLFFBQVE7WUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUMvQixDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELFVBQVUsQ0FBQyxJQUFhO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxTQUFTLENBQUMsR0FBeUI7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFDRCxTQUFTLENBQUMsSUFBYztRQUN0QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxJQUFJLENBQUMsR0FBNkI7UUFDaEMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELGNBQWMsQ0FBQyxDQUErQjtRQUM1QyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQWlCLENBQUM7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFDRCxLQUFLO1FBQ0gsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ2xELElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7OEdBMUhVLHFCQUFxQix3S0FpQ3RCLGFBQWE7a0dBakNaLHFCQUFxQixzTkFzQnJCLGNBQWMsZ0lBQ29CLFVBQVUseUdBQ1osVUFBVSxnRUMvQ3ZELGd5RUE2REE7OzJGRHRDYSxxQkFBcUI7a0JBTmpDLFNBQVM7K0JBQ0Usc0JBQXNCOzswQkFzQzdCLE1BQU07MkJBQUMsYUFBYTt5Q0EvQmQsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNhLFlBQVk7c0JBQTlCLE1BQU07Z0JBaUJzQyxLQUFLO3NCQUFqRCxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ2dCLFFBQVE7c0JBQWxFLFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUNBLE1BQU07c0JBQTlELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBJbnB1dCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcclxuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwsIHN3aXRjaE1hcCwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBTdGF0ZSwgRm9ybSwgVXNlckluZm8sIEF4ZXNNYXAgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscyc7XHJcbmltcG9ydCB7IGNsZWFudXAsIGlzU3RyaW5nIH0gZnJvbSAnLi4vLi4vY29yZS9mdW5jdGlvbnMnO1xyXG5pbXBvcnQgeyBTZXNzaW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2Vzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWFpbGJveFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL21haWxib3guc2VydmljZSc7XHJcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9hY2NvdW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBWElTX1ZBTFVFX1BBVFRFUk4gfSBmcm9tICcuLi8uLi9jdWJlL2N1YmUuc2VydmljZSc7XHJcbmltcG9ydCB7IEJpekRvY0NvbmZpZywgQklaRE9DX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvcmUvY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7IE1hdENoaXBMaXN0Ym94LCBNYXRDaGlwTGlzdGJveENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcclxuXHJcbmNvbnN0IEZJTFRFUl9ERUJPVU5DRSA9IDI1MDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYml6ZG9jLWJyb3dzZS1maWx0ZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2ZpbHRlci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbi8qKiBicm93c2UtZmlsdGVyIGNvbXBvbmVudCovXHJcbmV4cG9ydCBjbGFzcyBCcm93c2VGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICByZWFkb25seSBwYXR0ZXJuID0gQVhJU19WQUxVRV9QQVRURVJOO1xyXG4gIEBJbnB1dCgpIHZhbHVlczogQnJvd3NlRmlsdGVyQXJncztcclxuICBASW5wdXQoKSBmb2xkZXJJZD86IHN0cmluZztcclxuICBASW5wdXQoKSBleGNsdWRlPzogc3RyaW5nW107XHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHZhbHVlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QnJvd3NlRmlsdGVyQXJncz4oKTtcclxuICByZWFkb25seSBzZW5kZXJJZCA9IHRoaXMuX2ZiLmNvbnRyb2wobnVsbCk7XHJcbiAgcmVhZG9ubHkgZm9ybSA9IHRoaXMuX2ZiLmdyb3VwPEJyb3dzZUZpbHRlckFyZ3M+KHtcclxuICAgIGNvbnRhaW5zOiBudWxsLFxyXG4gICAgZm9ybTogbnVsbCxcclxuICAgIHN0YXRlOiBudWxsLFxyXG4gICAgc2VuZGVySWQ6IG51bGwsXHJcbiAgICB0YWc6IG51bGxcclxuICB9KTtcclxuICBmb3JtczogRm9ybVtdO1xyXG4gIHN0YXRlczogU3RhdGVbXTtcclxuICBzZW5kZXJzJDogT2JzZXJ2YWJsZTxVc2VySW5mb1tdPjtcclxuICB0YWdzOiBzdHJpbmdbXTtcclxuICBmaWx0ZXJzOiB7XHJcbiAgICBjdWJlPzogc3RyaW5nO1xyXG4gICAgYXhlczogc3RyaW5nW107XHJcbiAgfTtcclxuICBAVmlld0NoaWxkKE1hdENoaXBMaXN0Ym94LCB7IHN0YXRpYzogdHJ1ZSB9KSBjaGlwczogTWF0Q2hpcExpc3Rib3g7XHJcbiAgQFZpZXdDaGlsZCgnY29udGFpbnMnLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9KSBjb250YWluczogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdzZW5kZXInLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9KSBzZW5kZXI6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcbiAgcmVhZG9ubHkgc291cmNlczogeyBbZGF0YXR5cGU6IHN0cmluZ106IE9ic2VydmFibGU8eyBbbmFtZTogc3RyaW5nXTogYW55IH0+IH0gPSB7fTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAvKiogYnJvd3NlLWZpbHRlciBjdG9yICovXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIF9tYWlsYm94OiBNYWlsYm94U2VydmljZSxcclxuICAgIHByaXZhdGUgX2FjY291bnRzOiBBY2NvdW50U2VydmljZSxcclxuICAgIEBJbmplY3QoQklaRE9DX0NPTkZJRykgcHJpdmF0ZSBfY29uZmlnOiBCaXpEb2NDb25maWcpIHtcclxuICAgIHRoaXMuc3RhdGVzID0gX3Nlc3Npb24ucHJvZmlsZS5zdGF0ZXM7XHJcbiAgICB0aGlzLmZvcm1zID0gX3Nlc3Npb24ucHJvZmlsZS5mb3JtcztcclxuICAgIHRoaXMudGFncyA9IF9zZXNzaW9uLnByb2ZpbGUub3B0aW9ucy50YWdzO1xyXG4gIH1cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlbmRlcklkKSB0aGlzLnNlbmRlcnMkID0gdGhpcy5zZW5kZXJJZC52YWx1ZUNoYW5nZXMuXHJcbiAgICAgIHBpcGUoZGVib3VuY2VUaW1lKDI1MCksXHJcbiAgICAgICAgZmlsdGVyKHYgPT4gaXNTdHJpbmcodikpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSwgc3dpdGNoTWFwKHYgPT4gdGhpcy5fbWFpbGJveC5zZW5kZXJzKHYpKSk7XHJcbiAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpLCBkZWJvdW5jZVRpbWUoRklMVEVSX0RFQk9VTkNFKSkuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICBjb25zdCB2YWx1ZTogQnJvd3NlRmlsdGVyQXJncyA9IHsgLi4udiB9O1xyXG4gICAgICBjbGVhbnVwKHZhbHVlKTtcclxuICAgICAgdGhpcy52YWx1ZXNDaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX2luaXRpYWxpemUoKTtcclxuICAgIHRoaXMuc2V0VmFsdWUodGhpcy52YWx1ZXMpO1xyXG4gIH1cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZvY3VzKCk7XHJcbiAgfVxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIHRoaXMuX2luaXRpYWxpemUoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZSgpIHtcclxuICAgIGlmICh0aGlzLmZvbGRlcklkKSB7XHJcbiAgICAgIGNvbnN0IGZvbGRlciA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5mb2xkZXJzLmZpbmQoZiA9PiBmLm5hbWUgPT09IHRoaXMuZm9sZGVySWQpO1xyXG4gICAgICBpZiAoZm9sZGVyLmZpbHRlcnMpXHJcbiAgICAgICAgdGhpcy5maWx0ZXJzID0gZm9sZGVyLmZpbHRlcnM7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9jb25maWcuZm9sZGVycyAmJiB0aGlzLl9jb25maWcuZm9sZGVycy5heGVzKSB7XHJcbiAgICAgIGNvbnN0IHsgYXhlcywgY3ViZSB9ID0gdGhpcy5fY29uZmlnLmZvbGRlcnM7XHJcbiAgICAgIHRoaXMuZmlsdGVycyA9IHsgYXhlcywgY3ViZSB9O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmZpbHRlcnMgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgZGlzcGxheShrZXlWYWx1ZSkge1xyXG4gICAgcmV0dXJuIGtleVZhbHVlID8ga2V5VmFsdWUudmFsdWUgOiBudWxsO1xyXG4gIH1cclxuICBjaGFuZ2UoYXhpczogc3RyaW5nLCBldnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpIHtcclxuICAgIHRoaXMuZm9ybS5jb250cm9sc1theGlzXS5zZXRWYWx1ZShldnQub3B0aW9uLnZhbHVlLmtleSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXRWYWx1ZSh2YWx1ZTogQnJvd3NlRmlsdGVyQXJncykge1xyXG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgIGNvbnRhaW5zOiBudWxsLFxyXG4gICAgICBmb3JtOiBudWxsLFxyXG4gICAgICBzdGF0ZTogbnVsbCxcclxuICAgICAgc2VuZGVySWQ6IG51bGwsXHJcbiAgICAgIGZsYWc6IG51bGwsXHJcbiAgICAgIHRhZzogbnVsbFxyXG4gICAgfSwgdmFsdWUpLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICBpZiAodmFsdWUuc2VuZGVySWQpXHJcbiAgICAgIHRoaXMuX2FjY291bnRzLmdldCh2YWx1ZS5zZW5kZXJJZCkuc3Vic2NyaWJlKHUgPT4gdGhpcy5zZW5kZXJJZC5zZXRWYWx1ZSh1LCB7IGVtaXRFdmVudDogZmFsc2UgfSkpO1xyXG4gICAgdGhpcy5jaGlwcy52YWx1ZSA9IHZhbHVlLnRhZztcclxuICB9XHJcbiAgY2xlYXJTZW5kZXIoKSB7XHJcbiAgICB0aGlzLnNlbmRlcklkLnNldFZhbHVlKG51bGwpO1xyXG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyBzZW5kZXJJZDogbnVsbCB9KTtcclxuICB9XHJcbiAgYXhlc0NoYW5nZShheGVzOiBBeGVzTWFwKSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHsgLi4udGhpcy5mb3JtLnZhbHVlLCAuLi5heGVzIH07XHJcbiAgICBjbGVhbnVwKHZhbHVlKTtcclxuICAgIHRoaXMudmFsdWVzQ2hhbmdlLmVtaXQodmFsdWUpO1xyXG4gIH1cclxuICB0b2dnbGVUYWcoZXZ0OiBNYXRDaGlwTGlzdGJveENoYW5nZSkge1xyXG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzLnRhZy5zZXRWYWx1ZSh0aGlzLmZvcm0uY29udHJvbHMudGFnLnZhbHVlICE9PSBldnQudmFsdWUgPyBldnQudmFsdWUgOiBudWxsKTtcclxuICB9XHJcbiAgZGlzcGxheUZuKGl0ZW06IFVzZXJJbmZvKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiBpdGVtID8gaXRlbS5uYW1lIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuICBkcm9wKGV2dDogQ2RrRHJhZ0Ryb3A8c3RyaW5nLCBhbnk+KSB7XHJcbiAgICBldnQuaXRlbS5kYXRhO1xyXG4gIH1cclxuICBzZW5kZXJTZWxlY3RlZChlOiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KSB7XHJcbiAgICBjb25zdCBpbmZvID0gZS5vcHRpb24udmFsdWUgYXMgVXNlckluZm87XHJcbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IHNlbmRlcklkOiBpbmZvID8gaW5mby5pZCA6IG51bGwgfSk7XHJcbiAgfVxyXG4gIGZvY3VzKCkge1xyXG4gICAgaWYgKHRoaXMuY29udGFpbnMpIHRoaXMuY29udGFpbnMubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5zZW5kZXIpIHRoaXMuc2VuZGVyLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGVzdHJveS5uZXh0KCk7XHJcbiAgICB0aGlzLl9kZXN0cm95LmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgQnJvd3NlRmlsdGVyQXJncyB7XHJcbiAgZm9ybT86IHN0cmluZztcclxuICBmbGFnPzogYm9vbGVhbjtcclxuICBzdGF0ZT86IHN0cmluZztcclxuICBjb250YWlucz86IHN0cmluZztcclxuICBzZW5kZXJJZD86IHN0cmluZztcclxuICB0YWc/OiBzdHJpbmc7XHJcbn1cclxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJjb2x1bW4gZ2FwXCI+XG4gIEBpZiAoIWV4Y2x1ZGUgfHwgZXhjbHVkZS5pbmRleE9mKCdjb250YWlucycpIDwgMCkge1xuICA8bWF0LWZvcm0tZmllbGQgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJjb250YWluc1wiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHBsYWNlaG9sZGVyPVwie3snQ29udGFpbnMnIHwgdHJhbnNsYXRlfX1cIiAjY29udGFpbnM+XG4gICAgQGlmIChmb3JtLnZhbHVlLmNvbnRhaW5zKSB7XG4gICAgPGJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJcIiAoY2xpY2spPVwiZm9ybS5jb250cm9scy5jb250YWlucy5zZXRWYWx1ZShudWxsKVwiPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICB9XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG4gIH1cbiAgPG1hdC1mb3JtLWZpZWxkIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICA8aW5wdXQgbWF0SW5wdXQgW21hdEF1dG9jb21wbGV0ZV09XCJzZW5kZXJzXCIgW3BsYWNlaG9sZGVyXT1cIidTZW5kZXInIHwgdHJhbnNsYXRlXCIgW2Zvcm1Db250cm9sXT1cInNlbmRlcklkXCIgI3NlbmRlciAvPlxuICAgIDxtYXQtYXV0b2NvbXBsZXRlICNzZW5kZXJzIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5Rm5cIiAob3B0aW9uU2VsZWN0ZWQpPVwic2VuZGVyU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgQGZvciAodSBvZiBzZW5kZXJzJCB8IGFzeW5jOyB0cmFjayB1KSB7XG4gICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwidVwiPlxuICAgICAgICA8c3Bhbj57e3UubmFtZX19PC9zcGFuPlxuICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgfVxuICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICBAaWYgKHNlbmRlcklkLnZhbHVlKSB7XG4gICAgPGJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJjbGVhclNlbmRlcigpXCI+PG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgICB9XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDxtYXQtZm9ybS1maWVsZCBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XG4gICAgPG1hdC1zZWxlY3QgW3BsYWNlaG9sZGVyXT1cIidTdGF0dXMnfHRyYW5zbGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cInN0YXRlXCI+XG4gICAgICA8bWF0LW9wdGlvbj5cbiAgICAgICAge3sgJ0FsbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIEBmb3IgKHMgb2Ygc3RhdGVzOyB0cmFjayBzKSB7XG4gICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwicy5uYW1lXCI+XG4gICAgICAgIHt7cy50aXRsZX19XG4gICAgICA8L21hdC1vcHRpb24+XG4gICAgICB9XG4gICAgPC9tYXQtc2VsZWN0PlxuICA8L21hdC1mb3JtLWZpZWxkPlxuICA8bWF0LWZvcm0tZmllbGQgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgIDxtYXQtc2VsZWN0IFtwbGFjZWhvbGRlcl09XCInRm9ybScgfCB0cmFuc2xhdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJmb3JtXCI+XG4gICAgICA8bWF0LW9wdGlvbj5cbiAgICAgICAge3sgJ0FsbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIEBmb3IgKGYgb2YgZm9ybXM7IHRyYWNrIGYpIHtcbiAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJmLm5hbWVcIj57e2YudGl0bGV9fTwvbWF0LW9wdGlvbj5cbiAgICAgIH1cbiAgICA8L21hdC1zZWxlY3Q+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDxtYXQtY2hpcC1saXN0Ym94IGlkPVwidGFnc1wiIChjaGFuZ2UpPVwidG9nZ2xlVGFnKCRldmVudClcIj5cbiAgICBAZm9yICh0YWcgb2YgdGFnczsgdHJhY2sgdGFnKSB7XG4gICAgPG1hdC1jaGlwLW9wdGlvbiBjb2xvcj1cImFjY2VudFwiPlxuICAgICAge3t0YWd9fVxuICAgIDwvbWF0LWNoaXAtb3B0aW9uPlxuICAgIH1cbiAgPC9tYXQtY2hpcC1saXN0Ym94PlxuICBAaWYgKGZpbHRlcnMpIHtcbiAgPGJpemRvYy1jdWJlLWZpbHRlciBjbGFzcz1cImN1YmUtZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY3ViZV09XCJmaWx0ZXJzLmN1YmVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtpbmNsdWRlXT1cImZpbHRlcnMuYXhlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F4ZXNdPVwidmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAoYXhlc0NoYW5nZSk9XCJheGVzQ2hhbmdlKCRldmVudClcIj48L2JpemRvYy1jdWJlLWZpbHRlcj5cbiAgfVxuPC9mb3JtPlxuIl19
@@ -1,8 +1,8 @@
1
- import { Component, HostListener, ViewChild, ElementRef, Inject } from '@angular/core';
1
+ import { Component, HostListener, ViewChild, ElementRef } from '@angular/core';
2
2
  import { Subject } from 'rxjs';
3
3
  import { debounceTime, takeUntil } from 'rxjs/operators';
4
4
  import { ComposeFormComponent } from './form.component';
5
- import { BIZDOC_CONFIG, OpenPolicy } from '../core/configuration';
5
+ import { OpenPolicy } from '../core/configuration';
6
6
  import * as i0 from "@angular/core";
7
7
  import * as i1 from "../core/session.service";
8
8
  import * as i2 from "../core/mailbox.service";
@@ -20,11 +20,13 @@ import * as i13 from "../core/pipes/translate.pipe";
20
20
  /** compose component responsible for editing a form */
21
21
  export class ComposePaneComponent {
22
22
  /** compose ctor */
23
- constructor(_session, _mailbox, _pane, _router, config) {
23
+ constructor(_session, _mailbox, _pane, _router) {
24
24
  this._session = _session;
25
25
  this._mailbox = _mailbox;
26
26
  this._pane = _pane;
27
27
  this._router = _router;
28
+ this.showToolbar = true;
29
+ this._previousTop = 0;
28
30
  this._dragDrop = new Subject();
29
31
  this._destroy = new Subject();
30
32
  this.enableAnalysis = _session.profile.views.length > 0;
@@ -106,6 +108,11 @@ export class ComposePaneComponent {
106
108
  policy: OpenPolicy.Toggle
107
109
  });
108
110
  }
111
+ onScroll(event) {
112
+ const top = event.currentTarget.scrollTop;
113
+ this.showToolbar = this._previousTop > top && top > 0;
114
+ this._previousTop = top;
115
+ }
109
116
  handleDocumentDrop(event) {
110
117
  event.stopPropagation();
111
118
  event.preventDefault();
@@ -165,23 +172,23 @@ export class ComposePaneComponent {
165
172
  view() {
166
173
  this._navigate('views');
167
174
  }
168
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: ComposePaneComponent, deps: [{ token: i1.SessionService }, { token: i2.MailboxService }, { token: i3.PaneRef }, { token: i4.PanesRouter }, { token: BIZDOC_CONFIG }], target: i0.ɵɵFactoryTarget.Component }); }
169
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.1", type: ComposePaneComponent, selector: "bizdoc-compose.pane", host: { listeners: { "document:drop": "handleDocumentDrop($event)", "drop": "handleDrop($event)", "dragenter": "handleEnter($event)", "dragleave": "handleLeave($event)", "dragover": "handleOver($event)", "document:keydown": "handleKeydown($event)" }, classAttribute: "pane" }, viewQueries: [{ propertyName: "form", first: true, predicate: ComposeFormComponent, descendants: true, static: true }, { propertyName: "dropableElement", first: true, predicate: ["dropable"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<mat-toolbar class=\"nav-toolbar\">\n @if (form.page !== undefined) {\n <button mat-icon-button color=\"primary\" (click)=\"form.back()\" [bizdocTooltip]=\"'Back'|translate\" tabindex=\"1\">\n <mat-icon class=\"mat-icon-rtl-mirror\">arrow_back</mat-icon>\n </button>\n }\n @if (model.draft) {\n <button mat-stroked-button color=\"primary\" data-help=\"submit\"\n (click)=\"submit()\" [disabled]=\"!valid||working\">\n <span>{{'Submit' | translate}}</span>\n </button>\n }\n @if (form.actions.length === 1) {\n <button mat-stroked-button color=\"primary\" [attr.data-help]=\"'action-'+form.actions[0].name\" (click)=\"send(model.actions[0])\" [disabled]=\"!valid||working\">\n <span>{{form.actions[0].title}}</span>\n </button>\n }\n @if (form.actions.length > 1) {\n <button mat-stroked-button data-help=\"send\" color=\"primary\" [matMenuTriggerFor]=\"actionMenu\" [disabled]=\"!valid||working\">\n <span>{{'Send' | translate}}</span>\n </button>\n }\n <!-- action -->\n <mat-menu #actionMenu>\n <ng-template matMenuContent>\n @for (a of form.actions; track a; let i = $index) {\n @if (i > 0 && form.actions[i - 1].group !== a.group) {\n <mat-divider></mat-divider>\n }\n <button mat-menu-item (click)=\"send(a.name)\">{{a.title}}</button>\n }\n </ng-template>\n </mat-menu>\n @if (mode === 'compose') {\n <button mat-icon-button (click)=\"save()\" data-help=\"save\" [disabled]=\"!dirty||working\" [bizdocTooltip]=\"'Save'|translate\">\n <mat-icon>save</mat-icon>\n </button>\n }\n <button mat-icon-button data-help=\"tag\" (click)=\"form.tag($event)\" [bizdocTooltip]=\"'Tags' | translate\" [disabled]=\"working\"><mat-icon class=\"filled\">{{model.tags && model.tags.length ?'bookmark':'bookmark_border'}}</mat-icon></button>\n <button mat-icon-button data-help=\"flag\" [bizdocTooltip]=\"'Flagged'| translate\" [disabled]=\"working\" (click)=\"form.flag()\"><mat-icon [class.document-flag]=\"model.flag\">{{model.flag ? 'star' : 'star_border'}}</mat-icon></button>\n <button mat-icon-button (click)=\"form.attach()\" data-help=\"attach\" [bizdocTooltip]=\"'AttachFile' | translate\" [disabled]=\"working\"><mat-icon>attach_file</mat-icon></button>\n @if (mode !== 'compose' && model.pending && !model.completed) {\n <button mat-icon-button [disabled]=\"working\" data-help=\"edit\" (click)=\"edit()\" [bizdocTooltip]=\"'Edit' | translate\"><mat-icon>create</mat-icon></button>\n }\n <span class=\"divider\"></span>\n <button mat-icon-button (click)=\"navTrace()\" [bizdocTooltip]=\"'Trace' | translate\" tabindex=\"1\"><mat-icon>timeline</mat-icon></button>\n <button mat-icon-button (click)=\"navComments()\" data-help=\"comments\" [bizdocTooltip]=\"'Comments' | translate\" [matBadge]=\"newCommentsCount\" [matBadgeHidden]=\"!newCommentsCount\" matBadgeColor=\"accent\">\n <mat-icon [class.filled]=\"model.comments.length > 0\">format_quote</mat-icon>\n </button>\n @if (enableAnalysis) {\n <button mat-icon-button (click)=\"view()\" [bizdocTooltip]=\"'View' | translate\" [attr.aria-label]=\"'View' | translate\" class=\"tool\"><mat-icon>data_usage</mat-icon></button>\n }\n @if (expendable) {\n <button mat-icon-button (click)=\"expand()\" [bizdocTooltip]=\"'Expand' | translate\" [attr.aria-label]=\"'Expand' | translate\"><mat-icon>open_in_new</mat-icon></button>\n }\n <button mat-icon-button [matMenuTriggerFor]=\"optionsMenu\" [bizdocTooltip]=\"'Options' | translate\" [attr.aria-label]=\"'Options' | translate\"><mat-icon>more_vert</mat-icon></button>\n <mat-menu #optionsMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button mat-menu-item (click)=\"form.copy()\" [disabled]=\"working\">\n <!--<mat-icon>content_copy</mat-icon>-->\n <span>{{'Copy' | translate}}</span>\n </button>\n @if (model.draft && !model.issued) {\n <button mat-menu-item (click)=\"discard()\" [disabled]=\"working\">\n <!--<mat-icon>delete_outlined</mat-icon>-->\n <span>{{'Discard' | translate}}</span>\n </button>\n }\n @if (form.help) {\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"form.guide(form.help)\">\n <!--<mat-icon>help_outline</mat-icon>-->\n <span>{{'Help' | translate}}</span>\n </button>\n }\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"close()\"><!--<mat-icon></mat-icon>--><span>{{'Close'| translate}}</span></button>\n </ng-template>\n </mat-menu>\n</mat-toolbar>\n<div class=\"file-dropable flex\" #dropable>\n <bizdoc-form [model]=model #form\n (modelChange)=\"change()\"\n (saved)=\"saved()\"\n (validChange)=\"valid=$event\"\n (workingChange)=\"working=$event\"\n (dirtyChange)=\"dirty=$event\" [mode]=\"mode\"></bizdoc-form>\n</div>\n", styles: [":host{align-items:stretch}\n"], dependencies: [{ kind: "directive", type: i5.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: i6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i7.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i10.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i11.ComposeFormComponent, selector: "bizdoc-form", inputs: ["model", "working", "dirty", "valid", "mode", "contacts"], outputs: ["modelChange", "workingChange", "dirtyChange", "validChange", "saved"] }, { kind: "directive", type: i12.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }] }); }
175
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: ComposePaneComponent, deps: [{ token: i1.SessionService }, { token: i2.MailboxService }, { token: i3.PaneRef }, { token: i4.PanesRouter }], target: i0.ɵɵFactoryTarget.Component }); }
176
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.1", type: ComposePaneComponent, selector: "bizdoc-compose.pane", host: { listeners: { "scroll": "onScroll($event)", "document:drop": "handleDocumentDrop($event)", "drop": "handleDrop($event)", "dragenter": "handleEnter($event)", "dragleave": "handleLeave($event)", "dragover": "handleOver($event)", "document:keydown": "handleKeydown($event)" }, classAttribute: "pane" }, viewQueries: [{ propertyName: "form", first: true, predicate: ComposeFormComponent, descendants: true, static: true }, { propertyName: "dropableElement", first: true, predicate: ["dropable"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<mat-toolbar class=\"nav-toolbar\" [class.sticky]=\"showToolbar\">\n @if (form.page !== undefined) {\n <button mat-icon-button color=\"primary\" (click)=\"form.back()\" [bizdocTooltip]=\"'Back'|translate\" tabindex=\"1\">\n <mat-icon class=\"mat-icon-rtl-mirror\">arrow_back</mat-icon>\n </button>\n }\n @if (model.draft) {\n <button mat-stroked-button color=\"primary\" data-help=\"submit\"\n (click)=\"submit()\" [disabled]=\"!valid||working\">\n <span>{{'Submit' | translate}}</span>\n </button>\n }\n @if (form.actions.length === 1) {\n <button mat-stroked-button color=\"primary\" [attr.data-help]=\"'action-'+form.actions[0].name\" (click)=\"send(model.actions[0])\" [disabled]=\"!valid||working\">\n <span>{{form.actions[0].title}}</span>\n </button>\n }\n @if (form.actions.length > 1) {\n <button mat-stroked-button data-help=\"send\" color=\"primary\" [matMenuTriggerFor]=\"actionMenu\" [disabled]=\"!valid||working\">\n <span>{{'Send' | translate}}</span>\n </button>\n }\n <!-- action -->\n <mat-menu #actionMenu>\n <ng-template matMenuContent>\n @for (a of form.actions; track a; let i = $index) {\n @if (i > 0 && form.actions[i - 1].group !== a.group) {\n <mat-divider></mat-divider>\n }\n <button mat-menu-item (click)=\"send(a.name)\">{{a.title}}</button>\n }\n </ng-template>\n </mat-menu>\n @if (mode === 'compose') {\n <button mat-icon-button (click)=\"save()\" data-help=\"save\" [disabled]=\"!dirty||working\" [bizdocTooltip]=\"'Save'|translate\">\n <mat-icon>save</mat-icon>\n </button>\n }\n <button mat-icon-button data-help=\"tag\" (click)=\"form.tag($event)\" [bizdocTooltip]=\"'Tags' | translate\" [disabled]=\"working\"><mat-icon class=\"filled\">{{model.tags && model.tags.length ?'bookmark':'bookmark_border'}}</mat-icon></button>\n <button mat-icon-button data-help=\"flag\" [bizdocTooltip]=\"'Flagged'| translate\" [disabled]=\"working\" (click)=\"form.flag()\"><mat-icon [class.document-flag]=\"model.flag\">{{model.flag ? 'star' : 'star_border'}}</mat-icon></button>\n <button mat-icon-button (click)=\"form.attach()\" data-help=\"attach\" [bizdocTooltip]=\"'AttachFile' | translate\" [disabled]=\"working\"><mat-icon>attach_file</mat-icon></button>\n @if (mode !== 'compose' && model.pending && !model.completed) {\n <button mat-icon-button [disabled]=\"working\" data-help=\"edit\" (click)=\"edit()\" [bizdocTooltip]=\"'Edit' | translate\"><mat-icon>create</mat-icon></button>\n }\n <span class=\"divider\"></span>\n <button mat-icon-button (click)=\"navTrace()\" [bizdocTooltip]=\"'Trace' | translate\" tabindex=\"1\"><mat-icon>timeline</mat-icon></button>\n <button mat-icon-button (click)=\"navComments()\" data-help=\"comments\" [bizdocTooltip]=\"'Comments' | translate\" [matBadge]=\"newCommentsCount\" [matBadgeHidden]=\"!newCommentsCount\" matBadgeColor=\"accent\">\n <mat-icon [class.filled]=\"model.comments.length > 0\">format_quote</mat-icon>\n </button>\n @if (enableAnalysis) {\n <button mat-icon-button (click)=\"view()\" [bizdocTooltip]=\"'View' | translate\" [attr.aria-label]=\"'View' | translate\" class=\"tool\"><mat-icon>data_usage</mat-icon></button>\n }\n @if (expendable) {\n <button mat-icon-button (click)=\"expand()\" [bizdocTooltip]=\"'Expand' | translate\" [attr.aria-label]=\"'Expand' | translate\"><mat-icon>open_in_new</mat-icon></button>\n }\n <button mat-icon-button [matMenuTriggerFor]=\"optionsMenu\" [bizdocTooltip]=\"'Options' | translate\" [attr.aria-label]=\"'Options' | translate\"><mat-icon>more_vert</mat-icon></button>\n <mat-menu #optionsMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button mat-menu-item (click)=\"form.copy()\" [disabled]=\"working\">\n <!--<mat-icon>content_copy</mat-icon>-->\n <span>{{'Copy' | translate}}</span>\n </button>\n @if (model.draft && !model.issued) {\n <button mat-menu-item (click)=\"discard()\" [disabled]=\"working\">\n <!--<mat-icon>delete_outlined</mat-icon>-->\n <span>{{'Discard' | translate}}</span>\n </button>\n }\n @if (form.help) {\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"form.guide(form.help)\">\n <!--<mat-icon>help_outline</mat-icon>-->\n <span>{{'Help' | translate}}</span>\n </button>\n }\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"close()\"><!--<mat-icon></mat-icon>--><span>{{'Close'| translate}}</span></button>\n </ng-template>\n </mat-menu>\n</mat-toolbar>\n<div class=\"file-dropable flex\" #dropable>\n <bizdoc-form [model]=model #form\n (modelChange)=\"change()\"\n (saved)=\"saved()\"\n (validChange)=\"valid=$event\"\n (workingChange)=\"working=$event\"\n (dirtyChange)=\"dirty=$event\" [mode]=\"mode\"></bizdoc-form>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i5.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: i6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i7.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i10.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i11.ComposeFormComponent, selector: "bizdoc-form", inputs: ["model", "working", "dirty", "valid", "mode", "contacts"], outputs: ["modelChange", "workingChange", "dirtyChange", "validChange", "saved"] }, { kind: "directive", type: i12.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }] }); }
170
177
  }
171
178
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: ComposePaneComponent, decorators: [{
172
179
  type: Component,
173
180
  args: [{ selector: 'bizdoc-compose.pane', host: {
174
181
  class: 'pane'
175
- }, template: "<mat-toolbar class=\"nav-toolbar\">\n @if (form.page !== undefined) {\n <button mat-icon-button color=\"primary\" (click)=\"form.back()\" [bizdocTooltip]=\"'Back'|translate\" tabindex=\"1\">\n <mat-icon class=\"mat-icon-rtl-mirror\">arrow_back</mat-icon>\n </button>\n }\n @if (model.draft) {\n <button mat-stroked-button color=\"primary\" data-help=\"submit\"\n (click)=\"submit()\" [disabled]=\"!valid||working\">\n <span>{{'Submit' | translate}}</span>\n </button>\n }\n @if (form.actions.length === 1) {\n <button mat-stroked-button color=\"primary\" [attr.data-help]=\"'action-'+form.actions[0].name\" (click)=\"send(model.actions[0])\" [disabled]=\"!valid||working\">\n <span>{{form.actions[0].title}}</span>\n </button>\n }\n @if (form.actions.length > 1) {\n <button mat-stroked-button data-help=\"send\" color=\"primary\" [matMenuTriggerFor]=\"actionMenu\" [disabled]=\"!valid||working\">\n <span>{{'Send' | translate}}</span>\n </button>\n }\n <!-- action -->\n <mat-menu #actionMenu>\n <ng-template matMenuContent>\n @for (a of form.actions; track a; let i = $index) {\n @if (i > 0 && form.actions[i - 1].group !== a.group) {\n <mat-divider></mat-divider>\n }\n <button mat-menu-item (click)=\"send(a.name)\">{{a.title}}</button>\n }\n </ng-template>\n </mat-menu>\n @if (mode === 'compose') {\n <button mat-icon-button (click)=\"save()\" data-help=\"save\" [disabled]=\"!dirty||working\" [bizdocTooltip]=\"'Save'|translate\">\n <mat-icon>save</mat-icon>\n </button>\n }\n <button mat-icon-button data-help=\"tag\" (click)=\"form.tag($event)\" [bizdocTooltip]=\"'Tags' | translate\" [disabled]=\"working\"><mat-icon class=\"filled\">{{model.tags && model.tags.length ?'bookmark':'bookmark_border'}}</mat-icon></button>\n <button mat-icon-button data-help=\"flag\" [bizdocTooltip]=\"'Flagged'| translate\" [disabled]=\"working\" (click)=\"form.flag()\"><mat-icon [class.document-flag]=\"model.flag\">{{model.flag ? 'star' : 'star_border'}}</mat-icon></button>\n <button mat-icon-button (click)=\"form.attach()\" data-help=\"attach\" [bizdocTooltip]=\"'AttachFile' | translate\" [disabled]=\"working\"><mat-icon>attach_file</mat-icon></button>\n @if (mode !== 'compose' && model.pending && !model.completed) {\n <button mat-icon-button [disabled]=\"working\" data-help=\"edit\" (click)=\"edit()\" [bizdocTooltip]=\"'Edit' | translate\"><mat-icon>create</mat-icon></button>\n }\n <span class=\"divider\"></span>\n <button mat-icon-button (click)=\"navTrace()\" [bizdocTooltip]=\"'Trace' | translate\" tabindex=\"1\"><mat-icon>timeline</mat-icon></button>\n <button mat-icon-button (click)=\"navComments()\" data-help=\"comments\" [bizdocTooltip]=\"'Comments' | translate\" [matBadge]=\"newCommentsCount\" [matBadgeHidden]=\"!newCommentsCount\" matBadgeColor=\"accent\">\n <mat-icon [class.filled]=\"model.comments.length > 0\">format_quote</mat-icon>\n </button>\n @if (enableAnalysis) {\n <button mat-icon-button (click)=\"view()\" [bizdocTooltip]=\"'View' | translate\" [attr.aria-label]=\"'View' | translate\" class=\"tool\"><mat-icon>data_usage</mat-icon></button>\n }\n @if (expendable) {\n <button mat-icon-button (click)=\"expand()\" [bizdocTooltip]=\"'Expand' | translate\" [attr.aria-label]=\"'Expand' | translate\"><mat-icon>open_in_new</mat-icon></button>\n }\n <button mat-icon-button [matMenuTriggerFor]=\"optionsMenu\" [bizdocTooltip]=\"'Options' | translate\" [attr.aria-label]=\"'Options' | translate\"><mat-icon>more_vert</mat-icon></button>\n <mat-menu #optionsMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button mat-menu-item (click)=\"form.copy()\" [disabled]=\"working\">\n <!--<mat-icon>content_copy</mat-icon>-->\n <span>{{'Copy' | translate}}</span>\n </button>\n @if (model.draft && !model.issued) {\n <button mat-menu-item (click)=\"discard()\" [disabled]=\"working\">\n <!--<mat-icon>delete_outlined</mat-icon>-->\n <span>{{'Discard' | translate}}</span>\n </button>\n }\n @if (form.help) {\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"form.guide(form.help)\">\n <!--<mat-icon>help_outline</mat-icon>-->\n <span>{{'Help' | translate}}</span>\n </button>\n }\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"close()\"><!--<mat-icon></mat-icon>--><span>{{'Close'| translate}}</span></button>\n </ng-template>\n </mat-menu>\n</mat-toolbar>\n<div class=\"file-dropable flex\" #dropable>\n <bizdoc-form [model]=model #form\n (modelChange)=\"change()\"\n (saved)=\"saved()\"\n (validChange)=\"valid=$event\"\n (workingChange)=\"working=$event\"\n (dirtyChange)=\"dirty=$event\" [mode]=\"mode\"></bizdoc-form>\n</div>\n", styles: [":host{align-items:stretch}\n"] }]
176
- }], ctorParameters: () => [{ type: i1.SessionService }, { type: i2.MailboxService }, { type: i3.PaneRef }, { type: i4.PanesRouter }, { type: undefined, decorators: [{
177
- type: Inject,
178
- args: [BIZDOC_CONFIG]
179
- }] }], propDecorators: { form: [{
182
+ }, template: "<mat-toolbar class=\"nav-toolbar\" [class.sticky]=\"showToolbar\">\n @if (form.page !== undefined) {\n <button mat-icon-button color=\"primary\" (click)=\"form.back()\" [bizdocTooltip]=\"'Back'|translate\" tabindex=\"1\">\n <mat-icon class=\"mat-icon-rtl-mirror\">arrow_back</mat-icon>\n </button>\n }\n @if (model.draft) {\n <button mat-stroked-button color=\"primary\" data-help=\"submit\"\n (click)=\"submit()\" [disabled]=\"!valid||working\">\n <span>{{'Submit' | translate}}</span>\n </button>\n }\n @if (form.actions.length === 1) {\n <button mat-stroked-button color=\"primary\" [attr.data-help]=\"'action-'+form.actions[0].name\" (click)=\"send(model.actions[0])\" [disabled]=\"!valid||working\">\n <span>{{form.actions[0].title}}</span>\n </button>\n }\n @if (form.actions.length > 1) {\n <button mat-stroked-button data-help=\"send\" color=\"primary\" [matMenuTriggerFor]=\"actionMenu\" [disabled]=\"!valid||working\">\n <span>{{'Send' | translate}}</span>\n </button>\n }\n <!-- action -->\n <mat-menu #actionMenu>\n <ng-template matMenuContent>\n @for (a of form.actions; track a; let i = $index) {\n @if (i > 0 && form.actions[i - 1].group !== a.group) {\n <mat-divider></mat-divider>\n }\n <button mat-menu-item (click)=\"send(a.name)\">{{a.title}}</button>\n }\n </ng-template>\n </mat-menu>\n @if (mode === 'compose') {\n <button mat-icon-button (click)=\"save()\" data-help=\"save\" [disabled]=\"!dirty||working\" [bizdocTooltip]=\"'Save'|translate\">\n <mat-icon>save</mat-icon>\n </button>\n }\n <button mat-icon-button data-help=\"tag\" (click)=\"form.tag($event)\" [bizdocTooltip]=\"'Tags' | translate\" [disabled]=\"working\"><mat-icon class=\"filled\">{{model.tags && model.tags.length ?'bookmark':'bookmark_border'}}</mat-icon></button>\n <button mat-icon-button data-help=\"flag\" [bizdocTooltip]=\"'Flagged'| translate\" [disabled]=\"working\" (click)=\"form.flag()\"><mat-icon [class.document-flag]=\"model.flag\">{{model.flag ? 'star' : 'star_border'}}</mat-icon></button>\n <button mat-icon-button (click)=\"form.attach()\" data-help=\"attach\" [bizdocTooltip]=\"'AttachFile' | translate\" [disabled]=\"working\"><mat-icon>attach_file</mat-icon></button>\n @if (mode !== 'compose' && model.pending && !model.completed) {\n <button mat-icon-button [disabled]=\"working\" data-help=\"edit\" (click)=\"edit()\" [bizdocTooltip]=\"'Edit' | translate\"><mat-icon>create</mat-icon></button>\n }\n <span class=\"divider\"></span>\n <button mat-icon-button (click)=\"navTrace()\" [bizdocTooltip]=\"'Trace' | translate\" tabindex=\"1\"><mat-icon>timeline</mat-icon></button>\n <button mat-icon-button (click)=\"navComments()\" data-help=\"comments\" [bizdocTooltip]=\"'Comments' | translate\" [matBadge]=\"newCommentsCount\" [matBadgeHidden]=\"!newCommentsCount\" matBadgeColor=\"accent\">\n <mat-icon [class.filled]=\"model.comments.length > 0\">format_quote</mat-icon>\n </button>\n @if (enableAnalysis) {\n <button mat-icon-button (click)=\"view()\" [bizdocTooltip]=\"'View' | translate\" [attr.aria-label]=\"'View' | translate\" class=\"tool\"><mat-icon>data_usage</mat-icon></button>\n }\n @if (expendable) {\n <button mat-icon-button (click)=\"expand()\" [bizdocTooltip]=\"'Expand' | translate\" [attr.aria-label]=\"'Expand' | translate\"><mat-icon>open_in_new</mat-icon></button>\n }\n <button mat-icon-button [matMenuTriggerFor]=\"optionsMenu\" [bizdocTooltip]=\"'Options' | translate\" [attr.aria-label]=\"'Options' | translate\"><mat-icon>more_vert</mat-icon></button>\n <mat-menu #optionsMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button mat-menu-item (click)=\"form.copy()\" [disabled]=\"working\">\n <!--<mat-icon>content_copy</mat-icon>-->\n <span>{{'Copy' | translate}}</span>\n </button>\n @if (model.draft && !model.issued) {\n <button mat-menu-item (click)=\"discard()\" [disabled]=\"working\">\n <!--<mat-icon>delete_outlined</mat-icon>-->\n <span>{{'Discard' | translate}}</span>\n </button>\n }\n @if (form.help) {\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"form.guide(form.help)\">\n <!--<mat-icon>help_outline</mat-icon>-->\n <span>{{'Help' | translate}}</span>\n </button>\n }\n <mat-divider></mat-divider>\n <button mat-menu-item (click)=\"close()\"><!--<mat-icon></mat-icon>--><span>{{'Close'| translate}}</span></button>\n </ng-template>\n </mat-menu>\n</mat-toolbar>\n<div class=\"file-dropable flex\" #dropable>\n <bizdoc-form [model]=model #form\n (modelChange)=\"change()\"\n (saved)=\"saved()\"\n (validChange)=\"valid=$event\"\n (workingChange)=\"working=$event\"\n (dirtyChange)=\"dirty=$event\" [mode]=\"mode\"></bizdoc-form>\n</div>\n" }]
183
+ }], ctorParameters: () => [{ type: i1.SessionService }, { type: i2.MailboxService }, { type: i3.PaneRef }, { type: i4.PanesRouter }], propDecorators: { form: [{
180
184
  type: ViewChild,
181
185
  args: [ComposeFormComponent, { static: true }]
182
186
  }], dropableElement: [{
183
187
  type: ViewChild,
184
188
  args: ['dropable', { static: true, read: ElementRef }]
189
+ }], onScroll: [{
190
+ type: HostListener,
191
+ args: ['scroll', ['$event']]
185
192
  }], handleDocumentDrop: [{
186
193
  type: HostListener,
187
194
  args: ['document:drop', ['$event']]
@@ -201,4 +208,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImpor
201
208
  type: HostListener,
202
209
  args: ['document:keydown', ['$event']]
203
210
  }] } });
204
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zZS5wYW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvY29tcG9zZS9jb21wb3NlLnBhbmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUvc3JjL2xpYi9jb21wb3NlL2NvbXBvc2UucGFuZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBYSxTQUFTLEVBQUUsVUFBVSxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJeEQsT0FBTyxFQUFnQixhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQVVoRix1REFBdUQ7QUFDdkQsTUFBTSxPQUFPLG9CQUFvQjtJQWEvQixtQkFBbUI7SUFDbkIsWUFDVSxRQUF3QixFQUN4QixRQUF3QixFQUN4QixLQUFvQyxFQUNwQyxPQUFvQixFQUNMLE1BQW9CO1FBSm5DLGFBQVEsR0FBUixRQUFRLENBQWdCO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQWdCO1FBQ3hCLFVBQUssR0FBTCxLQUFLLENBQStCO1FBQ3BDLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFQYixjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUNuQyxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQVE5QyxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENB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RFYsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTXJDLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVXBDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgT25Jbml0LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUmVjaXBpZW50TW9kZWwgfSBmcm9tICcuLi9jb3JlL21vZGVscyc7XHJcbmltcG9ydCB7IFBhbmVzUm91dGVyIH0gZnJvbSAnLi4vY29yZS9zbG90cy9yb3V0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFBhbmVSZWYgfSBmcm9tICcuLi9jb3JlL3Nsb3RzL3BhbmUtcmVmJztcclxuaW1wb3J0IHsgQ29tbWVudHNQYW5lQ29tcG9uZW50IH0gZnJvbSAnLi9jb21tZW50cy9jb21tZW50cy5wYW5lLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbXBvc2VGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi9mb3JtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFZpZXdNb2RlIH0gZnJvbSAnLi4vY29yZS9iYXNlJztcclxuaW1wb3J0IHsgTWFpbGJveFNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL21haWxib3guc2VydmljZSc7XHJcbmltcG9ydCB7IFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9zZXNzaW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCaXpEb2NDb25maWcsIEJJWkRPQ19DT05GSUcsIE9wZW5Qb2xpY3kgfSBmcm9tICcuLi9jb3JlL2NvbmZpZ3VyYXRpb24nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdiaXpkb2MtY29tcG9zZS5wYW5lJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9zZS5wYW5lLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jb21wb3NlLnBhbmUuY29tcG9uZW50LnNjc3MnXSxcclxuICBob3N0OiB7XHJcbiAgICBjbGFzczogJ3BhbmUnXHJcbiAgfVxyXG59KVxyXG4vKiogY29tcG9zZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGVkaXRpbmcgYSBmb3JtICovXHJcbmV4cG9ydCBjbGFzcyBDb21wb3NlUGFuZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKENvbXBvc2VGb3JtQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBmb3JtOiBDb21wb3NlRm9ybUNvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKCdkcm9wYWJsZScsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pIGRyb3BhYmxlRWxlbWVudDogRWxlbWVudFJlZjtcclxuICBtb2RlbDogUmVjaXBpZW50TW9kZWw8YW55PjtcclxuICBuZXdDb21tZW50c0NvdW50OiBudW1iZXI7XHJcbiAgd29ya2luZzogYm9vbGVhbjtcclxuICBkaXJ0eTogYm9vbGVhbjtcclxuICB2YWxpZDogYm9vbGVhbjtcclxuICBtb2RlOiBWaWV3TW9kZTtcclxuICBleHBlbmRhYmxlOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IGVuYWJsZUFuYWx5c2lzOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RyYWdEcm9wID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAvKiogY29tcG9zZSBjdG9yICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9zZXNzaW9uOiBTZXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX21haWxib3g6IE1haWxib3hTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcGFuZTogUGFuZVJlZjxDb21wb3NlUGFuZUNvbXBvbmVudD4sXHJcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFBhbmVzUm91dGVyLFxyXG4gICAgQEluamVjdChCSVpET0NfQ09ORklHKSBjb25maWc6IEJpekRvY0NvbmZpZykge1xyXG4gICAgdGhpcy5lbmFibGVBbmFseXNpcyA9IF9zZXNzaW9uLnByb2ZpbGUudmlld3MubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcGFuZS5kYXRhQ2hhbmdlKCkuc3Vic2NyaWJlKGQgPT4ge1xyXG4gICAgICBpZiAodGhpcy5tb2RlbCA9PSBkLml0ZW0pIHJldHVybjtcclxuICAgICAgdGhpcy5tb2RlbCA9IGQuaXRlbTtcclxuICAgICAgY29uc3QgZm9ybSA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5mb3Jtcy5maW5kKGYgPT4gZi5uYW1lID09PSB0aGlzLm1vZGVsLmZvcm1JZCk7XHJcbiAgICAgIHRoaXMuX3BhbmUuaWNvbiA9IGZvcm0uaWNvbjtcclxuICAgICAgaWYgKHRoaXMubW9kZWwuZHJhZnQpIHtcclxuICAgICAgICB0aGlzLm1vZGUgPSAnY29tcG9zZSc7XHJcbiAgICAgICAgLy9zZXRUaW1lb3V0KCgpPT50aGlzLl9wYW5lLmV4cGFuZCgpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5tb2RlID0gJ3ByZXZpZXcnO1xyXG4gICAgICB0aGlzLm5ld0NvbW1lbnRzQ291bnQgPSB0aGlzLm1vZGVsLnVucmVhZENvbW1lbnRzO1xyXG4gICAgICB0aGlzLl9wYW5lLnRpdGxlID0gdGhpcy5fcGFuZS5ncm91cCA9IGAjJHt0aGlzLm1vZGVsLm51bWJlcn1gO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9wYW5lLnF1ZXJ5UGFyYW1zQ2hhbmdlKCkuc3Vic2NyaWJlKHAgPT4ge1xyXG4gICAgICBjb25zdCB7IHBhZ2UgfSA9IHA7XHJcbiAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyAgIGNvbnN0IHBhZ2VuID0gcGFyc2VJbnQocGFnZSk7XHJcbiAgICAgICAgLy8gIHRoaXMuZm9ybS5uYXZpZ2F0ZShpc05hTihwYWdlbikgPyBwYWdlIDogcGFnZW4pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX21haWxib3guY2hhbmdlZC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKGUgPT4ge1xyXG4gICAgICBpZiAoZS5pZCA9PT0gdGhpcy5tb2RlbC5pZCAmJiAhdGhpcy53b3JraW5nKSB7XHJcbiAgICAgICAgaWYgKGUuZm9sZGVySWQgJiYgZS5mb2xkZXJJZCAhPT0gdGhpcy5tb2RlbC5mb2xkZXJJZCkgdGhpcy5fY2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9tYWlsYm94LmRlbGV0ZWQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpLnN1YnNjcmliZShlID0+XHJcbiAgICAgIGUgPT09IHRoaXMubW9kZWwuaWQgJiYgIXRoaXMud29ya2luZyAmJlxyXG4gICAgICB0aGlzLl9jbG9zZSgpXHJcbiAgICApO1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5kcm9wYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuX2RyYWdEcm9wLnBpcGUoZGVib3VuY2VUaW1lKDEwMCksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKG9rID0+IHtcclxuICAgICAgaWYgKG9rKSBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZHJhZycpO1xyXG4gICAgICBlbHNlIGNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnJyk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZXhwZW5kYWJsZSA9ICF0aGlzLl9wYW5lLmV4cGFuZGVkO1xyXG4gICAgdGhpcy5fcGFuZS5leHBhbmRlZENoYW5nZSgpLnN1YnNjcmliZShlID0+IHRoaXMuZXhwZW5kYWJsZSA9ICFlKTtcclxuICB9XHJcbiAgY2xvc2UoKSB7XHJcbiAgICB0aGlzLl9wYW5lLmNsb3NlKCk7XHJcbiAgfVxyXG4gIGVkaXQoKSB7XHJcbiAgICB0aGlzLm1vZGUgPSAnY29tcG9zZSc7XHJcbiAgICB0aGlzLmV4cGVuZGFibGUgJiYgdGhpcy5leHBhbmQoKTtcclxuICB9XHJcbiAgZXhwYW5kKCkge1xyXG4gICAgdGhpcy5fcGFuZS5leHBhbmQoKTtcclxuICB9XHJcbiAgY2hhbmdlKCkge1xyXG4gICAgdGhpcy5fcGFuZS5mb2N1cygpO1xyXG4gIH1cclxuICBzYXZlKCkge1xyXG4gICAgdGhpcy5mb3JtLnNhdmUoKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcbiAgc2F2ZWQoKSB7XHJcbiAgICB0aGlzLl9wYW5lLnJlY3ljbGUoKTtcclxuICB9XHJcbiAgbmF2Q29tbWVudHMoKSB7XHJcbiAgICB0aGlzLl9uYXZpZ2F0ZSgnY29tbWVudHMnKS50aGVuKHBhbmVSZWYgPT4ge1xyXG4gICAgICAocGFuZVJlZi5pbnN0YW5jZSBhcyBDb21tZW50c1BhbmVDb21wb25lbnQpLmNvbW1lbnRzLmNoYW5nZS5cclxuICAgICAgICBwaXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+XHJcbiAgICAgICAgICB0aGlzLm5ld0NvbW1lbnRzQ291bnQgPSAocGFuZVJlZi5pbnN0YW5jZSBhcyBDb21tZW50c1BhbmVDb21wb25lbnQpLlxyXG4gICAgICAgICAgICBjb21tZW50cy51bnJlYWRDb21tZW50cyk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgbmF2VHJhY2UoKSB7XHJcbiAgICB0aGlzLl9uYXZpZ2F0ZSgndHJhY2UnKVxyXG4gIH1cclxuICBwcml2YXRlIF9uYXZpZ2F0ZShjb21tYW5kOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW2NvbW1hbmRdLCB7XHJcbiAgICAgIHBhdGhNb2RlOiAncmVsYXRpdmUnLFxyXG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLl9wYW5lLFxyXG4gICAgICBwb2xpY3k6IE9wZW5Qb2xpY3kuVG9nZ2xlXHJcbiAgICB9KTtcclxuICB9XHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6ZHJvcCcsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlRG9jdW1lbnREcm9wKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG4gIEBIb3N0TGlzdGVuZXIoJ2Ryb3AnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZURyb3AoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuX2RyYWdEcm9wLm5leHQoZmFsc2UpO1xyXG4gICAgY29uc3QgeyBpdGVtcyB9ID0gZXZlbnQuZGF0YVRyYW5zZmVyO1xyXG4gICAgY29uc3QgYXJyOiBGaWxlW10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgZmlsZSA9IGl0ZW1zW2ldLmdldEFzRmlsZSgpO1xyXG4gICAgICBmaWxlICYmIGFyci5wdXNoKGZpbGUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLnVwbG9hZChhcnIpLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuICBASG9zdExpc3RlbmVyKCdkcmFnZW50ZXInLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUVudGVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLl9kcmFnRHJvcC5uZXh0KHRydWUpO1xyXG4gIH1cclxuICBASG9zdExpc3RlbmVyKCdkcmFnbGVhdmUnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUxlYXZlKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLl9kcmFnRHJvcC5uZXh0KGZhbHNlKTtcclxuICB9XHJcbiAgQEhvc3RMaXN0ZW5lcignZHJhZ292ZXInLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZU92ZXIoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuX2RyYWdEcm9wLm5leHQodHJ1ZSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEN0cmwtcyBzYXZlXHJcbiAgICogQHBhcmFtIGV2ZW50XHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgKGV2ZW50LmtleSA9PT0gJ3MnIHx8IGV2ZW50LmtleSA9PT0gJ1MnKSkge1xyXG4gICAgICB0aGlzLmRpcnR5ICYmICF0aGlzLndvcmtpbmcgJiZcclxuICAgICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgZGlzY2FyZCgpIHtcclxuICAgIHRoaXMuZm9ybS5kaXNjYXJkKCkuc3Vic2NyaWJlKHsgbmV4dDogdGhpcy5fY2xvc2UuYmluZCh0aGlzKSB9KVxyXG4gIH1cclxuICBzZW5kKGFjdGlvbjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmZvcm0uc2VuZChhY3Rpb24pLnN1YnNjcmliZSh7IG5leHQ6IHRoaXMuX2Nsb3NlLmJpbmQodGhpcykgfSk7XHJcbiAgfVxyXG4gIHN1Ym1pdCgpIHtcclxuICAgIHRoaXMuZm9ybS5zdWJtaXQoKS5zdWJzY3JpYmUoeyBuZXh0OiB0aGlzLl9jbG9zZS5iaW5kKHRoaXMpIH0pXHJcbiAgfVxyXG4gIHByaXZhdGUgX2Nsb3NlKCkge1xyXG4gICAgdGhpcy5mb3JtLmRpcnR5ID0gZmFsc2U7XHJcbiAgICB0aGlzLl9wYW5lLmNsb3NlKCk7XHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZHJhZ0Ryb3AuY29tcGxldGUoKTtcclxuXHJcbiAgICB0aGlzLl9kZXN0cm95Lm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kuY29tcGxldGUoKTtcclxuICB9XHJcbiAgdmlldygpIHtcclxuICAgIHRoaXMuX25hdmlnYXRlKCd2aWV3cycpXHJcbiAgfVxyXG59XHJcbiIsIjxtYXQtdG9vbGJhciBjbGFzcz1cIm5hdi10b29sYmFyXCI+XG4gIEBpZiAoZm9ybS5wYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZm9ybS5iYWNrKClcIiBbYml6ZG9jVG9vbHRpcF09XCInQmFjayd8dHJhbnNsYXRlXCIgdGFiaW5kZXg9XCIxXCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1ydGwtbWlycm9yXCI+YXJyb3dfYmFjazwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIH1cbiAgQGlmIChtb2RlbC5kcmFmdCkge1xuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIGRhdGEtaGVscD1cInN1Ym1pdFwiXG4gICAgICAoY2xpY2spPVwic3VibWl0KClcIiBbZGlzYWJsZWRdPVwiIXZhbGlkfHx3b3JraW5nXCI+XG4gICAgICA8c3Bhbj57eydTdWJtaXQnIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIH1cbiAgQGlmIChmb3JtLmFjdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2F0dHIuZGF0YS1oZWxwXT1cIidhY3Rpb24tJytmb3JtLmFjdGlvbnNbMF0ubmFtZVwiIChjbGljayk9XCJzZW5kKG1vZGVsLmFjdGlvbnNbMF0pXCIgW2Rpc2FibGVkXT1cIiF2YWxpZHx8d29ya2luZ1wiPlxuICAgICAgPHNwYW4+e3tmb3JtLmFjdGlvbnNbMF0udGl0bGV9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgfVxuICBAaWYgKGZvcm0uYWN0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gZGF0YS1oZWxwPVwic2VuZFwiIGNvbG9yPVwicHJpbWFyeVwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJhY3Rpb25NZW51XCIgW2Rpc2FibGVkXT1cIiF2YWxpZHx8d29ya2luZ1wiPlxuICAgICAgPHNwYW4+e3snU2VuZCcgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgfVxuICA8IS0tIGFjdGlvbiAtLT5cbiAgPG1hdC1tZW51ICNhY3Rpb25NZW51PlxuICAgIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudD5cbiAgICAgIEBmb3IgKGEgb2YgZm9ybS5hY3Rpb25zOyB0cmFjayBhOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICBAaWYgKGkgPiAwICYmIGZvcm0uYWN0aW9uc1tpIC0gMV0uZ3JvdXAgIT09IGEuZ3JvdXApIHtcbiAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgICAgICAgfVxuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInNlbmQoYS5uYW1lKVwiPnt7YS50aXRsZX19PC9idXR0b24+XG4gICAgICB9XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9tYXQtbWVudT5cbiAgQGlmIChtb2RlID09PSAnY29tcG9zZScpIHtcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwic2F2ZSgpXCIgZGF0YS1oZWxwPVwic2F2ZVwiIFtkaXNhYmxlZF09XCIhZGlydHl8fHdvcmtpbmdcIiBbYml6ZG9jVG9vbHRpcF09XCInU2F2ZSd8dHJhbnNsYXRlXCI+XG4gICAgICA8bWF0LWljb24+c2F2ZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIH1cbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gZGF0YS1oZWxwPVwidGFnXCIgKGNsaWNrKT1cImZvcm0udGFnKCRldmVudClcIiBbYml6ZG9jVG9vbHRpcF09XCInVGFncycgfCB0cmFuc2xhdGVcIiBbZGlzYWJsZWRdPVwid29ya2luZ1wiPjxtYXQtaWNvbiBjbGFzcz1cImZpbGxlZFwiPnt7bW9kZWwudGFncyAmJiBtb2RlbC50YWdzLmxlbmd0aCA/J2Jvb2ttYXJrJzonYm9va21hcmtfYm9yZGVyJ319PC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gZGF0YS1oZWxwPVwiZmxhZ1wiIFtiaXpkb2NUb29sdGlwXT1cIidGbGFnZ2VkJ3wgdHJhbnNsYXRlXCIgW2Rpc2FibGVkXT1cIndvcmtpbmdcIiAoY2xpY2spPVwiZm9ybS5mbGFnKClcIj48bWF0LWljb24gW2NsYXNzLmRvY3VtZW50LWZsYWddPVwibW9kZWwuZmxhZ1wiPnt7bW9kZWwuZmxhZyA/ICdzdGFyJyA6ICdzdGFyX2JvcmRlcid9fTwvbWF0LWljb24+PC9idXR0b24+XG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJmb3JtLmF0dGFjaCgpXCIgZGF0YS1oZWxwPVwiYXR0YWNoXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0F0dGFjaEZpbGUnIHwgdHJhbnNsYXRlXCIgW2Rpc2FibGVkXT1cIndvcmtpbmdcIj48bWF0LWljb24+YXR0YWNoX2ZpbGU8L21hdC1pY29uPjwvYnV0dG9uPlxuICBAaWYgKG1vZGUgIT09ICdjb21wb3NlJyAmJiBtb2RlbC5wZW5kaW5nICYmICFtb2RlbC5jb21wbGV0ZWQpIHtcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbZGlzYWJsZWRdPVwid29ya2luZ1wiIGRhdGEtaGVscD1cImVkaXRcIiAoY2xpY2spPVwiZWRpdCgpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0VkaXQnIHwgdHJhbnNsYXRlXCI+PG1hdC1pY29uPmNyZWF0ZTwvbWF0LWljb24+PC9idXR0b24+XG4gIH1cbiAgPHNwYW4gY2xhc3M9XCJkaXZpZGVyXCI+PC9zcGFuPlxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwibmF2VHJhY2UoKVwiIFtiaXpkb2NUb29sdGlwXT1cIidUcmFjZScgfCB0cmFuc2xhdGVcIiB0YWJpbmRleD1cIjFcIj48bWF0LWljb24+dGltZWxpbmU8L21hdC1pY29uPjwvYnV0dG9uPlxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwibmF2Q29tbWVudHMoKVwiIGRhdGEtaGVscD1cImNvbW1lbnRzXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0NvbW1lbnRzJyB8IHRyYW5zbGF0ZVwiIFttYXRCYWRnZV09XCJuZXdDb21tZW50c0NvdW50XCIgW21hdEJhZGdlSGlkZGVuXT1cIiFuZXdDb21tZW50c0NvdW50XCIgbWF0QmFkZ2VDb2xvcj1cImFjY2VudFwiPlxuICAgIDxtYXQtaWNvbiBbY2xhc3MuZmlsbGVkXT1cIm1vZGVsLmNvbW1lbnRzLmxlbmd0aCA+IDBcIj5mb3JtYXRfcXVvdGU8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cbiAgQGlmIChlbmFibGVBbmFseXNpcykge1xuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJ2aWV3KClcIiBbYml6ZG9jVG9vbHRpcF09XCInVmlldycgfCB0cmFuc2xhdGVcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidWaWV3JyB8IHRyYW5zbGF0ZVwiIGNsYXNzPVwidG9vbFwiPjxtYXQtaWNvbj5kYXRhX3VzYWdlPC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgfVxuICBAaWYgKGV4cGVuZGFibGUpIHtcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZXhwYW5kKClcIiBbYml6ZG9jVG9vbHRpcF09XCInRXhwYW5kJyB8IHRyYW5zbGF0ZVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0V4cGFuZCcgfCB0cmFuc2xhdGVcIj48bWF0LWljb24+b3Blbl9pbl9uZXc8L21hdC1pY29uPjwvYnV0dG9uPlxuICB9XG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJvcHRpb25zTWVudVwiIFtiaXpkb2NUb29sdGlwXT1cIidPcHRpb25zJyB8IHRyYW5zbGF0ZVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09wdGlvbnMnIHwgdHJhbnNsYXRlXCI+PG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+PC9idXR0b24+XG4gIDxtYXQtbWVudSAjb3B0aW9uc01lbnU9XCJtYXRNZW51XCI+XG4gICAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50PlxuICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJmb3JtLmNvcHkoKVwiIFtkaXNhYmxlZF09XCJ3b3JraW5nXCI+XG4gICAgICAgIDwhLS08bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj4tLT5cbiAgICAgICAgPHNwYW4+e3snQ29weScgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgQGlmIChtb2RlbC5kcmFmdCAmJiAhbW9kZWwuaXNzdWVkKSB7XG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZGlzY2FyZCgpXCIgW2Rpc2FibGVkXT1cIndvcmtpbmdcIj5cbiAgICAgICAgICA8IS0tPG1hdC1pY29uPmRlbGV0ZV9vdXRsaW5lZDwvbWF0LWljb24+LS0+XG4gICAgICAgICAgPHNwYW4+e3snRGlzY2FyZCcgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgICBAaWYgKGZvcm0uaGVscCkge1xuICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJmb3JtLmd1aWRlKGZvcm0uaGVscClcIj5cbiAgICAgICAgICA8IS0tPG1hdC1pY29uPmhlbHBfb3V0bGluZTwvbWF0LWljb24+LS0+XG4gICAgICAgICAgPHNwYW4+e3snSGVscCcgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiY2xvc2UoKVwiPjwhLS08bWF0LWljb24+PC9tYXQtaWNvbj4tLT48c3Bhbj57eydDbG9zZSd8IHRyYW5zbGF0ZX19PC9zcGFuPjwvYnV0dG9uPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbWF0LW1lbnU+XG48L21hdC10b29sYmFyPlxuPGRpdiBjbGFzcz1cImZpbGUtZHJvcGFibGUgZmxleFwiICNkcm9wYWJsZT5cbiAgPGJpemRvYy1mb3JtIFttb2RlbF09bW9kZWwgI2Zvcm1cbiAgICAobW9kZWxDaGFuZ2UpPVwiY2hhbmdlKClcIlxuICAgIChzYXZlZCk9XCJzYXZlZCgpXCJcbiAgICAodmFsaWRDaGFuZ2UpPVwidmFsaWQ9JGV2ZW50XCJcbiAgICAod29ya2luZ0NoYW5nZSk9XCJ3b3JraW5nPSRldmVudFwiXG4gIChkaXJ0eUNoYW5nZSk9XCJkaXJ0eT0kZXZlbnRcIiBbbW9kZV09XCJtb2RlXCI+PC9iaXpkb2MtZm9ybT5cbjwvZGl2PlxuIl19
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zZS5wYW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvY29tcG9zZS9jb21wb3NlLnBhbmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUvc3JjL2xpYi9jb21wb3NlL2NvbXBvc2UucGFuZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBYSxTQUFTLEVBQUUsVUFBVSxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFVbkQsdURBQXVEO0FBQ3ZELE1BQU0sT0FBTyxvQkFBb0I7SUFlL0IsbUJBQW1CO0lBQ25CLFlBQ1UsUUFBd0IsRUFDeEIsUUFBd0IsRUFDeEIsS0FBb0MsRUFDcEMsT0FBb0I7UUFIcEIsYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFDeEIsVUFBSyxHQUFMLEtBQUssQ0FBK0I7UUFDcEMsWUFBTyxHQUFQLE9BQU8sQ0FBYTtRQVY5QixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVYLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ1IsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDbkMsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFPOUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUss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QkFtR3pELFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBT2xDLGtCQUFrQjtzQkFEakIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTXpDLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBYWhDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTXJDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTXJDLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVXBDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgT25Jbml0LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUmVjaXBpZW50TW9kZWwgfSBmcm9tICcuLi9jb3JlL21vZGVscyc7XHJcbmltcG9ydCB7IFBhbmVzUm91dGVyIH0gZnJvbSAnLi4vY29yZS9zbG90cy9yb3V0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFBhbmVSZWYgfSBmcm9tICcuLi9jb3JlL3Nsb3RzL3BhbmUtcmVmJztcclxuaW1wb3J0IHsgQ29tbWVudHNQYW5lQ29tcG9uZW50IH0gZnJvbSAnLi9jb21tZW50cy9jb21tZW50cy5wYW5lLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbXBvc2VGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi9mb3JtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFZpZXdNb2RlIH0gZnJvbSAnLi4vY29yZS9iYXNlJztcclxuaW1wb3J0IHsgTWFpbGJveFNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL21haWxib3guc2VydmljZSc7XHJcbmltcG9ydCB7IFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9zZXNzaW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPcGVuUG9saWN5IH0gZnJvbSAnLi4vY29yZS9jb25maWd1cmF0aW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYml6ZG9jLWNvbXBvc2UucGFuZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvc2UucGFuZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29tcG9zZS5wYW5lLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgaG9zdDoge1xyXG4gICAgY2xhc3M6ICdwYW5lJ1xyXG4gIH1cclxufSlcclxuLyoqIGNvbXBvc2UgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBlZGl0aW5nIGEgZm9ybSAqL1xyXG5leHBvcnQgY2xhc3MgQ29tcG9zZVBhbmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQFZpZXdDaGlsZChDb21wb3NlRm9ybUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgZm9ybTogQ29tcG9zZUZvcm1Db21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZCgnZHJvcGFibGUnLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9KSBkcm9wYWJsZUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcbiAgbW9kZWw6IFJlY2lwaWVudE1vZGVsPGFueT47XHJcbiAgbmV3Q29tbWVudHNDb3VudDogbnVtYmVyO1xyXG4gIHdvcmtpbmc6IGJvb2xlYW47XHJcbiAgZGlydHk6IGJvb2xlYW47XHJcbiAgdmFsaWQ6IGJvb2xlYW47XHJcbiAgbW9kZTogVmlld01vZGU7XHJcbiAgZXhwZW5kYWJsZTogYm9vbGVhbjtcclxuICBzaG93VG9vbGJhciA9IHRydWU7XHJcbiAgcmVhZG9ubHkgZW5hYmxlQW5hbHlzaXM6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfcHJldmlvdXNUb3AgPSAwO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RyYWdEcm9wID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAvKiogY29tcG9zZSBjdG9yICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9zZXNzaW9uOiBTZXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX21haWxib3g6IE1haWxib3hTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcGFuZTogUGFuZVJlZjxDb21wb3NlUGFuZUNvbXBvbmVudD4sXHJcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFBhbmVzUm91dGVyKSB7XHJcbiAgICB0aGlzLmVuYWJsZUFuYWx5c2lzID0gX3Nlc3Npb24ucHJvZmlsZS52aWV3cy5sZW5ndGggPiAwO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wYW5lLmRhdGFDaGFuZ2UoKS5zdWJzY3JpYmUoZCA9PiB7XHJcbiAgICAgIGlmICh0aGlzLm1vZGVsID09IGQuaXRlbSkgcmV0dXJuO1xyXG4gICAgICB0aGlzLm1vZGVsID0gZC5pdGVtO1xyXG4gICAgICBjb25zdCBmb3JtID0gdGhpcy5fc2Vzc2lvbi5wcm9maWxlLmZvcm1zLmZpbmQoZiA9PiBmLm5hbWUgPT09IHRoaXMubW9kZWwuZm9ybUlkKTtcclxuICAgICAgdGhpcy5fcGFuZS5pY29uID0gZm9ybS5pY29uO1xyXG4gICAgICBpZiAodGhpcy5tb2RlbC5kcmFmdCkge1xyXG4gICAgICAgIHRoaXMubW9kZSA9ICdjb21wb3NlJztcclxuICAgICAgICAvL3NldFRpbWVvdXQoKCk9PnRoaXMuX3BhbmUuZXhwYW5kKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLm1vZGUgPSAncHJldmlldyc7XHJcbiAgICAgIHRoaXMubmV3Q29tbWVudHNDb3VudCA9IHRoaXMubW9kZWwudW5yZWFkQ29tbWVudHM7XHJcbiAgICAgIHRoaXMuX3BhbmUudGl0bGUgPSB0aGlzLl9wYW5lLmdyb3VwID0gYCMke3RoaXMubW9kZWwubnVtYmVyfWA7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3BhbmUucXVlcnlQYXJhbXNDaGFuZ2UoKS5zdWJzY3JpYmUocCA9PiB7XHJcbiAgICAgIGNvbnN0IHsgcGFnZSB9ID0gcDtcclxuICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIC8vICAgY29uc3QgcGFnZW4gPSBwYXJzZUludChwYWdlKTtcclxuICAgICAgICAvLyAgdGhpcy5mb3JtLm5hdmlnYXRlKGlzTmFOKHBhZ2VuKSA/IHBhZ2UgOiBwYWdlbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fbWFpbGJveC5jaGFuZ2VkLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoZSA9PiB7XHJcbiAgICAgIGlmIChlLmlkID09PSB0aGlzLm1vZGVsLmlkICYmICF0aGlzLndvcmtpbmcpIHtcclxuICAgICAgICBpZiAoZS5mb2xkZXJJZCAmJiBlLmZvbGRlcklkICE9PSB0aGlzLm1vZGVsLmZvbGRlcklkKSB0aGlzLl9jbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX21haWxib3guZGVsZXRlZC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKGUgPT5cclxuICAgICAgZSA9PT0gdGhpcy5tb2RlbC5pZCAmJiAhdGhpcy53b3JraW5nICYmXHJcbiAgICAgIHRoaXMuX2Nsb3NlKClcclxuICAgICk7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmRyb3BhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5fZHJhZ0Ryb3AucGlwZShkZWJvdW5jZVRpbWUoMTAwKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUob2sgPT4ge1xyXG4gICAgICBpZiAob2spIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcmFnJyk7XHJcbiAgICAgIGVsc2UgY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWcnKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5leHBlbmRhYmxlID0gIXRoaXMuX3BhbmUuZXhwYW5kZWQ7XHJcbiAgICB0aGlzLl9wYW5lLmV4cGFuZGVkQ2hhbmdlKCkuc3Vic2NyaWJlKGUgPT4gdGhpcy5leHBlbmRhYmxlID0gIWUpO1xyXG4gIH1cclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMuX3BhbmUuY2xvc2UoKTtcclxuICB9XHJcbiAgZWRpdCgpIHtcclxuICAgIHRoaXMubW9kZSA9ICdjb21wb3NlJztcclxuICAgIHRoaXMuZXhwZW5kYWJsZSAmJiB0aGlzLmV4cGFuZCgpO1xyXG4gIH1cclxuICBleHBhbmQoKSB7XHJcbiAgICB0aGlzLl9wYW5lLmV4cGFuZCgpO1xyXG4gIH1cclxuICBjaGFuZ2UoKSB7XHJcbiAgICB0aGlzLl9wYW5lLmZvY3VzKCk7XHJcbiAgfVxyXG4gIHNhdmUoKSB7XHJcbiAgICB0aGlzLmZvcm0uc2F2ZSgpLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuICBzYXZlZCgpIHtcclxuICAgIHRoaXMuX3BhbmUucmVjeWNsZSgpO1xyXG4gIH1cclxuICBuYXZDb21tZW50cygpIHtcclxuICAgIHRoaXMuX25hdmlnYXRlKCdjb21tZW50cycpLnRoZW4ocGFuZVJlZiA9PiB7XHJcbiAgICAgIChwYW5lUmVmLmluc3RhbmNlIGFzIENvbW1lbnRzUGFuZUNvbXBvbmVudCkuY29tbWVudHMuY2hhbmdlLlxyXG4gICAgICAgIHBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoKCkgPT5cclxuICAgICAgICAgIHRoaXMubmV3Q29tbWVudHNDb3VudCA9IChwYW5lUmVmLmluc3RhbmNlIGFzIENvbW1lbnRzUGFuZUNvbXBvbmVudCkuXHJcbiAgICAgICAgICAgIGNvbW1lbnRzLnVucmVhZENvbW1lbnRzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBuYXZUcmFjZSgpIHtcclxuICAgIHRoaXMuX25hdmlnYXRlKCd0cmFjZScpXHJcbiAgfVxyXG4gIHByaXZhdGUgX25hdmlnYXRlKGNvbW1hbmQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbY29tbWFuZF0sIHtcclxuICAgICAgcGF0aE1vZGU6ICdyZWxhdGl2ZScsXHJcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMuX3BhbmUsXHJcbiAgICAgIHBvbGljeTogT3BlblBvbGljeS5Ub2dnbGVcclxuICAgIH0pO1xyXG4gIH1cclxuICBASG9zdExpc3RlbmVyKCdzY3JvbGwnLCBbJyRldmVudCddKVxyXG4gIG9uU2Nyb2xsKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBjb25zdCB0b3AgPSAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRGl2RWxlbWVudCkuc2Nyb2xsVG9wO1xyXG4gICAgdGhpcy5zaG93VG9vbGJhciA9IHRoaXMuX3ByZXZpb3VzVG9wID4gdG9wICYmIHRvcCA+IDA7XHJcbiAgICB0aGlzLl9wcmV2aW91c1RvcCA9IHRvcDtcclxuICB9XHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6ZHJvcCcsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlRG9jdW1lbnREcm9wKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG4gIEBIb3N0TGlzdGVuZXIoJ2Ryb3AnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZURyb3AoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuX2RyYWdEcm9wLm5leHQoZmFsc2UpO1xyXG4gICAgY29uc3QgeyBpdGVtcyB9ID0gZXZlbnQuZGF0YVRyYW5zZmVyO1xyXG4gICAgY29uc3QgYXJyOiBGaWxlW10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgZmlsZSA9IGl0ZW1zW2ldLmdldEFzRmlsZSgpO1xyXG4gICAgICBmaWxlICYmIGFyci5wdXNoKGZpbGUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLnVwbG9hZChhcnIpLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuICBASG9zdExpc3RlbmVyKCdkcmFnZW50ZXInLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUVudGVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLl9kcmFnRHJvcC5uZXh0KHRydWUpO1xyXG4gIH1cclxuICBASG9zdExpc3RlbmVyKCdkcmFnbGVhdmUnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUxlYXZlKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLl9kcmFnRHJvcC5uZXh0KGZhbHNlKTtcclxuICB9XHJcbiAgQEhvc3RMaXN0ZW5lcignZHJhZ292ZXInLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZU92ZXIoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuX2RyYWdEcm9wLm5leHQodHJ1ZSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEN0cmwtcyBzYXZlXHJcbiAgICogQHBhcmFtIGV2ZW50XHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgKGV2ZW50LmtleSA9PT0gJ3MnIHx8IGV2ZW50LmtleSA9PT0gJ1MnKSkge1xyXG4gICAgICB0aGlzLmRpcnR5ICYmICF0aGlzLndvcmtpbmcgJiZcclxuICAgICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgZGlzY2FyZCgpIHtcclxuICAgIHRoaXMuZm9ybS5kaXNjYXJkKCkuc3Vic2NyaWJlKHsgbmV4dDogdGhpcy5fY2xvc2UuYmluZCh0aGlzKSB9KVxyXG4gIH1cclxuICBzZW5kKGFjdGlvbjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmZvcm0uc2VuZChhY3Rpb24pLnN1YnNjcmliZSh7IG5leHQ6IHRoaXMuX2Nsb3NlLmJpbmQodGhpcykgfSk7XHJcbiAgfVxyXG4gIHN1Ym1pdCgpIHtcclxuICAgIHRoaXMuZm9ybS5zdWJtaXQoKS5zdWJzY3JpYmUoeyBuZXh0OiB0aGlzLl9jbG9zZS5iaW5kKHRoaXMpIH0pXHJcbiAgfVxyXG4gIHByaXZhdGUgX2Nsb3NlKCkge1xyXG4gICAgdGhpcy5mb3JtLmRpcnR5ID0gZmFsc2U7XHJcbiAgICB0aGlzLl9wYW5lLmNsb3NlKCk7XHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZHJhZ0Ryb3AuY29tcGxldGUoKTtcclxuXHJcbiAgICB0aGlzLl9kZXN0cm95Lm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kuY29tcGxldGUoKTtcclxuICB9XHJcbiAgdmlldygpIHtcclxuICAgIHRoaXMuX25hdmlnYXRlKCd2aWV3cycpXHJcbiAgfVxyXG59XHJcbiIsIjxtYXQtdG9vbGJhciBjbGFzcz1cIm5hdi10b29sYmFyXCIgW2NsYXNzLnN0aWNreV09XCJzaG93VG9vbGJhclwiPlxuICBAaWYgKGZvcm0ucGFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImZvcm0uYmFjaygpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0JhY2snfHRyYW5zbGF0ZVwiIHRhYmluZGV4PVwiMVwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LWljb24tcnRsLW1pcnJvclwiPmFycm93X2JhY2s8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICB9XG4gIEBpZiAobW9kZWwuZHJhZnQpIHtcbiAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBkYXRhLWhlbHA9XCJzdWJtaXRcIlxuICAgICAgKGNsaWNrKT1cInN1Ym1pdCgpXCIgW2Rpc2FibGVkXT1cIiF2YWxpZHx8d29ya2luZ1wiPlxuICAgICAgPHNwYW4+e3snU3VibWl0JyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICB9XG4gIEBpZiAoZm9ybS5hY3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFthdHRyLmRhdGEtaGVscF09XCInYWN0aW9uLScrZm9ybS5hY3Rpb25zWzBdLm5hbWVcIiAoY2xpY2spPVwic2VuZChtb2RlbC5hY3Rpb25zWzBdKVwiIFtkaXNhYmxlZF09XCIhdmFsaWR8fHdvcmtpbmdcIj5cbiAgICAgIDxzcGFuPnt7Zm9ybS5hY3Rpb25zWzBdLnRpdGxlfX08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIH1cbiAgQGlmIChmb3JtLmFjdGlvbnMubGVuZ3RoID4gMSkge1xuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGRhdGEtaGVscD1cInNlbmRcIiBjb2xvcj1cInByaW1hcnlcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYWN0aW9uTWVudVwiIFtkaXNhYmxlZF09XCIhdmFsaWR8fHdvcmtpbmdcIj5cbiAgICAgIDxzcGFuPnt7J1NlbmQnIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIH1cbiAgPCEtLSBhY3Rpb24gLS0+XG4gIDxtYXQtbWVudSAjYWN0aW9uTWVudT5cbiAgICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQ+XG4gICAgICBAZm9yIChhIG9mIGZvcm0uYWN0aW9uczsgdHJhY2sgYTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgQGlmIChpID4gMCAmJiBmb3JtLmFjdGlvbnNbaSAtIDFdLmdyb3VwICE9PSBhLmdyb3VwKSB7XG4gICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gICAgICAgIH1cbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzZW5kKGEubmFtZSlcIj57e2EudGl0bGV9fTwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbWF0LW1lbnU+XG4gIEBpZiAobW9kZSA9PT0gJ2NvbXBvc2UnKSB7XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNhdmUoKVwiIGRhdGEtaGVscD1cInNhdmVcIiBbZGlzYWJsZWRdPVwiIWRpcnR5fHx3b3JraW5nXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1NhdmUnfHRyYW5zbGF0ZVwiPlxuICAgICAgPG1hdC1pY29uPnNhdmU8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICB9XG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGRhdGEtaGVscD1cInRhZ1wiIChjbGljayk9XCJmb3JtLnRhZygkZXZlbnQpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1RhZ3MnIHwgdHJhbnNsYXRlXCIgW2Rpc2FibGVkXT1cIndvcmtpbmdcIj48bWF0LWljb24gY2xhc3M9XCJmaWxsZWRcIj57e21vZGVsLnRhZ3MgJiYgbW9kZWwudGFncy5sZW5ndGggPydib29rbWFyayc6J2Jvb2ttYXJrX2JvcmRlcid9fTwvbWF0LWljb24+PC9idXR0b24+XG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGRhdGEtaGVscD1cImZsYWdcIiBbYml6ZG9jVG9vbHRpcF09XCInRmxhZ2dlZCd8IHRyYW5zbGF0ZVwiIFtkaXNhYmxlZF09XCJ3b3JraW5nXCIgKGNsaWNrKT1cImZvcm0uZmxhZygpXCI+PG1hdC1pY29uIFtjbGFzcy5kb2N1bWVudC1mbGFnXT1cIm1vZGVsLmZsYWdcIj57e21vZGVsLmZsYWcgPyAnc3RhcicgOiAnc3Rhcl9ib3JkZXInfX08L21hdC1pY29uPjwvYnV0dG9uPlxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZm9ybS5hdHRhY2goKVwiIGRhdGEtaGVscD1cImF0dGFjaFwiIFtiaXpkb2NUb29sdGlwXT1cIidBdHRhY2hGaWxlJyB8IHRyYW5zbGF0ZVwiIFtkaXNhYmxlZF09XCJ3b3JraW5nXCI+PG1hdC1pY29uPmF0dGFjaF9maWxlPC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgQGlmIChtb2RlICE9PSAnY29tcG9zZScgJiYgbW9kZWwucGVuZGluZyAmJiAhbW9kZWwuY29tcGxldGVkKSB7XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW2Rpc2FibGVkXT1cIndvcmtpbmdcIiBkYXRhLWhlbHA9XCJlZGl0XCIgKGNsaWNrKT1cImVkaXQoKVwiIFtiaXpkb2NUb29sdGlwXT1cIidFZGl0JyB8IHRyYW5zbGF0ZVwiPjxtYXQtaWNvbj5jcmVhdGU8L21hdC1pY29uPjwvYnV0dG9uPlxuICB9XG4gIDxzcGFuIGNsYXNzPVwiZGl2aWRlclwiPjwvc3Bhbj5cbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cIm5hdlRyYWNlKClcIiBbYml6ZG9jVG9vbHRpcF09XCInVHJhY2UnIHwgdHJhbnNsYXRlXCIgdGFiaW5kZXg9XCIxXCI+PG1hdC1pY29uPnRpbWVsaW5lPC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cIm5hdkNvbW1lbnRzKClcIiBkYXRhLWhlbHA9XCJjb21tZW50c1wiIFtiaXpkb2NUb29sdGlwXT1cIidDb21tZW50cycgfCB0cmFuc2xhdGVcIiBbbWF0QmFkZ2VdPVwibmV3Q29tbWVudHNDb3VudFwiIFttYXRCYWRnZUhpZGRlbl09XCIhbmV3Q29tbWVudHNDb3VudFwiIG1hdEJhZGdlQ29sb3I9XCJhY2NlbnRcIj5cbiAgICA8bWF0LWljb24gW2NsYXNzLmZpbGxlZF09XCJtb2RlbC5jb21tZW50cy5sZW5ndGggPiAwXCI+Zm9ybWF0X3F1b3RlPC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG4gIEBpZiAoZW5hYmxlQW5hbHlzaXMpIHtcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwidmlldygpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1ZpZXcnIHwgdHJhbnNsYXRlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInVmlldycgfCB0cmFuc2xhdGVcIiBjbGFzcz1cInRvb2xcIj48bWF0LWljb24+ZGF0YV91c2FnZTwvbWF0LWljb24+PC9idXR0b24+XG4gIH1cbiAgQGlmIChleHBlbmRhYmxlKSB7XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImV4cGFuZCgpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0V4cGFuZCcgfCB0cmFuc2xhdGVcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidFeHBhbmQnIHwgdHJhbnNsYXRlXCI+PG1hdC1pY29uPm9wZW5faW5fbmV3PC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgfVxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwib3B0aW9uc01lbnVcIiBbYml6ZG9jVG9vbHRpcF09XCInT3B0aW9ucycgfCB0cmFuc2xhdGVcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidPcHRpb25zJyB8IHRyYW5zbGF0ZVwiPjxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPjwvYnV0dG9uPlxuICA8bWF0LW1lbnUgI29wdGlvbnNNZW51PVwibWF0TWVudVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudD5cbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZm9ybS5jb3B5KClcIiBbZGlzYWJsZWRdPVwid29ya2luZ1wiPlxuICAgICAgICA8IS0tPG1hdC1pY29uPmNvbnRlbnRfY29weTwvbWF0LWljb24+LS0+XG4gICAgICAgIDxzcGFuPnt7J0NvcHknIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIEBpZiAobW9kZWwuZHJhZnQgJiYgIW1vZGVsLmlzc3VlZCkge1xuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImRpc2NhcmQoKVwiIFtkaXNhYmxlZF09XCJ3b3JraW5nXCI+XG4gICAgICAgICAgPCEtLTxtYXQtaWNvbj5kZWxldGVfb3V0bGluZWQ8L21hdC1pY29uPi0tPlxuICAgICAgICAgIDxzcGFuPnt7J0Rpc2NhcmQnIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgQGlmIChmb3JtLmhlbHApIHtcbiAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZm9ybS5ndWlkZShmb3JtLmhlbHApXCI+XG4gICAgICAgICAgPCEtLTxtYXQtaWNvbj5oZWxwX291dGxpbmU8L21hdC1pY29uPi0tPlxuICAgICAgICAgIDxzcGFuPnt7J0hlbHAnIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImNsb3NlKClcIj48IS0tPG1hdC1pY29uPjwvbWF0LWljb24+LS0+PHNwYW4+e3snQ2xvc2UnfCB0cmFuc2xhdGV9fTwvc3Bhbj48L2J1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L21hdC1tZW51PlxuPC9tYXQtdG9vbGJhcj5cbjxkaXYgY2xhc3M9XCJmaWxlLWRyb3BhYmxlIGZsZXhcIiAjZHJvcGFibGU+XG4gIDxiaXpkb2MtZm9ybSBbbW9kZWxdPW1vZGVsICNmb3JtXG4gICAgKG1vZGVsQ2hhbmdlKT1cImNoYW5nZSgpXCJcbiAgICAoc2F2ZWQpPVwic2F2ZWQoKVwiXG4gICAgKHZhbGlkQ2hhbmdlKT1cInZhbGlkPSRldmVudFwiXG4gICAgKHdvcmtpbmdDaGFuZ2UpPVwid29ya2luZz0kZXZlbnRcIlxuICAoZGlydHlDaGFuZ2UpPVwiZGlydHk9JGV2ZW50XCIgW21vZGVdPVwibW9kZVwiPjwvYml6ZG9jLWZvcm0+XG48L2Rpdj5cbiJdfQ==