UNPKG

@ui-tool/core

Version:
151 lines 22.4 kB
import { Directive, Inject, Input, Optional } from '@angular/core'; import { VALIDATION_ITEM_TEMPLATE_BUILDERS } from '../../../../constants/injectors/validation-summarizer-injectors'; import { NO_SUITABLE_VALIDATION_SUMMARIZER_ITEM_TEMPLATE_BUILDER_FOUND } from '../../../../constants/internal-exception-codes'; import { ValidationItemBuildContext } from '../../../../models/implementations/validation-summarizers/validation-item-build-context'; import { forkJoin, from, of, Subject, Subscription } from 'rxjs'; import { catchError, debounceTime, map, switchMap } from 'rxjs/operators'; import * as i0 from "@angular/core"; // tslint:disable-next-line:directive-class-suffix export class ValidationSummarizerItemDirective { //#endregion //#region Constructor constructor(viewContainerRef, // tslint:disable-next-line:max-line-length validationItemTemplateBuilders) { this.viewContainerRef = viewContainerRef; this.validationItemTemplateBuilders = validationItemTemplateBuilders; this._containerId = ''; this._validationTriggerSubject = new Subject(); this._subscription = new Subscription(); } //#endregion //#region Accessors get containerId() { return this._containerId; } set containerId(value) { this._containerId = value; } get validationMessages() { return this._validationMessages; } set validationMessages(value) { if (!value) { this._validationMessages = []; return; } this._validationMessages = value; } get ngControl() { return this._control; } set ngControl(value) { this._control = value; } get controlLabel() { return this._label; } set controlLabel(value) { this._label = value; } //#endregion //#region Life cycle ngOnInit() { const validationTriggerSubscription = this._validationTriggerSubject .pipe(debounceTime(50), map(() => this._validationMessages || []), switchMap(validationMessages => { // Observables to be completed. const observables = []; for (const validationMessage of validationMessages) { const loadValidationItemComponentRefObservable = from(this.loadValidationItemComponentRef(validationMessage)) .pipe(catchError(() => { return of(null); })); observables.push(loadValidationItemComponentRefObservable); } return forkJoin(observables); })) .subscribe((componentRefs) => { // Clear the view container. this.viewContainerRef.clear(); for (const componentRef of componentRefs) { if (!componentRef) { continue; } this.viewContainerRef.insert(componentRef.hostView); } }); this._subscription.add(validationTriggerSubscription); } async ngAfterViewInit() { if (!this.ngControl || !this.ngControl.valueChanges) { return; } const valueChangeSubscription = this.ngControl.valueChanges .subscribe(() => { this._validationTriggerSubject.next(); }); this._subscription.add(valueChangeSubscription); // Trigger the validation right after the view has been initialized. this._validationTriggerSubject.next(); } // Called when component is destroyed. ngOnDestroy() { if (this._subscription && !this._subscription.closed) { this._subscription.unsubscribe(); } } //#endregion //#region Methods // Load suitable item template builder asynchronously. async loadSuitableItemTemplateBuilderAsync(validationMessage) { if (!this.validationItemTemplateBuilders || !this.validationItemTemplateBuilders.length) { throw new Error(NO_SUITABLE_VALIDATION_SUMMARIZER_ITEM_TEMPLATE_BUILDER_FOUND); } // Build the context. const validationItemBuildContext = this.loadValidationItemBuildContext(validationMessage); for (const validationTemplateBuilder of this.validationItemTemplateBuilders) { // Check whether template can be built or not. const ableToBuildTemplate = await validationTemplateBuilder.ableToBuildTemplateAsync(validationItemBuildContext).toPromise(); if (!ableToBuildTemplate) { continue; } return validationTemplateBuilder; } throw new Error(NO_SUITABLE_VALIDATION_SUMMARIZER_ITEM_TEMPLATE_BUILDER_FOUND); } loadValidationItemBuildContext(validationMessage) { return new ValidationItemBuildContext(this.containerId, this._label, validationMessage, this.ngControl); } // Load validation item component reference. async loadValidationItemComponentRef(validationMessage) { // Build the message context. const context = this.loadValidationItemBuildContext(validationMessage); // Get the suitable item template builder. const suitableItemTemplateBuilder = await this.loadSuitableItemTemplateBuilderAsync(validationMessage); // Build the component ref. return await suitableItemTemplateBuilder.buildTemplateAsync(context).toPromise(); } } ValidationSummarizerItemDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ValidationSummarizerItemDirective, deps: [{ token: i0.ViewContainerRef }, { token: VALIDATION_ITEM_TEMPLATE_BUILDERS, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); ValidationSummarizerItemDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: ValidationSummarizerItemDirective, selector: "[validationSummarizerItem]", inputs: { containerId: "containerId", validationMessages: "validationMessages", ngControl: "ngControl", controlLabel: "controlLabel" }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ValidationSummarizerItemDirective, decorators: [{ type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '[validationSummarizerItem]' }] }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: undefined, decorators: [{ type: Inject, args: [VALIDATION_ITEM_TEMPLATE_BUILDERS] }, { type: Optional }] }]; }, propDecorators: { containerId: [{ type: Input }], validationMessages: [{ type: Input }], ngControl: [{ type: Input }], controlLabel: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1zdW1tYXJpemVyLWl0ZW0uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9tb2R1bGVzL3ZhbGlkYXRvci92YWxpZGF0aW9uLXN1bW1hcml6ZXIvdmFsaWRhdGlvbi1zdW1tYXJpemVyLWl0ZW0vdmFsaWRhdGlvbi1zdW1tYXJpemVyLWl0ZW0uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBOEIsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBbUIsTUFBTSxlQUFlLENBQUM7QUFFbkksT0FBTyxFQUFDLGlDQUFpQyxFQUFDLE1BQU0saUVBQWlFLENBQUM7QUFHbEgsT0FBTyxFQUFDLDZEQUE2RCxFQUFDLE1BQU0sZ0RBQWdELENBQUM7QUFDN0gsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0seUZBQXlGLENBQUM7QUFDbkksT0FBTyxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDM0UsT0FBTyxFQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDOztBQU14RSxrREFBa0Q7QUFDbEQsTUFBTSxPQUFPLGlDQUFpQztJQXlFNUMsWUFBWTtJQUVaLHFCQUFxQjtJQUVyQixZQUNZLGdCQUFrQztJQUM1QywyQ0FBMkM7SUFDK0IsOEJBQTBFO1FBRjFJLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFFOEIsbUNBQThCLEdBQTlCLDhCQUE4QixDQUE0QztRQUNwSixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNyRCxJQUFJLENBQUMsYUFBYSxH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QUFpQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsNENBQTRDO0lBQ2xDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxpQkFBb0M7UUFDakYsNkJBQTZCO1FBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXZFLDBDQUEwQztRQUMxQyxNQUFNLDJCQUEyQixHQUFHLE1BQU0sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFdkcsMkJBQTJCO1FBQzNCLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuRixDQUFDOzsrSEFuTVUsaUNBQWlDLGtEQWdGbEMsaUNBQWlDO21IQWhGaEMsaUNBQWlDOzRGQUFqQyxpQ0FBaUM7a0JBTDdDLFNBQVM7bUJBQUM7b0JBQ1QsOENBQThDO29CQUM5QyxRQUFRLEVBQUUsNEJBQTRCO2lCQUN2Qzs7MEJBa0ZJLE1BQU07MkJBQUMsaUNBQWlDOzswQkFBRyxRQUFROzRDQTVDM0MsV0FBVztzQkFEckIsS0FBSztnQkFVSyxrQkFBa0I7c0JBRDVCLEtBQUs7Z0JBZ0JLLFNBQVM7c0JBRG5CLEtBQUs7Z0JBVUssWUFBWTtzQkFEdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50UmVmLCBEaXJlY3RpdmUsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgVmlld0NvbnRhaW5lclJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0lWYWxpZGF0aW9uU3VtbWFyaXplckl0ZW1UZW1wbGF0ZUJ1aWxkZXJ9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2ludGVyZmFjZXMvdmFsaWRhdGlvbi1zdW1tYXJpemVycy92YWxpZGF0aW9uLXN1bW1hcml6ZXItaXRlbS10ZW1wbGF0ZS1idWlsZGVyLmludGVyZmFjZSc7XG5pbXBvcnQge1ZBTElEQVRJT05fSVRFTV9URU1QTEFURV9CVUlMREVSU30gZnJvbSAnLi4vLi4vLi4vLi4vY29uc3RhbnRzL2luamVjdG9ycy92YWxpZGF0aW9uLXN1bW1hcml6ZXItaW5qZWN0b3JzJztcbmltcG9ydCB7VmFsaWRhdGlvbk1lc3NhZ2V9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9pbXBsZW1lbnRhdGlvbnMvdmFsaWRhdGlvbi1zdW1tYXJpemVycy92YWxpZGF0aW9uLW1lc3NhZ2UnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIE5nQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtOT19TVUlUQUJMRV9WQUxJREFUSU9OX1NVTU1BUklaRVJfSVRFTV9URU1QTEFURV9CVUlMREVSX0ZPVU5EfSBmcm9tICcuLi8uLi8uLi8uLi9jb25zdGFudHMvaW50ZXJuYWwtZXhjZXB0aW9uLWNvZGVzJztcbmltcG9ydCB7VmFsaWRhdGlvbkl0ZW1CdWlsZENvbnRleHR9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9pbXBsZW1lbnRhdGlvbnMvdmFsaWRhdGlvbi1zdW1tYXJpemVycy92YWxpZGF0aW9uLWl0ZW0tYnVpbGQtY29udGV4dCc7XG5pbXBvcnQge2ZvcmtKb2luLCBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBtYXAsIHN3aXRjaE1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1t2YWxpZGF0aW9uU3VtbWFyaXplckl0ZW1dJ1xufSlcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvblN1bW1hcml6ZXJJdGVtRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8vI3JlZ2lvbiBQcm9wZXJ0aWVzXG5cbiAgLy8gSWQgb2YgdmFsaWRhdGlvbiBzdW1tYXJpemVyLlxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBwcml2YXRlIF9jb250YWluZXJJZDogc3RyaW5nO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgX3ZhbGlkYXRpb25NZXNzYWdlczogVmFsaWRhdGlvbk1lc3NhZ2VbXSB8IHVuZGVmaW5lZDtcblxuICAvLyBGb3JtIGNvbnRyb2wgd2hpY2ggaXMgYmVpbmcgdmFsaWRhdGVkLlxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBwcml2YXRlIF9jb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBOZ0NvbnRyb2wgfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gIC8vIENvbnRyb2wgbGFiZWwuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgX2xhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLy8gU3ViamVjdCB3aGljaCB0cmlnZ2VycyB2YWxpZGF0aW9uLlxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBwcml2YXRlIHJlYWRvbmx5IF92YWxpZGF0aW9uVHJpZ2dlclN1YmplY3Q6IFN1YmplY3Q8dm9pZD47XG5cbiAgLy8gU3Vic2NyaXB0aW9uIHdhdGNoIGxpc3QuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBBY2Nlc3NvcnNcblxuICBwdWJsaWMgZ2V0IGNvbnRhaW5lcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcklkO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBjb250YWluZXJJZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29udGFpbmVySWQgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmFsaWRhdGlvbk1lc3NhZ2VzKCk6IFZhbGlkYXRpb25NZXNzYWdlW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZXM7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHZhbGlkYXRpb25NZXNzYWdlcyh2YWx1ZTogVmFsaWRhdGlvbk1lc3NhZ2VbXSB8IHVuZGVmaW5lZCkge1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VzID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VzID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5nQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wgfCBOZ0NvbnRyb2wgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbmdDb250cm9sKHZhbHVlOiBBYnN0cmFjdENvbnRyb2wgfCBOZ0NvbnRyb2wgfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gICAgdGhpcy5fY29udHJvbCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBjb250cm9sTGFiZWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbGFiZWw7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNvbnRyb2xMYWJlbCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbGFiZWwgPSB2YWx1ZTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBDb25zdHJ1Y3RvclxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgQEluamVjdChWQUxJREFUSU9OX0lURU1fVEVNUExBVEVfQlVJTERFUlMpIEBPcHRpb25hbCgpIHByb3RlY3RlZCByZWFkb25seSB2YWxpZGF0aW9uSXRlbVRlbXBsYXRlQnVpbGRlcnM6IElWYWxpZGF0aW9uU3VtbWFyaXplckl0ZW1UZW1wbGF0ZUJ1aWxkZXJbXSkge1xuICAgIHRoaXMuX2NvbnRhaW5lcklkID0gJyc7XG5cbiAgICB0aGlzLl92YWxpZGF0aW9uVHJpZ2dlclN1YmplY3QgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBMaWZlIGN5Y2xlXG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgY29uc3QgdmFsaWRhdGlvblRyaWdnZXJTdWJzY3JpcHRpb24gPSB0aGlzLl92YWxpZGF0aW9uVHJpZ2dlclN1YmplY3RcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoNTApLFxuICAgICAgICBtYXAoKCkgPT4gdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VzIHx8IFtdKSxcbiAgICAgICAgc3dpdGNoTWFwKHZhbGlkYXRpb25NZXNzYWdlcyA9PiB7XG5cbiAgICAgICAgICAvLyBPYnNlcnZhYmxlcyB0byBiZSBjb21wbGV0ZWQuXG4gICAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZXM6IE9ic2VydmFibGU8Q29tcG9uZW50UmVmPGFueT4gfCBudWxsPltdID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCB2YWxpZGF0aW9uTWVzc2FnZSBvZiB2YWxpZGF0aW9uTWVzc2FnZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRWYWxpZGF0aW9uSXRlbUNvbXBvbmVudFJlZk9ic2VydmFibGUgPSBmcm9tKHRoaXMubG9hZFZhbGlkYXRpb25JdGVtQ29tcG9uZW50UmVmKHZhbGlkYXRpb25NZXNzYWdlKSlcbiAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG9ic2VydmFibGVzLnB1c2gobG9hZFZhbGlkYXRpb25JdGVtQ29tcG9uZW50UmVmT2JzZXJ2YWJsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZvcmtKb2luKG9ic2VydmFibGVzKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGNvbXBvbmVudFJlZnM6IChDb21wb25lbnRSZWY8YW55PiB8IG51bGwpIFtdKSA9PiB7XG4gICAgICAgIC8vIENsZWFyIHRoZSB2aWV3IGNvbnRhaW5lci5cbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnRSZWYgb2YgY29tcG9uZW50UmVmcykge1xuICAgICAgICAgIGlmICghY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmluc2VydChjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHZhbGlkYXRpb25UcmlnZ2VyU3Vic2NyaXB0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBuZ0FmdGVyVmlld0luaXQoKTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICBpZiAoIXRoaXMubmdDb250cm9sIHx8ICF0aGlzLm5nQ29udHJvbC52YWx1ZUNoYW5nZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZUNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMubmdDb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRpb25UcmlnZ2VyU3ViamVjdC5uZXh0KCk7XG4gICAgICB9KTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uKTtcblxuICAgIC8vIFRyaWdnZXIgdGhlIHZhbGlkYXRpb24gcmlnaHQgYWZ0ZXIgdGhlIHZpZXcgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAgdGhpcy5fdmFsaWRhdGlvblRyaWdnZXJTdWJqZWN0Lm5leHQoKTtcbiAgfVxuXG4gIC8vIENhbGxlZCB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc3Vic2NyaXB0aW9uICYmICF0aGlzLl9zdWJzY3JpcHRpb24uY2xvc2VkKSB7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gTWV0aG9kc1xuXG4gIC8vIExvYWQgc3VpdGFibGUgaXRlbSB0ZW1wbGF0ZSBidWlsZGVyIGFzeW5jaHJvbm91c2x5LlxuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFN1aXRhYmxlSXRlbVRlbXBsYXRlQnVpbGRlckFzeW5jKHZhbGlkYXRpb25NZXNzYWdlOiBWYWxpZGF0aW9uTWVzc2FnZSlcbiAgICA6IFByb21pc2U8SVZhbGlkYXRpb25TdW1tYXJpemVySXRlbVRlbXBsYXRlQnVpbGRlcj4ge1xuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRpb25JdGVtVGVtcGxhdGVCdWlsZGVycyB8fCAhdGhpcy52YWxpZGF0aW9uSXRlbVRlbXBsYXRlQnVpbGRlcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoTk9fU1VJVEFCTEVfVkFMSURBVElPTl9TVU1NQVJJWkVSX0lURU1fVEVNUExBVEVfQlVJTERFUl9GT1VORCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGNvbnRleHQuXG4gICAgY29uc3QgdmFsaWRhdGlvbkl0ZW1CdWlsZENvbnRleHQgPSB0aGlzLmxvYWRWYWxpZGF0aW9uSXRlbUJ1aWxkQ29udGV4dCh2YWxpZGF0aW9uTWVzc2FnZSk7XG5cbiAgICBmb3IgKGNvbnN0IHZhbGlkYXRpb25UZW1wbGF0ZUJ1aWxkZXIgb2YgdGhpcy52YWxpZGF0aW9uSXRlbVRlbXBsYXRlQnVpbGRlcnMpIHtcblxuICAgICAgLy8gQ2hlY2sgd2hldGhlciB0ZW1wbGF0ZSBjYW4gYmUgYnVpbHQgb3Igbm90LlxuICAgICAgY29uc3QgYWJsZVRvQnVpbGRUZW1wbGF0ZSA9IGF3YWl0IHZhbGlkYXRpb25UZW1wbGF0ZUJ1aWxkZXIuYWJsZVRvQnVpbGRUZW1wbGF0ZUFzeW5jKHZhbGlkYXRpb25JdGVtQnVpbGRDb250ZXh0KS50b1Byb21pc2UoKTtcbiAgICAgIGlmICghYWJsZVRvQnVpbGRUZW1wbGF0ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbGlkYXRpb25UZW1wbGF0ZUJ1aWxkZXI7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKE5PX1NVSVRBQkxFX1ZBTElEQVRJT05fU1VNTUFSSVpFUl9JVEVNX1RFTVBMQVRFX0JVSUxERVJfRk9VTkQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxvYWRWYWxpZGF0aW9uSXRlbUJ1aWxkQ29udGV4dCh2YWxpZGF0aW9uTWVzc2FnZTogVmFsaWRhdGlvbk1lc3NhZ2UpOiBWYWxpZGF0aW9uSXRlbUJ1aWxkQ29udGV4dCB7XG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uSXRlbUJ1aWxkQ29udGV4dCh0aGlzLmNvbnRhaW5lcklkLCB0aGlzLl9sYWJlbCxcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlLCB0aGlzLm5nQ29udHJvbCk7XG4gIH1cblxuICAvLyBMb2FkIHZhbGlkYXRpb24gaXRlbSBjb21wb25lbnQgcmVmZXJlbmNlLlxuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFZhbGlkYXRpb25JdGVtQ29tcG9uZW50UmVmKHZhbGlkYXRpb25NZXNzYWdlOiBWYWxpZGF0aW9uTWVzc2FnZSk6IFByb21pc2U8Q29tcG9uZW50UmVmPGFueT4+IHtcbiAgICAvLyBCdWlsZCB0aGUgbWVzc2FnZSBjb250ZXh0LlxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmxvYWRWYWxpZGF0aW9uSXRlbUJ1aWxkQ29udGV4dCh2YWxpZGF0aW9uTWVzc2FnZSk7XG5cbiAgICAvLyBHZXQgdGhlIHN1aXRhYmxlIGl0ZW0gdGVtcGxhdGUgYnVpbGRlci5cbiAgICBjb25zdCBzdWl0YWJsZUl0ZW1UZW1wbGF0ZUJ1aWxkZXIgPSBhd2FpdCB0aGlzLmxvYWRTdWl0YWJsZUl0ZW1UZW1wbGF0ZUJ1aWxkZXJBc3luYyh2YWxpZGF0aW9uTWVzc2FnZSk7XG5cbiAgICAvLyBCdWlsZCB0aGUgY29tcG9uZW50IHJlZi5cbiAgICByZXR1cm4gYXdhaXQgc3VpdGFibGVJdGVtVGVtcGxhdGVCdWlsZGVyLmJ1aWxkVGVtcGxhdGVBc3luYyhjb250ZXh0KS50b1Byb21pc2UoKTtcbiAgfVxuXG4vLyNlbmRyZWdpb25cbn1cbiJdfQ==