UNPKG

ngrx-forms

Version:

Proper integration of forms in Angular 4 applications using ngrx

160 lines 21.2 kB
import { Directive, forwardRef, Host, HostListener, Input, Optional, } from '@angular/core'; import { NGRX_FORM_VIEW_ADAPTER } from './view-adapter'; import * as i0 from "@angular/core"; // tslint:disable:directive-class-suffix export class NgrxSelectMultipleViewAdapter { constructor(renderer, elementRef) { this.renderer = renderer; this.elementRef = elementRef; this.options = {}; this.optionValues = {}; this.idCounter = 0; this.selectedIds = []; this.nativeIdWasSet = false; this.onChangeFn = () => void 0; this.onTouched = () => void 0; } set ngrxFormControlState(value) { if (!value) { throw new Error('The control state must not be undefined!'); } this.state = value; const nativeId = this.elementRef.nativeElement.id; const shouldSetNativeId = value.id !== nativeId && this.nativeIdWasSet; if (shouldSetNativeId) { this.renderer.setProperty(this.elementRef.nativeElement, 'id', value.id); } } ngAfterViewInit() { const nativeId = this.elementRef.nativeElement.id; const shouldSetNativeId = this.state.id !== nativeId && !nativeId; if (shouldSetNativeId) { this.renderer.setProperty(this.elementRef.nativeElement, 'id', this.state.id); this.nativeIdWasSet = true; } } setViewValue(value) { if (value === null) { value = []; } if (!Array.isArray(value)) { throw new Error(`the value provided to a NgrxSelectMultipleViewAdapter must be null or an array; got ${value} of type ${typeof value}`); // ` } this.selectedIds = value.map(v => this.getOptionId(v)).filter(id => id !== null).map(id => id); Object.keys(this.options).forEach(id => this.options[id].isSelected = this.selectedIds.indexOf(id) >= 0); } onChange() { this.selectedIds = Object.keys(this.options).filter(id => this.options[id].isSelected); const value = this.selectedIds.map(id => this.optionValues[id]); this.onChangeFn(value); } setOnChangeCallback(fn) { this.onChangeFn = fn; } setOnTouchedCallback(fn) { this.onTouched = fn; } setIsDisabled(isDisabled) { this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled); } registerOption(option) { const id = this.idCounter.toString(); this.options[id] = option; this.idCounter += 1; return id; } updateOptionValue(id, value) { this.optionValues[id] = value; if (this.selectedIds.indexOf(id) >= 0) { this.onChange(); } } deregisterOption(id) { delete this.options[id]; delete this.optionValues[id]; } getOptionId(value) { for (const id of Array.from(Object.keys(this.optionValues))) { if (this.optionValues[id] === value) { return id; } } return null; } } NgrxSelectMultipleViewAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgrxSelectMultipleViewAdapter, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); NgrxSelectMultipleViewAdapter.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.13", type: NgrxSelectMultipleViewAdapter, selector: "select[multiple][ngrxFormControlState]", inputs: { ngrxFormControlState: "ngrxFormControlState" }, host: { listeners: { "blur": "onTouched()", "change": "onChange()" } }, providers: [{ provide: NGRX_FORM_VIEW_ADAPTER, useExisting: forwardRef(() => NgrxSelectMultipleViewAdapter), multi: true, }], ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgrxSelectMultipleViewAdapter, decorators: [{ type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: 'select[multiple][ngrxFormControlState]', providers: [{ provide: NGRX_FORM_VIEW_ADAPTER, useExisting: forwardRef(() => NgrxSelectMultipleViewAdapter), multi: true, }], }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { onTouched: [{ type: HostListener, args: ['blur'] }], ngrxFormControlState: [{ type: Input }], onChange: [{ type: HostListener, args: ['change'] }] } }); const NULL_VIEW_ADAPTER = { registerOption: () => '', deregisterOption: () => void 0, updateOptionValue: () => void 0, }; const NULL_RENDERER = { setProperty: () => void 0, }; export class NgrxSelectMultipleOption { constructor(element, renderer, viewAdapter) { this.element = element; this.renderer = renderer; this.viewAdapter = viewAdapter; this.renderer = viewAdapter ? renderer : NULL_RENDERER; this.viewAdapter = viewAdapter || NULL_VIEW_ADAPTER; this.id = this.viewAdapter.registerOption(this); } set value(value) { this.viewAdapter.updateOptionValue(this.id, value); } set isSelected(selected) { this.renderer.setProperty(this.element.nativeElement, 'selected', selected); } get isSelected() { return this.element.nativeElement.selected; } ngOnInit() { this.renderer.setProperty(this.element.nativeElement, 'value', this.id); } ngOnDestroy() { this.viewAdapter.deregisterOption(this.id); } } NgrxSelectMultipleOption.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgrxSelectMultipleOption, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: NgrxSelectMultipleViewAdapter, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); NgrxSelectMultipleOption.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.13", type: NgrxSelectMultipleOption, selector: "option", inputs: { value: "value" }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgrxSelectMultipleOption, decorators: [{ type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: 'option', }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: NgrxSelectMultipleViewAdapter, decorators: [{ type: Host }, { type: Optional }] }]; }, propDecorators: { value: [{ type: Input, args: ['value'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LW11bHRpcGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3ZpZXctYWRhcHRlci9zZWxlY3QtbXVsdGlwbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxVQUFVLEVBQ1YsSUFBSSxFQUNKLFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBbUIsc0JBQXNCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFekUsd0NBQXdDO0FBV3hDLE1BQU0sT0FBTyw2QkFBNkI7SUEwQnhDLFlBQW9CLFFBQW1CLEVBQVUsVUFBc0I7UUFBbkQsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUFVLGVBQVUsR0FBVixVQUFVLENBQVk7UUF4Qi9ELFlBQU8sR0FBK0MsRUFBRSxDQUFDO1FBQ3pELGlCQUFZLEdBQTBCLEVBQUUsQ0FBQztRQUN6QyxjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFDM0IsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFL0IsZUFBVSxHQUF5QixHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUdoRCxjQUFTLEdBQWUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUE7SUFldUMsQ0FBQztJQWI1RSxJQUFhLG9CQUFvQixDQUFDLEtBQTRCO1FBQzVELElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7U0FDN0Q7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsRUFBRSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ3ZFLElBQUksaUJBQWlCLEVBQUU7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMxRTtJQUNILENBQUM7SUFJRCxlQUFlO1FBQ2IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2xFLElBQUksaUJBQWlCLEVBQUU7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQVU7UUFDckIsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQ2xCLEtBQUssR0FBRyxFQUFFLENBQUM7U0FDWjtRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUZBQXVGLEtBQUssWUFBWSxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQzlJO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFZLENBQUMsQ0FBQztRQUN6RyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzRyxDQUFDO0lBR0QsUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxFQUF3QjtRQUMxQyxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsb0JBQW9CLENBQUMsRUFBYztRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsYUFBYSxDQUFDLFVBQW1CO1FBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQWdDO1FBQzdDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUM7UUFDcEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBVSxFQUFFLEtBQVU7UUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFOUIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQVU7UUFDekIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQVU7UUFDNUIsS0FBSyxNQUFNLEVBQUUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUU7WUFDM0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDbkMsT0FBTyxFQUFFLENBQUM7YUFDWDtTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOzsySEFqR1UsNkJBQTZCOytHQUE3Qiw2QkFBNkIsbU1BTjdCLENBQUM7WUFDVixPQUFPLEVBQUUsc0JBQXNCO1lBQy9CLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsNkJBQTZCLENBQUM7WUFDNUQsS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDOzRGQUVTLDZCQUE2QjtrQkFUekMsU0FBUzttQkFBQztvQkFDVCw4Q0FBOEM7b0JBQzlDLFFBQVEsRUFBRSx3Q0FBd0M7b0JBQ2xELFNBQVMsRUFBRSxDQUFDOzRCQUNWLE9BQU8sRUFBRSxzQkFBc0I7NEJBQy9CLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDhCQUE4QixDQUFDOzRCQUM1RCxLQUFLLEVBQUUsSUFBSTt5QkFDWixDQUFDO2lCQUNIO3lIQVlDLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxNQUFNO2dCQUdQLG9CQUFvQjtzQkFBaEMsS0FBSztnQkFzQ04sUUFBUTtzQkFEUCxZQUFZO3VCQUFDLFFBQVE7O0FBa0R4QixNQUFNLGlCQUFpQixHQUFrQztJQUN2RCxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUN4QixnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFDOUIsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0NBQ3pCLENBQUM7QUFFVCxNQUFNLGFBQWEsR0FBYztJQUMvQixXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0NBQ25CLENBQUM7QUFNVCxNQUFNLE9BQU8sd0JBQXdCO0lBR25DLFlBQ1UsT0FBbUIsRUFDbkIsUUFBbUIsRUFDQyxXQUEwQztRQUY5RCxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDQyxnQkFBVyxHQUFYLFdBQVcsQ0FBK0I7UUFFdEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxJQUFJLGlCQUFpQixDQUFDO1FBQ3BELElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQ0ksS0FBSyxDQUFDLEtBQVU7UUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxRQUFpQjtRQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFtQyxDQUFDLFFBQVEsQ0FBQztJQUNwRSxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDOztzSEFoQ1Usd0JBQXdCLHFFQU1RLDZCQUE2QjswR0FON0Qsd0JBQXdCOzRGQUF4Qix3QkFBd0I7a0JBSnBDLFNBQVM7bUJBQUM7b0JBQ1QsOENBQThDO29CQUM5QyxRQUFRLEVBQUUsUUFBUTtpQkFDbkI7MkdBTzRDLDZCQUE2QjswQkFBckUsSUFBSTs7MEJBQUksUUFBUTs0Q0FRZixLQUFLO3NCQURSLEtBQUs7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBmb3J3YXJkUmVmLFxyXG4gIEhvc3QsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgUmVuZGVyZXIyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgRm9ybUNvbnRyb2xTdGF0ZSB9IGZyb20gJy4uL3N0YXRlJztcclxuaW1wb3J0IHsgRm9ybVZpZXdBZGFwdGVyLCBOR1JYX0ZPUk1fVklFV19BREFQVEVSIH0gZnJvbSAnLi92aWV3LWFkYXB0ZXInO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGU6ZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAnc2VsZWN0W211bHRpcGxlXVtuZ3J4Rm9ybUNvbnRyb2xTdGF0ZV0nLFxyXG4gIHByb3ZpZGVyczogW3tcclxuICAgIHByb3ZpZGU6IE5HUlhfRk9STV9WSUVXX0FEQVBURVIsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3J4U2VsZWN0TXVsdGlwbGVWaWV3QWRhcHRlciksXHJcbiAgICBtdWx0aTogdHJ1ZSxcclxuICB9XSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5ncnhTZWxlY3RNdWx0aXBsZVZpZXdBZGFwdGVyIGltcGxlbWVudHMgRm9ybVZpZXdBZGFwdGVyLCBBZnRlclZpZXdJbml0IHtcclxuICBwcml2YXRlIHN0YXRlOiBGb3JtQ29udHJvbFN0YXRlPGFueT47XHJcbiAgcHJpdmF0ZSBvcHRpb25zOiB7IFtpZDogc3RyaW5nXTogTmdyeFNlbGVjdE11bHRpcGxlT3B0aW9uIH0gPSB7fTtcclxuICBwcml2YXRlIG9wdGlvblZhbHVlczogeyBbaWQ6IHN0cmluZ106IGFueSB9ID0ge307XHJcbiAgcHJpdmF0ZSBpZENvdW50ZXIgPSAwO1xyXG4gIHByaXZhdGUgc2VsZWN0ZWRJZHM6IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBuYXRpdmVJZFdhc1NldCA9IGZhbHNlO1xyXG5cclxuICBvbkNoYW5nZUZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHZvaWQgMDtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpXHJcbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4gdm9pZCAwXHJcblxyXG4gIEBJbnB1dCgpIHNldCBuZ3J4Rm9ybUNvbnRyb2xTdGF0ZSh2YWx1ZTogRm9ybUNvbnRyb2xTdGF0ZTxhbnk+KSB7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNvbnRyb2wgc3RhdGUgbXVzdCBub3QgYmUgdW5kZWZpbmVkIScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhdGUgPSB2YWx1ZTtcclxuICAgIGNvbnN0IG5hdGl2ZUlkID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuaWQ7XHJcbiAgICBjb25zdCBzaG91bGRTZXROYXRpdmVJZCA9IHZhbHVlLmlkICE9PSBuYXRpdmVJZCAmJiB0aGlzLm5hdGl2ZUlkV2FzU2V0O1xyXG4gICAgaWYgKHNob3VsZFNldE5hdGl2ZUlkKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdpZCcsIHZhbHVlLmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7IH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgY29uc3QgbmF0aXZlSWQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pZDtcclxuICAgIGNvbnN0IHNob3VsZFNldE5hdGl2ZUlkID0gdGhpcy5zdGF0ZS5pZCAhPT0gbmF0aXZlSWQgJiYgIW5hdGl2ZUlkO1xyXG4gICAgaWYgKHNob3VsZFNldE5hdGl2ZUlkKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdpZCcsIHRoaXMuc3RhdGUuaWQpO1xyXG4gICAgICB0aGlzLm5hdGl2ZUlkV2FzU2V0ID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldFZpZXdWYWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgdmFsdWUgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdGhlIHZhbHVlIHByb3ZpZGVkIHRvIGEgTmdyeFNlbGVjdE11bHRpcGxlVmlld0FkYXB0ZXIgbXVzdCBiZSBudWxsIG9yIGFuIGFycmF5OyBnb3QgJHt2YWx1ZX0gb2YgdHlwZSAke3R5cGVvZiB2YWx1ZX1gKTsgLy8gYFxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRJZHMgPSB2YWx1ZS5tYXAodiA9PiB0aGlzLmdldE9wdGlvbklkKHYpKS5maWx0ZXIoaWQgPT4gaWQgIT09IG51bGwpLm1hcChpZCA9PiBpZCBhcyBzdHJpbmcpO1xyXG4gICAgT2JqZWN0LmtleXModGhpcy5vcHRpb25zKS5mb3JFYWNoKGlkID0+IHRoaXMub3B0aW9uc1tpZF0uaXNTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJZHMuaW5kZXhPZihpZCkgPj0gMCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnKVxyXG4gIG9uQ2hhbmdlKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IE9iamVjdC5rZXlzKHRoaXMub3B0aW9ucykuZmlsdGVyKGlkID0+IHRoaXMub3B0aW9uc1tpZF0uaXNTZWxlY3RlZCk7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRJZHMubWFwKGlkID0+IHRoaXMub3B0aW9uVmFsdWVzW2lkXSk7XHJcbiAgICB0aGlzLm9uQ2hhbmdlRm4odmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgc2V0T25DaGFuZ2VDYWxsYmFjayhmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpIHtcclxuICAgIHRoaXMub25DaGFuZ2VGbiA9IGZuO1xyXG4gIH1cclxuXHJcbiAgc2V0T25Ub3VjaGVkQ2FsbGJhY2soZm46ICgpID0+IHZvaWQpIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXRJc0Rpc2FibGVkKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPcHRpb24ob3B0aW9uOiBOZ3J4U2VsZWN0TXVsdGlwbGVPcHRpb24pIHtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5pZENvdW50ZXIudG9TdHJpbmcoKTtcclxuICAgIHRoaXMub3B0aW9uc1tpZF0gPSBvcHRpb247XHJcbiAgICB0aGlzLmlkQ291bnRlciArPSAxO1xyXG4gICAgcmV0dXJuIGlkO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlT3B0aW9uVmFsdWUoaWQ6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5vcHRpb25WYWx1ZXNbaWRdID0gdmFsdWU7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJZHMuaW5kZXhPZihpZCkgPj0gMCkge1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkZXJlZ2lzdGVyT3B0aW9uKGlkOiBzdHJpbmcpIHtcclxuICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNbaWRdO1xyXG4gICAgZGVsZXRlIHRoaXMub3B0aW9uVmFsdWVzW2lkXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T3B0aW9uSWQodmFsdWU6IGFueSkge1xyXG4gICAgZm9yIChjb25zdCBpZCBvZiBBcnJheS5mcm9tKE9iamVjdC5rZXlzKHRoaXMub3B0aW9uVmFsdWVzKSkpIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9uVmFsdWVzW2lkXSA9PT0gdmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IE5VTExfVklFV19BREFQVEVSOiBOZ3J4U2VsZWN0TXVsdGlwbGVWaWV3QWRhcHRlciA9IHtcclxuICByZWdpc3Rlck9wdGlvbjogKCkgPT4gJycsXHJcbiAgZGVyZWdpc3Rlck9wdGlvbjogKCkgPT4gdm9pZCAwLFxyXG4gIHVwZGF0ZU9wdGlvblZhbHVlOiAoKSA9PiB2b2lkIDAsXHJcbn0gYXMgYW55O1xyXG5cclxuY29uc3QgTlVMTF9SRU5ERVJFUjogUmVuZGVyZXIyID0ge1xyXG4gIHNldFByb3BlcnR5OiAoKSA9PiB2b2lkIDAsXHJcbn0gYXMgYW55O1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAnb3B0aW9uJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5ncnhTZWxlY3RNdWx0aXBsZU9wdGlvbiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBpZDogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIEBIb3N0KCkgQE9wdGlvbmFsKCkgcHJpdmF0ZSB2aWV3QWRhcHRlcjogTmdyeFNlbGVjdE11bHRpcGxlVmlld0FkYXB0ZXIsXHJcbiAgKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyID0gdmlld0FkYXB0ZXIgPyByZW5kZXJlciA6IE5VTExfUkVOREVSRVI7XHJcbiAgICB0aGlzLnZpZXdBZGFwdGVyID0gdmlld0FkYXB0ZXIgfHwgTlVMTF9WSUVXX0FEQVBURVI7XHJcbiAgICB0aGlzLmlkID0gdGhpcy52aWV3QWRhcHRlci5yZWdpc3Rlck9wdGlvbih0aGlzKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgndmFsdWUnKVxyXG4gIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLnZpZXdBZGFwdGVyLnVwZGF0ZU9wdGlvblZhbHVlKHRoaXMuaWQsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHNldCBpc1NlbGVjdGVkKHNlbGVjdGVkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnc2VsZWN0ZWQnLCBzZWxlY3RlZCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNTZWxlY3RlZCgpIHtcclxuICAgIHJldHVybiAodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTE9wdGlvbkVsZW1lbnQpLnNlbGVjdGVkO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB0aGlzLmlkKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy52aWV3QWRhcHRlci5kZXJlZ2lzdGVyT3B0aW9uKHRoaXMuaWQpO1xyXG4gIH1cclxufVxyXG4iXX0=