ddata-ui-input
Version:
DData UI Input module, components, models & services
183 lines • 26.7 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { faCalendar } from '@fortawesome/free-solid-svg-icons';
import { BaseModel, DdataCoreModule } from 'ddata-core';
import * as moment from 'moment';
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 "@fortawesome/angular-fontawesome";
import * as i3 from "@ng-bootstrap/ng-bootstrap";
export class DdataInputDateComponent {
constructor(changeDetector) {
this.changeDetector = changeDetector;
this.helperService = DdataCoreModule.InjectorInstance.get(InputHelperService);
// tslint:disable: variable-name
this._field = '';
this._title = '';
this._label = '';
this._placeholder = '';
this._prepend = '';
this._append = '';
this._isRequired = false;
this._model = new BaseModel();
this._moment = moment;
this.disabled = false;
this.inputClass = 'form-control';
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.showLabel = true;
this.autoFocus = false;
this.isViewOnly = false;
this.viewOnlyClass = 'form-control border-0 bg-light';
this.buttonClass = 'input-group-prepend btn btn-light mb-0';
this.wrapperClass = 'd-flex flex-wrap';
this.format = 'YYYY-MM-DD';
this.separator = '-';
this.labelApply = 'OK';
this.labelCancel = 'Cancel';
this.position = 'center';
this.direction = 'down';
this.showIcon = true;
this.autoApply = true;
this.singleDatePicker = true;
this.changed = new EventEmitter();
this.icon = {
calendar: faCalendar,
};
this.random = this.helperService.randChars();
this.selectedValue = !!this.model[this._field] ? this.model[this._field] : '';
}
set moment(value) {
if (!value) {
value = moment;
}
this._moment = value;
}
set model(value) {
if (!value) {
value = new BaseModel();
}
this._model = value;
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() {
if (!!this.model[this._field]) {
this.selectedValue = this.model[this._field];
}
if (this.autoFocus) {
this.inputBox.nativeElement.focus();
}
}
change(value) {
this.selectedValue = value.year + '-' + value.month.toString().padStart(2, '0') + '-' + value.day.toString().padStart(2, '0');
this.model[this._field] = this.selectedValue;
const isValid = this.helperService.validateField(this._model, this._field);
if (isValid) {
this.changed.emit(this._model);
}
}
typeChange(event) {
this._model[this._field] = event.target.value;
}
}
DdataInputDateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataInputDateComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
DdataInputDateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: DdataInputDateComponent, selector: "dd-input-date", inputs: { moment: "moment", model: "model", field: "field", append: "append", prepend: "prepend", labelText: "labelText", disabled: "disabled", inputClass: "inputClass", labelClass: "labelClass", inputBlockClass: "inputBlockClass", inputBlockExtraClass: "inputBlockExtraClass", showLabel: "showLabel", autoFocus: "autoFocus", isViewOnly: "isViewOnly", viewOnlyClass: "viewOnlyClass", buttonClass: "buttonClass", wrapperClass: "wrapperClass", format: "format", separator: "separator", labelApply: "labelApply", labelCancel: "labelCancel", position: "position", direction: "direction", showIcon: "showIcon", autoApply: "autoApply", singleDatePicker: "singleDatePicker" }, 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=\"_is_required\"> *</span>\n </label>\n\n <div [class]=\"inputBlockClass\" [ngClass]=\"showLabel ? inputBlockExtraClass : ''\">\n\n <div class=\"input-group-prepend\" *ngIf=\" _prepend != '' \">\n <div class=\"input-group-text\">{{ _prepend }}</div>\n </div>\n\n <ng-container *ngIf=\"!isViewOnly\">\n\n <input\n [class.invalid]=\"model.validationErrors.includes(_field)\"\n [class]=\"inputClass\"\n [disabled]=\"disabled\"\n [id]=\"_field + '_' + random\"\n [name]=\"_field + '_' + random\"\n [placeholder]=\"_placeholder\"\n [title]=\"_title\"\n [value]=\"model[_field]\"\n (dateSelect)=\"change($event)\"\n type=\"text\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (click)=\"d.toggle()\"\n (change)=\"typeChange($event)\">\n\n </ng-container>\n\n <ng-container *ngIf=\"isViewOnly\">\n <div [class]=\"viewOnlyClass\">{{ model[_field] }}</div>\n </ng-container>\n\n <label [class]=\"buttonClass\" *ngIf=\"!disabled && showIcon\" [for]=\"_field + '_' + random\">\n <fa-icon [icon]=\"icon.calendar\"></fa-icon>\n </label>\n\n <div class=\"input-group-append\" *ngIf=\"_append != ''\">\n <div class=\"input-group-text\">{{ _append }}</div>\n </div>\n </div>\n\n</div>\n", styles: [":host{position:relative;flex:1 1 auto}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i3.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataInputDateComponent, decorators: [{
type: Component,
args: [{ selector: 'dd-input-date', template: "<div [class]=\"wrapperClass\">\n <label [class]=\"labelClass\" [for]=\"_field + '_' + random\" *ngIf=\"showLabel\">\n {{ _label }}:\n <span *ngIf=\"_is_required\"> *</span>\n </label>\n\n <div [class]=\"inputBlockClass\" [ngClass]=\"showLabel ? inputBlockExtraClass : ''\">\n\n <div class=\"input-group-prepend\" *ngIf=\" _prepend != '' \">\n <div class=\"input-group-text\">{{ _prepend }}</div>\n </div>\n\n <ng-container *ngIf=\"!isViewOnly\">\n\n <input\n [class.invalid]=\"model.validationErrors.includes(_field)\"\n [class]=\"inputClass\"\n [disabled]=\"disabled\"\n [id]=\"_field + '_' + random\"\n [name]=\"_field + '_' + random\"\n [placeholder]=\"_placeholder\"\n [title]=\"_title\"\n [value]=\"model[_field]\"\n (dateSelect)=\"change($event)\"\n type=\"text\"\n ngbDatepicker\n #d=\"ngbDatepicker\"\n (click)=\"d.toggle()\"\n (change)=\"typeChange($event)\">\n\n </ng-container>\n\n <ng-container *ngIf=\"isViewOnly\">\n <div [class]=\"viewOnlyClass\">{{ model[_field] }}</div>\n </ng-container>\n\n <label [class]=\"buttonClass\" *ngIf=\"!disabled && showIcon\" [for]=\"_field + '_' + random\">\n <fa-icon [icon]=\"icon.calendar\"></fa-icon>\n </label>\n\n <div class=\"input-group-append\" *ngIf=\"_append != ''\">\n <div class=\"input-group-text\">{{ _append }}</div>\n </div>\n </div>\n\n</div>\n", styles: [":host{position:relative;flex:1 1 auto}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { moment: [{
type: Input
}], model: [{
type: Input
}], field: [{
type: Input
}], append: [{
type: Input
}], prepend: [{
type: Input
}], labelText: [{
type: Input
}], disabled: [{
type: Input
}], inputClass: [{
type: Input
}], labelClass: [{
type: Input
}], inputBlockClass: [{
type: Input
}], inputBlockExtraClass: [{
type: Input
}], showLabel: [{
type: Input
}], autoFocus: [{
type: Input
}], isViewOnly: [{
type: Input
}], viewOnlyClass: [{
type: Input
}], buttonClass: [{
type: Input
}], wrapperClass: [{
type: Input
}], format: [{
type: Input
}], separator: [{
type: Input
}], labelApply: [{
type: Input
}], labelCancel: [{
type: Input
}], position: [{
type: Input
}], direction: [{
type: Input
}], showIcon: [{
type: Input
}], autoApply: [{
type: Input
}], singleDatePicker: [{
type: Input
}], changed: [{
type: Output
}], inputBox: [{
type: ViewChild,
args: ['inputBox']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZGF0YS11aS1pbnB1dC9zcmMvbGliL2NvbXBvbmVudHMvZGF0ZS9kYXRlLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RkYXRhLXVpLWlucHV0L3NyYy9saWIvY29tcG9uZW50cy9kYXRlL2RhdGUtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUvRCxPQUFPLEVBQUUsU0FBUyxFQUFzQixlQUFlLEVBQW1CLE1BQU0sWUFBWSxDQUFDO0FBQzdGLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRWpDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDOzs7OztBQU90RixNQUFNLE9BQU8sdUJBQXVCO0lBc0dsQyxZQUNVLGNBQWlDO1FBQWpDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQXRHM0Msa0JBQWEsR0FBZ0MsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBOEIsa0JBQWtCLENBQUMsQ0FBQztRQUVuSSxnQ0FBZ0M7UUFDaEMsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osaUJBQVksR0FBRyxFQUFFLENBQUM7UUFDbEIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixXQUFNLEdBQW1ELElBQUksU0FB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QixLQUFLO2dCQU9PLFNBQVM7c0JBQXJCLEtBQUs7Z0JBT0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVJLE9BQU87c0JBQWhCLE1BQU07Z0JBRWdCLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZhQ2FsZW5kYXIgfSBmcm9tICdAZm9ydGF3ZXNvbWUvZnJlZS1zb2xpZC1zdmctaWNvbnMnO1xuaW1wb3J0IHsgTmdiRGF0ZSwgTmdiSW5wdXREYXRlcGlja2VyIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgQmFzZU1vZGVsLCBCYXNlTW9kZWxJbnRlcmZhY2UsIERkYXRhQ29yZU1vZHVsZSwgRmllbGRzSW50ZXJmYWNlIH0gZnJvbSAnZGRhdGEtY29yZSc7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IElucHV0SGVscGVyU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2lucHV0L2hlbHBlci9pbnB1dC1oZWxwZXItc2VydmljZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSW5wdXRIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaW5wdXQvaGVscGVyL2lucHV0LWhlbHBlci5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGQtaW5wdXQtZGF0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZS1pbnB1dC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERkYXRhSW5wdXREYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgaGVscGVyU2VydmljZTogSW5wdXRIZWxwZXJTZXJ2aWNlSW50ZXJmYWNlID0gRGRhdGFDb3JlTW9kdWxlLkluamVjdG9ySW5zdGFuY2UuZ2V0PElucHV0SGVscGVyU2VydmljZUludGVyZmFjZT4oSW5wdXRIZWxwZXJTZXJ2aWNlKTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZTogdmFyaWFibGUtbmFtZVxuICBfZmllbGQgPSAnJztcbiAgX3RpdGxlID0gJyc7XG4gIF9sYWJlbCA9ICcnO1xuICBfcGxhY2Vob2xkZXIgPSAnJztcbiAgX3ByZXBlbmQgPSAnJztcbiAgX2FwcGVuZCA9ICcnO1xuICBfaXNSZXF1aXJlZCA9IGZhbHNlO1xuICBfbW9kZWw6IEJhc2VNb2RlbEludGVyZmFjZTxhbnk+ICYgRmllbGRzSW50ZXJmYWNlPGFueT4gPSBuZXcgQmFzZU1vZGVsKCk7XG4gIF9tb21lbnQgPSBtb21lbnQ7XG5cbiAgQElucHV0KCkgc2V0IG1vbWVudCh2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdmFsdWUgPSBtb21lbnQ7XG4gICAgfVxuXG4gICAgdGhpcy5fbW9tZW50ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KCkgc2V0IG1vZGVsKHZhbHVlOiBCYXNlTW9kZWxJbnRlcmZhY2U8YW55PiAmIEZpZWxkc0ludGVyZmFjZTxhbnk+IHwgbnVsbCkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHZhbHVlID0gbmV3IEJhc2VNb2RlbCgpO1xuICAgIH1cblxuICAgIHRoaXMuX21vZGVsID0gdmFsdWU7XG5cbiAgICBpZiAoISF0aGlzLl9tb2RlbCAmJiAhIXRoaXMuX21vZGVsLmZpZWxkc1t0aGlzLl9maWVsZF0pIHtcbiAgICAgIHRoaXMuX3RpdGxlID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldFRpdGxlKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHRoaXMuaGVscGVyU2VydmljZS5nZXRQbGFjZWhvbGRlcih0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuICAgICAgdGhpcy5fcHJlcGVuZCA9IHRoaXMuaGVscGVyU2VydmljZS5nZXRQcmVwZW5kKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgICB0aGlzLl9hcHBlbmQgPSB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0QXBwZW5kKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgICB0aGlzLl9sYWJlbCA9IHRoaXMuaGVscGVyU2VydmljZS5nZXRMYWJlbCh0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuICAgIH1cblxuICAgIGlmICghIXRoaXMuX21vZGVsICYmICEhdGhpcy5fbW9kZWwudmFsaWRhdGlvblJ1bGVzW3RoaXMuX2ZpZWxkXSkge1xuICAgICAgdGhpcy5faXNSZXF1aXJlZCA9IHRoaXMuaGVscGVyU2VydmljZS5pc1JlcXVpcmVkKHRoaXMuX21vZGVsLCB0aGlzLl9maWVsZCk7XG4gICAgfVxuICB9XG4gIGdldCBtb2RlbCgpOiBCYXNlTW9kZWxJbnRlcmZhY2U8YW55PiAmIEZpZWxkc0ludGVyZmFjZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gIH1cbiAgQElucHV0KCkgc2V0IGZpZWxkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YWx1ZSA9ICdpc1ZhbGlkJztcbiAgICB9XG5cbiAgICB0aGlzLl9maWVsZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIHNldCBhcHBlbmQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5fYXBwZW5kID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KCkgc2V0IHByZXBlbmQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJlcGVuZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIHNldCBsYWJlbFRleHQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5fbGFiZWwgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBpbnB1dENsYXNzID0gJ2Zvcm0tY29udHJvbCc7XG4gIEBJbnB1dCgpIGxhYmVsQ2xhc3MgPSAnY29sLTEyIGNvbC1tZC0zIHB4LTAgY29sLWZvcm0tbGFiZWwnO1xuICBASW5wdXQoKSBpbnB1dEJsb2NrQ2xhc3MgPSAnY29sLTEyIGQtZmxleCBweC0wJztcbiAgQElucHV0KCkgaW5wdXRCbG9ja0V4dHJhQ2xhc3MgPSAnY29sLW1kLTknO1xuICBASW5wdXQoKSBzaG93TGFiZWwgPSB0cnVlO1xuICBASW5wdXQoKSBhdXRvRm9jdXMgPSBmYWxzZTtcbiAgQElucHV0KCkgaXNWaWV3T25seSA9IGZhbHNlO1xuICBASW5wdXQoKSB2aWV3T25seUNsYXNzID0gJ2Zvcm0tY29udHJvbCBib3JkZXItMCBiZy1saWdodCc7XG4gIEBJbnB1dCgpIGJ1dHRvbkNsYXNzID0gJ2lucHV0LWdyb3VwLXByZXBlbmQgYnRuIGJ0bi1saWdodCBtYi0wJztcbiAgQElucHV0KCkgd3JhcHBlckNsYXNzID0gJ2QtZmxleCBmbGV4LXdyYXAnO1xuICBASW5wdXQoKSBmb3JtYXQgPSAnWVlZWS1NTS1ERCc7XG4gIEBJbnB1dCgpIHNlcGFyYXRvciA9ICctJztcbiAgQElucHV0KCkgbGFiZWxBcHBseSA9ICdPSyc7XG4gIEBJbnB1dCgpIGxhYmVsQ2FuY2VsID0gJ0NhbmNlbCc7XG4gIEBJbnB1dCgpIHBvc2l0aW9uOiAnbGVmdCcgfCAnY2VudGVyJyB8ICdyaWdodCcgPSAnY2VudGVyJztcbiAgQElucHV0KCkgZGlyZWN0aW9uOiAndXAnIHwgJ2Rvd24nID0gJ2Rvd24nO1xuICBASW5wdXQoKSBzaG93SWNvbiA9IHRydWU7XG4gIEBJbnB1dCgpIGF1dG9BcHBseSA9IHRydWU7XG4gIEBJbnB1dCgpIHNpbmdsZURhdGVQaWNrZXIgPSB0cnVlO1xuXG4gIEBPdXRwdXQoKSBjaGFuZ2VkOiBFdmVudEVtaXR0ZXI8QmFzZU1vZGVsSW50ZXJmYWNlPGFueT4gJiBGaWVsZHNJbnRlcmZhY2U8YW55Pj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgnaW5wdXRCb3gnKSBpbnB1dEJveDogRWxlbWVudFJlZjtcblxuICBpY29uID0ge1xuICAgIGNhbGVuZGFyOiBmYUNhbGVuZGFyLFxuICB9O1xuICByYW5kb206IHN0cmluZyA9IHRoaXMuaGVscGVyU2VydmljZS5yYW5kQ2hhcnMoKTtcbiAgc2VsZWN0ZWRWYWx1ZSA9ICEhdGhpcy5tb2RlbFt0aGlzLl9maWVsZF0gPyB0aGlzLm1vZGVsW3RoaXMuX2ZpZWxkXSA6ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghIXRoaXMubW9kZWxbdGhpcy5fZmllbGRdKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSB0aGlzLm1vZGVsW3RoaXMuX2ZpZWxkXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hdXRvRm9jdXMpIHtcbiAgICAgIHRoaXMuaW5wdXRCb3gubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG5cbiAgY2hhbmdlKHZhbHVlOiBOZ2JEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdmFsdWUueWVhciArICctJyArIHZhbHVlLm1vbnRoLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSArICctJyArIHZhbHVlLmRheS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG5cbiAgICB0aGlzLm1vZGVsW3RoaXMuX2ZpZWxkXSA9IHRoaXMuc2VsZWN0ZWRWYWx1ZTtcblxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLmhlbHBlclNlcnZpY2UudmFsaWRhdGVGaWVsZCh0aGlzLl9tb2RlbCwgdGhpcy5fZmllbGQpO1xuXG4gICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KHRoaXMuX21vZGVsKTtcbiAgICB9XG4gIH1cblxuICB0eXBlQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RlbFt0aGlzLl9maWVsZF0gPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH1cbn1cbiIsIjxkaXYgW2NsYXNzXT1cIndyYXBwZXJDbGFzc1wiPlxuICA8bGFiZWwgW2NsYXNzXT1cImxhYmVsQ2xhc3NcIiBbZm9yXT1cIl9maWVsZCArICdfJyArIHJhbmRvbVwiICpuZ0lmPVwic2hvd0xhYmVsXCI+XG4gICAge3sgX2xhYmVsIH19OlxuICAgIDxzcGFuICpuZ0lmPVwiX2lzX3JlcXVpcmVkXCI+ICo8L3NwYW4+XG4gIDwvbGFiZWw+XG5cbiAgPGRpdiBbY2xhc3NdPVwiaW5wdXRCbG9ja0NsYXNzXCIgW25nQ2xhc3NdPVwic2hvd0xhYmVsID8gaW5wdXRCbG9ja0V4dHJhQ2xhc3MgOiAnJ1wiPlxuXG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXByZXBlbmRcIiAqbmdJZj1cIiBfcHJlcGVuZCAhPSAnJyBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+e3sgX3ByZXBlbmQgfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNWaWV3T25seVwiPlxuXG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIFtjbGFzcy5pbnZhbGlkXT1cIm1vZGVsLnZhbGlkYXRpb25FcnJvcnMuaW5jbHVkZXMoX2ZpZWxkKVwiXG4gICAgICAgICAgW2NsYXNzXT1cImlucHV0Q2xhc3NcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgW2lkXT1cIl9maWVsZCArICdfJyArIHJhbmRvbVwiXG4gICAgICAgICAgW25hbWVdPVwiX2ZpZWxkICsgJ18nICsgcmFuZG9tXCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiX3BsYWNlaG9sZGVyXCJcbiAgICAgICAgICBbdGl0bGVdPVwiX3RpdGxlXCJcbiAgICAgICAgICBbdmFsdWVdPVwibW9kZWxbX2ZpZWxkXVwiXG4gICAgICAgICAgKGRhdGVTZWxlY3QpPVwiY2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBuZ2JEYXRlcGlja2VyXG4gICAgICAgICAgI2Q9XCJuZ2JEYXRlcGlja2VyXCJcbiAgICAgICAgICAoY2xpY2spPVwiZC50b2dnbGUoKVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJ0eXBlQ2hhbmdlKCRldmVudClcIj5cblxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVmlld09ubHlcIj5cbiAgICAgIDxkaXYgW2NsYXNzXT1cInZpZXdPbmx5Q2xhc3NcIj57eyBtb2RlbFtfZmllbGRdIH19PC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bGFiZWwgW2NsYXNzXT1cImJ1dHRvbkNsYXNzXCIgKm5nSWY9XCIhZGlzYWJsZWQgJiYgc2hvd0ljb25cIiBbZm9yXT1cIl9maWVsZCArICdfJyArIHJhbmRvbVwiPlxuICAgICAgPGZhLWljb24gW2ljb25dPVwiaWNvbi5jYWxlbmRhclwiPjwvZmEtaWNvbj5cbiAgICA8L2xhYmVsPlxuXG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiICpuZ0lmPVwiX2FwcGVuZCAhPSAnJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIj57eyBfYXBwZW5kIH19PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG48L2Rpdj5cbiJdfQ==