UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

189 lines 31.7 kB
import { Inject, Injectable, Optional } from '@angular/core'; import { TaskHandlingService } from './task-handling-service'; import { NAE_TASK_OPERATIONS } from '../models/task-operations-injection-token'; import { createTaskEventNotification } from '../../task-content/model/task-event-notification'; import { TaskEvent } from '../../task-content/model/task-event'; import { take } from 'rxjs/operators'; import { QueuedEvent } from '../../event-queue/model/queued-event'; import { AfterAction } from '../../utility/call-chain/after-action'; import * as i0 from "@angular/core"; import * as i1 from "../../logger/services/logger.service"; import * as i2 from "../../resources/engine-endpoint/task-resource.service"; import * as i3 from "../../snack-bar/services/snack-bar.service"; import * as i4 from "@ngx-translate/core"; import * as i5 from "./task-request-state.service"; import * as i6 from "../../task-content/services/task-event.service"; import * as i7 from "./task-data.service"; import * as i8 from "../../event-queue/services/event-queue.service"; import * as i9 from "../../event/services/event.service"; import * as i10 from "../../changed-fields/services/changed-fields.service"; import * as i11 from "../../actions/services/front-action.service"; import * as i12 from "./selected-case.service"; import * as i13 from "../../view/task-view/service/task-view.service"; import * as i14 from "../../task-content/services/task-content.service"; /** * Service that handles the logic of assigning a task. */ export class AssignTaskService extends TaskHandlingService { _log; _taskResourceService; _snackBar; _translate; _taskState; _taskEvent; _taskDataService; _eventQueue; _eventService; _changedFieldsService; _frontActionService; _taskOperations; _taskViewService; constructor(_log, _taskResourceService, _snackBar, _translate, _taskState, _taskEvent, _taskDataService, _eventQueue, _eventService, _changedFieldsService, _frontActionService, _taskOperations, _selectedCaseService, _taskViewService, _taskContentService) { super(_taskContentService, _selectedCaseService); this._log = _log; this._taskResourceService = _taskResourceService; this._snackBar = _snackBar; this._translate = _translate; this._taskState = _taskState; this._taskEvent = _taskEvent; this._taskDataService = _taskDataService; this._eventQueue = _eventQueue; this._eventService = _eventService; this._changedFieldsService = _changedFieldsService; this._frontActionService = _frontActionService; this._taskOperations = _taskOperations; this._taskViewService = _taskViewService; } /** * Performs the 'assign' operation on the task held by {@link TaskContentService}. * * Doesn't send any requests if the loading indicator is in it's active state. * Otherwise sets the indicator to the active state and disables it once the request response is received. * * The argument can be used to chain operations together, * or to execute code conditionally based on the success state of the assign operation. * * If the task held within the {@link TaskContentService} changes before a response is received, the response will be ignored * and the `afterAction` will not be executed. * @param afterAction if assign completes successfully `true` will be emitted into this Subject, otherwise `false` will be emitted */ assign(afterAction = new AfterAction()) { this._eventQueue.scheduleEvent(new QueuedEvent(() => { return !this._safeTask.userId; }, nextEvent => { this.performAssignRequest(afterAction, nextEvent, this._taskViewService !== null && !this._taskViewService.allowMultiOpen); }, nextEvent => { this.completeSuccess(afterAction, nextEvent); })); } /** * Performs an `assign` request on the task currently stored in the `taskContent` service * @param afterAction the action that should be performed after the request is processed * @param nextEvent indicates to the event queue that the next event can be processed * @param forceReload whether a force reload of the task data should be performed after assign. * If set to `false` a regular reload is performed instead. */ performAssignRequest(afterAction, nextEvent, forceReload) { const assignedTaskId = this._safeTask.stringId; // this is probably no longer necessary because of the event queue if (this._taskState.isLoading(assignedTaskId)) { nextEvent.resolve(true); return; } this._taskState.startLoading(assignedTaskId); this.assignRequest(afterAction, assignedTaskId, nextEvent, forceReload); } /** * Calls the endpoint and processes the possible responses. * @param afterAction the action that should be performed after the request is processed * @param assignedTaskId the id of the task that is being assigned * @param nextEvent indicates to the event queue that the next event can be processed * @param forceReload whether a force reload of the task data should be performed after assign. * If set to `false` a regular reload is performed instead. */ assignRequest(afterAction = new AfterAction(), assignedTaskId, nextEvent = new AfterAction(), forceReload) { this._taskResourceService.assignTask(this._safeTask.stringId).pipe(take(1)) .subscribe((outcomeResource) => { this._taskState.stopLoading(assignedTaskId); if (!this.isTaskRelevant(assignedTaskId)) { this._log.debug('current task changed before the assign response could be received, discarding...'); nextEvent.resolve(false); return; } if (outcomeResource.success) { this._taskContentService.updateStateData(outcomeResource.outcome); const changedFieldsMap = this._eventService .parseChangedFieldsFromOutcomeTree(outcomeResource.outcome); const frontActions = this._eventService.parseFrontActionsFromOutcomeTree(outcomeResource.outcome); if (!!changedFieldsMap) { this._changedFieldsService.emitChangedFields(changedFieldsMap); } if (frontActions?.length > 0) { this._frontActionService.runAll(frontActions); } forceReload ? this._taskOperations.forceReload() : this._taskOperations.reload(); this.completeActions(afterAction, nextEvent, true, outcomeResource.outcome); this._snackBar.openSuccessSnackBar(!!outcomeResource.outcome.message ? outcomeResource.outcome.message : this._translate.instant('tasks.snackbar.assignTaskSuccess')); } else if (outcomeResource.error) { if (outcomeResource.error !== '') { this._snackBar.openErrorSnackBar(outcomeResource.error); } if (outcomeResource.outcome !== undefined) { const changedFieldsMap = this._eventService.parseChangedFieldsFromOutcomeTree(outcomeResource.outcome); this._changedFieldsService.emitChangedFields(changedFieldsMap); } this.completeActions(afterAction, nextEvent, false); } }, error => { this._taskState.stopLoading(assignedTaskId); this._log.debug('assigning task failed', error); if (!this.isTaskRelevant(assignedTaskId)) { this._log.debug('current task changed before the assign error could be received'); nextEvent.resolve(false); return; } this._snackBar.openErrorSnackBar(`${this._translate.instant('tasks.snackbar.assignTask')} ${this._taskContentService.task} ${this._translate.instant('tasks.snackbar.failed')}`); this.completeActions(afterAction, nextEvent, false); }); } /** * Reloads the task and emits `true` to the `afterAction` stream */ completeSuccess(afterAction, nextEvent) { this._taskOperations.reload(); this.completeActions(afterAction, nextEvent, true); } /** * complete all action streams and send notification with selected boolean */ completeActions(afterAction, nextEvent, bool, outcome) { this.sendNotification(bool, outcome); afterAction.resolve(bool); nextEvent.resolve(bool); } /** * Publishes an assign notification to the {@link TaskEventService} * @param success whether the assign operation was successful or not * @param outcome */ sendNotification(success, outcome) { this._taskEvent.publishTaskEvent(createTaskEventNotification(this._safeTask, TaskEvent.ASSIGN, success, outcome)); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AssignTaskService, deps: [{ token: i1.LoggerService }, { token: i2.TaskResourceService }, { token: i3.SnackBarService }, { token: i4.TranslateService }, { token: i5.TaskRequestStateService }, { token: i6.TaskEventService }, { token: i7.TaskDataService }, { token: i8.EventQueueService }, { token: i9.EventService }, { token: i10.ChangedFieldsService }, { token: i11.FrontActionService }, { token: NAE_TASK_OPERATIONS }, { token: i12.SelectedCaseService, optional: true }, { token: i13.TaskViewService, optional: true }, { token: i14.TaskContentService }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AssignTaskService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AssignTaskService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.LoggerService }, { type: i2.TaskResourceService }, { type: i3.SnackBarService }, { type: i4.TranslateService }, { type: i5.TaskRequestStateService }, { type: i6.TaskEventService }, { type: i7.TaskDataService }, { type: i8.EventQueueService }, { type: i9.EventService }, { type: i10.ChangedFieldsService }, { type: i11.FrontActionService }, { type: undefined, decorators: [{ type: Inject, args: [NAE_TASK_OPERATIONS] }] }, { type: i12.SelectedCaseService, decorators: [{ type: Optional }] }, { type: i13.TaskViewService, decorators: [{ type: Optional }] }, { type: i14.TaskContentService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaWduLXRhc2suc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdGFzay9zZXJ2aWNlcy9hc3NpZ24tdGFzay5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQU8zRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUk5RSxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFFOUQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3BDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXbEU7O0dBRUc7QUFFSCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsbUJBQW1CO0lBRWhDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDNkI7SUFFakI7SUFibEMsWUFBc0IsSUFBbUIsRUFDbkIsb0JBQXlDLEVBQ3pDLFNBQTBCLEVBQzFCLFVBQTRCLEVBQzVCLFVBQW1DLEVBQ25DLFVBQTRCLEVBQzVCLGdCQUFpQyxFQUNqQyxXQUE4QixFQUM5QixhQUEyQixFQUMzQixxQkFBMkMsRUFDM0MsbUJBQXVDLEVBQ1YsZUFBK0IsRUFDMUQsb0JBQXlDLEVBQy9CLGdCQUFpQyxFQUN2RCxtQkFBdUM7UUFDL0MsS0FBSyxDQUFDLG1C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Q0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNPLGVBQWUsQ0FBQyxXQUF3QixFQUFFLFNBQXNCLEVBQUUsSUFBYSxFQUFFLE9BQTBCO1FBQ2pILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sZ0JBQWdCLENBQUMsT0FBZ0IsRUFBRSxPQUEwQjtRQUNuRSxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN0SCxDQUFDO3dHQTVKUSxpQkFBaUIsNFhBYU4sbUJBQW1COzRHQWI5QixpQkFBaUI7OzRGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVU7OzBCQWNNLE1BQU07MkJBQUMsbUJBQW1COzswQkFDMUIsUUFBUTs7MEJBQ1IsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tDb250ZW50U2VydmljZX0gZnJvbSAnLi4vLi4vdGFzay1jb250ZW50L3NlcnZpY2VzL3Rhc2stY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7VGFza1Jlc291cmNlU2VydmljZX0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2VuZ2luZS1lbmRwb2ludC90YXNrLXJlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtTbmFja0JhclNlcnZpY2V9IGZyb20gJy4uLy4uL3NuYWNrLWJhci9zZXJ2aWNlcy9zbmFjay1iYXIuc2VydmljZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtUYXNrUmVxdWVzdFN0YXRlU2VydmljZX0gZnJvbSAnLi90YXNrLXJlcXVlc3Qtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tIYW5kbGluZ1NlcnZpY2V9IGZyb20gJy4vdGFzay1oYW5kbGluZy1zZXJ2aWNlJztcbmltcG9ydCB7TkFFX1RBU0tfT1BFUkFUSU9OU30gZnJvbSAnLi4vbW9kZWxzL3Rhc2stb3BlcmF0aW9ucy1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHtUYXNrT3BlcmF0aW9uc30gZnJvbSAnLi4vaW50ZXJmYWNlcy90YXNrLW9wZXJhdGlvbnMnO1xuaW1wb3J0IHtTZWxlY3RlZENhc2VTZXJ2aWNlfSBmcm9tICcuL3NlbGVjdGVkLWNhc2Uuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tFdmVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy90YXNrLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtjcmVhdGVUYXNrRXZlbnROb3RpZmljYXRpb259IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9tb2RlbC90YXNrLWV2ZW50LW5vdGlmaWNhdGlvbic7XG5pbXBvcnQge1Rhc2tFdmVudH0gZnJvbSAnLi4vLi4vdGFzay1jb250ZW50L21vZGVsL3Rhc2stZXZlbnQnO1xuaW1wb3J0IHtUYXNrRGF0YVNlcnZpY2V9IGZyb20gJy4vdGFzay1kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHt0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1Rhc2tWaWV3U2VydmljZX0gZnJvbSAnLi4vLi4vdmlldy90YXNrLXZpZXcvc2VydmljZS90YXNrLXZpZXcuc2VydmljZSc7XG5pbXBvcnQge0V2ZW50UXVldWVTZXJ2aWNlfSBmcm9tICcuLi8uLi9ldmVudC1xdWV1ZS9zZXJ2aWNlcy9ldmVudC1xdWV1ZS5zZXJ2aWNlJztcbmltcG9ydCB7UXVldWVkRXZlbnR9IGZyb20gJy4uLy4uL2V2ZW50LXF1ZXVlL21vZGVsL3F1ZXVlZC1ldmVudCc7XG5pbXBvcnQge0FmdGVyQWN0aW9ufSBmcm9tICcuLi8uLi91dGlsaXR5L2NhbGwtY2hhaW4vYWZ0ZXItYWN0aW9uJztcbmltcG9ydCB7QXNzaWduVGFza0V2ZW50T3V0Y29tZX0gZnJvbSAnLi4vLi4vZXZlbnQvbW9kZWwvZXZlbnQtb3V0Y29tZXMvdGFzay1vdXRjb21lcy9hc3NpZ24tdGFzay1ldmVudC1vdXRjb21lJztcbmltcG9ydCB7RXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL21lc3NhZ2UtcmVzb3VyY2UnO1xuaW1wb3J0IHtDaGFuZ2VkRmllbGRzU2VydmljZX0gZnJvbSAnLi4vLi4vY2hhbmdlZC1maWVsZHMvc2VydmljZXMvY2hhbmdlZC1maWVsZHMuc2VydmljZSc7XG5pbXBvcnQge0V2ZW50U2VydmljZX0gZnJvbSAnLi4vLi4vZXZlbnQvc2VydmljZXMvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQge0NoYW5nZWRGaWVsZHNNYXB9IGZyb20gJy4uLy4uL2V2ZW50L3NlcnZpY2VzL2ludGVyZmFjZXMvY2hhbmdlZC1maWVsZHMtbWFwJztcbmltcG9ydCB7VGFza0V2ZW50T3V0Y29tZX0gZnJvbSAnLi4vLi4vZXZlbnQvbW9kZWwvZXZlbnQtb3V0Y29tZXMvdGFzay1vdXRjb21lcy90YXNrLWV2ZW50LW91dGNvbWUnO1xuaW1wb3J0IHtGcm9udEFjdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uL2FjdGlvbnMvc2VydmljZXMvZnJvbnQtYWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtGcm9udEFjdGlvbn0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvbW9kZWxzL2NoYW5nZWQtZmllbGRzJztcblxuXG4vKipcbiAqIFNlcnZpY2UgdGhhdCBoYW5kbGVzIHRoZSBsb2dpYyBvZiBhc3NpZ25pbmcgYSB0YXNrLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXNzaWduVGFza1NlcnZpY2UgZXh0ZW5kcyBUYXNrSGFuZGxpbmdTZXJ2aWNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfbG9nOiBMb2dnZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdGFza1Jlc291cmNlU2VydmljZTogVGFza1Jlc291cmNlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3NuYWNrQmFyOiBTbmFja0JhclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90YXNrU3RhdGU6IFRhc2tSZXF1ZXN0U3RhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdGFza0V2ZW50OiBUYXNrRXZlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdGFza0RhdGFTZXJ2aWNlOiBUYXNrRGF0YVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9ldmVudFF1ZXVlOiBFdmVudFF1ZXVlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2V2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfY2hhbmdlZEZpZWxkc1NlcnZpY2U6IENoYW5nZWRGaWVsZHNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfZnJvbnRBY3Rpb25TZXJ2aWNlOiBGcm9udEFjdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQEluamVjdChOQUVfVEFTS19PUEVSQVRJT05TKSBwcm90ZWN0ZWQgX3Rhc2tPcGVyYXRpb25zOiBUYXNrT3BlcmF0aW9ucyxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBfc2VsZWN0ZWRDYXNlU2VydmljZTogU2VsZWN0ZWRDYXNlU2VydmljZSxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgX3Rhc2tWaWV3U2VydmljZTogVGFza1ZpZXdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIF90YXNrQ29udGVudFNlcnZpY2U6IFRhc2tDb250ZW50U2VydmljZSkge1xuICAgICAgICBzdXBlcihfdGFza0NvbnRlbnRTZXJ2aWNlLCBfc2VsZWN0ZWRDYXNlU2VydmljZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlICdhc3NpZ24nIG9wZXJhdGlvbiBvbiB0aGUgdGFzayBoZWxkIGJ5IHtAbGluayBUYXNrQ29udGVudFNlcnZpY2V9LlxuICAgICAqXG4gICAgICogRG9lc24ndCBzZW5kIGFueSByZXF1ZXN0cyBpZiB0aGUgbG9hZGluZyBpbmRpY2F0b3IgaXMgaW4gaXQncyBhY3RpdmUgc3RhdGUuXG4gICAgICogT3RoZXJ3aXNlIHNldHMgdGhlIGluZGljYXRvciB0byB0aGUgYWN0aXZlIHN0YXRlIGFuZCBkaXNhYmxlcyBpdCBvbmNlIHRoZSByZXF1ZXN0IHJlc3BvbnNlIGlzIHJlY2VpdmVkLlxuICAgICAqXG4gICAgICogVGhlIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIGNoYWluIG9wZXJhdGlvbnMgdG9nZXRoZXIsXG4gICAgICogb3IgdG8gZXhlY3V0ZSBjb2RlIGNvbmRpdGlvbmFsbHkgYmFzZWQgb24gdGhlIHN1Y2Nlc3Mgc3RhdGUgb2YgdGhlIGFzc2lnbiBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBJZiB0aGUgdGFzayBoZWxkIHdpdGhpbiB0aGUge0BsaW5rIFRhc2tDb250ZW50U2VydmljZX0gY2hhbmdlcyBiZWZvcmUgYSByZXNwb25zZSBpcyByZWNlaXZlZCwgdGhlIHJlc3BvbnNlIHdpbGwgYmUgaWdub3JlZFxuICAgICAqIGFuZCB0aGUgYGFmdGVyQWN0aW9uYCB3aWxsIG5vdCBiZSBleGVjdXRlZC5cbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gaWYgYXNzaWduIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgYHRydWVgIHdpbGwgYmUgZW1pdHRlZCBpbnRvIHRoaXMgU3ViamVjdCwgb3RoZXJ3aXNlIGBmYWxzZWAgd2lsbCBiZSBlbWl0dGVkXG4gICAgICovXG4gICAgcHVibGljIGFzc2lnbihhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24gPSBuZXcgQWZ0ZXJBY3Rpb24oKSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9ldmVudFF1ZXVlLnNjaGVkdWxlRXZlbnQobmV3IFF1ZXVlZEV2ZW50KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5fc2FmZVRhc2sudXNlcklkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRFdmVudCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtQXNzaWduUmVxdWVzdChhZnRlckFjdGlvbiwgbmV4dEV2ZW50LCB0aGlzLl90YXNrVmlld1NlcnZpY2UgIT09IG51bGwgJiYgIXRoaXMuX3Rhc2tWaWV3U2VydmljZS5hbGxvd011bHRpT3Blbik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dEV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlU3VjY2VzcyhhZnRlckFjdGlvbiwgbmV4dEV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYW4gYGFzc2lnbmAgcmVxdWVzdCBvbiB0aGUgdGFzayBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBgdGFza0NvbnRlbnRgIHNlcnZpY2VcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIG5leHRFdmVudCBpbmRpY2F0ZXMgdG8gdGhlIGV2ZW50IHF1ZXVlIHRoYXQgdGhlIG5leHQgZXZlbnQgY2FuIGJlIHByb2Nlc3NlZFxuICAgICAqIEBwYXJhbSBmb3JjZVJlbG9hZCB3aGV0aGVyIGEgZm9yY2UgcmVsb2FkIG9mIHRoZSB0YXNrIGRhdGEgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciBhc3NpZ24uXG4gICAgICogSWYgc2V0IHRvIGBmYWxzZWAgYSByZWd1bGFyIHJlbG9hZCBpcyBwZXJmb3JtZWQgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcGVyZm9ybUFzc2lnblJlcXVlc3QoYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLCBuZXh0RXZlbnQ6IEFmdGVyQWN0aW9uLCBmb3JjZVJlbG9hZDogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBhc3NpZ25lZFRhc2tJZCA9IHRoaXMuX3NhZmVUYXNrLnN0cmluZ0lkO1xuXG4gICAgICAgIC8vIHRoaXMgaXMgcHJvYmFibHkgbm8gbG9uZ2VyIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHRoZSBldmVudCBxdWV1ZVxuICAgICAgICBpZiAodGhpcy5fdGFza1N0YXRlLmlzTG9hZGluZyhhc3NpZ25lZFRhc2tJZCkpIHtcbiAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0YXJ0TG9hZGluZyhhc3NpZ25lZFRhc2tJZCk7XG4gICAgICAgIHRoaXMuYXNzaWduUmVxdWVzdChhZnRlckFjdGlvbiwgYXNzaWduZWRUYXNrSWQsIG5leHRFdmVudCwgZm9yY2VSZWxvYWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIHRoZSBlbmRwb2ludCBhbmQgcHJvY2Vzc2VzIHRoZSBwb3NzaWJsZSByZXNwb25zZXMuXG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIHRoZSByZXF1ZXN0IGlzIHByb2Nlc3NlZFxuICAgICAqIEBwYXJhbSBhc3NpZ25lZFRhc2tJZCB0aGUgaWQgb2YgdGhlIHRhc2sgdGhhdCBpcyBiZWluZyBhc3NpZ25lZFxuICAgICAqIEBwYXJhbSBuZXh0RXZlbnQgaW5kaWNhdGVzIHRvIHRoZSBldmVudCBxdWV1ZSB0aGF0IHRoZSBuZXh0IGV2ZW50IGNhbiBiZSBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gZm9yY2VSZWxvYWQgd2hldGhlciBhIGZvcmNlIHJlbG9hZCBvZiB0aGUgdGFzayBkYXRhIHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgYXNzaWduLlxuICAgICAqIElmIHNldCB0byBgZmFsc2VgIGEgcmVndWxhciByZWxvYWQgaXMgcGVyZm9ybWVkIGluc3RlYWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzc2lnblJlcXVlc3QoYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uID0gbmV3IEFmdGVyQWN0aW9uKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduZWRUYXNrSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RXZlbnQ6IEFmdGVyQWN0aW9uID0gbmV3IEFmdGVyQWN0aW9uKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VSZWxvYWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fdGFza1Jlc291cmNlU2VydmljZS5hc3NpZ25UYXNrKHRoaXMuX3NhZmVUYXNrLnN0cmluZ0lkKS5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChvdXRjb21lUmVzb3VyY2U6IEV2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdG9wTG9hZGluZyhhc3NpZ25lZFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVGFza1JlbGV2YW50KGFzc2lnbmVkVGFza0lkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ2N1cnJlbnQgdGFzayBjaGFuZ2VkIGJlZm9yZSB0aGUgYXNzaWduIHJlc3BvbnNlIGNvdWxkIGJlIHJlY2VpdmVkLCBkaXNjYXJkaW5nLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvdXRjb21lUmVzb3VyY2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudXBkYXRlU3RhdGVEYXRhKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lIGFzIEFzc2lnblRhc2tFdmVudE91dGNvbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VkRmllbGRzTWFwOiBDaGFuZ2VkRmllbGRzTWFwID0gdGhpcy5fZXZlbnRTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAucGFyc2VDaGFuZ2VkRmllbGRzRnJvbU91dGNvbWVUcmVlKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnRBY3Rpb25zOiBBcnJheTxGcm9udEFjdGlvbj4gPSB0aGlzLl9ldmVudFNlcnZpY2UucGFyc2VGcm9udEFjdGlvbnNGcm9tT3V0Y29tZVRyZWUob3V0Y29tZVJlc291cmNlLm91dGNvbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghIWNoYW5nZWRGaWVsZHNNYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRGaWVsZHNTZXJ2aWNlLmVtaXRDaGFuZ2VkRmllbGRzKGNoYW5nZWRGaWVsZHNNYXApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9udEFjdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Zyb250QWN0aW9uU2VydmljZS5ydW5BbGwoZnJvbnRBY3Rpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZvcmNlUmVsb2FkID8gdGhpcy5fdGFza09wZXJhdGlvbnMuZm9yY2VSZWxvYWQoKSA6IHRoaXMuX3Rhc2tPcGVyYXRpb25zLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlQWN0aW9ucyhhZnRlckFjdGlvbiwgbmV4dEV2ZW50LCB0cnVlLCBvdXRjb21lUmVzb3VyY2Uub3V0Y29tZSBhcyBBc3NpZ25UYXNrRXZlbnRPdXRjb21lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlblN1Y2Nlc3NTbmFja0JhcighIW91dGNvbWVSZXNvdXJjZS5vdXRjb21lLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgID8gb3V0Y29tZVJlc291cmNlLm91dGNvbWUubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIuYXNzaWduVGFza1N1Y2Nlc3MnKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRjb21lUmVzb3VyY2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG91dGNvbWVSZXNvdXJjZS5lcnJvciAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW5FcnJvclNuYWNrQmFyKG91dGNvbWVSZXNvdXJjZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRGaWVsZHNNYXAgPSB0aGlzLl9ldmVudFNlcnZpY2UucGFyc2VDaGFuZ2VkRmllbGRzRnJvbU91dGNvbWVUcmVlKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRGaWVsZHNTZXJ2aWNlLmVtaXRDaGFuZ2VkRmllbGRzKGNoYW5nZWRGaWVsZHNNYXApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVBY3Rpb25zKGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKGFzc2lnbmVkVGFza0lkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ2Fzc2lnbmluZyB0YXNrIGZhaWxlZCcsIGVycm9yKTtcblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1Rhc2tSZWxldmFudChhc3NpZ25lZFRhc2tJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdjdXJyZW50IHRhc2sgY2hhbmdlZCBiZWZvcmUgdGhlIGFzc2lnbiBlcnJvciBjb3VsZCBiZSByZWNlaXZlZCcpO1xuICAgICAgICAgICAgICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuRXJyb3JTbmFja0JhcihgJHt0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIuYXNzaWduVGFzaycpfVxuICAgICAgICAgICAgICR7dGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2t9ICR7dGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLmZhaWxlZCcpfWApO1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVBY3Rpb25zKGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQsIGZhbHNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbG9hZHMgdGhlIHRhc2sgYW5kIGVtaXRzIGB0cnVlYCB0byB0aGUgYGFmdGVyQWN0aW9uYCBzdHJlYW1cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29tcGxldGVTdWNjZXNzKGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiwgbmV4dEV2ZW50OiBBZnRlckFjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLl90YXNrT3BlcmF0aW9ucy5yZWxvYWQoKTtcbiAgICAgICAgdGhpcy5jb21wbGV0ZUFjdGlvbnMoYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29tcGxldGUgYWxsIGFjdGlvbiBzdHJlYW1zIGFuZCBzZW5kIG5vdGlmaWNhdGlvbiB3aXRoIHNlbGVjdGVkIGJvb2xlYW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29tcGxldGVBY3Rpb25zKGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiwgbmV4dEV2ZW50OiBBZnRlckFjdGlvbiwgYm9vbDogYm9vbGVhbiwgb3V0Y29tZT86IFRhc2tFdmVudE91dGNvbWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZW5kTm90aWZpY2F0aW9uKGJvb2wsIG91dGNvbWUpO1xuICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKGJvb2wpO1xuICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZShib29sKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQdWJsaXNoZXMgYW4gYXNzaWduIG5vdGlmaWNhdGlvbiB0byB0aGUge0BsaW5rIFRhc2tFdmVudFNlcnZpY2V9XG4gICAgICogQHBhcmFtIHN1Y2Nlc3Mgd2hldGhlciB0aGUgYXNzaWduIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBvciBub3RcbiAgICAgKiBAcGFyYW0gb3V0Y29tZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzZW5kTm90aWZpY2F0aW9uKHN1Y2Nlc3M6IGJvb2xlYW4sIG91dGNvbWU/OiBUYXNrRXZlbnRPdXRjb21lKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Rhc2tFdmVudC5wdWJsaXNoVGFza0V2ZW50KGNyZWF0ZVRhc2tFdmVudE5vdGlmaWNhdGlvbih0aGlzLl9zYWZlVGFzaywgVGFza0V2ZW50LkFTU0lHTiwgc3VjY2Vzcywgb3V0Y29tZSkpO1xuICAgIH1cbn1cbiJdfQ==