UNPKG

@ui-tool/core

Version:
213 lines 30 kB
import { ChangeDetectionStrategy, Component, Inject, Injector, Input } from '@angular/core'; import { v4 as uuid } from 'uuid'; import { Subject } from 'rxjs'; import { DISPLAY_SPINNER_OPTIONS, SPINNER_HOST, SPINNER_METHOD_INVOKE_CALLBACK, SPINNER_REQUEST_ID, SPINNER_SERVICE } from '../../constants/injectors/injectors'; import { BasicSpinnerComponent } from './basic-spinner/basic-spinner.component'; import { filter } from 'rxjs/operators'; import { SpinnerCommands } from '../../constants'; import { PurgeSpinnerCommand } from '../../models'; import * as i0 from "@angular/core"; export class SpinnerContainerComponent { //#endregion //#region Constructor constructor(_spinnerService, _viewContainerRef, _changeDetectorRef, __injector) { this._spinnerService = _spinnerService; this._viewContainerRef = _viewContainerRef; this._changeDetectorRef = _changeDetectorRef; this.__injector = __injector; this.id = uuid(); this.__id = uuid(); this.__hostClass = ''; this.__preserveLatestRequest = true; this.__contexts = []; this._visibilityEvent$ = new Subject(); } //#endregion //#region Accessors set id(value) { this.__id = value; if (this._visibilityChangedSubscription && !this._visibilityChangedSubscription.closed) { this._visibilityChangedSubscription.unsubscribe(); this._visibilityEvent$.next(undefined); } // Register spinner visibility changed event. this._visibilityChangedSubscription = this._spinnerService .hookSpinnerVisibilityEvent(value) .subscribe((event) => this._visibilityEvent$.next(event)); } get id() { return this.__id; } set preserveLatestRequest(value) { this.__preserveLatestRequest = value; } get preserveLatestRequest() { return this.__preserveLatestRequest; } //#endregion //#region Life cycle hooks ngOnInit() { // Subscription registration. this.__localVisibilityRequestHandleSubscription = this._visibilityEvent$ .pipe(filter(command => command?.containerId === this.__id), filter(command => command !== null && command !== undefined)) .subscribe(command => { this._handleVisibilityChangedEvent(command); this._changeDetectorRef.markForCheck(); }); } ngAfterViewInit() { // Update component id to trigger spinner event. this.id = this.__id || uuid(); } //#endregion //#region Methods // Called when component is destroyed. ngOnDestroy() { this._visibilityChangedSubscription?.unsubscribe(); this._visibilityEvent$?.unsubscribe(); this.__localVisibilityRequestHandleSubscription?.unsubscribe(); } // Handle visibility changed event. _handleVisibilityChangedEvent(command) { // Invalid command & view container ref. if (!command || !this._viewContainerRef) { return; } if (command.kind === SpinnerCommands.display) { const actualCommand = command; let purge = false; if (actualCommand.options) { purge = actualCommand.options.purge || false; } if (purge) { const purgeRequest = new PurgeSpinnerCommand(actualCommand.containerId); this._handleVisibilityChangedEvent(purgeRequest); } else if (this.__preserveLatestRequest) { // Get the latest context. const context = this._getLatestContext(); context?.context?.componentRef?.destroy(); } this._displaySpinner(actualCommand, -1); return; } if (command.kind === SpinnerCommands.close) { const actualCommand = command; if (actualCommand.id) { this._dismissByRequestId(actualCommand.id); } // There is at least one display request. Display that one. const { context, index: latestIndex } = this._getLatestContext(); if (context && latestIndex > -1) { this._displaySpinner(context.command, latestIndex); } return; } if (command.kind === SpinnerCommands.purge) { while (true) { if (!this.__contexts.length) { break; } this._dismissByRequestId(this.__contexts[0].command?.id, true); } return; } } _displaySpinner(displaySpinnerRequest, index) { if (!displaySpinnerRequest || !this._viewContainerRef) { return; } const commandContext = { command: displaySpinnerRequest, componentRef: null }; if (!(index < 0 || index >= this.__contexts.length)) { this.__contexts[index].componentRef?.destroy(); } const childInjector = Injector.create({ providers: [ { provide: SPINNER_METHOD_INVOKE_CALLBACK, useValue: displaySpinnerRequest.options?.invokedMethod }, { provide: SPINNER_REQUEST_ID, useValue: displaySpinnerRequest.id }, { provide: DISPLAY_SPINNER_OPTIONS, useValue: displaySpinnerRequest.options }, { provide: SPINNER_HOST, useValue: displaySpinnerRequest.containerId } ], parent: this.__injector }); if (!displaySpinnerRequest.options || !displaySpinnerRequest.options.instanceType) { const componentRef = this._viewContainerRef.createComponent(BasicSpinnerComponent, { injector: childInjector }); componentRef.changeDetectorRef.markForCheck(); commandContext.componentRef = componentRef; } else { const componentRef = this._viewContainerRef.createComponent(displaySpinnerRequest.options.instanceType, { injector: childInjector }); componentRef.changeDetectorRef.markForCheck(); commandContext.componentRef = componentRef; } if (index < 0 || index >= this.__contexts.length) { this.__contexts.push(commandContext); } else { this.__contexts[index] = commandContext; } } _dismissByRequestId(requestId, force) { const index = this.__contexts.findIndex(x => x.command?.id === requestId); if (index < 0) { return; } const context = this.__contexts[index]; if (!context) { return; } const command = context.command; if (!command || command.kind !== SpinnerCommands.display) { return; } // Spinner cannot be closed. const closingHandler = command?.options?.closing; if (!force && closingHandler && !closingHandler()) { return; } context.componentRef?.destroy(); context.componentRef = null; command?.options?.closed?.(force || false); this.__contexts.splice(index, 1); } _getLatestContext() { if (this.__contexts.length < 1) { return { context: null, index: -1 }; } const lastIndex = this.__contexts.length - 1; return { context: this.__contexts[lastIndex], index: lastIndex }; } } SpinnerContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SpinnerContainerComponent, deps: [{ token: SPINNER_SERVICE }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); SpinnerContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: SpinnerContainerComponent, selector: "cms-spinner-container", inputs: { id: "id", preserveLatestRequest: "preserveLatestRequest" }, ngImport: i0, template: '', isInline: true, styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SpinnerContainerComponent, decorators: [{ type: Component, args: [{ selector: 'cms-spinner-container', template: '', changeDetection: ChangeDetectionStrategy.OnPush, styles: [""] }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [SPINNER_SERVICE] }] }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: i0.Injector }]; }, propDecorators: { id: [{ type: Input }], preserveLatestRequest: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbm5lci1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9tb2R1bGVzL3NwaW5uZXIvc3Bpbm5lci1jb250YWluZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUtOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxFQUFFLElBQUksSUFBSSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUNMLHVCQUF1QixFQUFFLFlBQVksRUFDckMsOEJBQThCLEVBQzlCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2hCLE1BQU0scUNBQXFDLENBQUM7QUFJN0MsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFDOUUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQWtCLG1CQUFtQixFQUFDLE1BQU0sY0FBYyxDQUFDOztBQWFsRSxNQUFNLE9BQU8seUJBQXlCO0lBeURwQyxZQUFZO0lBRVoscUJBQXFCO0lBRXJCLFlBQ3NDLGVBQWdDLEVBQ2hDLGlCQUFtQyxFQUNuQyxrQkFBcUMsRUFDdkMsVUFBb0I7UUFIbEIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFDbkMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUN2QyxlQUFVLEdBQVYsVUFBVSxDQUFVO1FBQ3RELElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFFakIs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QVM7K0JBQ0UsdUJBQXVCLFlBQ3ZCLEVBQUUsbUJBRUssdUJBQXVCLENBQUMsTUFBTTs7MEJBK0QzQixNQUFNOzJCQUFDLGVBQWU7a0lBL0IvQixFQUFFO3NCQURaLEtBQUs7Z0JBb0JLLHFCQUFxQjtzQkFEL0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudFJlZixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Y0IGFzIHV1aWR9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHtTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRElTUExBWV9TUElOTkVSX09QVElPTlMsIFNQSU5ORVJfSE9TVCxcbiAgU1BJTk5FUl9NRVRIT0RfSU5WT0tFX0NBTExCQUNLLFxuICBTUElOTkVSX1JFUVVFU1RfSUQsXG4gIFNQSU5ORVJfU0VSVklDRVxufSBmcm9tICcuLi8uLi9jb25zdGFudHMvaW5qZWN0b3JzL2luamVjdG9ycyc7XG5pbXBvcnQge0lTcGlubmVyU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvaW50ZXJmYWNlcy9zcGlubmVyLXNlcnZpY2UuaW50ZXJmYWNlJztcbmltcG9ydCB7RGlzcGxheVNwaW5uZXJDb21tYW5kfSBmcm9tICcuLi8uLi9tb2RlbHMvaW1wbGVtZW50YXRpb25zL3NwaW5uZXJzL2Rpc3BsYXktc3Bpbm5lci1jb21tYW5kJztcbmltcG9ydCB7RGVsZXRlU3Bpbm5lckNvbW1hbmR9IGZyb20gJy4uLy4uL21vZGVscy9pbXBsZW1lbnRhdGlvbnMvc3Bpbm5lcnMvZGVsZXRlLXNwaW5uZXItY29tbWFuZCc7XG5pbXBvcnQge0Jhc2ljU3Bpbm5lckNvbXBvbmVudH0gZnJvbSAnLi9iYXNpYy1zcGlubmVyL2Jhc2ljLXNwaW5uZXIuY29tcG9uZW50JztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1NwaW5uZXJDb21tYW5kc30gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7SVNwaW5uZXJDb21tYW5kLCBQdXJnZVNwaW5uZXJDb21tYW5kfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuXG5kZWNsYXJlIHR5cGUgU3Bpbm5lckNvbW1hbmRDb250ZXh0ID0ge1xuICBjb21tYW5kOiBEaXNwbGF5U3Bpbm5lckNvbW1hbmQsXG4gIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT4gfCBudWxsXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbXMtc3Bpbm5lci1jb250YWluZXInLFxuICB0ZW1wbGF0ZTogJycsXG4gIHN0eWxlVXJsczogWydzcGlubmVyLWNvbnRhaW5lci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTcGlubmVyQ29udGFpbmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8vI3JlZ2lvbiBQcm9wZXJ0aWVzXG5cbiAgLy8gSWQgb2YgbG9hZGluZyBzcGlubmVyLlxuICBwcml2YXRlIF9faWQ6IHN0cmluZztcblxuICAvLyBXaGV0aGVyIHNwaW5uZXIgb25seSBkaXNwbGF5cyB0aGUgbGF0ZXN0IHJlcXVlc3Qgb25seSBvciBub3QuXG4gIHByaXZhdGUgX19wcmVzZXJ2ZUxhdGVzdFJlcXVlc3Q6IGJvb2xlYW47XG5cbiAgLy8gQ2xhc3Mgd2hpY2ggaXMgYXBwbGllZCB0byBob3N0IGNvbXBvbmVudC5cbiAgcHJpdmF0ZSBfX2hvc3RDbGFzczogc3RyaW5nO1xuXG4gIC8vIFN1YmplY3Qgd2hpY2ggZW1pdHMgc3Bpbm5lciB2aXNpYmlsaXR5IGV2ZW50LlxuICBwcml2YXRlIHJlYWRvbmx5IF92aXNpYmlsaXR5RXZlbnQkOiBTdWJqZWN0PElTcGlubmVyQ29tbWFuZCB8IG51bGw+O1xuXG4gIC8vIE1hcHBpbmcgYmV0d2VlbiBkaXNwbGF5IHJlcXVlc3QgaWQgJiBkaXNwbGF5ZWQgY29tcG9uZW50LlxuICBwcml2YXRlIHJlYWRvbmx5IF9fY29udGV4dHM6IFNwaW5uZXJDb21tYW5kQ29udGV4dFtdO1xuXG4gIC8vIFN1YnNjcmlwdGlvbiB0byBoYW5kbGUgbG9jYWwgdmlzaWJpbGl0eSByZXF1ZXN0LlxuICBwcml2YXRlIF9fbG9jYWxWaXNpYmlsaXR5UmVxdWVzdEhhbmRsZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIC8vIFN1YnNjcmlwdGlvbiB3YXRjaCBsaXN0LlxuICBwcm90ZWN0ZWQgX3Zpc2liaWxpdHlDaGFuZ2VkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIEFjY2Vzc29yc1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX19pZCA9IHZhbHVlO1xuXG4gICAgaWYgKHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkU3Vic2NyaXB0aW9uICYmICF0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZFN1YnNjcmlwdGlvbi5jbG9zZWQpIHtcbiAgICAgIHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLl92aXNpYmlsaXR5RXZlbnQkLm5leHQodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBzcGlubmVyIHZpc2liaWxpdHkgY2hhbmdlZCBldmVudC5cbiAgICB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZFN1YnNjcmlwdGlvbiA9IHRoaXMuX3NwaW5uZXJTZXJ2aWNlXG4gICAgICAuaG9va1NwaW5uZXJWaXNpYmlsaXR5RXZlbnQodmFsdWUpXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogRGlzcGxheVNwaW5uZXJDb21tYW5kIHwgRGVsZXRlU3Bpbm5lckNvbW1hbmQpID0+IHRoaXMuX3Zpc2liaWxpdHlFdmVudCQubmV4dChldmVudCkpO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9faWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHByZXNlcnZlTGF0ZXN0UmVxdWVzdCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX19wcmVzZXJ2ZUxhdGVzdFJlcXVlc3QgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcHJlc2VydmVMYXRlc3RSZXF1ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9fcHJlc2VydmVMYXRlc3RSZXF1ZXN0O1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIENvbnN0cnVjdG9yXG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKEBJbmplY3QoU1BJTk5FUl9TRVJWSUNFKVxuICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9zcGlubmVyU2VydmljZTogSVNwaW5uZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9faW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5pZCA9IHV1aWQoKTtcblxuICAgIHRoaXMuX19pZCA9IHV1aWQoKTtcbiAgICB0aGlzLl9faG9zdENsYXNzID0gJyc7XG4gICAgdGhpcy5fX3ByZXNlcnZlTGF0ZXN0UmVxdWVzdCA9IHRydWU7XG5cbiAgICB0aGlzLl9fY29udGV4dHMgPSBbXTtcbiAgICB0aGlzLl92aXNpYmlsaXR5RXZlbnQkID0gbmV3IFN1YmplY3Q8SVNwaW5uZXJDb21tYW5kIHwgbnVsbD4oKTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBMaWZlIGN5Y2xlIGhvb2tzXG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgLy8gU3Vic2NyaXB0aW9uIHJlZ2lzdHJhdGlvbi5cbiAgICB0aGlzLl9fbG9jYWxWaXNpYmlsaXR5UmVxdWVzdEhhbmRsZVN1YnNjcmlwdGlvbiA9IHRoaXMuX3Zpc2liaWxpdHlFdmVudCRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoY29tbWFuZCA9PiBjb21tYW5kPy5jb250YWluZXJJZCA9PT0gdGhpcy5fX2lkKSxcbiAgICAgICAgZmlsdGVyKGNvbW1hbmQgPT4gY29tbWFuZCAhPT0gbnVsbCAmJiBjb21tYW5kICE9PSB1bmRlZmluZWQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShjb21tYW5kID0+IHtcbiAgICAgICAgdGhpcy5faGFuZGxlVmlzaWJpbGl0eUNoYW5nZWRFdmVudChjb21tYW5kKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIGNvbXBvbmVudCBpZCB0byB0cmlnZ2VyIHNwaW5uZXIgZXZlbnQuXG4gICAgdGhpcy5pZCA9IHRoaXMuX19pZCB8fCB1dWlkKCk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gTWV0aG9kc1xuXG4gIC8vIENhbGxlZCB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcblxuICAgIHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3Zpc2liaWxpdHlFdmVudCQ/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fX2xvY2FsVmlzaWJpbGl0eVJlcXVlc3RIYW5kbGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyBIYW5kbGUgdmlzaWJpbGl0eSBjaGFuZ2VkIGV2ZW50LlxuICBwcm90ZWN0ZWQgX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2VkRXZlbnQoY29tbWFuZDogSVNwaW5uZXJDb21tYW5kIHwgbnVsbCk6IHZvaWQge1xuXG4gICAgLy8gSW52YWxpZCBjb21tYW5kICYgdmlldyBjb250YWluZXIgcmVmLlxuICAgIGlmICghY29tbWFuZCB8fCAhdGhpcy5fdmlld0NvbnRhaW5lclJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFNwaW5uZXJDb21tYW5kcy5kaXNwbGF5KSB7XG4gICAgICBjb25zdCBhY3R1YWxDb21tYW5kID0gY29tbWFuZCBhcyBEaXNwbGF5U3Bpbm5lckNvbW1hbmQ7XG5cbiAgICAgIGxldCBwdXJnZSA9IGZhbHNlO1xuICAgICAgaWYgKGFjdHVhbENvbW1hbmQub3B0aW9ucykge1xuICAgICAgICBwdXJnZSA9IGFjdHVhbENvbW1hbmQub3B0aW9ucy5wdXJnZSB8fCBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHB1cmdlKSB7XG4gICAgICAgIGNvbnN0IHB1cmdlUmVxdWVzdCA9IG5ldyBQdXJnZVNwaW5uZXJDb21tYW5kKGFjdHVhbENvbW1hbmQuY29udGFpbmVySWQpO1xuICAgICAgICB0aGlzLl9oYW5kbGVWaXNpYmlsaXR5Q2hhbmdlZEV2ZW50KHB1cmdlUmVxdWVzdCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX19wcmVzZXJ2ZUxhdGVzdFJlcXVlc3QpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBsYXRlc3QgY29udGV4dC5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2dldExhdGVzdENvbnRleHQoKTtcbiAgICAgICAgY29udGV4dD8uY29udGV4dD8uY29tcG9uZW50UmVmPy5kZXN0cm95KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2Rpc3BsYXlTcGlubmVyKGFjdHVhbENvbW1hbmQsIC0xKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZC5raW5kID09PSBTcGlubmVyQ29tbWFuZHMuY2xvc2UpIHtcbiAgICAgIGNvbnN0IGFjdHVhbENvbW1hbmQgPSBjb21tYW5kIGFzIERlbGV0ZVNwaW5uZXJDb21tYW5kO1xuICAgICAgaWYgKGFjdHVhbENvbW1hbmQuaWQpIHtcbiAgICAgICAgdGhpcy5fZGlzbWlzc0J5UmVxdWVzdElkKGFjdHVhbENvbW1hbmQuaWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgZGlzcGxheSByZXF1ZXN0LiBEaXNwbGF5IHRoYXQgb25lLlxuICAgICAgY29uc3Qge2NvbnRleHQsIGluZGV4OiBsYXRlc3RJbmRleH0gPSB0aGlzLl9nZXRMYXRlc3RDb250ZXh0KCk7XG4gICAgICBpZiAoY29udGV4dCAmJiBsYXRlc3RJbmRleCA+IC0xKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlTcGlubmVyKGNvbnRleHQuY29tbWFuZCwgbGF0ZXN0SW5kZXgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQua2luZCA9PT0gU3Bpbm5lckNvbW1hbmRzLnB1cmdlKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuX19jb250ZXh0cy5sZW5ndGgpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Rpc21pc3NCeVJlcXVlc3RJZCh0aGlzLl9fY29udGV4dHNbMF0uY29tbWFuZD8uaWQsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9kaXNwbGF5U3Bpbm5lcihkaXNwbGF5U3Bpbm5lclJlcXVlc3Q6IERpc3BsYXlTcGlubmVyQ29tbWFuZCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuXG4gICAgaWYgKCFkaXNwbGF5U3Bpbm5lclJlcXVlc3QgfHwgIXRoaXMuX3ZpZXdDb250YWluZXJSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kQ29udGV4dDogU3Bpbm5lckNvbW1hbmRDb250ZXh0ID0ge1xuICAgICAgY29tbWFuZDogZGlzcGxheVNwaW5uZXJSZXF1ZXN0LFxuICAgICAgY29tcG9uZW50UmVmOiBudWxsXG4gICAgfTtcblxuICAgIGlmICghKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9fY29udGV4dHMubGVuZ3RoKSkge1xuICAgICAgdGhpcy5fX2NvbnRleHRzW2luZGV4XS5jb21wb25lbnRSZWY/LmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZEluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogU1BJTk5FUl9NRVRIT0RfSU5WT0tFX0NBTExCQUNLLFxuICAgICAgICAgIHVzZVZhbHVlOiBkaXNwbGF5U3Bpbm5lclJlcXVlc3Qub3B0aW9ucz8uaW52b2tlZE1ldGhvZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogU1BJTk5FUl9SRVFVRVNUX0lELFxuICAgICAgICAgIHVzZVZhbHVlOiBkaXNwbGF5U3Bpbm5lclJlcXVlc3QuaWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IERJU1BMQVlfU1BJTk5FUl9PUFRJT05TLFxuICAgICAgICAgIHVzZVZhbHVlOiBkaXNwbGF5U3Bpbm5lclJlcXVlc3Qub3B0aW9uc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogU1BJTk5FUl9IT1NULFxuICAgICAgICAgIHVzZVZhbHVlOiBkaXNwbGF5U3Bpbm5lclJlcXVlc3QuY29udGFpbmVySWRcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIHBhcmVudDogdGhpcy5fX2luamVjdG9yXG4gICAgfSk7XG5cbiAgICBpZiAoIWRpc3BsYXlTcGlubmVyUmVxdWVzdC5vcHRpb25zIHx8ICFkaXNwbGF5U3Bpbm5lclJlcXVlc3Qub3B0aW9ucy5pbnN0YW5jZVR5cGUpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KEJhc2ljU3Bpbm5lckNvbXBvbmVudCwge1xuICAgICAgICBpbmplY3RvcjogY2hpbGRJbmplY3RvclxuICAgICAgfSk7XG4gICAgICBjb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICBjb21tYW5kQ29udGV4dC5jb21wb25lbnRSZWYgPSBjb21wb25lbnRSZWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGRpc3BsYXlTcGlubmVyUmVxdWVzdC5vcHRpb25zLmluc3RhbmNlVHlwZSwge1xuICAgICAgICBpbmplY3RvcjogY2hpbGRJbmplY3RvclxuICAgICAgfSk7XG4gICAgICBjb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICBjb21tYW5kQ29udGV4dC5jb21wb25lbnRSZWYgPSBjb21wb25lbnRSZWY7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9fY29udGV4dHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9fY29udGV4dHMucHVzaChjb21tYW5kQ29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX19jb250ZXh0c1tpbmRleF0gPSBjb21tYW5kQ29udGV4dDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX2Rpc21pc3NCeVJlcXVlc3RJZChyZXF1ZXN0SWQ6IHN0cmluZywgZm9yY2U/OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9fY29udGV4dHMuZmluZEluZGV4KHggPT4geC5jb21tYW5kPy5pZCA9PT0gcmVxdWVzdElkKTtcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX19jb250ZXh0c1tpbmRleF07XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZCA9IGNvbnRleHQuY29tbWFuZDtcbiAgICBpZiAoIWNvbW1hbmQgfHwgY29tbWFuZC5raW5kICE9PSBTcGlubmVyQ29tbWFuZHMuZGlzcGxheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNwaW5uZXIgY2Fubm90IGJlIGNsb3NlZC5cbiAgICBjb25zdCBjbG9zaW5nSGFuZGxlciA9IGNvbW1hbmQ/Lm9wdGlvbnM/LmNsb3Npbmc7XG4gICAgaWYgKCFmb3JjZSAmJiBjbG9zaW5nSGFuZGxlciAmJiAhY2xvc2luZ0hhbmRsZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnRleHQuY29tcG9uZW50UmVmPy5kZXN0cm95KCk7XG4gICAgY29udGV4dC5jb21wb25lbnRSZWYgPSBudWxsO1xuICAgIGNvbW1hbmQ/Lm9wdGlvbnM/LmNsb3NlZD8uKGZvcmNlIHx8IGZhbHNlKTtcbiAgICB0aGlzLl9fY29udGV4dHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZ2V0TGF0ZXN0Q29udGV4dCgpOiB7IGNvbnRleHQ6IFNwaW5uZXJDb21tYW5kQ29udGV4dCB8IG51bGwsIGluZGV4OiBudW1iZXIgfSB7XG4gICAgaWYgKHRoaXMuX19jb250ZXh0cy5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm4ge2NvbnRleHQ6IG51bGwsIGluZGV4OiAtMX07XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdEluZGV4ID0gdGhpcy5fX2NvbnRleHRzLmxlbmd0aCAtIDE7XG4gICAgcmV0dXJuIHtjb250ZXh0OiB0aGlzLl9fY29udGV4dHNbbGFzdEluZGV4XSwgaW5kZXg6IGxhc3RJbmRleH07XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxufVxuIl19