UNPKG

@favian/headwind-ui

Version:

Headless UI for Angular - Styleless Angular components to integrate with Tailwind CSS

185 lines 25.3 kB
import { booleanAttribute, Component, ContentChild, EventEmitter, HostListener, Input, Output, } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { HeadwindErrors } from '../../constants/headwind-errors'; import { HeadwindClickDetector } from '../../services/headwind-click-detector.service'; import { HeadwindControlValueAccessor } from '../../abstracts/headwind-control-value-accessor'; import { HeadwindSelectService } from './service/headwind-select.service'; import { HeadwindOptionsOverlayDirective } from './headwind-options-overlay/headwind-options-overlay.directive'; import { HeadwindOptionsOverlayComponent } from './headwind-options-overlay/headwind-options-overlay.component'; import * as i0 from "@angular/core"; import * as i1 from "../../services/headwind-overlay.service"; import * as i2 from "../../services/headwind-click-detector.service"; import * as i3 from "../../services/headwind-animator"; import * as i4 from "./service/headwind-select.service"; export class HeadwindSelectComponent extends HeadwindControlValueAccessor { constructor(_elementRef, _headwindOverlayService, _headwindClickDetector, _headwindAnimator, _headwindSelectService) { super(); this._elementRef = _elementRef; this._headwindOverlayService = _headwindOverlayService; this._headwindClickDetector = _headwindClickDetector; this._headwindAnimator = _headwindAnimator; this._headwindSelectService = _headwindSelectService; this.valueChange = new EventEmitter(); this._optionsPositionListener = () => { this.options?.updatePosition(this._elementRef.nativeElement); }; // options should be closed from the options component this._headwindSelectService.selectOption.pipe(takeUntilDestroyed()).subscribe((optionValue) => { if (this.multiple) { const { value } = this; if (value.includes(optionValue)) { this.updateValue(value.filter((item) => item !== optionValue)); } else { this.updateValue([...value, optionValue]); } } else { this.updateValue(optionValue); this.close(); } }); this._headwindSelectService.closeOptions.pipe(takeUntilDestroyed()).subscribe(() => { this.close(); }); } get multiple() { return this._headwindSelectService.multiple; } set multiple(value) { this._headwindSelectService.multiple = value; } get value() { return this._headwindSelectService.value; } set value(value) { this._headwindSelectService.value = value; } get disabled() { return this.isDisabled; } set disabled(value) { this.setDisabledState(value); } get opened() { return !!this._optionsViewRef; } ngAfterViewInit() { this._headwindClickDetector.register(this._elementRef.nativeElement); } ngOnDestroy() { clearTimeout(this._openTimeoutId); clearTimeout(this._closeTimeoutId); } writeValue(obj) { this._headwindSelectService.value = obj; } updateValue(value) { super.updateValue(value); this.valueChange.emit(value); } onHostBlur() { this.onTouched(); } onHostClick() { this.open(); } onHostEnterKeydown(event) { event.preventDefault(); event.stopPropagation(); this.open(); } onHostArrowUpKeydown(event) { event.preventDefault(); event.stopPropagation(); this.open(); } onHostArrowDownKeydown(event) { event.preventDefault(); event.stopPropagation(); this.open(); } open() { if (this.isDisabled || this._headwindSelectService.optionsOpened) { return; } if (!this.optionsTemplate) { console.error(HeadwindErrors.headwindError0001); return; } if (this._optionsViewRef) { // already opened return; } this._optionsViewRef = this._headwindOverlayService.open(this.optionsTemplate.templateRef, () => this._afterClosed()); this._headwindAnimator.addListener(this._optionsPositionListener); this._elementRef.nativeElement.blur(); this._headwindSelectService.optionsOpened = true; clearTimeout(this._openTimeoutId); // timeout to wait until options rendered this._openTimeoutId = setTimeout(() => { if (!this.options) { console.error(HeadwindErrors.headwindError0002); return; } }); } close() { this._optionsViewRef?.destroy(); this._afterClosed(); } _afterClosed() { clearTimeout(this._closeTimeoutId); // timeout to prevent re-opening options after closed this._closeTimeoutId = setTimeout(() => { this._headwindAnimator.removeListener(this._optionsPositionListener); this._headwindSelectService.optionsOpened = false; delete this._optionsViewRef; }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeadwindSelectComponent, deps: [{ token: i0.ElementRef }, { token: i1.HeadwindOverlayService }, { token: i2.HeadwindClickDetector }, { token: i3.HeadwindAnimator }, { token: i4.HeadwindSelectService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.13", type: HeadwindSelectComponent, isStandalone: true, selector: "headwind-select", inputs: { multiple: ["multiple", "multiple", booleanAttribute], value: "value", disabled: ["disabled", "disabled", booleanAttribute] }, outputs: { valueChange: "valueChange" }, host: { attributes: { "tabindex": "0", "role": "combobox", "aria-haspopup": "listbox" }, listeners: { "blur": "onHostBlur()", "click": "onHostClick()", "keydown.enter": "onHostEnterKeydown($event)", "keydown.arrowUp": "onHostArrowUpKeydown($event)", "keydown.arrowDown": "onHostArrowDownKeydown($event)" }, properties: { "attr.aria-expanded": "opened", "class.headwind-opened": "opened" }, classAttribute: "headwind-select" }, providers: [HeadwindClickDetector, HeadwindSelectService], queries: [{ propertyName: "optionsTemplate", first: true, predicate: HeadwindOptionsOverlayDirective, descendants: true }, { propertyName: "options", first: true, predicate: HeadwindOptionsOverlayComponent, descendants: true }], exportAs: ["headwindSelect"], usesInheritance: true, ngImport: i0, template: "<ng-content></ng-content>\r\n", styles: [""] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeadwindSelectComponent, decorators: [{ type: Component, args: [{ selector: 'headwind-select', standalone: true, imports: [], exportAs: 'headwindSelect', host: { tabindex: '0', class: 'headwind-select', role: 'combobox', ['aria-haspopup']: 'listbox', ['[attr.aria-expanded]']: 'opened', ['[class.headwind-opened]']: 'opened', }, providers: [HeadwindClickDetector, HeadwindSelectService], template: "<ng-content></ng-content>\r\n" }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.HeadwindOverlayService }, { type: i2.HeadwindClickDetector }, { type: i3.HeadwindAnimator }, { type: i4.HeadwindSelectService }], propDecorators: { valueChange: [{ type: Output }], optionsTemplate: [{ type: ContentChild, args: [HeadwindOptionsOverlayDirective, { descendants: true }] }], options: [{ type: ContentChild, args: [HeadwindOptionsOverlayComponent, { descendants: true }] }], multiple: [{ type: Input, args: [{ transform: booleanAttribute }] }], value: [{ type: Input }], disabled: [{ type: Input, args: [{ transform: booleanAttribute }] }], onHostBlur: [{ type: HostListener, args: ['blur'] }], onHostClick: [{ type: HostListener, args: ['click'] }], onHostEnterKeydown: [{ type: HostListener, args: ['keydown.enter', ['$event']] }], onHostArrowUpKeydown: [{ type: HostListener, args: ['keydown.arrowUp', ['$event']] }], onHostArrowDownKeydown: [{ type: HostListener, args: ['keydown.arrowDown', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZHdpbmQtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2hlYWR3aW5kLXVpL3NyYy9jb21wb25lbnRzL2hlYWR3aW5kLXNlbGVjdC9oZWFkd2luZC1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaGVhZHdpbmQtdWkvc3JjL2NvbXBvbmVudHMvaGVhZHdpbmQtc2VsZWN0L2hlYWR3aW5kLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxZQUFZLEVBR1osWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN2RixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUUvRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUNoSCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQzs7Ozs7O0FBbUJoSCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsNEJBQTRCO0lBWXZFLFlBQ21CLFdBQW9DLEVBQ3BDLHVCQUErQyxFQUMvQyxzQkFBNkMsRUFDN0MsaUJBQW1DLEVBQ25DLHNCQUE2QztRQUU5RCxLQUFLLEVBQUUsQ0FBQztRQU5TLGdCQUFXLEdBQVgsV0FBVyxDQUF5QjtRQUNwQyw0QkFBdUIsR0FBdkIsdUJBQXVC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QUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbnRlbnRDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEVtYmVkZGVkVmlld1JlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPdXRwdXQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHsgSGVhZHdpbmRPdmVybGF5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2hlYWR3aW5kLW92ZXJsYXkuc2VydmljZSc7XHJcbmltcG9ydCB7IEhlYWR3aW5kRXJyb3JzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2hlYWR3aW5kLWVycm9ycyc7XHJcbmltcG9ydCB7IEhlYWR3aW5kQ2xpY2tEZXRlY3RvciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2hlYWR3aW5kLWNsaWNrLWRldGVjdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIZWFkd2luZENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi4vLi4vYWJzdHJhY3RzL2hlYWR3aW5kLWNvbnRyb2wtdmFsdWUtYWNjZXNzb3InO1xyXG5pbXBvcnQgeyBIZWFkd2luZEFuaW1hdG9yIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaGVhZHdpbmQtYW5pbWF0b3InO1xyXG5pbXBvcnQgeyBIZWFkd2luZFNlbGVjdFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2UvaGVhZHdpbmQtc2VsZWN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIZWFkd2luZE9wdGlvbnNPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnLi9oZWFkd2luZC1vcHRpb25zLW92ZXJsYXkvaGVhZHdpbmQtb3B0aW9ucy1vdmVybGF5LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEhlYWR3aW5kT3B0aW9uc092ZXJsYXlDb21wb25lbnQgfSBmcm9tICcuL2hlYWR3aW5kLW9wdGlvbnMtb3ZlcmxheS9oZWFkd2luZC1vcHRpb25zLW92ZXJsYXkuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaGVhZHdpbmQtc2VsZWN0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9oZWFkd2luZC1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9oZWFkd2luZC1zZWxlY3QuY29tcG9uZW50LnNjc3MnLFxyXG4gIGV4cG9ydEFzOiAnaGVhZHdpbmRTZWxlY3QnLFxyXG4gIGhvc3Q6IHtcclxuICAgIHRhYmluZGV4OiAnMCcsXHJcbiAgICBjbGFzczogJ2hlYWR3aW5kLXNlbGVjdCcsXHJcbiAgICByb2xlOiAnY29tYm9ib3gnLFxyXG4gICAgWydhcmlhLWhhc3BvcHVwJ106ICdsaXN0Ym94JyxcclxuICAgIFsnW2F0dHIuYXJpYS1leHBhbmRlZF0nXTogJ29wZW5lZCcsXHJcbiAgICBbJ1tjbGFzcy5oZWFkd2luZC1vcGVuZWRdJ106ICdvcGVuZWQnLFxyXG4gIH0sXHJcbiAgcHJvdmlkZXJzOiBbSGVhZHdpbmRDbGlja0RldGVjdG9yLCBIZWFkd2luZFNlbGVjdFNlcnZpY2VdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSGVhZHdpbmRTZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBIZWFkd2luZENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChIZWFkd2luZE9wdGlvbnNPdmVybGF5RGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXHJcbiAgb3B0aW9uc1RlbXBsYXRlPzogSGVhZHdpbmRPcHRpb25zT3ZlcmxheURpcmVjdGl2ZTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChIZWFkd2luZE9wdGlvbnNPdmVybGF5Q29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIG9wdGlvbnM/OiBIZWFkd2luZE9wdGlvbnNPdmVybGF5Q29tcG9uZW50O1xyXG5cclxuICBwcml2YXRlIF9vcHRpb25zVmlld1JlZj86IEVtYmVkZGVkVmlld1JlZjxhbnk+O1xyXG4gIHByaXZhdGUgX29wZW5UaW1lb3V0SWQ/OiBhbnk7XHJcbiAgcHJpdmF0ZSBfY2xvc2VUaW1lb3V0SWQ/OiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9oZWFkd2luZE92ZXJsYXlTZXJ2aWNlOiBIZWFkd2luZE92ZXJsYXlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaGVhZHdpbmRDbGlja0RldGVjdG9yOiBIZWFkd2luZENsaWNrRGV0ZWN0b3IsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9oZWFkd2luZEFuaW1hdG9yOiBIZWFkd2luZEFuaW1hdG9yLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaGVhZHdpbmRTZWxlY3RTZXJ2aWNlOiBIZWFkd2luZFNlbGVjdFNlcnZpY2UsXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIC8vIG9wdGlvbnMgc2hvdWxkIGJlIGNsb3NlZCBmcm9tIHRoZSBvcHRpb25zIGNvbXBvbmVudFxyXG4gICAgdGhpcy5faGVhZHdpbmRTZWxlY3RTZXJ2aWNlLnNlbGVjdE9wdGlvbi5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKS5zdWJzY3JpYmUoKG9wdGlvblZhbHVlKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKCh2YWx1ZSBhcyBhbnlbXSkuaW5jbHVkZXMob3B0aW9uVmFsdWUpKSB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKHZhbHVlLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtICE9PSBvcHRpb25WYWx1ZSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKFsuLi52YWx1ZSwgb3B0aW9uVmFsdWVdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShvcHRpb25WYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9oZWFkd2luZFNlbGVjdFNlcnZpY2UuY2xvc2VPcHRpb25zLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXHJcbiAgZ2V0IG11bHRpcGxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hlYWR3aW5kU2VsZWN0U2VydmljZS5tdWx0aXBsZTtcclxuICB9XHJcblxyXG4gIHNldCBtdWx0aXBsZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faGVhZHdpbmRTZWxlY3RTZXJ2aWNlLm11bHRpcGxlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWUoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLl9oZWFkd2luZFNlbGVjdFNlcnZpY2UudmFsdWU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLl9oZWFkd2luZFNlbGVjdFNlcnZpY2UudmFsdWUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxyXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuc2V0RGlzYWJsZWRTdGF0ZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgb3BlbmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy5fb3B0aW9uc1ZpZXdSZWY7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLl9oZWFkd2luZENsaWNrRGV0ZWN0b3IucmVnaXN0ZXIodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX29wZW5UaW1lb3V0SWQpO1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2Nsb3NlVGltZW91dElkKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHdyaXRlVmFsdWUob2JqOiBhbnkpIHtcclxuICAgIHRoaXMuX2hlYWR3aW5kU2VsZWN0U2VydmljZS52YWx1ZSA9IG9iajtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHVwZGF0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgIHN1cGVyLnVwZGF0ZVZhbHVlKHZhbHVlKTtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdibHVyJylcclxuICBvbkhvc3RCbHVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJylcclxuICBvbkhvc3RDbGljaygpOiB2b2lkIHtcclxuICAgIHRoaXMub3BlbigpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lbnRlcicsIFsnJGV2ZW50J10pXHJcbiAgb25Ib3N0RW50ZXJLZXlkb3duKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIHRoaXMub3BlbigpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd1VwJywgWyckZXZlbnQnXSlcclxuICBvbkhvc3RBcnJvd1VwS2V5ZG93bihldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICB0aGlzLm9wZW4oKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uYXJyb3dEb3duJywgWyckZXZlbnQnXSlcclxuICBvbkhvc3RBcnJvd0Rvd25LZXlkb3duKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIHRoaXMub3BlbigpO1xyXG4gIH1cclxuXHJcbiAgb3BlbigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQgfHwgdGhpcy5faGVhZHdpbmRTZWxlY3RTZXJ2aWNlLm9wdGlvbnNPcGVuZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5vcHRpb25zVGVtcGxhdGUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihIZWFkd2luZEVycm9ycy5oZWFkd2luZEVycm9yMDAwMSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fb3B0aW9uc1ZpZXdSZWYpIHtcclxuICAgICAgLy8gYWxyZWFkeSBvcGVuZWRcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX29wdGlvbnNWaWV3UmVmID0gdGhpcy5faGVhZHdpbmRPdmVybGF5U2VydmljZS5vcGVuKHRoaXMub3B0aW9uc1RlbXBsYXRlLnRlbXBsYXRlUmVmLCAoKSA9PlxyXG4gICAgICB0aGlzLl9hZnRlckNsb3NlZCgpLFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLl9oZWFkd2luZEFuaW1hdG9yLmFkZExpc3RlbmVyKHRoaXMuX29wdGlvbnNQb3NpdGlvbkxpc3RlbmVyKTtcclxuXHJcbiAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xyXG4gICAgdGhpcy5faGVhZHdpbmRTZWxlY3RTZXJ2aWNlLm9wdGlvbnNPcGVuZWQgPSB0cnVlO1xyXG5cclxuICAgIGNsZWFyVGltZW91dCh0aGlzLl9vcGVuVGltZW91dElkKTtcclxuXHJcbiAgICAvLyB0aW1lb3V0IHRvIHdhaXQgdW50aWwgb3B0aW9ucyByZW5kZXJlZFxyXG4gICAgdGhpcy5fb3BlblRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucykge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoSGVhZHdpbmRFcnJvcnMuaGVhZHdpbmRFcnJvcjAwMDIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX29wdGlvbnNWaWV3UmVmPy5kZXN0cm95KCk7XHJcblxyXG4gICAgdGhpcy5fYWZ0ZXJDbG9zZWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FmdGVyQ2xvc2VkKCk6IHZvaWQge1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2Nsb3NlVGltZW91dElkKTtcclxuXHJcbiAgICAvLyB0aW1lb3V0IHRvIHByZXZlbnQgcmUtb3BlbmluZyBvcHRpb25zIGFmdGVyIGNsb3NlZFxyXG4gICAgdGhpcy5fY2xvc2VUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5faGVhZHdpbmRBbmltYXRvci5yZW1vdmVMaXN0ZW5lcih0aGlzLl9vcHRpb25zUG9zaXRpb25MaXN0ZW5lcik7XHJcbiAgICAgIHRoaXMuX2hlYWR3aW5kU2VsZWN0U2VydmljZS5vcHRpb25zT3BlbmVkID0gZmFsc2U7XHJcblxyXG4gICAgICBkZWxldGUgdGhpcy5fb3B0aW9uc1ZpZXdSZWY7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29wdGlvbnNQb3NpdGlvbkxpc3RlbmVyID0gKCkgPT4ge1xyXG4gICAgdGhpcy5vcHRpb25zPy51cGRhdGVQb3NpdGlvbih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gIH07XHJcbn1cclxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4iXX0=