@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
184 lines • 31.1 kB
JavaScript
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 "../../task-content/services/task-event.service";
import * as i3 from "../../resources/engine-endpoint/task-resource.service";
import * as i4 from "@ngx-translate/core";
import * as i5 from "../../snack-bar/services/snack-bar.service";
import * as i6 from "./task-request-state.service";
import * as i7 from "../../user/services/user-comparator.service";
import * as i8 from "./task-data.service";
import * as i9 from "../../event-queue/services/event-queue.service";
import * as i10 from "../../event/services/event.service";
import * as i11 from "../../changed-fields/services/changed-fields.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";
import * as i15 from "../../authorization/permission/permission.service";
import * as i16 from "../../actions/services/front-action.service";
/**
* Service that handles the logic of canceling a task.
*/
export class CancelTaskService extends TaskHandlingService {
_log;
_taskEventService;
_taskResourceService;
_translate;
_snackBar;
_taskState;
_userComparator;
_taskEvent;
_taskDataService;
_eventQueue;
_eventService;
_changedFieldsService;
_taskOperations;
_taskViewService;
permissionService;
_frontActionService;
constructor(_log, _taskEventService, _taskResourceService, _translate, _snackBar, _taskState, _userComparator, _taskEvent, _taskDataService, _eventQueue, _eventService, _changedFieldsService, _taskOperations, _selectedCaseService, _taskViewService, _taskContentService, permissionService, _frontActionService) {
super(_taskContentService, _selectedCaseService);
this._log = _log;
this._taskEventService = _taskEventService;
this._taskResourceService = _taskResourceService;
this._translate = _translate;
this._snackBar = _snackBar;
this._taskState = _taskState;
this._userComparator = _userComparator;
this._taskEvent = _taskEvent;
this._taskDataService = _taskDataService;
this._eventQueue = _eventQueue;
this._eventService = _eventService;
this._changedFieldsService = _changedFieldsService;
this._taskOperations = _taskOperations;
this._taskViewService = _taskViewService;
this.permissionService = permissionService;
this._frontActionService = _frontActionService;
}
/**
* Performs the 'cancel' 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 cancel 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 cancel completes successfully `true` will be emitted into this Subject, otherwise `false` will be emitted
*/
cancel(afterAction = new AfterAction()) {
this._eventQueue.scheduleEvent(new QueuedEvent(() => this.permissionService.canCancel(this._safeTask), nextEvent => {
this.performCancelRequest(afterAction, nextEvent, this._taskViewService !== null && !this._taskViewService.allowMultiOpen);
}, nextEvent => {
this.completeActions(afterAction, nextEvent, false);
}));
}
/**
* Performs a `cancel` 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 cancel.
* If set to `false` a regular reload is performed instead.
*/
performCancelRequest(afterAction, nextEvent, forceReload) {
const canceledTaskId = this._safeTask.stringId;
// this is probably no longer necessary because of the event queue
if (this._taskState.isLoading(canceledTaskId)) {
nextEvent.resolve(true);
return;
}
this._taskState.startLoading(canceledTaskId);
this.cancelRequest(afterAction, canceledTaskId, nextEvent, forceReload);
}
/**
* Calls the endpoint and processes the possible responses.
* @param afterAction the action that should be performed after the request is processed
* @param canceledTaskId the id of the task that is being canceled
* @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 cancel.
* If set to `false` a regular reload is performed instead.
*/
cancelRequest(afterAction = new AfterAction(), canceledTaskId, nextEvent = new AfterAction(), forceReload) {
this._taskResourceService.cancelTask(this._safeTask.stringId).pipe(take(1)).subscribe((outcomeResource) => {
this._taskState.stopLoading(canceledTaskId);
if (!this.isTaskRelevant(canceledTaskId)) {
this._log.debug('current task changed before the cancel 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);
}
else if (outcomeResource.error !== undefined) {
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(canceledTaskId);
this._log.debug('canceling task failed', error);
if (!this.isTaskRelevant(canceledTaskId)) {
this._log.debug('current task changed before the cancel error could be received');
nextEvent.resolve(false);
return;
}
this._snackBar.openErrorSnackBar(`${this._translate.instant('tasks.snackbar.cancelTask')}
${this._task} ${this._translate.instant('tasks.snackbar.failed')}`);
this.completeActions(afterAction, nextEvent, false);
});
}
/**
* 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 a cancel notification to the {@link TaskEventService}
* @param success whether the cancel operation was successful or not
* @param outcome
*/
sendNotification(success, outcome) {
this._taskEvent.publishTaskEvent(createTaskEventNotification(this._safeTask, TaskEvent.CANCEL, success, outcome));
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CancelTaskService, deps: [{ token: i1.LoggerService }, { token: i2.TaskEventService }, { token: i3.TaskResourceService }, { token: i4.TranslateService }, { token: i5.SnackBarService }, { token: i6.TaskRequestStateService }, { token: i7.UserComparatorService }, { token: i2.TaskEventService }, { token: i8.TaskDataService }, { token: i9.EventQueueService }, { token: i10.EventService }, { token: i11.ChangedFieldsService }, { token: NAE_TASK_OPERATIONS }, { token: i12.SelectedCaseService, optional: true }, { token: i13.TaskViewService, optional: true }, { token: i14.TaskContentService }, { token: i15.PermissionService }, { token: i16.FrontActionService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CancelTaskService });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CancelTaskService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.LoggerService }, { type: i2.TaskEventService }, { type: i3.TaskResourceService }, { type: i4.TranslateService }, { type: i5.SnackBarService }, { type: i6.TaskRequestStateService }, { type: i7.UserComparatorService }, { type: i2.TaskEventService }, { type: i8.TaskDataService }, { type: i9.EventQueueService }, { type: i10.EventService }, { type: i11.ChangedFieldsService }, { type: undefined, decorators: [{
type: Inject,
args: [NAE_TASK_OPERATIONS]
}] }, { type: i12.SelectedCaseService, decorators: [{
type: Optional
}] }, { type: i13.TaskViewService, decorators: [{
type: Optional
}] }, { type: i14.TaskContentService }, { type: i15.PermissionService }, { type: i16.FrontActionService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsLXRhc2suc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdGFzay9zZXJ2aWNlcy9jYW5jZWwtdGFzay5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQVEzRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUk5RSxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFFOUQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBS3BDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFsRTs7R0FFRztBQUVILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxtQkFBbUI7SUFFaEM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQzZCO0lBRWpCO0lBRVo7SUFDQTtJQWpCdEIsWUFBc0IsSUFBbUIsRUFDbkIsaUJBQW1DLEVBQ25DLG9CQUF5QyxFQUN6QyxVQUE0QixFQUM1QixTQUEwQixFQUMxQixVQUFtQyxFQUNuQyxlQUFzQyxFQUN0QyxVQUE0QixFQUM1QixnQkFBaUMsRUFDakMsV0FBOEIsRUFDOUIsYUFBMkIsRUFDM0IscUJBQTJDLEVBQ2QsZUFBK0IsRUFDMUQsb0JBQXlDLEVBQy9CLGdCQUFpQyxF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QyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGdCQUFnQixDQUFDLE9BQWdCLEVBQUUsT0FBMEI7UUFDbkUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDdEgsQ0FBQzt3R0FuSlEsaUJBQWlCLCtaQWNOLG1CQUFtQjs0R0FkOUIsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVOzswQkFlTSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLFFBQVE7OzBCQUNSLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrQ29udGVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy90YXNrLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tFdmVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy90YXNrLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrUmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L3Rhc2stcmVzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtTbmFja0JhclNlcnZpY2V9IGZyb20gJy4uLy4uL3NuYWNrLWJhci9zZXJ2aWNlcy9zbmFjay1iYXIuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tSZXF1ZXN0U3RhdGVTZXJ2aWNlfSBmcm9tICcuL3Rhc2stcmVxdWVzdC1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7VGFza0hhbmRsaW5nU2VydmljZX0gZnJvbSAnLi90YXNrLWhhbmRsaW5nLXNlcnZpY2UnO1xuaW1wb3J0IHtOQUVfVEFTS19PUEVSQVRJT05TfSBmcm9tICcuLi9tb2RlbHMvdGFzay1vcGVyYXRpb25zLWluamVjdGlvbi10b2tlbic7XG5pbXBvcnQge1Rhc2tPcGVyYXRpb25zfSBmcm9tICcuLi9pbnRlcmZhY2VzL3Rhc2stb3BlcmF0aW9ucyc7XG5pbXBvcnQge1VzZXJDb21wYXJhdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vdXNlci9zZXJ2aWNlcy91c2VyLWNvbXBhcmF0b3Iuc2VydmljZSc7XG5pbXBvcnQge1NlbGVjdGVkQ2FzZVNlcnZpY2V9IGZyb20gJy4vc2VsZWN0ZWQtY2FzZS5zZXJ2aWNlJztcbmltcG9ydCB7Y3JlYXRlVGFza0V2ZW50Tm90aWZpY2F0aW9ufSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvbW9kZWwvdGFzay1ldmVudC1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHtUYXNrRXZlbnR9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9tb2RlbC90YXNrLWV2ZW50JztcbmltcG9ydCB7VGFza0RhdGFTZXJ2aWNlfSBmcm9tICcuL3Rhc2stZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7dGFrZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtUYXNrVmlld1NlcnZpY2V9IGZyb20gJy4uLy4uL3ZpZXcvdGFzay12aWV3L3NlcnZpY2UvdGFzay12aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHtDYW5jZWxUYXNrRXZlbnRPdXRjb21lfSBmcm9tICcuLi8uLi9ldmVudC9tb2RlbC9ldmVudC1vdXRjb21lcy90YXNrLW91dGNvbWVzL2NhbmNlbC10YXNrLWV2ZW50LW91dGNvbWUnO1xuaW1wb3J0IHtFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvbWVzc2FnZS1yZXNvdXJjZSc7XG5pbXBvcnQge0V2ZW50UXVldWVTZXJ2aWNlfSBmcm9tICcuLi8uLi9ldmVudC1xdWV1ZS9zZXJ2aWNlcy9ldmVudC1xdWV1ZS5zZXJ2aWNlJztcbmltcG9ydCB7UXVldWVkRXZlbnR9IGZyb20gJy4uLy4uL2V2ZW50LXF1ZXVlL21vZGVsL3F1ZXVlZC1ldmVudCc7XG5pbXBvcnQge0FmdGVyQWN0aW9ufSBmcm9tICcuLi8uLi91dGlsaXR5L2NhbGwtY2hhaW4vYWZ0ZXItYWN0aW9uJztcbmltcG9ydCB7UGVybWlzc2lvblNlcnZpY2V9IGZyb20gJy4uLy4uL2F1dGhvcml6YXRpb24vcGVybWlzc2lvbi9wZXJtaXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtDaGFuZ2VkRmllbGRzU2VydmljZX0gZnJvbSAnLi4vLi4vY2hhbmdlZC1maWVsZHMvc2VydmljZXMvY2hhbmdlZC1maWVsZHMuc2VydmljZSc7XG5pbXBvcnQge0V2ZW50U2VydmljZX0gZnJvbSAnLi4vLi4vZXZlbnQvc2VydmljZXMvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQge0NoYW5nZWRGaWVsZHNNYXB9IGZyb20gJy4uLy4uL2V2ZW50L3NlcnZpY2VzL2ludGVyZmFjZXMvY2hhbmdlZC1maWVsZHMtbWFwJztcbmltcG9ydCB7VGFza0V2ZW50T3V0Y29tZX0gZnJvbSAnLi4vLi4vZXZlbnQvbW9kZWwvZXZlbnQtb3V0Y29tZXMvdGFzay1vdXRjb21lcy90YXNrLWV2ZW50LW91dGNvbWUnO1xuaW1wb3J0IHtGcm9udEFjdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uL2FjdGlvbnMvc2VydmljZXMvZnJvbnQtYWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtGcm9udEFjdGlvbn0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvbW9kZWxzL2NoYW5nZWQtZmllbGRzJztcbi8qKlxuICogU2VydmljZSB0aGF0IGhhbmRsZXMgdGhlIGxvZ2ljIG9mIGNhbmNlbGluZyBhIHRhc2suXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDYW5jZWxUYXNrU2VydmljZSBleHRlbmRzIFRhc2tIYW5kbGluZ1NlcnZpY2Uge1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90YXNrRXZlbnRTZXJ2aWNlOiBUYXNrRXZlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdGFza1Jlc291cmNlU2VydmljZTogVGFza1Jlc291cmNlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3NuYWNrQmFyOiBTbmFja0JhclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90YXNrU3RhdGU6IFRhc2tSZXF1ZXN0U3RhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdXNlckNvbXBhcmF0b3I6IFVzZXJDb21wYXJhdG9yU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tFdmVudDogVGFza0V2ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tEYXRhU2VydmljZTogVGFza0RhdGFTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfZXZlbnRRdWV1ZTogRXZlbnRRdWV1ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9ldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2NoYW5nZWRGaWVsZHNTZXJ2aWNlOiBDaGFuZ2VkRmllbGRzU2VydmljZSxcbiAgICAgICAgICAgICAgICBASW5qZWN0KE5BRV9UQVNLX09QRVJBVElPTlMpIHByb3RlY3RlZCBfdGFza09wZXJhdGlvbnM6IFRhc2tPcGVyYXRpb25zLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIF9zZWxlY3RlZENhc2VTZXJ2aWNlOiBTZWxlY3RlZENhc2VTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfdGFza1ZpZXdTZXJ2aWNlOiBUYXNrVmlld1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgX3Rhc2tDb250ZW50U2VydmljZTogVGFza0NvbnRlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBwZXJtaXNzaW9uU2VydmljZTogUGVybWlzc2lvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9mcm9udEFjdGlvblNlcnZpY2U6IEZyb250QWN0aW9uU2VydmljZVxuKSB7XG4gICAgICAgIHN1cGVyKF90YXNrQ29udGVudFNlcnZpY2UsIF9zZWxlY3RlZENhc2VTZXJ2aWNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgJ2NhbmNlbCcgb3BlcmF0aW9uIG9uIHRoZSB0YXNrIGhlbGQgYnkge0BsaW5rIFRhc2tDb250ZW50U2VydmljZX0uXG4gICAgICpcbiAgICAgKiBEb2Vzbid0IHNlbmQgYW55IHJlcXVlc3RzIGlmIHRoZSBsb2FkaW5nIGluZGljYXRvciBpcyBpbiBpdCdzIGFjdGl2ZSBzdGF0ZS5cbiAgICAgKiBPdGhlcndpc2Ugc2V0cyB0aGUgaW5kaWNhdG9yIHRvIHRoZSBhY3RpdmUgc3RhdGUgYW5kIGRpc2FibGVzIGl0IG9uY2UgdGhlIHJlcXVlc3QgcmVzcG9uc2UgaXMgcmVjZWl2ZWQuXG4gICAgICpcbiAgICAgKiBUaGUgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gY2hhaW4gb3BlcmF0aW9ucyB0b2dldGhlcixcbiAgICAgKiBvciB0byBleGVjdXRlIGNvZGUgY29uZGl0aW9uYWxseSBiYXNlZCBvbiB0aGUgc3VjY2VzcyBzdGF0ZSBvZiB0aGUgY2FuY2VsIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIElmIHRoZSB0YXNrIGhlbGQgd2l0aGluIHRoZSB7QGxpbmsgVGFza0NvbnRlbnRTZXJ2aWNlfSBjaGFuZ2VzIGJlZm9yZSBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBpZ25vcmVkXG4gICAgICogYW5kIHRoZSBgYWZ0ZXJBY3Rpb25gIHdpbGwgbm90IGJlIGV4ZWN1dGVkLlxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiBpZiBjYW5jZWwgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBgdHJ1ZWAgd2lsbCBiZSBlbWl0dGVkIGludG8gdGhpcyBTdWJqZWN0LCBvdGhlcndpc2UgYGZhbHNlYCB3aWxsIGJlIGVtaXR0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuY2VsKGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiA9IG5ldyBBZnRlckFjdGlvbigpKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50UXVldWUuc2NoZWR1bGVFdmVudChuZXcgUXVldWVkRXZlbnQoXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLmNhbkNhbmNlbCh0aGlzLl9zYWZlVGFzayksXG4gICAgICAgICAgICBuZXh0RXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybUNhbmNlbFJlcXVlc3QoYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCwgdGhpcy5fdGFza1ZpZXdTZXJ2aWNlICE9PSBudWxsICYmICF0aGlzLl90YXNrVmlld1NlcnZpY2UuYWxsb3dNdWx0aU9wZW4pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRFdmVudCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZUFjdGlvbnMoYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIGBjYW5jZWxgIHJlcXVlc3Qgb24gdGhlIHRhc2sgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgYHRhc2tDb250ZW50YCBzZXJ2aWNlXG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIHRoZSByZXF1ZXN0IGlzIHByb2Nlc3NlZFxuICAgICAqIEBwYXJhbSBuZXh0RXZlbnQgaW5kaWNhdGVzIHRvIHRoZSBldmVudCBxdWV1ZSB0aGF0IHRoZSBuZXh0IGV2ZW50IGNhbiBiZSBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gZm9yY2VSZWxvYWQgd2hldGhlciBhIGZvcmNlIHJlbG9hZCBvZiB0aGUgdGFzayBkYXRhIHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgY2FuY2VsLlxuICAgICAqIElmIHNldCB0byBgZmFsc2VgIGEgcmVndWxhciByZWxvYWQgaXMgcGVyZm9ybWVkIGluc3RlYWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHBlcmZvcm1DYW5jZWxSZXF1ZXN0KGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiwgbmV4dEV2ZW50OiBBZnRlckFjdGlvbiwgZm9yY2VSZWxvYWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgY2FuY2VsZWRUYXNrSWQgPSB0aGlzLl9zYWZlVGFzay5zdHJpbmdJZDtcblxuICAgICAgICAvLyB0aGlzIGlzIHByb2JhYmx5IG5vIGxvbmdlciBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGUgZXZlbnQgcXVldWVcbiAgICAgICAgaWYgKHRoaXMuX3Rhc2tTdGF0ZS5pc0xvYWRpbmcoY2FuY2VsZWRUYXNrSWQpKSB7XG4gICAgICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdGFydExvYWRpbmcoY2FuY2VsZWRUYXNrSWQpO1xuICAgICAgICB0aGlzLmNhbmNlbFJlcXVlc3QoYWZ0ZXJBY3Rpb24sIGNhbmNlbGVkVGFza0lkLCBuZXh0RXZlbnQsIGZvcmNlUmVsb2FkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyB0aGUgZW5kcG9pbnQgYW5kIHByb2Nlc3NlcyB0aGUgcG9zc2libGUgcmVzcG9uc2VzLlxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gY2FuY2VsZWRUYXNrSWQgdGhlIGlkIG9mIHRoZSB0YXNrIHRoYXQgaXMgYmVpbmcgY2FuY2VsZWRcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIGZvcmNlUmVsb2FkIHdoZXRoZXIgYSBmb3JjZSByZWxvYWQgb2YgdGhlIHRhc2sgZGF0YSBzaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIGNhbmNlbC5cbiAgICAgKiBJZiBzZXQgdG8gYGZhbHNlYCBhIHJlZ3VsYXIgcmVsb2FkIGlzIHBlcmZvcm1lZCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYW5jZWxSZXF1ZXN0KGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiA9IG5ldyBBZnRlckFjdGlvbigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGVkVGFza0lkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50OiBBZnRlckFjdGlvbiA9IG5ldyBBZnRlckFjdGlvbigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUmVsb2FkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Rhc2tSZXNvdXJjZVNlcnZpY2UuY2FuY2VsVGFzayh0aGlzLl9zYWZlVGFzay5zdHJpbmdJZCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAob3V0Y29tZVJlc291cmNlOiBFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdG9wTG9hZGluZyhjYW5jZWxlZFRhc2tJZCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNUYXNrUmVsZXZhbnQoY2FuY2VsZWRUYXNrSWQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdjdXJyZW50IHRhc2sgY2hhbmdlZCBiZWZvcmUgdGhlIGNhbmNlbCByZXNwb25zZSBjb3VsZCBiZSByZWNlaXZlZCwgZGlzY2FyZGluZy4uLicpO1xuICAgICAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvdXRjb21lUmVzb3VyY2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS51cGRhdGVTdGF0ZURhdGEob3V0Y29tZVJlc291cmNlLm91dGNvbWUgYXMgQ2FuY2VsVGFza0V2ZW50T3V0Y29tZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlZEZpZWxkc01hcDogQ2hhbmdlZEZpZWxkc01hcCA9IHRoaXMuX2V2ZW50U2VydmljZVxuICAgICAgICAgICAgICAgICAgICAucGFyc2VDaGFuZ2VkRmllbGRzRnJvbU91dGNvbWVUcmVlKG91dGNvbWVSZXNvdXJjZS5vdXRjb21lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9udEFjdGlvbnM6IEFycmF5PEZyb250QWN0aW9uPiA9IHRoaXMuX2V2ZW50U2VydmljZS5wYXJzZUZyb250QWN0aW9uc0Zyb21PdXRjb21lVHJlZShvdXRjb21lUmVzb3VyY2Uub3V0Y29tZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoISFjaGFuZ2VkRmllbGRzTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRGaWVsZHNTZXJ2aWNlLmVtaXRDaGFuZ2VkRmllbGRzKGNoYW5nZWRGaWVsZHNNYXApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZnJvbnRBY3Rpb25zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Zyb250QWN0aW9uU2VydmljZS5ydW5BbGwoZnJvbnRBY3Rpb25zKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3JjZVJlbG9hZCA/IHRoaXMuX3Rhc2tPcGVyYXRpb25zLmZvcmNlUmVsb2FkKCkgOiB0aGlzLl90YXNrT3BlcmF0aW9ucy5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlQWN0aW9ucyhhZnRlckFjdGlvbiwgbmV4dEV2ZW50LCB0cnVlLCBvdXRjb21lUmVzb3VyY2Uub3V0Y29tZSBhcyBDYW5jZWxUYXNrRXZlbnRPdXRjb21lKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0Y29tZVJlc291cmNlLmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAob3V0Y29tZVJlc291cmNlLmVycm9yICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuRXJyb3JTbmFja0JhcihvdXRjb21lUmVzb3VyY2UuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3V0Y29tZVJlc291cmNlLm91dGNvbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VkRmllbGRzTWFwID0gdGhpcy5fZXZlbnRTZXJ2aWNlLnBhcnNlQ2hhbmdlZEZpZWxkc0Zyb21PdXRjb21lVHJlZShvdXRjb21lUmVzb3VyY2Uub3V0Y29tZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRGaWVsZHNTZXJ2aWNlLmVtaXRDaGFuZ2VkRmllbGRzKGNoYW5nZWRGaWVsZHNNYXApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlQWN0aW9ucyhhZnRlckFjdGlvbiwgbmV4dEV2ZW50LCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdG9wTG9hZGluZyhjYW5jZWxlZFRhc2tJZCk7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ2NhbmNlbGluZyB0YXNrIGZhaWxlZCcsIGVycm9yKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVGFza1JlbGV2YW50KGNhbmNlbGVkVGFza0lkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnY3VycmVudCB0YXNrIGNoYW5nZWQgYmVmb3JlIHRoZSBjYW5jZWwgZXJyb3IgY291bGQgYmUgcmVjZWl2ZWQnKTtcbiAgICAgICAgICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuRXJyb3JTbmFja0JhcihgJHt0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIuY2FuY2VsVGFzaycpfVxuICAgICAgICAgICAgICR7dGhpcy5fdGFza30gJHt0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIuZmFpbGVkJyl9YCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlQWN0aW9ucyhhZnRlckFjdGlvbiwgbmV4dEV2ZW50LCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNvbXBsZXRlIGFsbCBhY3Rpb24gc3RyZWFtcyBhbmQgc2VuZCBub3RpZmljYXRpb24gd2l0aCBzZWxlY3RlZCBib29sZWFuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXBsZXRlQWN0aW9ucyhhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24sIG5leHRFdmVudDogQWZ0ZXJBY3Rpb24sIGJvb2w6IGJvb2xlYW4sIG91dGNvbWU/OiBUYXNrRXZlbnRPdXRjb21lKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbihib29sLCBvdXRjb21lKTtcbiAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZShib29sKTtcbiAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoYm9vbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHVibGlzaGVzIGEgY2FuY2VsIG5vdGlmaWNhdGlvbiB0byB0aGUge0BsaW5rIFRhc2tFdmVudFNlcnZpY2V9XG4gICAgICogQHBhcmFtIHN1Y2Nlc3Mgd2hldGhlciB0aGUgY2FuY2VsIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBvciBub3RcbiAgICAgKiBAcGFyYW0gb3V0Y29tZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzZW5kTm90aWZpY2F0aW9uKHN1Y2Nlc3M6IGJvb2xlYW4sIG91dGNvbWU/OiBUYXNrRXZlbnRPdXRjb21lKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Rhc2tFdmVudC5wdWJsaXNoVGFza0V2ZW50KGNyZWF0ZVRhc2tFdmVudE5vdGlmaWNhdGlvbih0aGlzLl9zYWZlVGFzaywgVGFza0V2ZW50LkNBTkNFTCwgc3VjY2Vzcywgb3V0Y29tZSkpO1xuICAgIH1cbn1cbiJdfQ==