UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

246 lines 28.9 kB
import * as tslib_1 from "tslib"; /** * Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company. * @link https://truedirective.com/ * @license MIT */ import { Component, Output, EventEmitter, ViewChild, Renderer2 } from '@angular/core'; import { Subject, Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { Column, ColumnType, GridSettings } from '@true-directive/base'; import { Keys } from '@true-directive/base'; import { DropdownBaseComponent } from '../controls/dropdown-base.component'; let EditorSelectTrueComponent = class EditorSelectTrueComponent { constructor(_renderer) { this._renderer = _renderer; this.destroy$ = new Subject(); this.ie = false; this.valueChanged = false; this.height = 0; this.wasShown = false; this.initialized = false; this._value = null; this.displayValue = ''; this.disableTextEditor = false; this.commit = new EventEmitter(); this.change = new EventEmitter(); this.cancel = new EventEmitter(); /** * Список колонок выпадающего списка */ this._columns = null; /** * Настройки грида в выпадающем списке */ this._settings = null; /** * Данные выпадающего списка */ this._items = null; this._valueField = null; this._displayField = null; } get value() { return this._value; } set value(v) { this._value = v; this.change.emit(v); } get maxDropDownHeight() { return this.state.settings.maxDropDownHeight; } get columns() { if (this._columns === null) { if (this.column.optionsColumns !== null) { this._columns = this.column.optionsColumns; } else { this._columns = [new Column('name', 'name', 300, ColumnType.STRING)]; } } return this._columns; } get settings() { if (this._settings === null) { this._settings = GridSettings.minimal(); this._settings.appearance.class = this.state.settings.appearance.class; this._settings.appearance.enableFocusedAppearance = false; this._settings.showHeader = false; this._settings.searchDelay = 100; } return this._settings; } get items() { if (this._items === null) { if (this.column.optionsData instanceof Observable) { // Подпись const observable = this.column.optionsData; observable.pipe(takeUntil(this.destroy$)).subscribe(data => { this._items = data; }); } else { this._items = this.column.optionsData; } } return this._items; } get valueField() { if (this._valueField === null) { this._valueField = this.columns[0].fieldName; } return this._valueField; } get displayField() { if (this._displayField === null) { this._displayField = this.columns[0].fieldName; } return this._displayField; } init(value, valueChanged, height, ie = false, wasShown = false) { if (this.state.touchMode) { this.input.popupPosition = 'MODAL'; this.disableTextEditor = true; } if (valueChanged) { if (!this.disableTextEditor) { this.displayValue = value; this.valueChanged = true; } else { this.valueChanged = false; } this.change.emit(null); } else { // Без события об изменении this._value = value; } this.wasShown = wasShown; this.height = height; this.ie = ie; } inputItemSelect(e) { if (this.state.touchMode) { this.commit.emit(this.value); } } // Останавливаем propagation, чтобы не влиять на grid inputMouseDown(e) { e.stopPropagation(); } inputKeyDown(e) { if (e.defaultPrevented) { return; } if (e.keyCode === Keys.TAB) { this.input.setValueFromDisplayed(); return; } if (e.keyCode === Keys.UP || e.keyCode === Keys.DOWN || e.keyCode === Keys.PAGE_UP || e.keyCode === Keys.PAGE_DOWN) { // По идее просто их должен отработать грид e.stopPropagation(); return; } e.stopPropagation(); if (e.keyCode === Keys.ESCAPE) { this.cancel.emit(); return; } if (e.keyCode === Keys.ENTER) { this.commit.emit(this.value); return; } } ngAfterContentInit() { if (!this.valueChanged) { if (this.state.touchMode) { // На тач устройствах не будем фокусироваться на инпуте, // нам достаточно показать форму для выбора в модальном режиме if (!this.wasShown) { setTimeout(() => this.input.showByTarget()); } } else { setTimeout(() => this.input.focus()); } return; } this.input.focus(); setTimeout(() => { this._renderer.setProperty(this.input.input.nativeElement, 'value', this.displayValue); this._renderer.setProperty(this.input.input.nativeElement, 'selectionStart', this.displayValue.length); this._renderer.setProperty(this.input.input.nativeElement, 'selectionEnd', this.displayValue.length); this.input.displayValue = this.displayValue === null ? '' : this.displayValue; this.input.inputInput(); }); } // Если у нас есть информация о высоте строки - берем её и не // назначаем никакого класса getClass() { if ((this.height !== null && this.height > 0)) { return 'true-grid__input-container'; } if (this.ie) { return 'true-grid-editor-ie'; } return 'true-grid-editor-100p'; } getH() { if (this.height !== null && this.height > 0) { return this.height + 'px'; } return '100%'; } ngOnDestroy() { // Если нас удаляют... this.destroy$.next(true); this.destroy$.unsubscribe(); } }; tslib_1.__decorate([ ViewChild('input', { static: true }), tslib_1.__metadata("design:type", DropdownBaseComponent) ], EditorSelectTrueComponent.prototype, "input", void 0); tslib_1.__decorate([ Output("commit"), tslib_1.__metadata("design:type", EventEmitter) ], EditorSelectTrueComponent.prototype, "commit", void 0); tslib_1.__decorate([ Output("change"), tslib_1.__metadata("design:type", EventEmitter) ], EditorSelectTrueComponent.prototype, "change", void 0); tslib_1.__decorate([ Output("cancel"), tslib_1.__metadata("design:type", EventEmitter) ], EditorSelectTrueComponent.prototype, "cancel", void 0); EditorSelectTrueComponent = tslib_1.__decorate([ Component({ selector: 'true-editor-select-true', template: `<div [ngClass]="getClass()" [style.height]="getH()"> <true-select #input class="true-editor-select__selector" [(ngModel)]="value" [style.height]="getH()" [valueField]="valueField" [displayField]="displayField" [columns]="columns" [settings]="settings" [items]="items" [useAltDown]="true" [maxDropDownHeight]="maxDropDownHeight" [disableTextEditor]="disableTextEditor" (mousedown)="inputMouseDown($event)" (itemSelect)="inputItemSelect($event)" (keydown)="inputKeyDown($event)"></true-select> </div>`, styles: [":host{box-sizing:border-box;padding:0}.true-editor-select__selector{width:100%}.true-editor-select__selector ::ng-deep .true-select__input{height:100%}.true-editor-select__selector ::ng-deep input{border:0}.true-editor-select__container{padding:0;margin:0;background-color:#00f;box-sizing:border-box;height:100%}"] }), tslib_1.__metadata("design:paramtypes", [Renderer2]) ], EditorSelectTrueComponent); export { EditorSelectTrueComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLXNlbGVjdC10cnVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0cnVlLWRpcmVjdGl2ZS9ncmlkLyIsInNvdXJjZXMiOlsic3JjL2VkaXRvcnMvZWRpdG9yLXNlbGVjdC10cnVlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBRSxTQUFTLEVBQVMsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQ2pELFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUVyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRzVDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBd0I1RSxJQUFhLHlCQUF5QixHQUF0QyxNQUFhLHlCQUF5QjtJQW9PcEMsWUFBc0IsU0FBb0I7UUFBcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQWxPaEMsYUFBUSxHQUFxQixJQUFJLE9BQU8sRUFBVyxDQUFDO1FBRXRELE9BQUUsR0FBWSxLQUFLLENBQUM7UUFDcEIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRXBCLFdBQU0sR0FBUSxJQUFJLENBQUM7UUFjcEIsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFFMUIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBVWpDLFdBQU0sR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUdsRCxXQUFNLEdB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ZXNDb250ZW50IjpbIi8qKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBBbGVrc2V5IE1lbG5pa292LCBUcnVlIERpcmVjdGl2ZSBDb21wYW55LlxyXG4gKiBAbGluayBodHRwczovL3RydWVkaXJlY3RpdmUuY29tL1xyXG4gKiBAbGljZW5zZSBNSVRcclxuKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCxcclxuICAgICAgICAgUmVuZGVyZXIyLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgQ29sdW1uLCBDb2x1bW5UeXBlLCBHcmlkU2V0dGluZ3MgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcbmltcG9ydCB7IEtleXMgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcblxyXG5pbXBvcnQgeyBHcmlkU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vZ3JpZC1zdGF0ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRHJvcGRvd25CYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29udHJvbHMvZHJvcGRvd24tYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJRWRpdG9yIH0gZnJvbSBcIi4vZWRpdG9yLmludGVyZmFjZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0cnVlLWVkaXRvci1zZWxlY3QtdHJ1ZScsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IFtuZ0NsYXNzXT1cImdldENsYXNzKClcIiBbc3R5bGUuaGVpZ2h0XT1cImdldEgoKVwiPlxyXG4gICAgICAgICAgICAgIDx0cnVlLXNlbGVjdCAjaW5wdXRcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHJ1ZS1lZGl0b3Itc2VsZWN0X19zZWxlY3RvclwiXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiZ2V0SCgpXCJcclxuICAgICAgICAgICAgICAgIFt2YWx1ZUZpZWxkXT1cInZhbHVlRmllbGRcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlGaWVsZF09XCJkaXNwbGF5RmllbGRcIlxyXG4gICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgICBbc2V0dGluZ3NdPVwic2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgW2l0ZW1zXT1cIml0ZW1zXCJcclxuICAgICAgICAgICAgICAgIFt1c2VBbHREb3duXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgW21heERyb3BEb3duSGVpZ2h0XT1cIm1heERyb3BEb3duSGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlVGV4dEVkaXRvcl09XCJkaXNhYmxlVGV4dEVkaXRvclwiXHJcbiAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cImlucHV0TW91c2VEb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGl0ZW1TZWxlY3QpPVwiaW5wdXRJdGVtU2VsZWN0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaW5wdXRLZXlEb3duKCRldmVudClcIj48L3RydWUtc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5gLFxyXG4gIHN0eWxlVXJsczogWycuL2VkaXRvci1zZWxlY3QtdHJ1ZS5jb21wb25lbnQuc2NzcyddXHJcbiAgfSlcclxuZXhwb3J0IGNsYXNzIEVkaXRvclNlbGVjdFRydWVDb21wb25lbnQgaW1wbGVtZW50cyBJRWRpdG9yLCBPbkRlc3Ryb3kge1xyXG5cclxuICBwcm90ZWN0ZWQgZGVzdHJveSQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICBwcml2YXRlIGllOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB2YWx1ZUNoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGhlaWdodDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIHdhc1Nob3duID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfdmFsdWU6IGFueSA9IG51bGw7XHJcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCB2YWx1ZSh2OiBhbnkpIHtcclxuICAgIHRoaXMuX3ZhbHVlID0gdjtcclxuICAgIHRoaXMuY2hhbmdlLmVtaXQodik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IG1heERyb3BEb3duSGVpZ2h0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zZXR0aW5ncy5tYXhEcm9wRG93bkhlaWdodDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwbGF5VmFsdWU6IHN0cmluZyA9ICcnO1xyXG5cclxuICBwdWJsaWMgZGlzYWJsZVRleHRFZGl0b3IgPSBmYWxzZTtcclxuXHJcbiAgc3RhdGU6IEdyaWRTdGF0ZVNlcnZpY2U7XHJcbiAgY29sdW1uOiBDb2x1bW47XHJcbiAgcm93OiBhbnk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2lucHV0Jywge3N0YXRpYzogdHJ1ZX0pXHJcbiAgaW5wdXQ6IERyb3Bkb3duQmFzZUNvbXBvbmVudDtcclxuXHJcbiAgQE91dHB1dChcImNvbW1pdFwiKVxyXG4gIGNvbW1pdDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoXCJjaGFuZ2VcIilcclxuICBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAT3V0cHV0KFwiY2FuY2VsXCIpXHJcbiAgY2FuY2VsOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqINCh0L/QuNGB0L7QuiDQutC+0LvQvtC90L7QuiDQstGL0L/QsNC00LDRjtGJ0LXQs9C+INGB0L/QuNGB0LrQsFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2NvbHVtbnM6IENvbHVtbltdID0gbnVsbDtcclxuICBnZXQgY29sdW1ucygpOiBDb2x1bW5bXSB7XHJcbiAgICBpZiAodGhpcy5fY29sdW1ucyA9PT0gbnVsbCkge1xyXG4gICAgICBpZiAodGhpcy5jb2x1bW4ub3B0aW9uc0NvbHVtbnMgIT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9jb2x1bW5zID0gdGhpcy5jb2x1bW4ub3B0aW9uc0NvbHVtbnM7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fY29sdW1ucyA9IFtuZXcgQ29sdW1uKCduYW1lJywgJ25hbWUnLCAzMDAsIENvbHVtblR5cGUuU1RSSU5HKV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog0J3QsNGB0YLRgNC+0LnQutC4INCz0YDQuNC00LAg0LIg0LLRi9C/0LDQtNCw0Y7RidC10Lwg0YHQv9C40YHQutC1XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfc2V0dGluZ3M6IEdyaWRTZXR0aW5ncyA9IG51bGw7XHJcbiAgZ2V0IHNldHRpbmdzKCkge1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3NldHRpbmdzID0gR3JpZFNldHRpbmdzLm1pbmltYWwoKTtcclxuICAgICAgdGhpcy5fc2V0dGluZ3MuYXBwZWFyYW5jZS5jbGFzcyA9IHRoaXMuc3RhdGUuc2V0dGluZ3MuYXBwZWFyYW5jZS5jbGFzcztcclxuICAgICAgdGhpcy5fc2V0dGluZ3MuYXBwZWFyYW5jZS5lbmFibGVGb2N1c2VkQXBwZWFyYW5jZSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy5zaG93SGVhZGVyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX3NldHRpbmdzLnNlYXJjaERlbGF5ID0gMTAwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog0JTQsNC90L3Ri9C1INCy0YvQv9Cw0LTQsNGO0YnQtdCz0L4g0YHQv9C40YHQutCwXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfaXRlbXM6IGFueVtdID0gbnVsbDtcclxuICBnZXQgaXRlbXMoKTogYW55W10ge1xyXG4gICAgaWYgKHRoaXMuX2l0ZW1zID09PSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbHVtbi5vcHRpb25zRGF0YSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcclxuICAgICAgICAvLyDQn9C+0LTQv9C40YHRjFxyXG4gICAgICAgIGNvbnN0IG9ic2VydmFibGUgPSA8T2JzZXJ2YWJsZTxhbnk+PnRoaXMuY29sdW1uLm9wdGlvbnNEYXRhO1xyXG4gICAgICAgIG9ic2VydmFibGUucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMuX2l0ZW1zID0gZGF0YTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9pdGVtcyA9IHRoaXMuY29sdW1uLm9wdGlvbnNEYXRhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5faXRlbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF92YWx1ZUZpZWxkOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICBwdWJsaWMgZ2V0IHZhbHVlRmllbGQoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl92YWx1ZUZpZWxkID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3ZhbHVlRmllbGQgPSB0aGlzLmNvbHVtbnNbMF0uZmllbGROYW1lO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlRmllbGQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kaXNwbGF5RmllbGQ6IHN0cmluZyA9IG51bGw7XHJcbiAgcHVibGljIGdldCBkaXNwbGF5RmllbGQoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl9kaXNwbGF5RmllbGQgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZGlzcGxheUZpZWxkID0gdGhpcy5jb2x1bW5zWzBdLmZpZWxkTmFtZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5RmllbGQ7XHJcbiAgfVxyXG5cclxuICBpbml0KHZhbHVlOiBhbnksIHZhbHVlQ2hhbmdlZDogYm9vbGVhbiwgaGVpZ2h0OiBudW1iZXIsIGllOiBib29sZWFuID0gZmFsc2UsIHdhc1Nob3duOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGlmICh0aGlzLnN0YXRlLnRvdWNoTW9kZSkge1xyXG4gICAgICB0aGlzLmlucHV0LnBvcHVwUG9zaXRpb24gPSAnTU9EQUwnO1xyXG4gICAgICB0aGlzLmRpc2FibGVUZXh0RWRpdG9yID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlVGV4dEVkaXRvcikge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jaGFuZ2UuZW1pdChudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vINCR0LXQtyDRgdC+0LHRi9GC0LjRjyDQvtCxINC40LfQvNC10L3QtdC90LjQuFxyXG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMud2FzU2hvd24gPSB3YXNTaG93bjtcclxuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgdGhpcy5pZSA9IGllO1xyXG4gIH1cclxuXHJcbiAgaW5wdXRJdGVtU2VsZWN0KGU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUudG91Y2hNb2RlKSB7XHJcbiAgICAgIHRoaXMuY29tbWl0LmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDQntGB0YLQsNC90LDQstC70LjQstCw0LXQvCBwcm9wYWdhdGlvbiwg0YfRgtC+0LHRiyDQvdC1INCy0LvQuNGP0YLRjCDQvdCwIGdyaWRcclxuICBpbnB1dE1vdXNlRG93bihlOiBhbnkpIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBpbnB1dEtleURvd24oZTogYW55KSB7XHJcblxyXG4gICAgaWYgKGUuZGVmYXVsdFByZXZlbnRlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5UQUIpIHtcclxuICAgICAgdGhpcy5pbnB1dC5zZXRWYWx1ZUZyb21EaXNwbGF5ZWQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuVVAgfHxcclxuICAgICAgICBlLmtleUNvZGUgPT09IEtleXMuRE9XTiB8fFxyXG4gICAgICAgIGUua2V5Q29kZSA9PT0gS2V5cy5QQUdFX1VQIHx8XHJcbiAgICAgICAgZS5rZXlDb2RlID09PSBLZXlzLlBBR0VfRE9XTikge1xyXG4gICAgICAvLyDQn9C+INC40LTQtdC1INC/0YDQvtGB0YLQviDQuNGFINC00L7Qu9C20LXQvSDQvtGC0YDQsNCx0L7RgtCw0YLRjCDQs9GA0LjQtFxyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLkVTQ0FQRSkge1xyXG4gICAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLkVOVEVSKSB7XHJcbiAgICAgIHRoaXMuY29tbWl0LmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgIGlmICghdGhpcy52YWx1ZUNoYW5nZWQpIHtcclxuICAgICAgaWYgKHRoaXMuc3RhdGUudG91Y2hNb2RlKSB7XHJcbiAgICAgICAgLy8g0J3QsCDRgtCw0Ycg0YPRgdGC0YDQvtC50YHRgtCy0LDRhSDQvdC1INCx0YPQtNC10Lwg0YTQvtC60YPRgdC40YDQvtCy0LDRgtGM0YHRjyDQvdCwINC40L3Qv9GD0YLQtSxcclxuICAgICAgICAvLyDQvdCw0Lwg0LTQvtGB0YLQsNGC0L7Rh9C90L4g0L/QvtC60LDQt9Cw0YLRjCDRhNC+0YDQvNGDINC00LvRjyDQstGL0LHQvtGA0LAg0LIg0LzQvtC00LDQu9GM0L3QvtC8INGA0LXQttC40LzQtVxyXG4gICAgICAgIGlmICghdGhpcy53YXNTaG93bikge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmlucHV0LnNob3dCeVRhcmdldCgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmlucHV0LmZvY3VzKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlucHV0LmZvY3VzKCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dC5pbnB1dC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB0aGlzLmRpc3BsYXlWYWx1ZSk7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaW5wdXQuaW5wdXQubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGlvblN0YXJ0JywgdGhpcy5kaXNwbGF5VmFsdWUubGVuZ3RoKTtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dC5pbnB1dC5uYXRpdmVFbGVtZW50LCAnc2VsZWN0aW9uRW5kJywgdGhpcy5kaXNwbGF5VmFsdWUubGVuZ3RoKTtcclxuICAgICAgdGhpcy5pbnB1dC5kaXNwbGF5VmFsdWUgPSB0aGlzLmRpc3BsYXlWYWx1ZSA9PT0gbnVsbCA/ICcnIDogdGhpcy5kaXNwbGF5VmFsdWU7XHJcbiAgICAgIHRoaXMuaW5wdXQuaW5wdXRJbnB1dCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDQldGB0LvQuCDRgyDQvdCw0YEg0LXRgdGC0Ywg0LjQvdGE0L7RgNC80LDRhtC40Y8g0L4g0LLRi9GB0L7RgtC1INGB0YLRgNC+0LrQuCAtINCx0LXRgNC10Lwg0LXRkSDQuCDQvdC1XHJcbiAgLy8g0L3QsNC30L3QsNGH0LDQtdC8INC90LjQutCw0LrQvtCz0L4g0LrQu9Cw0YHRgdCwXHJcbiAgZ2V0Q2xhc3MoKSB7XHJcbiAgICBpZiAoKHRoaXMuaGVpZ2h0ICE9PSBudWxsICYmIHRoaXMuaGVpZ2h0ID4gMCkpIHtcclxuICAgICAgcmV0dXJuICd0cnVlLWdyaWRfX2lucHV0LWNvbnRhaW5lcic7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pZSkge1xyXG4gICAgICByZXR1cm4gJ3RydWUtZ3JpZC1lZGl0b3ItaWUnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICd0cnVlLWdyaWQtZWRpdG9yLTEwMHAnO1xyXG4gIH1cclxuXHJcbiAgZ2V0SCgpIHtcclxuICAgIGlmICh0aGlzLmhlaWdodCAhPT0gbnVsbCAmJiB0aGlzLmhlaWdodCA+IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaGVpZ2h0ICsgJ3B4JztcclxuICAgIH1cclxuICAgIHJldHVybiAnMTAwJSc7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vINCV0YHQu9C4INC90LDRgSDRg9C00LDQu9GP0Y7Rgi4uLlxyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9yZW5kZXJlcjogUmVuZGVyZXIyKSB7IH1cclxufVxyXG4iXX0=