@nakedobjects/gemini
Version:
Single Page Application client for a Naked Objects application.
119 lines • 23.6 kB
JavaScript
import { Component, Input, ViewChildren } from '@angular/core';
import { ParameterViewModel } from '@nakedobjects/view-models';
import { BaseDialogComponent } from '../base-dialog/base-dialog.component';
import some from 'lodash-es/some';
import map from 'lodash-es/map';
import fromPairs from 'lodash-es/fromPairs';
import { EditParameterComponent } from '../edit-parameter/edit-parameter.component';
import * as i0 from "@angular/core";
import * as i1 from "@nakedobjects/view-models";
import * as i2 from "@nakedobjects/services";
import * as i3 from "@angular/forms";
import * as i4 from "@angular/common";
import * as i5 from "../action-bar/action-bar.component";
import * as i6 from "../view-property/view-property.component";
import * as i7 from "../edit-parameter/edit-parameter.component";
export class CreateNewDialogComponent extends BaseDialogComponent {
colorService;
configService;
constructor(viewModelFactory, error, context, colorService, configService, formBuilder) {
super(viewModelFactory, error, context, formBuilder);
this.colorService = colorService;
this.configService = configService;
this.pendingColor = `${configService.config.objectColor}${colorService.getConfiguredDefault()}`;
}
parmComponents;
set toCreateClass(cls) {
this.toCreate = cls;
this.colorService.toColorNumberFromType(cls).then(c => this.pendingColor = `${this.configService.config.objectColor}${c}`);
}
set parentMenu(parent) {
this.parent = parent;
}
get parentMenu() {
return this.parent;
}
// used to smooth transition before object set
pendingColor;
get color() {
return this.pendingColor;
}
toCreate;
saveButton = {
value: 'Save',
doClick: () => this.onSubmit(),
doRightClick: () => this.onSubmit(true),
show: () => true,
disabled: () => this.form && !this.form.valid ? true : null,
tempDisabled: () => null,
title: () => this.tooltip,
accesskey: null,
presentationHint: '',
showDialog: () => false
};
cancelButton = {
value: 'Cancel',
doClick: () => this.close(),
show: () => true,
disabled: () => null,
tempDisabled: () => null,
title: () => '',
accesskey: null,
presentationHint: '',
showDialog: () => false
};
saveButtons = [this.saveButton, this.cancelButton];
get actionHolders() {
return this.saveButtons;
}
get parametersProperties() {
const properties = this.dialog?.actionViewModel.createNewProperties;
const parmMap = fromPairs(this.parameters.map((p) => [p.title.toLowerCase(), p]));
return map(properties, (p) => parmMap[p.toLowerCase()] ?? p);
}
isParameter(parmprop) {
return parmprop instanceof ParameterViewModel;
}
asParameter(parmprop) {
return parmprop;
}
isProperty(parmprop) {
return !this.isParameter(parmprop);
}
asProperty(parmprop) {
return parmprop;
}
hasHint(parm) {
return parm?.presentationHint !== null && parm.presentationHint !== undefined;
}
classes(parmprop) {
return ({ parameter: true, [parmprop.presentationHint]: this.hasHint(parmprop) });
}
ngAfterViewInit() {
this.sub = this.parmComponents?.changes.subscribe(() => this.focus());
}
focus() {
const parms = this.parmComponents;
if (parms && parms.length > 0) {
// until first element returns true
return some(parms.toArray(), i => i.focus());
}
return false;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CreateNewDialogComponent, deps: [{ token: i1.ViewModelFactoryService }, { token: i2.ErrorService }, { token: i2.ContextService }, { token: i2.ColorService }, { token: i2.ConfigService }, { token: i3.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: CreateNewDialogComponent, selector: "nof-create-new-dialog", inputs: { toCreateClass: "toCreateClass", parentMenu: "parentMenu" }, viewQueries: [{ propertyName: "parmComponents", predicate: EditParameterComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"object edit\" [ngClass]=\"color\">\n <header class=\"header\">\n <div class=\"title\" tabindex=\"0\">{{title}}</div>\n\t\t<div class=\"menus\">\n\t\t\t<nof-action-bar [actions]=\"actionHolders\"></nof-action-bar>\n\t\t</div>\n\t\t<div class=\"messages\">{{message}}</div>\n </header>\n <div class=\"main-column\">\n <div *ngIf=\"dialog\" class=\"dialog\">\n\t\t\t<form *ngIf=\"form\" (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\" autocomplete=\"off\">\n\t\t\t\t<ng-container *ngFor=\"let parmprop of parametersProperties\">\n\t\t\t\t\t<nof-edit-parameter *ngIf=\"isParameter(parmprop)\" [ngClass]=\"classes(asParameter(parmprop))\" [parameter]=\"asParameter(parmprop)\" [parent]=\"parentMenu\" [form]=\"form\"></nof-edit-parameter>\n\t\t\t\t\t<nof-view-property *ngIf=\"isProperty(parmprop)\" [propertyName]=\"asProperty(parmprop)\" class=\"property\"></nof-view-property>\n\t\t\t\t</ng-container>\n\t\t\t\t<div class=\"co-validation\">{{message}}</div>\n\t\t\t</form>\n\t\t</div>\n </div>\n</div>", styles: [":host{overflow-y:auto;color:var(--default-text-color);font-size:var(--font-size-2);font-weight:var(--font-weight-1);display:block;height:100%}.object{height:100%;display:block;padding-left:var(--space-5);overflow-y:auto}.header{display:block;margin-bottom:var(--space-5);overflow:hidden;color:var(--contrast-text-color);background-color:var(--header-background-color)}viewTitle{display:inline-block}.title,.type{position:relative;font-weight:var(--font-weight-2);font-size:var(--font-size-4);line-height:38pt;margin-left:var(--space-1);padding-left:var(--space-3);padding-right:var(--space-3);margin-right:var(--space-5);margin-top:var(--space-1);display:inline-block}.type{float:left;margin-right:var(--space-5);display:none}.menus{display:block}.menu,.header .action{display:block;float:left;padding:var(--space-3);margin-top:0;margin-left:var(--space-1);margin-right:var(--space-4);margin-bottom:var(--space-3);font:inherit;font-size:var(--font-size-3);color:var(--default-text-color);background-color:transparent}.menu:disabled{color:var(--disabled-color)}.title:hover,.title:focus{outline-color:var(--contrast-outline-color);outline-width:1px}.actions,.main-column{float:left;margin-bottom:var(--space-5);margin-right:var(--space-5)}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.ActionBarComponent, selector: "nof-action-bar", inputs: ["actions", "menuHolder"] }, { kind: "component", type: i6.ViewPropertyComponent, selector: "nof-view-property", inputs: ["property", "propertyName"] }, { kind: "component", type: i7.EditParameterComponent, selector: "nof-edit-parameter", inputs: ["parent", "parameter", "form"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CreateNewDialogComponent, decorators: [{
type: Component,
args: [{ selector: 'nof-create-new-dialog', template: "<div class=\"object edit\" [ngClass]=\"color\">\n <header class=\"header\">\n <div class=\"title\" tabindex=\"0\">{{title}}</div>\n\t\t<div class=\"menus\">\n\t\t\t<nof-action-bar [actions]=\"actionHolders\"></nof-action-bar>\n\t\t</div>\n\t\t<div class=\"messages\">{{message}}</div>\n </header>\n <div class=\"main-column\">\n <div *ngIf=\"dialog\" class=\"dialog\">\n\t\t\t<form *ngIf=\"form\" (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\" autocomplete=\"off\">\n\t\t\t\t<ng-container *ngFor=\"let parmprop of parametersProperties\">\n\t\t\t\t\t<nof-edit-parameter *ngIf=\"isParameter(parmprop)\" [ngClass]=\"classes(asParameter(parmprop))\" [parameter]=\"asParameter(parmprop)\" [parent]=\"parentMenu\" [form]=\"form\"></nof-edit-parameter>\n\t\t\t\t\t<nof-view-property *ngIf=\"isProperty(parmprop)\" [propertyName]=\"asProperty(parmprop)\" class=\"property\"></nof-view-property>\n\t\t\t\t</ng-container>\n\t\t\t\t<div class=\"co-validation\">{{message}}</div>\n\t\t\t</form>\n\t\t</div>\n </div>\n</div>", styles: [":host{overflow-y:auto;color:var(--default-text-color);font-size:var(--font-size-2);font-weight:var(--font-weight-1);display:block;height:100%}.object{height:100%;display:block;padding-left:var(--space-5);overflow-y:auto}.header{display:block;margin-bottom:var(--space-5);overflow:hidden;color:var(--contrast-text-color);background-color:var(--header-background-color)}viewTitle{display:inline-block}.title,.type{position:relative;font-weight:var(--font-weight-2);font-size:var(--font-size-4);line-height:38pt;margin-left:var(--space-1);padding-left:var(--space-3);padding-right:var(--space-3);margin-right:var(--space-5);margin-top:var(--space-1);display:inline-block}.type{float:left;margin-right:var(--space-5);display:none}.menus{display:block}.menu,.header .action{display:block;float:left;padding:var(--space-3);margin-top:0;margin-left:var(--space-1);margin-right:var(--space-4);margin-bottom:var(--space-3);font:inherit;font-size:var(--font-size-3);color:var(--default-text-color);background-color:transparent}.menu:disabled{color:var(--disabled-color)}.title:hover,.title:focus{outline-color:var(--contrast-outline-color);outline-width:1px}.actions,.main-column{float:left;margin-bottom:var(--space-5);margin-right:var(--space-5)}\n"] }]
}], ctorParameters: () => [{ type: i1.ViewModelFactoryService }, { type: i2.ErrorService }, { type: i2.ContextService }, { type: i2.ColorService }, { type: i2.ConfigService }, { type: i3.FormBuilder }], propDecorators: { parmComponents: [{
type: ViewChildren,
args: [EditParameterComponent]
}], toCreateClass: [{
type: Input,
args: [{ required: true }]
}], parentMenu: [{
type: Input,
args: [{ required: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW5ldy1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZ2VtaW5pL3NyYy9jcmVhdGUtbmV3LWRpYWxvZy9jcmVhdGUtbmV3LWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL2NyZWF0ZS1uZXctZGlhbG9nL2NyZWF0ZS1uZXctZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBd0IsWUFBWSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRy9HLE9BQU8sRUFHSCxrQkFBa0IsRUFFckIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLElBQUksTUFBTSxnQkFBZ0IsQ0FBQztBQUNsQyxPQUFPLEdBQUcsTUFBTSxlQUFlLENBQUM7QUFDaEMsT0FBTyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7Ozs7Ozs7OztBQVFwRixNQUFNLE9BQU8sd0JBQXlCLFNBQVEsbUJBQW1CO0lBTXhDO0lBQ0E7SUFMckIsWUFDSSxnQkFBeUMsRUFDekMsS0FBbUIsRUFDbkIsT0FBdUIsRUFDTixZQUEwQixFQUMxQixhQUE0QixFQUM3QyxXQUF3QjtRQUNwQixLQUFLLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUh4QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUd6QyxJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQztJQUN4RyxDQUFD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c0IsdUVDbEN4QyxraENBbUJNOzsyRkRFTyx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0ksdUJBQXVCO3FPQWtCakMsY0FBYztzQkFEYixZQUFZO3VCQUFDLHNCQUFzQjtnQkFJaEMsYUFBYTtzQkFEaEIsS0FBSzt1QkFBQyxFQUFDLFFBQVEsRUFBRyxJQUFJLEVBQUM7Z0JBT3BCLFVBQVU7c0JBRGIsS0FBSzt1QkFBQyxFQUFDLFFBQVEsRUFBRyxJQUFJLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29sb3JTZXJ2aWNlLCBDb25maWdTZXJ2aWNlLCBDb250ZXh0U2VydmljZSwgRXJyb3JTZXJ2aWNlIH0gZnJvbSAnQG5ha2Vkb2JqZWN0cy9zZXJ2aWNlcyc7XG5pbXBvcnQge1xuICAgIERvbWFpbk9iamVjdFZpZXdNb2RlbCxcbiAgICBNZW51Vmlld01vZGVsLFxuICAgIFBhcmFtZXRlclZpZXdNb2RlbCxcbiAgICBWaWV3TW9kZWxGYWN0b3J5U2VydmljZVxufSBmcm9tICdAbmFrZWRvYmplY3RzL3ZpZXctbW9kZWxzJztcbmltcG9ydCB7IEJhc2VEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlLWRpYWxvZy9iYXNlLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHNvbWUgZnJvbSAnbG9kYXNoLWVzL3NvbWUnO1xuaW1wb3J0IG1hcCBmcm9tICdsb2Rhc2gtZXMvbWFwJztcbmltcG9ydCBmcm9tUGFpcnMgZnJvbSAnbG9kYXNoLWVzL2Zyb21QYWlycyc7XG5pbXBvcnQgeyBFZGl0UGFyYW1ldGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vZWRpdC1wYXJhbWV0ZXIvZWRpdC1wYXJhbWV0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IElBY3Rpb25Ib2xkZXIgfSBmcm9tICcuLi9hY3Rpb24vYWN0aW9uLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbm9mLWNyZWF0ZS1uZXctZGlhbG9nJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2NyZWF0ZS1uZXctZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnY3JlYXRlLW5ldy1kaWFsb2cuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIENyZWF0ZU5ld0RpYWxvZ0NvbXBvbmVudCBleHRlbmRzIEJhc2VEaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgdmlld01vZGVsRmFjdG9yeTogVmlld01vZGVsRmFjdG9yeVNlcnZpY2UsXG4gICAgICAgIGVycm9yOiBFcnJvclNlcnZpY2UsXG4gICAgICAgIGNvbnRleHQ6IENvbnRleHRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNvbG9yU2VydmljZTogQ29sb3JTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgICAgIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcikge1xuICAgICAgICAgICAgc3VwZXIodmlld01vZGVsRmFjdG9yeSwgZXJyb3IsIGNvbnRleHQsIGZvcm1CdWlsZGVyKTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NvbG9yID0gYCR7Y29uZmlnU2VydmljZS5jb25maWcub2JqZWN0Q29sb3J9JHtjb2xvclNlcnZpY2UuZ2V0Q29uZmlndXJlZERlZmF1bHQoKX1gO1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGRyZW4oRWRpdFBhcmFtZXRlckNvbXBvbmVudClcbiAgICBwYXJtQ29tcG9uZW50cz86IFF1ZXJ5TGlzdDxFZGl0UGFyYW1ldGVyQ29tcG9uZW50PjtcblxuICAgIEBJbnB1dCh7cmVxdWlyZWQgOiB0cnVlfSlcbiAgICBzZXQgdG9DcmVhdGVDbGFzcyhjbHM6IHN0cmluZykge1xuICAgICAgICB0aGlzLnRvQ3JlYXRlID0gY2xzO1xuICAgICAgICB0aGlzLmNvbG9yU2VydmljZS50b0NvbG9yTnVtYmVyRnJvbVR5cGUoY2xzKS50aGVuKGMgPT4gdGhpcy5wZW5kaW5nQ29sb3IgPSBgJHt0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLm9iamVjdENvbG9yfSR7Y31gKTtcbiAgICB9XG5cbiAgICBASW5wdXQoe3JlcXVpcmVkIDogdHJ1ZX0pXG4gICAgc2V0IHBhcmVudE1lbnUocGFyZW50OiBNZW51Vmlld01vZGVsIHwgRG9tYWluT2JqZWN0Vmlld01vZGVsKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIGdldCBwYXJlbnRNZW51KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgYXMgTWVudVZpZXdNb2RlbCB8IERvbWFpbk9iamVjdFZpZXdNb2RlbDtcbiAgICB9XG5cbiAgICAgLy8gdXNlZCB0byBzbW9vdGggdHJhbnNpdGlvbiBiZWZvcmUgb2JqZWN0IHNldFxuICAgIHByaXZhdGUgcGVuZGluZ0NvbG9yOiBzdHJpbmc7XG5cbiAgICBnZXQgY29sb3IoKSB7XG4gICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nQ29sb3I7XG4gICAgfVxuXG4gICAgdG9DcmVhdGUhOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIHNhdmVCdXR0b246IElBY3Rpb25Ib2xkZXIgPSB7XG4gICAgICAgIHZhbHVlOiAnU2F2ZScsXG4gICAgICAgIGRvQ2xpY2s6ICgpID0+IHRoaXMub25TdWJtaXQoKSxcbiAgICAgICAgZG9SaWdodENsaWNrOiAoKSA9PiB0aGlzLm9uU3VibWl0KHRydWUpLFxuICAgICAgICBzaG93OiAoKSA9PiB0cnVlLFxuICAgICAgICBkaXNhYmxlZDogKCkgPT4gdGhpcy5mb3JtICYmICF0aGlzLmZvcm0udmFsaWQgPyB0cnVlIDogbnVsbCxcbiAgICAgICAgdGVtcERpc2FibGVkOiAoKSA9PiBudWxsLFxuICAgICAgICB0aXRsZTogKCkgPT4gdGhpcy50b29sdGlwLFxuICAgICAgICBhY2Nlc3NrZXk6IG51bGwsXG4gICAgICAgIHByZXNlbnRhdGlvbkhpbnQ6ICcnLFxuICAgICAgICBzaG93RGlhbG9nOiAoKSA9PiBmYWxzZVxuICAgIH07XG5cbiAgICBwcml2YXRlIGNhbmNlbEJ1dHRvbjogSUFjdGlvbkhvbGRlciA9IHtcbiAgICAgICAgdmFsdWU6ICdDYW5jZWwnLFxuICAgICAgICBkb0NsaWNrOiAoKSA9PiB0aGlzLmNsb3NlKCksXG4gICAgICAgIHNob3c6ICgpID0+IHRydWUsXG4gICAgICAgIGRpc2FibGVkOiAoKSA9PiBudWxsLFxuICAgICAgICB0ZW1wRGlzYWJsZWQ6ICgpID0+IG51bGwsXG4gICAgICAgIHRpdGxlOiAoKSA9PiAnJyxcbiAgICAgICAgYWNjZXNza2V5OiBudWxsLFxuICAgICAgICBwcmVzZW50YXRpb25IaW50OiAnJyxcbiAgICAgICAgc2hvd0RpYWxvZzogKCkgPT4gZmFsc2VcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzYXZlQnV0dG9ucyA9IFt0aGlzLnNhdmVCdXR0b24sIHRoaXMuY2FuY2VsQnV0dG9uXTtcblxuICAgIGdldCBhY3Rpb25Ib2xkZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zYXZlQnV0dG9ucztcbiAgICB9XG5cbiAgICBnZXQgcGFyYW1ldGVyc1Byb3BlcnRpZXMoKTogKFBhcmFtZXRlclZpZXdNb2RlbCB8IHN0cmluZylbXSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLmRpYWxvZz8uYWN0aW9uVmlld01vZGVsLmNyZWF0ZU5ld1Byb3BlcnRpZXM7XG4gICAgICAgIGNvbnN0IHBhcm1NYXAgPSBmcm9tUGFpcnModGhpcy5wYXJhbWV0ZXJzLm1hcCgocCkgPT4gW3AudGl0bGUudG9Mb3dlckNhc2UoKSwgcF0pKTtcbiAgICAgICAgcmV0dXJuIG1hcChwcm9wZXJ0aWVzLCAocCkgPT4gcGFybU1hcFtwLnRvTG93ZXJDYXNlKCldID8/IHApO1xuICAgIH1cblxuICAgIGlzUGFyYW1ldGVyKHBhcm1wcm9wOiBQYXJhbWV0ZXJWaWV3TW9kZWwgfCBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHBhcm1wcm9wIGluc3RhbmNlb2YgUGFyYW1ldGVyVmlld01vZGVsO1xuICAgIH1cblxuICAgIGFzUGFyYW1ldGVyKHBhcm1wcm9wOiBQYXJhbWV0ZXJWaWV3TW9kZWwgfCBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHBhcm1wcm9wIGFzIFBhcmFtZXRlclZpZXdNb2RlbDtcbiAgICB9XG5cbiAgICBpc1Byb3BlcnR5KHBhcm1wcm9wOiBQYXJhbWV0ZXJWaWV3TW9kZWwgfCBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzUGFyYW1ldGVyKHBhcm1wcm9wKTtcbiAgICB9XG5cbiAgICBhc1Byb3BlcnR5KHBhcm1wcm9wOiBQYXJhbWV0ZXJWaWV3TW9kZWwgfCBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHBhcm1wcm9wIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0hpbnQocGFybTogUGFyYW1ldGVyVmlld01vZGVsKSB7XG4gICAgICAgIHJldHVybiBwYXJtPy5wcmVzZW50YXRpb25IaW50ICE9PSBudWxsICYmIHBhcm0ucHJlc2VudGF0aW9uSGludCAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNsYXNzZXMocGFybXByb3A6IFBhcmFtZXRlclZpZXdNb2RlbCkge1xuICAgICAgICByZXR1cm4gKHsgcGFyYW1ldGVyOiB0cnVlLCBbcGFybXByb3AucHJlc2VudGF0aW9uSGludF06IHRoaXMuaGFzSGludChwYXJtcHJvcCl9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3ViID0gdGhpcy5wYXJtQ29tcG9uZW50cz8uY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5mb2N1cygpKTtcbiAgICB9XG5cbiAgICBmb2N1cygpIHtcbiAgICAgICAgY29uc3QgcGFybXMgPSB0aGlzLnBhcm1Db21wb25lbnRzO1xuICAgICAgICBpZiAocGFybXMgJiYgcGFybXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gdW50aWwgZmlyc3QgZWxlbWVudCByZXR1cm5zIHRydWVcbiAgICAgICAgICAgIHJldHVybiBzb21lKHBhcm1zLnRvQXJyYXkoKSwgaSA9PiBpLmZvY3VzKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCI8ZGl2ICBjbGFzcz1cIm9iamVjdCBlZGl0XCIgW25nQ2xhc3NdPVwiY29sb3JcIj5cbiAgICA8aGVhZGVyIGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiIHRhYmluZGV4PVwiMFwiPnt7dGl0bGV9fTwvZGl2PlxuXHRcdDxkaXYgIGNsYXNzPVwibWVudXNcIj5cblx0XHRcdDxub2YtYWN0aW9uLWJhciBbYWN0aW9uc109XCJhY3Rpb25Ib2xkZXJzXCI+PC9ub2YtYWN0aW9uLWJhcj5cblx0XHQ8L2Rpdj5cblx0XHQ8ZGl2IGNsYXNzPVwibWVzc2FnZXNcIj57e21lc3NhZ2V9fTwvZGl2PlxuICAgIDwvaGVhZGVyPlxuICAgIDxkaXYgY2xhc3M9XCJtYWluLWNvbHVtblwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGlhbG9nXCIgY2xhc3M9XCJkaWFsb2dcIj5cblx0XHRcdDxmb3JtICAqbmdJZj1cImZvcm1cIiAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuXHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwYXJtcHJvcCBvZiBwYXJhbWV0ZXJzUHJvcGVydGllc1wiPlxuXHRcdFx0XHRcdDxub2YtZWRpdC1wYXJhbWV0ZXIgKm5nSWY9XCJpc1BhcmFtZXRlcihwYXJtcHJvcClcIiBbbmdDbGFzc109XCJjbGFzc2VzKGFzUGFyYW1ldGVyKHBhcm1wcm9wKSlcIiBbcGFyYW1ldGVyXT1cImFzUGFyYW1ldGVyKHBhcm1wcm9wKVwiIFtwYXJlbnRdPVwicGFyZW50TWVudVwiIFtmb3JtXT1cImZvcm1cIj48L25vZi1lZGl0LXBhcmFtZXRlcj5cblx0XHRcdFx0XHQ8bm9mLXZpZXctcHJvcGVydHkgKm5nSWY9XCJpc1Byb3BlcnR5KHBhcm1wcm9wKVwiIFtwcm9wZXJ0eU5hbWVdPVwiYXNQcm9wZXJ0eShwYXJtcHJvcClcIiBjbGFzcz1cInByb3BlcnR5XCI+PC9ub2Ytdmlldy1wcm9wZXJ0eT5cblx0XHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjby12YWxpZGF0aW9uXCI+e3ttZXNzYWdlfX08L2Rpdj5cblx0XHRcdDwvZm9ybT5cblx0XHQ8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==