ddata-ui-input
Version:
DData UI Input module, components, models & services
163 lines • 25.4 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { BaseModel, DdataCoreModule } from 'ddata-core';
import { InputHelperService } from '../../services/input/helper/input-helper.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
export class DdataTextareaComponent {
constructor() {
this.helperService = DdataCoreModule.InjectorInstance.get(InputHelperService);
// tslint:disable: variable-name
this._field = '';
this._title = '';
this._label = '';
this._placeholder = '';
this._prepend = '';
this._append = '';
this._max = '';
this._isRequired = false;
this._model = new BaseModel();
this.inputClass = 'form-control';
this.disabled = false;
this.isViewOnly = false;
this.labelClass = 'col-12 col-md-3 px-0 col-form-label';
this.inputBlockClass = 'col-12 d-flex px-0';
this.inputBlockExtraClass = 'col-md-9';
this.viewOnlyClass = 'form-control border-0 bg-light';
this.showLabel = true;
this.autoFocus = false;
this.wrapperClass = 'd-flex flex-wrap';
this.rows = '5';
this.enableCharacterCounter = false;
this.enableWordCounter = false;
this.maxLength = 255;
this.maxWords = 7;
this.wordCounterWarningMessage = '';
this.changed = new EventEmitter();
this.random = this.helperService.randChars();
this.displayWordCounterWarning = false;
}
set model(value) {
// prevent undefined
if (!value) {
console.error('The input-box component get undefined model');
return;
}
this._model = value;
if (!this._model.fields) {
console.error(`Your ${this._model.model_name}'s 'fields' field is`, this._model.fields);
return;
}
if (!this._model.fields[this._field]) {
console.error(`The ${this._model.model_name}'s ${this._field} field is `, this._model.fields[this._field]);
return;
}
if (!!this._model && !!this._model.fields[this._field]) {
this._title = this.helperService.getTitle(this._model, this._field);
this._placeholder = this.helperService.getPlaceholder(this._model, this._field);
this._prepend = this.helperService.getPrepend(this._model, this._field);
this._append = this.helperService.getAppend(this._model, this._field);
this._label = this.helperService.getLabel(this._model, this._field);
}
if (!!this._model && !!this._model.validationRules[this._field]) {
this._isRequired = this.helperService.isRequired(this._model, this._field);
}
}
get model() {
return this._model;
}
set field(value) {
if (value === 'undefined') {
value = 'isValid';
}
this._field = value;
}
set append(value) {
if (value === 'undefined') {
value = '';
}
this._append = value;
}
set prepend(value) {
if (value === 'undefined') {
value = '';
}
this._prepend = value;
}
set labelText(value) {
if (value === 'undefined') {
value = '';
}
this._label = value;
}
ngOnInit() {
}
ngAfterViewInit() {
if (this.autoFocus) {
this.inputBox.nativeElement.focus();
}
}
validateField() {
const isValid = this.helperService.validateField(this._model, this._field);
if (isValid) {
this.changed.emit(this._model);
}
}
setWordCounterWarning(value) {
this.displayWordCounterWarning = value;
}
}
DdataTextareaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataTextareaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
DdataTextareaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: DdataTextareaComponent, selector: "dd-textarea", inputs: { model: "model", field: "field", append: "append", prepend: "prepend", labelText: "labelText", inputClass: "inputClass", disabled: "disabled", isViewOnly: "isViewOnly", labelClass: "labelClass", inputBlockClass: "inputBlockClass", inputBlockExtraClass: "inputBlockExtraClass", viewOnlyClass: "viewOnlyClass", showLabel: "showLabel", autoFocus: "autoFocus", wrapperClass: "wrapperClass", rows: "rows", enableCharacterCounter: "enableCharacterCounter", enableWordCounter: "enableWordCounter", maxLength: "maxLength", maxWords: "maxWords", wordCounterWarningMessage: "wordCounterWarningMessage" }, outputs: { changed: "changed" }, viewQueries: [{ propertyName: "inputBox", first: true, predicate: ["inputBox"], descendants: true }], ngImport: i0, template: "<div [class]=\"wrapperClass\">\n <label [class]=\"labelClass\" [for]=\"_field + '_' + random\" *ngIf=\"showLabel\">\n {{ _label }}:\n <span *ngIf=\"_isRequired\"> *</span>\n </label>\n <div [class]=\"inputBlockClass\" [ngClass]=\"showLabel ? inputBlockExtraClass : ''\">\n <div class=\"input-group-prepend\" *ngIf=\" _prepend != '' \">\n <div class=\"input-group-text\">{{ _prepend }}</div>\n </div>\n\n <textarea *ngIf=\"!isViewOnly\"\n [id]=\"_field + '_' + random\"\n [attr.name]=\"_field + '_' + random\"\n [class.invalid]=\"_model.validationErrors.includes(_field)\"\n [class]=\"inputClass\"\n [rows]=\"rows\"\n [(ngModel)]=\"_model[_field]\"\n [placeholder]=\"_placeholder\"\n [title]=\"_title\"\n [disabled]=\"disabled\"\n (keyup)=\"validateField()\"\n #inputBox>\n <ng-container *ngIf=\"enableCharacterCounter\">\n <character-counter [currentLength]=\"model[_field]?.length || 0\" [maxLength]=\"maxLength\"></character-counter>\n </ng-container>\n <ng-container *ngIf=\"enableWordCounter\">\n <app-word-counter\n [currentLength]=\"model[_field]\"\n [maxLength]=\"maxWords\"\n (maxLentghReached)=\"showWordCounterWarning = $event\"\n ></app-word-counter>\n </ng-container>\n </textarea>\n\n <div *ngIf=\"isViewOnly\"\n [id]=\"field\"\n [name]=\"field\"\n [title]=\"_title\"\n [class]=\"viewOnlyClass\">\n\n {{ _model[_field] }}\n </div>\n\n <div class=\"input-group-append\" *ngIf=\"_append != ''\">\n <div class=\"input-group-text\">{{ _append }}</div>\n </div>\n </div>\n <div *ngIf=\"displayWordCounterWarning && wordCounterWarningMessage !== ''\" class=\"d-flex pb-2\">\n <div class=\"col-12 col-md-7 offset-md-3 bg-warning p-2 rounded\">\n {{ wordCounterWarningMessage }}\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataTextareaComponent, decorators: [{
type: Component,
args: [{ selector: 'dd-textarea', template: "<div [class]=\"wrapperClass\">\n <label [class]=\"labelClass\" [for]=\"_field + '_' + random\" *ngIf=\"showLabel\">\n {{ _label }}:\n <span *ngIf=\"_isRequired\"> *</span>\n </label>\n <div [class]=\"inputBlockClass\" [ngClass]=\"showLabel ? inputBlockExtraClass : ''\">\n <div class=\"input-group-prepend\" *ngIf=\" _prepend != '' \">\n <div class=\"input-group-text\">{{ _prepend }}</div>\n </div>\n\n <textarea *ngIf=\"!isViewOnly\"\n [id]=\"_field + '_' + random\"\n [attr.name]=\"_field + '_' + random\"\n [class.invalid]=\"_model.validationErrors.includes(_field)\"\n [class]=\"inputClass\"\n [rows]=\"rows\"\n [(ngModel)]=\"_model[_field]\"\n [placeholder]=\"_placeholder\"\n [title]=\"_title\"\n [disabled]=\"disabled\"\n (keyup)=\"validateField()\"\n #inputBox>\n <ng-container *ngIf=\"enableCharacterCounter\">\n <character-counter [currentLength]=\"model[_field]?.length || 0\" [maxLength]=\"maxLength\"></character-counter>\n </ng-container>\n <ng-container *ngIf=\"enableWordCounter\">\n <app-word-counter\n [currentLength]=\"model[_field]\"\n [maxLength]=\"maxWords\"\n (maxLentghReached)=\"showWordCounterWarning = $event\"\n ></app-word-counter>\n </ng-container>\n </textarea>\n\n <div *ngIf=\"isViewOnly\"\n [id]=\"field\"\n [name]=\"field\"\n [title]=\"_title\"\n [class]=\"viewOnlyClass\">\n\n {{ _model[_field] }}\n </div>\n\n <div class=\"input-group-append\" *ngIf=\"_append != ''\">\n <div class=\"input-group-text\">{{ _append }}</div>\n </div>\n </div>\n <div *ngIf=\"displayWordCounterWarning && wordCounterWarningMessage !== ''\" class=\"d-flex pb-2\">\n <div class=\"col-12 col-md-7 offset-md-3 bg-warning p-2 rounded\">\n {{ wordCounterWarningMessage }}\n </div>\n </div>\n</div>\n" }]
}], ctorParameters: function () { return []; }, propDecorators: { model: [{
type: Input
}], field: [{
type: Input
}], append: [{
type: Input
}], prepend: [{
type: Input
}], labelText: [{
type: Input
}], inputClass: [{
type: Input
}], disabled: [{
type: Input
}], isViewOnly: [{
type: Input
}], labelClass: [{
type: Input
}], inputBlockClass: [{
type: Input
}], inputBlockExtraClass: [{
type: Input
}], viewOnlyClass: [{
type: Input
}], showLabel: [{
type: Input
}], autoFocus: [{
type: Input
}], wrapperClass: [{
type: Input
}], rows: [{
type: Input
}], enableCharacterCounter: [{
type: Input
}], enableWordCounter: [{
type: Input
}], maxLength: [{
type: Input
}], maxWords: [{
type: Input
}], wordCounterWarningMessage: [{
type: Input
}], changed: [{
type: Output
}], inputBox: [{
type: ViewChild,
args: ['inputBox']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGRhdGEtdWktaW5wdXQvc3JjL2xpYi9jb21wb25lbnRzL3RleHRhcmVhL3RleHRhcmVhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RkYXRhLXVpLWlucHV0L3NyYy9saWIvY29tcG9uZW50cy90ZXh0YXJlYS90ZXh0YXJlYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckgsT0FBTyxFQUFFLFNBQVMsRUFBc0IsZUFBZSxFQUFtQixNQUFNLFlBQVksQ0FBQztBQUU3RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7OztBQU90RixNQUFNLE9BQU8sc0JBQXNCO0lBdUdqQztRQXRHQSxrQkFBYSxHQUFnQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUE4QixrQkFBa0IsQ0FBQyxDQUFDO1FBRW5JLGdDQUFnQztRQUNoQyxXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLFNBQUksR0FBRyxFQUFFLENBQUM7UUFDVixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixXQUFNLEdBQW1ELElBQUksU0FBUyxFQUFFLENBQUM7UUFrRWhFLGVBQVUsR0FBRyxjQUFjLENBQUM7UUFDNUIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FB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M0UsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBRUQscUJBQXFCLENBQUMsS0FBYztRQUNsQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBQ3pDLENBQUM7O21IQTVIVSxzQkFBc0I7dUdBQXRCLHNCQUFzQixzeEJDVm5DLHMzREFxREE7MkZEM0NhLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxhQUFhOzBFQWtCVixLQUFLO3NCQUFqQixLQUFLO2dCQW9DTyxLQUFLO3NCQUFqQixLQUFLO2dCQU9PLE1BQU07c0JBQWxCLEtBQUs7Z0JBT08sT0FBTztzQkFBbkIsS0FBSztnQkFPTyxTQUFTO3NCQUFyQixLQUFLO2dCQU9HLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUVJLE9BQU87c0JBQWhCLE1BQU07Z0JBRWdCLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZU1vZGVsLCBCYXNlTW9kZWxJbnRlcmZhY2UsIERkYXRhQ29yZU1vZHVsZSwgRmllbGRzSW50ZXJmYWNlIH0gZnJvbSAnZGRhdGEtY29yZSc7XG5pbXBvcnQgeyBJbnB1dEhlbHBlclNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pbnB1dC9oZWxwZXIvaW5wdXQtaGVscGVyLXNlcnZpY2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IElucHV0SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2lucHV0L2hlbHBlci9pbnB1dC1oZWxwZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RkLXRleHRhcmVhJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RleHRhcmVhLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGV4dGFyZWEuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEZGF0YVRleHRhcmVhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgaGVscGVyU2VydmljZTogSW5wdXRIZWxwZXJTZXJ2aWNlSW50ZXJmYWNlID0gRGRhdGFDb3JlTW9kdWxlLkluamVjdG9ySW5zdGFuY2UuZ2V0PElucHV0SGVscGVyU2VydmljZUludGVyZmFjZT4oSW5wdXRIZWxwZXJTZXJ2aWNlKTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZTogdmFyaWFibGUtbmFtZVxuICBfZmllbGQgPSAnJztcbiAgX3RpdGxlID0gJyc7XG4gIF9sYWJlbCA9ICcnO1xuICBfcGxhY2Vob2xkZXIgPSAnJztcbiAgX3ByZXBlbmQgPSAnJztcbiAgX2FwcGVuZCA9ICcnO1xuICBfbWF4ID0gJyc7XG4gIF9pc1JlcXVpcmVkID0gZmFsc2U7XG4gIF9tb2RlbDogQmFzZU1vZGVsSW50ZXJmYWNlPGFueT4gJiBGaWVsZHNJbnRlcmZhY2U8YW55PiA9IG5ldyBCYXNlTW9kZWwoKTtcblxuICBASW5wdXQoKSBzZXQgbW9kZWwodmFsdWU6IEJhc2VNb2RlbEludGVyZmFjZTxhbnk+ICYgRmllbGRzSW50ZXJmYWNlPGFueT4gfCBudWxsKSB7XG4gICAgLy8gcHJldmVudCB1bmRlZmluZWRcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgaW5wdXQtYm94IGNvbXBvbmVudCBnZXQgdW5kZWZpbmVkIG1vZGVsJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fbW9kZWwgPSB2YWx1ZTtcblxuICAgIGlmICghdGhpcy5fbW9kZWwuZmllbGRzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBZb3VyICR7dGhpcy5fbW9kZWwubW9kZWxfbmFtZX0ncyAnZmllbGRzJyBmaWVsZCBpc2AsIHRoaXMuX21vZGVsLmZpZWxkcyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX21vZGVsLmZpZWxkc1t0aGlzLl9maWVsZF0pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFRoZSAke3RoaXMuX21vZGVsLm1vZGVsX25hbWV9J3MgJHt0aGlzLl9maWVsZH0gZmllbGQgaXMgYCwgdGhpcy5fbW9kZWwuZmllbGRzW3RoaXMuX2ZpZWxkXSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoISF0aGlzLl9tb2RlbCAmJiAhIXRoaXMuX21vZGVsLmZpZWxkc1t0aGlzLl9maWVsZF0pIHtcbiAgICAgIHRoaXMuX3RpdGxlID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldFRpdGxlKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHRoaXMuaGVscGVyU2VydmljZS5nZXRQbGFjZWhvbGRlcih0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuICAgICAgdGhpcy5fcHJlcGVuZCA9IHRoaXMuaGVscGVyU2VydmljZS5nZXRQcmVwZW5kKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgICB0aGlzLl9hcHBlbmQgPSB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0QXBwZW5kKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgICB0aGlzLl9sYWJlbCA9IHRoaXMuaGVscGVyU2VydmljZS5nZXRMYWJlbCh0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuICAgIH1cblxuICAgIGlmICghIXRoaXMuX21vZGVsICYmICEhdGhpcy5fbW9kZWwudmFsaWRhdGlvblJ1bGVzW3RoaXMuX2ZpZWxkXSkge1xuICAgICAgdGhpcy5faXNSZXF1aXJlZCA9IHRoaXMuaGVscGVyU2VydmljZS5pc1JlcXVpcmVkKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgfVxuICB9XG4gIGdldCBtb2RlbCgpOiBCYXNlTW9kZWxJbnRlcmZhY2U8YW55PiAmIEZpZWxkc0ludGVyZmFjZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gIH1cbiAgQElucHV0KCkgc2V0IGZpZWxkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YWx1ZSA9ICdpc1ZhbGlkJztcbiAgICB9XG5cbiAgICB0aGlzLl9maWVsZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIHNldCBhcHBlbmQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5fYXBwZW5kID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KCkgc2V0IHByZXBlbmQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJlcGVuZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIHNldCBsYWJlbFRleHQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5fbGFiZWwgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKSBpbnB1dENsYXNzID0gJ2Zvcm0tY29udHJvbCc7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzVmlld09ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgbGFiZWxDbGFzcyA9ICdjb2wtMTIgY29sLW1kLTMgcHgtMCBjb2wtZm9ybS1sYWJlbCc7XG4gIEBJbnB1dCgpIGlucHV0QmxvY2tDbGFzcyA9ICdjb2wtMTIgZC1mbGV4IHB4LTAnO1xuICBASW5wdXQoKSBpbnB1dEJsb2NrRXh0cmFDbGFzcyA9ICdjb2wtbWQtOSc7XG4gIEBJbnB1dCgpIHZpZXdPbmx5Q2xhc3MgPSAnZm9ybS1jb250cm9sIGJvcmRlci0wIGJnLWxpZ2h0JztcbiAgQElucHV0KCkgc2hvd0xhYmVsID0gdHJ1ZTtcbiAgQElucHV0KCkgYXV0b0ZvY3VzID0gZmFsc2U7XG4gIEBJbnB1dCgpIHdyYXBwZXJDbGFzcyA9ICdkLWZsZXggZmxleC13cmFwJztcbiAgQElucHV0KCkgcm93cyA9ICc1JztcbiAgQElucHV0KCkgZW5hYmxlQ2hhcmFjdGVyQ291bnRlciA9IGZhbHNlO1xuICBASW5wdXQoKSBlbmFibGVXb3JkQ291bnRlciA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXhMZW5ndGggPSAyNTU7XG4gIEBJbnB1dCgpIG1heFdvcmRzID0gNztcbiAgQElucHV0KCkgd29yZENvdW50ZXJXYXJuaW5nTWVzc2FnZSA9ICcnO1xuXG4gIEBPdXRwdXQoKSBjaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKCdpbnB1dEJveCcpIGlucHV0Qm94OiBFbGVtZW50UmVmO1xuXG4gIHJhbmRvbTogc3RyaW5nID0gdGhpcy5oZWxwZXJTZXJ2aWNlLnJhbmRDaGFycygpO1xuXG4gIGRpc3BsYXlXb3JkQ291bnRlcldhcm5pbmcgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmF1dG9Gb2N1cykge1xuICAgICAgdGhpcy5pbnB1dEJveC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVGaWVsZCgpOiB2b2lkIHtcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy5oZWxwZXJTZXJ2aWNlLnZhbGlkYXRlRmllbGQodGhpcy5fbW9kZWwsIHRoaXMuX2ZpZWxkKTtcblxuICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICB0aGlzLmNoYW5nZWQuZW1pdCh0aGlzLl9tb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgc2V0V29yZENvdW50ZXJXYXJuaW5nKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5V29yZENvdW50ZXJXYXJuaW5nID0gdmFsdWU7XG4gIH1cblxufVxuIiwiPGRpdiBbY2xhc3NdPVwid3JhcHBlckNsYXNzXCI+XG4gIDxsYWJlbCBbY2xhc3NdPVwibGFiZWxDbGFzc1wiIFtmb3JdPVwiX2ZpZWxkICsgJ18nICsgcmFuZG9tXCIgKm5nSWY9XCJzaG93TGFiZWxcIj5cbiAgICB7eyBfbGFiZWwgfX06XG4gICAgPHNwYW4gKm5nSWY9XCJfaXNSZXF1aXJlZFwiPiAqPC9zcGFuPlxuICA8L2xhYmVsPlxuICA8ZGl2IFtjbGFzc109XCJpbnB1dEJsb2NrQ2xhc3NcIiBbbmdDbGFzc109XCJzaG93TGFiZWwgPyBpbnB1dEJsb2NrRXh0cmFDbGFzcyA6ICcnXCI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXByZXBlbmRcIiAqbmdJZj1cIiBfcHJlcGVuZCAhPSAnJyBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+e3sgX3ByZXBlbmQgfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDx0ZXh0YXJlYSAqbmdJZj1cIiFpc1ZpZXdPbmx5XCJcbiAgICAgIFtpZF09XCJfZmllbGQgKyAnXycgKyByYW5kb21cIlxuICAgICAgW2F0dHIubmFtZV09XCJfZmllbGQgKyAnXycgKyByYW5kb21cIlxuICAgICAgW2NsYXNzLmludmFsaWRdPVwiX21vZGVsLnZhbGlkYXRpb25FcnJvcnMuaW5jbHVkZXMoX2ZpZWxkKVwiXG4gICAgICBbY2xhc3NdPVwiaW5wdXRDbGFzc1wiXG4gICAgICBbcm93c109XCJyb3dzXCJcbiAgICAgIFsobmdNb2RlbCldPVwiX21vZGVsW19maWVsZF1cIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIl9wbGFjZWhvbGRlclwiXG4gICAgICBbdGl0bGVdPVwiX3RpdGxlXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAoa2V5dXApPVwidmFsaWRhdGVGaWVsZCgpXCJcbiAgICAgICNpbnB1dEJveD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbmFibGVDaGFyYWN0ZXJDb3VudGVyXCI+XG4gICAgICAgIDxjaGFyYWN0ZXItY291bnRlciBbY3VycmVudExlbmd0aF09XCJtb2RlbFtfZmllbGRdPy5sZW5ndGggfHwgMFwiIFttYXhMZW5ndGhdPVwibWF4TGVuZ3RoXCI+PC9jaGFyYWN0ZXItY291bnRlcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVuYWJsZVdvcmRDb3VudGVyXCI+XG4gICAgICAgIDxhcHAtd29yZC1jb3VudGVyXG4gICAgICAgIFtjdXJyZW50TGVuZ3RoXT1cIm1vZGVsW19maWVsZF1cIlxuICAgICAgICBbbWF4TGVuZ3RoXT1cIm1heFdvcmRzXCJcbiAgICAgICAgKG1heExlbnRnaFJlYWNoZWQpPVwic2hvd1dvcmRDb3VudGVyV2FybmluZyA9ICRldmVudFwiXG4gICAgICA+PC9hcHAtd29yZC1jb3VudGVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC90ZXh0YXJlYT5cblxuICAgIDxkaXYgKm5nSWY9XCJpc1ZpZXdPbmx5XCJcbiAgICAgIFtpZF09XCJmaWVsZFwiXG4gICAgICBbbmFtZV09XCJmaWVsZFwiXG4gICAgICBbdGl0bGVdPVwiX3RpdGxlXCJcbiAgICAgIFtjbGFzc109XCJ2aWV3T25seUNsYXNzXCI+XG5cbiAgICAgIHt7IF9tb2RlbFtfZmllbGRdIH19XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCIgKm5nSWY9XCJfYXBwZW5kICE9ICcnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiPnt7IF9hcHBlbmQgfX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJkaXNwbGF5V29yZENvdW50ZXJXYXJuaW5nICYmIHdvcmRDb3VudGVyV2FybmluZ01lc3NhZ2UgIT09ICcnXCIgY2xhc3M9XCJkLWZsZXggcGItMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTcgb2Zmc2V0LW1kLTMgYmctd2FybmluZyBwLTIgcm91bmRlZFwiPlxuICAgICAge3sgd29yZENvdW50ZXJXYXJuaW5nTWVzc2FnZSB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19