UNPKG

ontimize-web-ngx

Version:
202 lines 33.9 kB
import { __decorate, __metadata } from "tslib"; import { ChangeDetectionStrategy, Component, Injector, TemplateRef, ViewChild, ViewEncapsulation } from '@angular/core'; import { DateAdapter, MAT_DATE_LOCALE } from '@angular/material/core'; import moment from 'moment'; import { BooleanInputConverter } from '../../../../../decorators/input-converter'; import { MomentService } from '../../../../../services/moment.service'; import { OntimizeMomentDateAdapter } from '../../../../../shared/material/date/ontimize-moment-date-adapter'; import { Util } from '../../../../../util/util'; import { OBaseTableCellEditor } from '../o-base-table-cell-editor.class'; import * as i0 from "@angular/core"; import * as i1 from "@angular/material/core"; import * as i2 from "@angular/common"; import * as i3 from "@angular/forms"; import * as i4 from "../../../../../directives/o-mat-error.directive"; import * as i5 from "@angular/material/datepicker"; import * as i6 from "@angular/material/icon"; import * as i7 from "@angular/material/input"; import * as i8 from "@angular/material/form-field"; import * as i9 from "@angular/material/tooltip"; import * as i10 from "../../../../../pipes/o-translate.pipe"; export const DEFAULT_INPUTS_O_TABLE_CELL_EDITOR_DATE = [ 'format', 'locale', 'oStartView: start-view', 'min', 'max', 'oTouchUi: touch-ui', 'startAt: start-at', 'filterDate: filter-date', 'dateValueType: date-value-type' ]; export class OTableCellEditorDateComponent extends OBaseTableCellEditor { constructor(injector, momentDateAdapter) { super(injector); this.injector = injector; this.momentDateAdapter = momentDateAdapter; this.format = 'L'; this.oStartView = 'month'; this.oTouchUi = false; this._dateValueType = 'timestamp'; this.momentSrv = this.injector.get(MomentService); } initialize() { super.initialize(); if (!this.locale) { this.locale = this.momentSrv.getLocale(); } if (this.format) { this.momentDateAdapter.oFormat = this.format; } this.momentDateAdapter.setLocale(this.locale); if (this.startAt) { this.oStartAt = new Date(this.startAt); } if (this.min) { const date = new Date(this.min); const momentD = moment(date); if (momentD.isValid()) { this.oMinDate = date; this.minDateString = momentD.format(this.format); } } if (this.max) { const date = new Date(this.max); const momentD = moment(date); if (momentD.isValid()) { this.oMaxDate = date; this.maxDateString = momentD.format(this.format); } } } handleKeyup(event) { const oColumn = this.table.getOColumn(this.tableColumn.attr); if (!oColumn) { return; } if (!oColumn.editing && this.datepicker && this.datepicker.opened) { this.datepicker.close(); } else { super.handleKeyup(event); } } startEdition(data) { super.startEdition(data); if (!this.startAt) { this.oStartAt = this.getCellData(); } } getCellData() { const value = super.getCellData(); if (Util.isDefined(value)) { let result = value; let m; switch (this.dateValueType) { case 'string': m = moment(value, this.format); break; case 'date': break; case 'iso-8601': case 'timestamp': default: m = moment(value); break; } if (Util.isDefined(m)) { result = m.toDate(); } return result; } return value; } commitEdition() { if (!this.formControl.invalid) { this.oldValue = this._rowData[this.tableColumnAttr]; this._rowData[this.tableColumnAttr] = this.getValueByValyType(); if (!this.isSilentControl()) { this.endEdition(true); this.editionCommitted.emit(this._rowData); } } } getValueByValyType() { let result = this.formControl.value; const m = moment(this.formControl.value); switch (this.dateValueType) { case 'string': result = m.format(this.format); break; case 'date': result = new Date(result); break; case 'iso-8601': result = m.toISOString(); break; case 'timestamp': default: result = m.valueOf(); break; } return result; } onDateChange(event) { const isValid = event.value && event.value.isValid && event.value.isValid(); let val = isValid ? event.value.valueOf() : event.value; const m = moment(val); switch (this.dateValueType) { case 'string': if (val) { val = m.format(this.format); } break; case 'date': val = new Date(val); break; case 'iso-8601': val = m.toISOString(); break; case 'timestamp': default: break; } this.formControl.setValue(val, { emitModelToViewChange: false, emitEvent: false }); } openDatepicker(d) { this.datepicker = d; d.open(); } set dateValueType(val) { this._dateValueType = Util.convertToODateValueType(val); } get dateValueType() { return this._dateValueType; } onClosed() { if (this.inputRef) { this.inputRef.nativeElement.focus(); } } } OTableCellEditorDateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableCellEditorDateComponent, deps: [{ token: i0.Injector }, { token: i1.DateAdapter }], target: i0.ɵɵFactoryTarget.Component }); OTableCellEditorDateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OTableCellEditorDateComponent, selector: "o-table-cell-editor-date", inputs: { format: "format", locale: "locale", oStartView: ["start-view", "oStartView"], min: "min", max: "max", oTouchUi: ["touch-ui", "oTouchUi"], startAt: ["start-at", "startAt"], filterDate: ["filter-date", "filterDate"], dateValueType: ["date-value-type", "dateValueType"] }, providers: [ { provide: DateAdapter, useClass: OntimizeMomentDateAdapter, deps: [MAT_DATE_LOCALE] } ], viewQueries: [{ propertyName: "templateref", first: true, predicate: ["templateref"], descendants: true, read: TemplateRef, static: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #templateref let-cellvalue=\"cellvalue\" let-rowvalue=\"rowvalue\">\n <div [formGroup]=\"formGroup\" class=\"o-table-cell-editor-date o-table-cell-editor\"\n [matTooltip]=\"tooltip\"\n [matTooltipClass]=\"tooltipClass\"\n [matTooltipPosition]=\"tooltipPosition\"\n [matTooltipShowDelay]=\"tooltipShowDelay\"\n [matTooltipHideDelay]=\"tooltipHideDelay\">\n <mat-form-field cdkFocusInitial>\n <input #input matInput [id]=\"cellEditorId\" [placeholder]=\"getPlaceholder()\" [formControl]=\"formControl\"\n [required]=\"orequired\" [matDatepicker]=\"d\" [matDatepickerFilter]=\"filterDate\"\n (dateChange)=\"onDateChange($event)\" [min]=\"oMinDate\" [max]=\"oMaxDate\">\n\n <mat-datepicker #d [startView]=\"oStartView\" [startAt]=\"oStartAt\" [touchUi]=\"oTouchUi\" (closed)=\"onClosed()\">\n </mat-datepicker>\n\n <span class=\"icon-btn\" (click)=\"openDatepicker(d)\" matSuffix>\n <mat-icon svgIcon=\"ontimize:today\"></mat-icon>\n </span>\n\n <mat-error *oMatError=\"hasError('required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n <mat-error *oMatError=\"hasError('matDatepickerParse')\">\n {{ 'FORM_VALIDATION.DATE_PARSE' | oTranslate }} {{ format }}\n </mat-error>\n <mat-error *oMatError=\"hasError('matDatepickerFilter')\">\n {{ 'FORM_VALIDATION.DATE_FILTER' | oTranslate }}\n </mat-error>\n <mat-error *oMatError=\"hasError('matDatepickerMin')\">\n {{ 'FORM_VALIDATION.DATE_MIN' | oTranslate }} {{ minDateString }}\n </mat-error>\n <mat-error *oMatError=\"hasError('matDatepickerMax')\">\n {{ 'FORM_VALIDATION.DATE_MAX' | oTranslate }} {{ maxDateString }}\n </mat-error>\n <mat-error *ngFor=\"let oError of getActiveOErrors()\">\n {{ getErrorText(oError) }}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.OMatErrorDirective, selector: "[oMatError]", inputs: ["oMatError"] }, { kind: "component", type: i5.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.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: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "pipe", type: i10.OTranslatePipe, name: "oTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OTableCellEditorDateComponent.prototype, "oTouchUi", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableCellEditorDateComponent, decorators: [{ type: Component, args: [{ selector: 'o-table-cell-editor-date', inputs: DEFAULT_INPUTS_O_TABLE_CELL_EDITOR_DATE, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { provide: DateAdapter, useClass: OntimizeMomentDateAdapter, deps: [MAT_DATE_LOCALE] } ], template: "<ng-template #templateref let-cellvalue=\"cellvalue\" let-rowvalue=\"rowvalue\">\n <div [formGroup]=\"formGroup\" class=\"o-table-cell-editor-date o-table-cell-editor\"\n [matTooltip]=\"tooltip\"\n [matTooltipClass]=\"tooltipClass\"\n [matTooltipPosition]=\"tooltipPosition\"\n [matTooltipShowDelay]=\"tooltipShowDelay\"\n [matTooltipHideDelay]=\"tooltipHideDelay\">\n <mat-form-field cdkFocusInitial>\n <input #input matInput [id]=\"cellEditorId\" [placeholder]=\"getPlaceholder()\" [formControl]=\"formControl\"\n [required]=\"orequired\" [matDatepicker]=\"d\" [matDatepickerFilter]=\"filterDate\"\n (dateChange)=\"onDateChange($event)\" [min]=\"oMinDate\" [max]=\"oMaxDate\">\n\n <mat-datepicker #d [startView]=\"oStartView\" [startAt]=\"oStartAt\" [touchUi]=\"oTouchUi\" (closed)=\"onClosed()\">\n </mat-datepicker>\n\n <span class=\"icon-btn\" (click)=\"openDatepicker(d)\" matSuffix>\n <mat-icon svgIcon=\"ontimize:today\"></mat-icon>\n </span>\n\n <mat-error *oMatError=\"hasError('required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n <mat-error *oMatError=\"hasError('matDatepickerParse')\">\n {{ 'FORM_VALIDATION.DATE_PARSE' | oTranslate }} {{ format }}\n </mat-error>\n <mat-error *oMatError=\"hasError('matDatepickerFilter')\">\n {{ 'FORM_VALIDATION.DATE_FILTER' | oTranslate }}\n </mat-error>\n <mat-error *oMatError=\"hasError('matDatepickerMin')\">\n {{ 'FORM_VALIDATION.DATE_MIN' | oTranslate }} {{ minDateString }}\n </mat-error>\n <mat-error *oMatError=\"hasError('matDatepickerMax')\">\n {{ 'FORM_VALIDATION.DATE_MAX' | oTranslate }} {{ maxDateString }}\n </mat-error>\n <mat-error *ngFor=\"let oError of getActiveOErrors()\">\n {{ getErrorText(oError) }}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n" }] }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.DateAdapter }]; }, propDecorators: { templateref: [{ type: ViewChild, args: ['templateref', { read: TemplateRef, static: true }] }], oTouchUi: [] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS1jZWxsLWVkaXRvci1kYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL2NvbHVtbi9jZWxsLWVkaXRvci9kYXRlL28tdGFibGUtY2VsbC1lZGl0b3ItZGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9jb2x1bW4vY2VsbC1lZGl0b3IvZGF0ZS9vLXRhYmxlLWNlbGwtZWRpdG9yLWRhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFVLFdBQVcsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEksT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGtFQUFrRSxDQUFDO0FBRzdHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7Ozs7O0FBRXpFLE1BQU0sQ0FBQyxNQUFNLHVDQUF1QyxHQUFHO0lBQ3JELFFBQVE7SUFDUixRQUFRO0lBQ1Isd0JBQXdCO0lBQ3hCLEtBQUs7SUFDTCxLQUFLO0lBQ0wsb0JBQW9C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SUFBSSxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUU7S0FDdkYsaUhBS2lDLFdBQVcsa0VDM0MvQyw4NERBd0NBO0FEVUU7SUFBQyxxQkFBcUIsRUFBRTs7K0RBQ0U7NEZBVmYsNkJBQTZCO2tCQVp6QyxTQUFTOytCQUNFLDBCQUEwQixVQUc1Qix1Q0FBdUMsaUJBQ2hDLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0sYUFDcEM7d0JBQ1QsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSx5QkFBeUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRTtxQkFDdkY7eUhBS3FFLFdBQVc7c0JBQWhGLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVE3RCxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5qZWN0b3IsIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGVBZGFwdGVyLCBNQVRfREFURV9MT0NBTEUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdERhdGVwaWNrZXIsIE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IEJvb2xlYW5JbnB1dENvbnZlcnRlciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvaW5wdXQtY29udmVydGVyJztcbmltcG9ydCB7IE1vbWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zZXJ2aWNlcy9tb21lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBPbnRpbWl6ZU1vbWVudERhdGVBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2hhcmVkL21hdGVyaWFsL2RhdGUvb250aW1pemUtbW9tZW50LWRhdGUtYWRhcHRlcic7XG5pbXBvcnQgeyBEYXRlRmlsdGVyRnVuY3Rpb24gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi90eXBlcy9kYXRlLWZpbHRlci1mdW5jdGlvbi50eXBlJztcbmltcG9ydCB7IE9EYXRlVmFsdWVUeXBlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdHlwZXMvby1kYXRlLXZhbHVlLnR5cGUnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPQmFzZVRhYmxlQ2VsbEVkaXRvciB9IGZyb20gJy4uL28tYmFzZS10YWJsZS1jZWxsLWVkaXRvci5jbGFzcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lOUFVUU19PX1RBQkxFX0NFTExfRURJVE9SX0RBVEUgPSBbXG4gICdmb3JtYXQnLFxuICAnbG9jYWxlJyxcbiAgJ29TdGFydFZpZXc6IHN0YXJ0LXZpZXcnLFxuICAnbWluJyxcbiAgJ21heCcsXG4gICdvVG91Y2hVaTogdG91Y2gtdWknLFxuICAnc3RhcnRBdDogc3RhcnQtYXQnLFxuICAnZmlsdGVyRGF0ZTogZmlsdGVyLWRhdGUnLFxuICAvLyB2YWx1ZS10eXBlIFt0aW1lc3RhbXB8c3RyaW5nXTogdHlwZSBtdXN0IGJlIGRlZmluZWQgdG8gYmUgYWJsZSB0byBzYXZlIGl0cyB2YWx1ZSxcbiAgLy8gZS5nLiBjbGFzc2ljIG9udGltaXplIHNlcnZlciBkYXRlcyBjb21lIGFzIHRpbWVzdGFtcHMgKG51bWJlciksIGJ1dCB0byBiZSBhYmxlIHRvIHNhdmUgdGhlbSB0aGV5IGhhdmUgdG8gYmUgc2VuZCBhcyBzdHJpbmdzIHdpdGhcbiAgLy8gdGhlIGZvcm1hdCAnWVlZWS1NTS1ERCBISDptbTpzcydEZWZhdWx0OiB0aW1lc3RhbXAuXG4gICdkYXRlVmFsdWVUeXBlOiBkYXRlLXZhbHVlLXR5cGUnXG5dO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ28tdGFibGUtY2VsbC1lZGl0b3ItZGF0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9vLXRhYmxlLWNlbGwtZWRpdG9yLWRhdGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9vLXRhYmxlLWNlbGwtZWRpdG9yLWRhdGUuY29tcG9uZW50LnNjc3MnXSxcbiAgaW5wdXRzOiBERUZBVUxUX0lOUFVUU19PX1RBQkxFX0NFTExfRURJVE9SX0RBVEUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7IHByb3ZpZGU6IERhdGVBZGFwdGVyLCB1c2VDbGFzczogT250aW1pemVNb21lbnREYXRlQWRhcHRlciwgZGVwczogW01BVF9EQVRFX0xPQ0FMRV0gfVxuICBdXG59KVxuXG5leHBvcnQgY2xhc3MgT1RhYmxlQ2VsbEVkaXRvckRhdGVDb21wb25lbnQgZXh0ZW5kcyBPQmFzZVRhYmxlQ2VsbEVkaXRvciBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQFZpZXdDaGlsZCgndGVtcGxhdGVyZWYnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSkgcHVibGljIHRlbXBsYXRlcmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIGZvcm1hdDogc3RyaW5nID0gJ0wnO1xuICBwcm90ZWN0ZWQgbG9jYWxlOiBzdHJpbmc7XG4gIG9TdGFydFZpZXc6ICdtb250aCcgfCAneWVhcicgPSAnbW9udGgnO1xuICBwcm90ZWN0ZWQgbWluOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBtYXg6IHN0cmluZztcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIG9Ub3VjaFVpOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzdGFydEF0OiBzdHJpbmc7XG4gIGZpbHRlckRhdGU6IERhdGVGaWx0ZXJGdW5jdGlvbjtcbiAgX2RhdGVWYWx1ZVR5cGU6IE9EYXRlVmFsdWVUeXBlID0gJ3RpbWVzdGFtcCc7XG5cbiAgb1N0YXJ0QXQ6IERhdGU7XG4gIG9NaW5EYXRlOiBEYXRlO1xuICBvTWF4RGF0ZTogRGF0ZTtcblxuICBwcml2YXRlIG1vbWVudFNydjogTW9tZW50U2VydmljZTtcbiAgbWluRGF0ZVN0cmluZzogc3RyaW5nO1xuICBtYXhEYXRlU3RyaW5nOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIGRhdGVwaWNrZXI6IE1hdERhdGVwaWNrZXI8RGF0ZT47XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIG1vbWVudERhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxPbnRpbWl6ZU1vbWVudERhdGVBZGFwdGVyPlxuICApIHtcbiAgICBzdXBlcihpbmplY3Rvcik7XG4gICAgdGhpcy5tb21lbnRTcnYgPSB0aGlzLmluamVjdG9yLmdldChNb21lbnRTZXJ2aWNlKTtcbiAgfVxuXG4gIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIGlmICghdGhpcy5sb2NhbGUpIHtcbiAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5tb21lbnRTcnYuZ2V0TG9jYWxlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmZvcm1hdCkge1xuICAgICAgKHRoaXMubW9tZW50RGF0ZUFkYXB0ZXIgYXMgYW55KS5vRm9ybWF0ID0gdGhpcy5mb3JtYXQ7XG4gICAgfVxuXG4gICAgdGhpcy5tb21lbnREYXRlQWRhcHRlci5zZXRMb2NhbGUodGhpcy5sb2NhbGUpO1xuICAgIGlmICh0aGlzLnN0YXJ0QXQpIHtcbiAgICAgIHRoaXMub1N0YXJ0QXQgPSBuZXcgRGF0ZSh0aGlzLnN0YXJ0QXQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1pbikge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMubWluKTtcbiAgICAgIGNvbnN0IG1vbWVudEQgPSBtb21lbnQoZGF0ZSk7XG4gICAgICBpZiAobW9tZW50RC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgdGhpcy5vTWluRGF0ZSA9IGRhdGU7XG4gICAgICAgIHRoaXMubWluRGF0ZVN0cmluZyA9IG1vbWVudEQuZm9ybWF0KHRoaXMuZm9ybWF0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXgpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLm1heCk7XG4gICAgICBjb25zdCBtb21lbnREID0gbW9tZW50KGRhdGUpO1xuICAgICAgaWYgKG1vbWVudEQuaXNWYWxpZCgpKSB7XG4gICAgICAgIHRoaXMub01heERhdGUgPSBkYXRlO1xuICAgICAgICB0aGlzLm1heERhdGVTdHJpbmcgPSBtb21lbnRELmZvcm1hdCh0aGlzLmZvcm1hdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUtleXVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3Qgb0NvbHVtbiA9IHRoaXMudGFibGUuZ2V0T0NvbHVtbih0aGlzLnRhYmxlQ29sdW1uLmF0dHIpO1xuICAgIGlmICghb0NvbHVtbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIW9Db2x1bW4uZWRpdGluZyAmJiB0aGlzLmRhdGVwaWNrZXIgJiYgdGhpcy5kYXRlcGlja2VyLm9wZW5lZCkge1xuICAgICAgdGhpcy5kYXRlcGlja2VyLmNsb3NlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLmhhbmRsZUtleXVwKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBzdGFydEVkaXRpb24oZGF0YTogYW55KSB7XG4gICAgc3VwZXIuc3RhcnRFZGl0aW9uKGRhdGEpO1xuICAgIGlmICghdGhpcy5zdGFydEF0KSB7XG4gICAgICB0aGlzLm9TdGFydEF0ID0gdGhpcy5nZXRDZWxsRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldENlbGxEYXRhKCk6IGFueSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdXBlci5nZXRDZWxsRGF0YSgpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIGxldCByZXN1bHQgPSB2YWx1ZTtcbiAgICAgIGxldCBtO1xuICAgICAgc3dpdGNoICh0aGlzLmRhdGVWYWx1ZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICBtID0gbW9tZW50KHZhbHVlLCB0aGlzLmZvcm1hdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdpc28tODYwMSc6XG4gICAgICAgIGNhc2UgJ3RpbWVzdGFtcCc6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgbSA9IG1vbWVudCh2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQobSkpIHtcbiAgICAgICAgcmVzdWx0ID0gbS50b0RhdGUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGNvbW1pdEVkaXRpb24oKSB7XG4gICAgLy8gIXRoaXMuZGF0ZXBpY2tlci5vcGVuZWQgJiZcbiAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wuaW52YWxpZCkge1xuICAgICAgdGhpcy5vbGRWYWx1ZSA9IHRoaXMuX3Jvd0RhdGFbdGhpcy50YWJsZUNvbHVtbkF0dHJdO1xuICAgICAgdGhpcy5fcm93RGF0YVt0aGlzLnRhYmxlQ29sdW1uQXR0cl0gPSB0aGlzLmdldFZhbHVlQnlWYWx5VHlwZSgpO1xuICAgICAgaWYgKCF0aGlzLmlzU2lsZW50Q29udHJvbCgpKSB7XG4gICAgICAgIHRoaXMuZW5kRWRpdGlvbih0cnVlKTtcbiAgICAgICAgdGhpcy5lZGl0aW9uQ29tbWl0dGVkLmVtaXQodGhpcy5fcm93RGF0YSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFZhbHVlQnlWYWx5VHlwZSgpOiBhbnkge1xuICAgIGxldCByZXN1bHQgPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlO1xuICAgIGNvbnN0IG0gPSBtb21lbnQodGhpcy5mb3JtQ29udHJvbC52YWx1ZSk7XG4gICAgc3dpdGNoICh0aGlzLmRhdGVWYWx1ZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJlc3VsdCA9IG0uZm9ybWF0KHRoaXMuZm9ybWF0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgcmVzdWx0ID0gbmV3IERhdGUocmVzdWx0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpc28tODYwMSc6XG4gICAgICAgIHJlc3VsdCA9IG0udG9JU09TdHJpbmcoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0aW1lc3RhbXAnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmVzdWx0ID0gbS52YWx1ZU9mKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb25EYXRlQ2hhbmdlKGV2ZW50OiBNYXREYXRlcGlja2VySW5wdXRFdmVudDxhbnk+KSB7XG4gICAgY29uc3QgaXNWYWxpZCA9IGV2ZW50LnZhbHVlICYmIGV2ZW50LnZhbHVlLmlzVmFsaWQgJiYgZXZlbnQudmFsdWUuaXNWYWxpZCgpO1xuICAgIGxldCB2YWwgPSBpc1ZhbGlkID8gZXZlbnQudmFsdWUudmFsdWVPZigpIDogZXZlbnQudmFsdWU7XG4gICAgY29uc3QgbSA9IG1vbWVudCh2YWwpO1xuICAgIHN3aXRjaCAodGhpcy5kYXRlVmFsdWVUeXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgdmFsID0gbS5mb3JtYXQodGhpcy5mb3JtYXQpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIHZhbCA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaXNvLTg2MDEnOlxuICAgICAgICB2YWwgPSBtLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGltZXN0YW1wJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsLCB7XG4gICAgICBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2U6IGZhbHNlLFxuICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgb3BlbkRhdGVwaWNrZXIoZDogTWF0RGF0ZXBpY2tlcjxEYXRlPikge1xuICAgIHRoaXMuZGF0ZXBpY2tlciA9IGQ7XG4gICAgZC5vcGVuKCk7XG4gIH1cblxuICBzZXQgZGF0ZVZhbHVlVHlwZSh2YWw6IGFueSkge1xuICAgIHRoaXMuX2RhdGVWYWx1ZVR5cGUgPSBVdGlsLmNvbnZlcnRUb09EYXRlVmFsdWVUeXBlKHZhbCk7XG4gIH1cblxuICBnZXQgZGF0ZVZhbHVlVHlwZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9kYXRlVmFsdWVUeXBlO1xuICB9XG5cbiAgb25DbG9zZWQoKSB7XG4gICAgaWYgKHRoaXMuaW5wdXRSZWYpIHtcbiAgICAgIHRoaXMuaW5wdXRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZXJlZiBsZXQtY2VsbHZhbHVlPVwiY2VsbHZhbHVlXCIgbGV0LXJvd3ZhbHVlPVwicm93dmFsdWVcIj5cbiAgPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiIGNsYXNzPVwiby10YWJsZS1jZWxsLWVkaXRvci1kYXRlIG8tdGFibGUtY2VsbC1lZGl0b3JcIlxuICAgIFttYXRUb29sdGlwXT1cInRvb2x0aXBcIlxuICAgIFttYXRUb29sdGlwQ2xhc3NdPVwidG9vbHRpcENsYXNzXCJcbiAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvblwiXG4gICAgW21hdFRvb2x0aXBTaG93RGVsYXldPVwidG9vbHRpcFNob3dEZWxheVwiXG4gICAgW21hdFRvb2x0aXBIaWRlRGVsYXldPVwidG9vbHRpcEhpZGVEZWxheVwiPlxuICAgIDxtYXQtZm9ybS1maWVsZCBjZGtGb2N1c0luaXRpYWw+XG4gICAgICA8aW5wdXQgI2lucHV0IG1hdElucHV0IFtpZF09XCJjZWxsRWRpdG9ySWRcIiBbcGxhY2Vob2xkZXJdPVwiZ2V0UGxhY2Vob2xkZXIoKVwiIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgIFtyZXF1aXJlZF09XCJvcmVxdWlyZWRcIiBbbWF0RGF0ZXBpY2tlcl09XCJkXCIgW21hdERhdGVwaWNrZXJGaWx0ZXJdPVwiZmlsdGVyRGF0ZVwiXG4gICAgICAgIChkYXRlQ2hhbmdlKT1cIm9uRGF0ZUNoYW5nZSgkZXZlbnQpXCIgW21pbl09XCJvTWluRGF0ZVwiIFttYXhdPVwib01heERhdGVcIj5cblxuICAgICAgPG1hdC1kYXRlcGlja2VyICNkIFtzdGFydFZpZXddPVwib1N0YXJ0Vmlld1wiIFtzdGFydEF0XT1cIm9TdGFydEF0XCIgW3RvdWNoVWldPVwib1RvdWNoVWlcIiAoY2xvc2VkKT1cIm9uQ2xvc2VkKClcIj5cbiAgICAgIDwvbWF0LWRhdGVwaWNrZXI+XG5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1idG5cIiAoY2xpY2spPVwib3BlbkRhdGVwaWNrZXIoZClcIiBtYXRTdWZmaXg+XG4gICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwib250aW1pemU6dG9kYXlcIj48L21hdC1pY29uPlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8bWF0LWVycm9yICpvTWF0RXJyb3I9XCJoYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgICB7eyAnRk9STV9WQUxJREFUSU9OLlJFUVVJUkVEJyB8IG9UcmFuc2xhdGUgfX1cbiAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgPG1hdC1lcnJvciAqb01hdEVycm9yPVwiaGFzRXJyb3IoJ21hdERhdGVwaWNrZXJQYXJzZScpXCI+XG4gICAgICAgIHt7ICdGT1JNX1ZBTElEQVRJT04uREFURV9QQVJTRScgfCBvVHJhbnNsYXRlIH19IHt7IGZvcm1hdCB9fVxuICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICA8bWF0LWVycm9yICpvTWF0RXJyb3I9XCJoYXNFcnJvcignbWF0RGF0ZXBpY2tlckZpbHRlcicpXCI+XG4gICAgICAgIHt7ICdGT1JNX1ZBTElEQVRJT04uREFURV9GSUxURVInIHwgb1RyYW5zbGF0ZSB9fVxuICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICA8bWF0LWVycm9yICpvTWF0RXJyb3I9XCJoYXNFcnJvcignbWF0RGF0ZXBpY2tlck1pbicpXCI+XG4gICAgICAgIHt7ICdGT1JNX1ZBTElEQVRJT04uREFURV9NSU4nIHwgb1RyYW5zbGF0ZSB9fSB7eyBtaW5EYXRlU3RyaW5nIH19XG4gICAgICA8L21hdC1lcnJvcj5cbiAgICAgIDxtYXQtZXJyb3IgKm9NYXRFcnJvcj1cImhhc0Vycm9yKCdtYXREYXRlcGlja2VyTWF4JylcIj5cbiAgICAgICAge3sgJ0ZPUk1fVkFMSURBVElPTi5EQVRFX01BWCcgfCBvVHJhbnNsYXRlIH19IHt7IG1heERhdGVTdHJpbmcgfX1cbiAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgPG1hdC1lcnJvciAqbmdGb3I9XCJsZXQgb0Vycm9yIG9mIGdldEFjdGl2ZU9FcnJvcnMoKVwiPlxuICAgICAgICB7eyBnZXRFcnJvclRleHQob0Vycm9yKSB9fVxuICAgICAgPC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19