UNPKG

@yyasinaslan/easyform

Version:
221 lines 27.7 kB
import { DestroyRef, Directive, EventEmitter, inject, Injector, Input, Output, ViewContainerRef } from '@angular/core'; import { EasyFormComponent } from "../easy-form/easy-form.component"; import { isComponent } from "../helpers/component-helper"; import { filter } from "rxjs"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import * as i0 from "@angular/core"; export class FormFieldDirective { constructor() { this.destroyRef = inject(DestroyRef); this.viewContainerRef = inject(ViewContainerRef); this.easyFormComponent = inject(EasyFormComponent); this.disabled = false; // It emits control value changes this.change = new EventEmitter(); // Emit all events this.fieldEvent = new EventEmitter(); // Filter events this.focus = this.fieldEvent.pipe(filter(e => e.type == 'focus' || e.type == 'focusin')); this.blur = this.fieldEvent.pipe(filter(e => e.type == 'blur' || e.type == 'focusout')); // Event emitters derived from fieldEvent this.input = this.fieldEvent.pipe(filter(e => e.type == 'input')); this.keyup = this.fieldEvent.pipe(filter(e => e.type == 'keyup')); this.keydown = this.fieldEvent.pipe(filter(e => e.type == 'keydown')); } get value() { return this.control?.value; } get form() { return this.easyFormComponent.form; } ngOnChanges(changes) { if (changes['path']) { this.pathChanged(); } if (changes['disabled']) { const control = this.control; if (control) { if (this.disabled) { control.disable(); } else { control.enable(); } } } if (changes['props'] && this.componentRef) { this.componentRef.instance.props.set(changes['props'].currentValue); this.componentRef.changeDetectorRef.detectChanges(); } } pathChanged() { const control = this.setControl(); if (control) { if (this.valueChangeSubscription) { this.valueChangeSubscription.unsubscribe(); } this.control = control; this.valueChangeSubscription = control.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(value => { this.change.emit(value); }); this.render(); } } setControl() { const path = this.path; if (!path || path.length === 0) { return; } if (!this.easyFormComponent.form) { return undefined; } const control = this.easyFormComponent.form.getControl(path); if (!control) { return undefined; } return control; } async render() { await this._render(); const control = this.control; if (control) { setTimeout(() => { if (this.disabled) { control.disable(); } else { control.enable(); } }); } } async _render() { const path = this.path; if (!path) { return; } const schema = this.form.getSchema(path); if (!schema) { throw new Error(`Path not found for ${path}`); } let componentDefinition = typeof schema.controlType === 'string' ? this.form.getComponentType(schema.controlType) : schema.controlType; let component; if (!componentDefinition) { // Get component from formConfig componentDefinition = this.easyFormComponent.getComponentType(schema.controlType); } if (!componentDefinition) { throw new Error(`Component configuration not found for ${schema.controlType}`); } if (!isComponent(componentDefinition)) { // Assume this is lazy loading component if (typeof componentDefinition !== 'function') { throw new Error(`${schema.controlType} is not a valid Angular component`); } const lazyLoadingComponent = componentDefinition; const loaded = await lazyLoadingComponent(); if (loaded.default) { component = loaded.default; } else if (typeof loaded === 'function' && isComponent(loaded)) { component = loaded; } else { throw new Error(`${schema.controlType} has no default export or is not a valid Angular component`); } } else { component = componentDefinition; } // Double check if component is a valid Angular component if (!isComponent(component)) { throw new Error(`${schema.controlType} is not a valid Angular component. Please provide a valid Angular component for ${schema.controlType} on provider EasyFormConfig`); } // Forwards this instance to the child component const injector = Injector.create({ parent: this.viewContainerRef.injector, providers: [ { provide: FormFieldDirective, useValue: this } ] }); this.viewContainerRef.clear(); if (this.componentRef) { this.componentRef.destroy(); } const componentRef = this.viewContainerRef.createComponent(component, { injector: injector }); this.componentRef = componentRef; this.instance = componentRef.instance; // This usage is removed in favor of directives props input // if (schema.props) { // // Initialize props // this.instance.props.set(schema.props); // } // Set component specific properties if (this.props) { this.componentRef.instance.props.set(this.props); } componentRef.instance.easyFormControl.set({ id: path.join('_') + '_' + Math.random().toString(36).substring(2), control: this.control, schema: schema }); componentRef.changeDetectorRef.detectChanges(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FormFieldDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.12", type: FormFieldDirective, isStandalone: true, selector: "ng-container[easyFormField]", inputs: { disabled: "disabled", props: "props", path: ["path", "path", (val) => { const path = val; if (typeof path === 'string') { return path.split('.'); } return path; }] }, outputs: { change: "change", fieldEvent: "fieldEvent", focus: "focus", blur: "blur", input: "input", keyup: "keyup", keydown: "keydown" }, exportAs: ["easyFormField"], usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FormFieldDirective, decorators: [{ type: Directive, args: [{ selector: 'ng-container[easyFormField]', standalone: true, exportAs: 'easyFormField', }] }], propDecorators: { disabled: [{ type: Input }], props: [{ type: Input }], change: [{ type: Output }], fieldEvent: [{ type: Output }], focus: [{ type: Output, args: ["focus"] }], blur: [{ type: Output, args: ["blur"] }], input: [{ type: Output, args: ["input"] }], keyup: [{ type: Output, args: ["keyup"] }], keydown: [{ type: Output, args: ["keydown"] }], path: [{ type: Input, args: [{ required: true, transform: (val) => { const path = val; if (typeof path === 'string') { return path.split('.'); } return path; } }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWVsZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lYXN5LWZvcm0vc3JjL2xpYi9kaXJlY3RpdmVzL2Zvcm0tZmllbGQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxVQUFVLEVBQ1YsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFFTCxNQUFNLEVBRU4sZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBRW5FLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUV4RCxPQUFPLEVBQUMsTUFBTSxFQUEyQixNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7QUFROUQsTUFBTSxPQUFPLGtCQUFrQjtJQUwvQjtRQU1FLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDL0IscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDM0Msc0JBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFFcEMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUUxQixpQ0FBaUM7UUFDdkIsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDM0Msa0JBQWtCO1FBQ1IsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFTLENBQUM7UUFDakQsZ0JBQWdCO1FBQ0MsVUFBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLENBQTJC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QUMsT0FBTztnQkFDSSxPQUFPO3NCQUF6QixNQUFNO3VCQUFDLFNBQVM7Z0JBYWQsSUFBSTtzQkFUTixLQUFLO3VCQUFDO3dCQUNMLFFBQVEsRUFBRSxJQUFJO3dCQUNkLFNBQVMsRUFBRSxDQUFDLEdBQW9DLEVBQTBCLEVBQUU7NEJBQzFFLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQzs0QkFDakIsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQ0FDN0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUN6QixDQUFDOzRCQUNELE9BQU8sSUFBSSxDQUFDO3dCQUNkLENBQUM7cUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudFJlZixcclxuICBEZXN0cm95UmVmLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgaW5qZWN0LFxyXG4gIEluamVjdG9yLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q29udGFpbmVyUmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge0Vhc3lGb3JtQ29tcG9uZW50fSBmcm9tIFwiLi4vZWFzeS1mb3JtL2Vhc3ktZm9ybS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtFYXN5Rm9ybUNvbnRyb2x9IGZyb20gXCIuLi9lYXN5LWZvcm0tY29udHJvbFwiO1xyXG5pbXBvcnQge2lzQ29tcG9uZW50fSBmcm9tIFwiLi4vaGVscGVycy9jb21wb25lbnQtaGVscGVyXCI7XHJcbmltcG9ydCB7RWFzeUZvcm1Db250cm9sQ29tcG9uZW50LCBMYXp5TG9hZGluZ0NvbXBvbmVudH0gZnJvbSBcIi4uL3Rva2Vucy9lYXN5LWZvcm0tY29uZmlnXCI7XHJcbmltcG9ydCB7ZmlsdGVyLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3BcIjtcclxuaW1wb3J0IHtFYXN5Rm9ybUZpZWxkfSBmcm9tIFwiLi4vZWFzeS1mb3JtLWZpZWxkXCI7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ25nLWNvbnRhaW5lcltlYXN5Rm9ybUZpZWxkXScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBleHBvcnRBczogJ2Vhc3lGb3JtRmllbGQnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybUZpZWxkRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpXHJcbiAgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKVxyXG4gIGVhc3lGb3JtQ29tcG9uZW50ID0gaW5qZWN0KEVhc3lGb3JtQ29tcG9uZW50KVxyXG5cclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PjtcclxuICAvLyBJdCBlbWl0cyBjb250cm9sIHZhbHVlIGNoYW5nZXNcclxuICBAT3V0cHV0KCkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgLy8gRW1pdCBhbGwgZXZlbnRzXHJcbiAgQE91dHB1dCgpIGZpZWxkRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xyXG4gIC8vIEZpbHRlciBldmVudHNcclxuICBAT3V0cHV0KFwiZm9jdXNcIikgZm9jdXMgPSB0aGlzLmZpZWxkRXZlbnQucGlwZShmaWx0ZXIoZSA9PiBlLnR5cGUgPT0gJ2ZvY3VzJyB8fCBlLnR5cGUgPT0gJ2ZvY3VzaW4nKSkgYXMgT2JzZXJ2YWJsZTxGb2N1c0V2ZW50PjtcclxuICBAT3V0cHV0KFwiYmx1clwiKSBibHVyID0gdGhpcy5maWVsZEV2ZW50LnBpcGUoZmlsdGVyKGUgPT4gZS50eXBlID09ICdibHVyJyB8fCBlLnR5cGUgPT0gJ2ZvY3Vzb3V0JykpIGFzIE9ic2VydmFibGU8Rm9jdXNFdmVudD47XHJcbiAgLy8gRXZlbnQgZW1pdHRlcnMgZGVyaXZlZCBmcm9tIGZpZWxkRXZlbnRcclxuICBAT3V0cHV0KFwiaW5wdXRcIikgaW5wdXQgPSB0aGlzLmZpZWxkRXZlbnQucGlwZShmaWx0ZXIoZSA9PiBlLnR5cGUgPT0gJ2lucHV0JykpIGFzIE9ic2VydmFibGU8SW5wdXRFdmVudD47XHJcbiAgQE91dHB1dChcImtleXVwXCIpIGtleXVwID0gdGhpcy5maWVsZEV2ZW50LnBpcGUoZmlsdGVyKGUgPT4gZS50eXBlID09ICdrZXl1cCcpKSBhcyBPYnNlcnZhYmxlPEtleWJvYXJkRXZlbnQ+O1xyXG4gIEBPdXRwdXQoXCJrZXlkb3duXCIpIGtleWRvd24gPSB0aGlzLmZpZWxkRXZlbnQucGlwZShmaWx0ZXIoZSA9PiBlLnR5cGUgPT0gJ2tleWRvd24nKSkgYXMgT2JzZXJ2YWJsZTxLZXlib2FyZEV2ZW50PjtcclxuXHJcbiAgcHVibGljIGluc3RhbmNlPzogRWFzeUZvcm1Db250cm9sO1xyXG5cclxuICBASW5wdXQoe1xyXG4gICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICB0cmFuc2Zvcm06ICh2YWw6IHN0cmluZyB8IEFycmF5PHN0cmluZyB8IG51bWJlcj4pOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0+IHtcclxuICAgICAgY29uc3QgcGF0aCA9IHZhbDtcclxuICAgICAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICB9XHJcbiAgfSkgcGF0aCE6IEFycmF5PHN0cmluZyB8IG51bWJlcj47XHJcblxyXG4gIGNvbnRyb2w/OiBGb3JtQ29udHJvbDtcclxuXHJcbiAgcHJpdmF0ZSBjb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8RWFzeUZvcm1Db250cm9sPjtcclxuICBwcml2YXRlIHZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sPy52YWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGZvcm0oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lYXN5Rm9ybUNvbXBvbmVudC5mb3JtO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ3BhdGgnXSkge1xyXG4gICAgICB0aGlzLnBhdGhDaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10pIHtcclxuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuY29udHJvbDtcclxuICAgICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgY29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ3Byb3BzJ10gJiYgdGhpcy5jb21wb25lbnRSZWYpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UucHJvcHMuc2V0KGNoYW5nZXNbJ3Byb3BzJ10uY3VycmVudFZhbHVlKTtcclxuICAgICAgdGhpcy5jb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXRoQ2hhbmdlZCgpIHtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnNldENvbnRyb2woKTtcclxuICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgIGlmICh0aGlzLnZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY29udHJvbCA9IGNvbnRyb2w7XHJcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24gPSBjb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlLmVtaXQodmFsdWUpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldENvbnRyb2woKSB7XHJcbiAgICBjb25zdCBwYXRoID0gdGhpcy5wYXRoO1xyXG4gICAgaWYgKCFwYXRoIHx8IHBhdGgubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZWFzeUZvcm1Db21wb25lbnQuZm9ybSkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmVhc3lGb3JtQ29tcG9uZW50LmZvcm0uZ2V0Q29udHJvbChwYXRoKTtcclxuXHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIHJldHVybiBjb250cm9sIGFzIEZvcm1Db250cm9sO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZW5kZXIoKSB7XHJcbiAgICBhd2FpdCB0aGlzLl9yZW5kZXIoKTtcclxuXHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5jb250cm9sO1xyXG4gICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb250cm9sLmVuYWJsZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlcigpIHtcclxuICAgIGNvbnN0IHBhdGggPSB0aGlzLnBhdGg7XHJcbiAgICBpZiAoIXBhdGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5mb3JtLmdldFNjaGVtYShwYXRoKTtcclxuICAgIGlmICghc2NoZW1hKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCBub3QgZm91bmQgZm9yICR7cGF0aH1gKTtcclxuICAgIH1cclxuICAgIGxldCBjb21wb25lbnREZWZpbml0aW9uID0gdHlwZW9mIHNjaGVtYS5jb250cm9sVHlwZSA9PT0gJ3N0cmluZycgPyB0aGlzLmZvcm0uZ2V0Q29tcG9uZW50VHlwZShzY2hlbWEuY29udHJvbFR5cGUpIDogc2NoZW1hLmNvbnRyb2xUeXBlO1xyXG4gICAgbGV0IGNvbXBvbmVudDogRWFzeUZvcm1Db250cm9sQ29tcG9uZW50O1xyXG4gICAgaWYgKCFjb21wb25lbnREZWZpbml0aW9uKSB7XHJcbiAgICAgIC8vIEdldCBjb21wb25lbnQgZnJvbSBmb3JtQ29uZmlnXHJcbiAgICAgIGNvbXBvbmVudERlZmluaXRpb24gPSB0aGlzLmVhc3lGb3JtQ29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoc2NoZW1hLmNvbnRyb2xUeXBlIGFzIHN0cmluZyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFjb21wb25lbnREZWZpbml0aW9uKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50IGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kIGZvciAke3NjaGVtYS5jb250cm9sVHlwZX1gKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWlzQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24pKSB7XHJcbiAgICAgIC8vIEFzc3VtZSB0aGlzIGlzIGxhenkgbG9hZGluZyBjb21wb25lbnRcclxuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnREZWZpbml0aW9uICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3NjaGVtYS5jb250cm9sVHlwZX0gaXMgbm90IGEgdmFsaWQgQW5ndWxhciBjb21wb25lbnRgKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBsYXp5TG9hZGluZ0NvbXBvbmVudCA9IGNvbXBvbmVudERlZmluaXRpb24gYXMgTGF6eUxvYWRpbmdDb21wb25lbnQ7XHJcbiAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxhenlMb2FkaW5nQ29tcG9uZW50KCkgYXMgYW55O1xyXG4gICAgICBpZiAobG9hZGVkLmRlZmF1bHQpIHtcclxuICAgICAgICBjb21wb25lbnQgPSBsb2FkZWQuZGVmYXVsdDtcclxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbG9hZGVkID09PSAnZnVuY3Rpb24nICYmIGlzQ29tcG9uZW50KGxvYWRlZCkpIHtcclxuICAgICAgICBjb21wb25lbnQgPSBsb2FkZWQgYXMgRWFzeUZvcm1Db250cm9sQ29tcG9uZW50O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY2hlbWEuY29udHJvbFR5cGV9IGhhcyBubyBkZWZhdWx0IGV4cG9ydCBvciBpcyBub3QgYSB2YWxpZCBBbmd1bGFyIGNvbXBvbmVudGApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb21wb25lbnQgPSBjb21wb25lbnREZWZpbml0aW9uIGFzIEVhc3lGb3JtQ29udHJvbENvbXBvbmVudDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEb3VibGUgY2hlY2sgaWYgY29tcG9uZW50IGlzIGEgdmFsaWQgQW5ndWxhciBjb21wb25lbnRcclxuICAgIGlmICghaXNDb21wb25lbnQoY29tcG9uZW50KSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NoZW1hLmNvbnRyb2xUeXBlfSBpcyBub3QgYSB2YWxpZCBBbmd1bGFyIGNvbXBvbmVudC4gUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCBBbmd1bGFyIGNvbXBvbmVudCBmb3IgJHtzY2hlbWEuY29udHJvbFR5cGV9IG9uIHByb3ZpZGVyIEVhc3lGb3JtQ29uZmlnYCk7XHJcbiAgICB9XHJcbiAgICAvLyBGb3J3YXJkcyB0aGlzIGluc3RhbmNlIHRvIHRoZSBjaGlsZCBjb21wb25lbnRcclxuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcclxuICAgICAgcGFyZW50OiB0aGlzLnZpZXdDb250YWluZXJSZWYuaW5qZWN0b3IsXHJcbiAgICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IEZvcm1GaWVsZERpcmVjdGl2ZSxcclxuICAgICAgICAgIHVzZVZhbHVlOiB0aGlzXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9KVxyXG4gICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XHJcbiAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRSZWYuZGVzdHJveSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudDxFYXN5Rm9ybUNvbnRyb2w+KGNvbXBvbmVudCBhcyBFYXN5Rm9ybUNvbnRyb2xDb21wb25lbnQsIHtcclxuICAgICAgaW5qZWN0b3I6IGluamVjdG9yXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY29tcG9uZW50UmVmID0gY29tcG9uZW50UmVmO1xyXG4gICAgdGhpcy5pbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcclxuXHJcbiAgICAvLyBUaGlzIHVzYWdlIGlzIHJlbW92ZWQgaW4gZmF2b3Igb2YgZGlyZWN0aXZlcyBwcm9wcyBpbnB1dFxyXG4gICAgLy8gaWYgKHNjaGVtYS5wcm9wcykge1xyXG4gICAgLy8gICAvLyBJbml0aWFsaXplIHByb3BzXHJcbiAgICAvLyAgIHRoaXMuaW5zdGFuY2UucHJvcHMuc2V0KHNjaGVtYS5wcm9wcyk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gU2V0IGNvbXBvbmVudCBzcGVjaWZpYyBwcm9wZXJ0aWVzXHJcbiAgICBpZiAodGhpcy5wcm9wcykge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5wcm9wcy5zZXQodGhpcy5wcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmVhc3lGb3JtQ29udHJvbC5zZXQoe1xyXG4gICAgICBpZDogcGF0aC5qb2luKCdfJykgKyAnXycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiksXHJcbiAgICAgIGNvbnRyb2w6IHRoaXMuY29udHJvbCEsXHJcbiAgICAgIHNjaGVtYTogc2NoZW1hIGFzIEVhc3lGb3JtRmllbGRcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=