UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

305 lines (304 loc) 26.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { DefaultControlValueAccessor } from './../common/default-control-value-accessor'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { Component, Input, ContentChild, forwardRef, Renderer2, ElementRef } from '@angular/core'; import { AsiComponentTemplateOptionDef, AsiComponentTemplateEmptyDef, AsiComponentTemplateSelectedDef } from '../common/asi-component-template'; import * as nh from '../../native-helper'; export class AsiSelectComponent extends DefaultControlValueAccessor { /** * @param {?} renderer * @param {?} elementRef */ constructor(renderer, elementRef) { super(); this.renderer = renderer; this.elementRef = elementRef; /** * Label position */ this.labelPosition = 'top'; /** * Multi selection */ this.multiple = false; /** * Add an empty value (template must be define) */ this.withEmptyValue = false; this.open = false; this.allChecked = false; } /** * @return {?} */ ngOnInit() { this.renderer.addClass(this.elementRef.nativeElement, 'label-' + this.labelPosition); if (this.multiple) { this.renderer.addClass(this.elementRef.nativeElement, 'multiple'); } } /** * @return {?} */ onDropdownClose() { this.open = false; } /** * @return {?} */ isOpened() { return this.open; } /** * @return {?} */ ngOnChanges() { this.initData(); } /** * @return {?} */ initData() { this.selectDatas = []; this.data = this.data || []; if (this.withEmptyValue) { this.selectDatas.push(null); } this.data.forEach((data) => { /** @type {?} */ const proxyData = { selected: false, value: data }; this.selectDatas.push(proxyData); }); } /** * @param {?} value * @return {?} */ checkAll(value) { this.allChecked = value; this.selectDatas.forEach((data) => { if (data != null && (value !== data.selected)) { this.internalSelectValue(null, data); } }); this.onModelChange(this._value); } /** * @return {?} */ updateAllChecked() { this.allChecked = nh.find(this.selectDatas, (data) => { return data != null ? !data.selected : false; }) == null; } /** * @param {?} event * @param {?} data * @return {?} */ selectValue(event, data) { this.internalSelectValue(event, data); this.onModelChange(this._value); } /** * @param {?} event * @param {?} data * @return {?} */ internalSelectValue(event, data) { if (data == null) { this.onModelChange(null); this.open = false; return; } /** @type {?} */ let realValue = data.value; if (this.multiple) { if (event != null) { event.stopPropagation(); } if (this._value == null) { this._value = []; } /** @type {?} */ let removed = nh.remove(this._value, (value) => { if (value != null) { if (this.trackBy != null) { return value[this.trackBy] === realValue[this.trackBy]; } else { return value === realValue; } } return false; }); if (nh.isEmpty(removed)) { this.value.push(realValue); data.selected = true; } else { data.selected = false; } if (nh.isEmpty(this._value)) { this._value = null; } if (event != null) { this.updateAllChecked(); } } else { this.open = false; this._value = realValue; } } /** * @return {?} */ toggleSelect() { this.open = !this.open; } /** * @param {?} value * @return {?} */ writeValue(value) { if (isNaN(value) && nh.isEmpty(value)) { this._value = null; } else { this._value = value; } if (this.multiple) { if (this._value != null) { this.selectDatas.forEach((data) => { if (data != null) { data.selected = nh.find(this.value, (possibleValue) => { if (possibleValue != null) { if (this.trackBy != null) { return possibleValue[this.trackBy] === data.value[this.trackBy]; } else { return possibleValue === data.value; } } return false; }) != null; } }); } else { this.selectDatas.forEach((data) => { if (data != null) { data.selected = false; } }); } this.updateAllChecked(); } this.manageHasValue(); } /** * @param {?} value * @return {?} */ onModelChange(value) { this.value = value; this.manageHasValue(); } /** * @return {?} */ manageHasValue() { if (this.value != null) { this.renderer.addClass(this.elementRef.nativeElement, 'has-value'); } else { this.renderer.removeClass(this.elementRef.nativeElement, 'has-value'); } } } AsiSelectComponent.decorators = [ { type: Component, args: [{ selector: 'asi-select', host: { 'class': 'asi-component asi-select' }, template: "<label class=\"input-label\" *ngIf=\"label != null\">{{label | translate}}</label>\r\n\r\n<div class=\"asi-select-container\" aria-labelledby=\"select\">\r\n <div class=\"asi-select-header asi-focus-error\" (keyup.esc)=\"toggleSelect()\">\r\n <asi-checkbox *ngIf=\"multiple\" [disabled]=\"disabled\" [ngModel]=\"allChecked\" (onValueChange)=\"checkAll($event)\">\r\n </asi-checkbox>\r\n <button type=\"button\" class=\"item-container\" [disabled]=\"disabled\" (click)=\"toggleSelect()\">\r\n <span>\r\n <div class=\"item\">\r\n <ng-template *ngIf=\"value != null\" [ngTemplateOutlet]=\"selectedDef.template\"\r\n [ngTemplateOutletContext]=\"{$implicit : value}\"></ng-template>\r\n <ng-template *ngIf=\"value == null\" [ngTemplateOutlet]=\"emptyDef?.template\"\r\n [ngTemplateOutletContext]=\"{$implicit : value}\"></ng-template>\r\n </div>\r\n <div class=\"drop-icon-container\">\r\n <span class=\"drop-icon\" [innerHtml]=\"'&#9660;'\"></span>\r\n </div>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <asi-dropdown [open]=\"open\" (onClose)=\"onDropdownClose()\" dropDownClass=\"asi-select-dropdown\">\r\n <div class=\"drop-down-select\">\r\n <div class=\"drop-down-panel\">\r\n <button type=\"button\" class=\"drop-down-item\" [ngClass]=\"{'empty' : data == null , 'selected' : data?.selected}\"\r\n (keyup.esc)=\"toggleSelect()\" (click)=\"selectValue($event, data)\" *ngFor=\"let data of selectDatas\">\r\n <span class=\"option\">\r\n <asi-checkbox *ngIf=\"multiple && data != null\" [ngModel]=\"data.selected\"\r\n (click)=\"selectValue($event, data)\"></asi-checkbox>\r\n <div class=\"item\" aria-labelledby=\"item\">\r\n <ng-template *ngIf=\"data != null\" [ngTemplateOutlet]=\"optionDef.template\"\r\n [ngTemplateOutletContext]=\"{$implicit : data.value}\"></ng-template>\r\n </div>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </asi-dropdown>\r\n</div>\r\n", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AsiSelectComponent), multi: true } ] }] } ]; /** @nocollapse */ AsiSelectComponent.ctorParameters = () => [ { type: Renderer2 }, { type: ElementRef } ]; AsiSelectComponent.propDecorators = { label: [{ type: Input }], labelPosition: [{ type: Input }], data: [{ type: Input }], multiple: [{ type: Input }], trackBy: [{ type: Input }], withEmptyValue: [{ type: Input }], optionDef: [{ type: ContentChild, args: [AsiComponentTemplateOptionDef,] }], emptyDef: [{ type: ContentChild, args: [AsiComponentTemplateEmptyDef,] }], selectedDef: [{ type: ContentChild, args: [AsiComponentTemplateSelectedDef,] }] }; if (false) { /** * Label to display (is translated) * @type {?} */ AsiSelectComponent.prototype.label; /** * Label position * @type {?} */ AsiSelectComponent.prototype.labelPosition; /** * Data to display * @type {?} */ AsiSelectComponent.prototype.data; /** * Multi selection * @type {?} */ AsiSelectComponent.prototype.multiple; /** * Track data base on a sub attribute rather than reference * @type {?} */ AsiSelectComponent.prototype.trackBy; /** * Add an empty value (template must be define) * @type {?} */ AsiSelectComponent.prototype.withEmptyValue; /** @type {?} */ AsiSelectComponent.prototype.optionDef; /** @type {?} */ AsiSelectComponent.prototype.emptyDef; /** @type {?} */ AsiSelectComponent.prototype.selectedDef; /** @type {?} */ AsiSelectComponent.prototype.selectDatas; /** @type {?} */ AsiSelectComponent.prototype.open; /** @type {?} */ AsiSelectComponent.prototype.allChecked; /** @type {?} */ AsiSelectComponent.prototype.renderer; /** @type {?} */ AsiSelectComponent.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLXNlbGVjdC9hc2ktc2VsZWN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFxQixVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVySCxPQUFPLEVBQ0wsNkJBQTZCLEVBQUUsNEJBQTRCLEVBQzNELCtCQUErQixFQUNoQyxNQUFNLGtDQUFrQyxDQUFDO0FBRTFDLE9BQU8sS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFjMUMsTUFBTSx5QkFBMEIsU0FBUSwyQkFBMkI7Ozs7O0lBNkJqRSxZQUFvQixRQUFtQixFQUM3QjtRQUNSLEtBQUssRUFBRSxDQUFDO1FBRlUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUM3QixlQUFVLEdBQVYsVUFBVTs7Ozs2QkF4QjJFLEtBQUs7Ozs7d0JBTWhGLEtBQUs7Ozs7OEJBTUMsS0FBSztvQkFReEIsS0FBSzswQkFDQyxLQUFLO0tBS2pCOzs7O0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckYsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxD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LEtBQUssRUFBRSxJQUFJO3FCQUNaO2lCQUNGO2FBQ0Y7Ozs7WUFwQnVFLFNBQVM7WUFBRSxVQUFVOzs7b0JBd0IxRixLQUFLOzRCQUdMLEtBQUs7bUJBR0wsS0FBSzt1QkFHTCxLQUFLO3NCQUdMLEtBQUs7NkJBR0wsS0FBSzt3QkFFTCxZQUFZLFNBQUMsNkJBQTZCO3VCQUMxQyxZQUFZLFNBQUMsNEJBQTRCOzBCQUN6QyxZQUFZLFNBQUMsK0JBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVmYXVsdENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi8uLi9jb21tb24vZGVmYXVsdC1jb250cm9sLXZhbHVlLWFjY2Vzc29yJztcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENvbnRlbnRDaGlsZCwgT25Jbml0LCBPbkNoYW5nZXMsIGZvcndhcmRSZWYsIFJlbmRlcmVyMiwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHtcclxuICBBc2lDb21wb25lbnRUZW1wbGF0ZU9wdGlvbkRlZiwgQXNpQ29tcG9uZW50VGVtcGxhdGVFbXB0eURlZixcclxuICBBc2lDb21wb25lbnRUZW1wbGF0ZVNlbGVjdGVkRGVmXHJcbn0gZnJvbSAnLi4vY29tbW9uL2FzaS1jb21wb25lbnQtdGVtcGxhdGUnO1xyXG5cclxuaW1wb3J0ICogYXMgbmggZnJvbSAnLi4vLi4vbmF0aXZlLWhlbHBlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FzaS1zZWxlY3QnLFxyXG4gIGhvc3Q6IHsgJ2NsYXNzJzogJ2FzaS1jb21wb25lbnQgYXNpLXNlbGVjdCcgfSxcclxuICB0ZW1wbGF0ZVVybDogJ2FzaS1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXNpU2VsZWN0Q29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc2lTZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIC8qKiBMYWJlbCB0byBkaXNwbGF5IChpcyB0cmFuc2xhdGVkKSAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBMYWJlbCBwb3NpdGlvbiAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsUG9zaXRpb246ICd0b3AnIHwgJ2xlZnQnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2JvdHRvbS1jZW50ZXInIHwgJ3RvcC1jZW50ZXInID0gJ3RvcCc7XHJcblxyXG4gIC8qKiBEYXRhIHRvIGRpc3BsYXkgICovXHJcbiAgQElucHV0KCkgZGF0YTogQXJyYXk8YW55PjtcclxuXHJcbiAgLyoqIE11bHRpIHNlbGVjdGlvbiAgKi9cclxuICBASW5wdXQoKSBtdWx0aXBsZSA9IGZhbHNlO1xyXG5cclxuICAvKiogVHJhY2sgZGF0YSBiYXNlIG9uIGEgc3ViIGF0dHJpYnV0ZSByYXRoZXIgdGhhbiByZWZlcmVuY2UgICovXHJcbiAgQElucHV0KCkgdHJhY2tCeTogc3RyaW5nO1xyXG5cclxuICAvKiogQWRkIGFuIGVtcHR5IHZhbHVlICh0ZW1wbGF0ZSBtdXN0IGJlIGRlZmluZSkgKi9cclxuICBASW5wdXQoKSB3aXRoRW1wdHlWYWx1ZSA9IGZhbHNlO1xyXG5cclxuICBAQ29udGVudENoaWxkKEFzaUNvbXBvbmVudFRlbXBsYXRlT3B0aW9uRGVmKSBvcHRpb25EZWY6IEFzaUNvbXBvbmVudFRlbXBsYXRlT3B0aW9uRGVmO1xyXG4gIEBDb250ZW50Q2hpbGQoQXNpQ29tcG9uZW50VGVtcGxhdGVFbXB0eURlZikgZW1wdHlEZWY6IEFzaUNvbXBvbmVudFRlbXBsYXRlRW1wdHlEZWY7XHJcbiAgQENvbnRlbnRDaGlsZChBc2lDb21wb25lbnRUZW1wbGF0ZVNlbGVjdGVkRGVmKSBzZWxlY3RlZERlZjogQXNpQ29tcG9uZW50VGVtcGxhdGVTZWxlY3RlZERlZjtcclxuXHJcbiAgLy8gQ29waWUgZGVzIGRvbm7DqWVzIGQnZW50csOpZVxyXG4gIHNlbGVjdERhdGFzOiBBcnJheTxhbnk+O1xyXG4gIG9wZW4gPSBmYWxzZTtcclxuICBhbGxDaGVja2VkID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2xhYmVsLScgKyB0aGlzLmxhYmVsUG9zaXRpb24pO1xyXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ211bHRpcGxlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRyb3Bkb3duQ2xvc2UoKSB7XHJcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc09wZW5lZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wZW47XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuICAgIHRoaXMuaW5pdERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdERhdGEoKSB7XHJcbiAgICB0aGlzLnNlbGVjdERhdGFzID0gW107XHJcbiAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEgfHwgW107XHJcblxyXG4gICAgaWYgKHRoaXMud2l0aEVtcHR5VmFsdWUpIHtcclxuICAgICAgdGhpcy5zZWxlY3REYXRhcy5wdXNoKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGF0YS5mb3JFYWNoKChkYXRhKSA9PiB7XHJcbiAgICAgIGNvbnN0IHByb3h5RGF0YSA9IHtcclxuICAgICAgICBzZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgICAgdmFsdWU6IGRhdGFcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlbGVjdERhdGFzLnB1c2gocHJveHlEYXRhKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tBbGwodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5hbGxDaGVja2VkID0gdmFsdWU7XHJcbiAgICB0aGlzLnNlbGVjdERhdGFzLmZvckVhY2goKGRhdGEpID0+IHtcclxuICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiAodmFsdWUgIT09IGRhdGEuc2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdFZhbHVlKG51bGwsIGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLl92YWx1ZSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVBbGxDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hbGxDaGVja2VkID0gbmguZmluZCh0aGlzLnNlbGVjdERhdGFzLCAoZGF0YSkgPT4ge1xyXG4gICAgICByZXR1cm4gZGF0YSAhPSBudWxsID8gIWRhdGEuc2VsZWN0ZWQgOiBmYWxzZTtcclxuICAgIH0pID09IG51bGw7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RWYWx1ZShldmVudDogTW91c2VFdmVudCwgZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLmludGVybmFsU2VsZWN0VmFsdWUoZXZlbnQsIGRhdGEpO1xyXG4gICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZXJuYWxTZWxlY3RWYWx1ZShldmVudDogTW91c2VFdmVudCwgZGF0YTogYW55KSB7XHJcbiAgICBpZiAoZGF0YSA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMub25Nb2RlbENoYW5nZShudWxsKTtcclxuICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVhbFZhbHVlID0gZGF0YS52YWx1ZTtcclxuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgIGlmIChldmVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl92YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBbXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHJlbW92ZWQgPSBuaC5yZW1vdmUodGhpcy5fdmFsdWUsICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnRyYWNrQnkgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVbdGhpcy50cmFja0J5XSA9PT0gcmVhbFZhbHVlW3RoaXMudHJhY2tCeV07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IHJlYWxWYWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChuaC5pc0VtcHR5KHJlbW92ZWQpKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHJlYWxWYWx1ZSk7XHJcbiAgICAgICAgZGF0YS5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGF0YS5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobmguaXNFbXB0eSh0aGlzLl92YWx1ZSkpIHtcclxuICAgICAgICB0aGlzLl92YWx1ZSA9IG51bGw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudCAhPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVBbGxDaGVja2VkKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl92YWx1ZSA9IHJlYWxWYWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbGVjdCgpOiB2b2lkIHtcclxuICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChpc05hTih2YWx1ZSkgJiYgbmguaXNFbXB0eSh2YWx1ZSkpIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgIGlmICh0aGlzLl92YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3REYXRhcy5mb3JFYWNoKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRhdGEuc2VsZWN0ZWQgPSBuaC5maW5kKHRoaXMudmFsdWUsIChwb3NzaWJsZVZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocG9zc2libGVWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0J5ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc3NpYmxlVmFsdWVbdGhpcy50cmFja0J5XSA9PT0gZGF0YS52YWx1ZVt0aGlzLnRyYWNrQnldO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc3NpYmxlVmFsdWUgPT09IGRhdGEudmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfSkgIT0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdERhdGFzLmZvckVhY2goKGRhdGEpID0+IHtcclxuICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgZGF0YS5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudXBkYXRlQWxsQ2hlY2tlZCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tYW5hZ2VIYXNWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgb25Nb2RlbENoYW5nZSh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLm1hbmFnZUhhc1ZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hbmFnZUhhc1ZhbHVlKCkge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnaGFzLXZhbHVlJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnaGFzLXZhbHVlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==