UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

186 lines 25.9 kB
import { Inject, Injectable } from '@angular/core'; import { AssignPolicy } from '../../task-content/model/policy'; import { TaskHandlingService } from './task-handling-service'; import { NAE_TASK_OPERATIONS } from '../models/task-operations-injection-token'; import { race } from 'rxjs'; import { AfterAction } from '../../utility/call-chain/after-action'; import { PermissionType } from '../../process/permissions'; import { filter, take } from "rxjs/operators"; import * as i0 from "@angular/core"; import * as i1 from "./task-data.service"; import * as i2 from "./assign-task.service"; import * as i3 from "./cancel-task.service"; import * as i4 from "./finish-policy.service"; import * as i5 from "../../utility/call-chain/call-chain.service"; import * as i6 from "../../user/services/user-comparator.service"; import * as i7 from "../../task-content/services/task-content.service"; import * as i8 from "../../authorization/permission/permission.service"; import * as i9 from "../../user/services/user.service"; /** * Handles the sequence of actions that are performed when a task is being assigned, based on the task's configuration. */ export class AssignPolicyService extends TaskHandlingService { _taskDataService; _assignTaskService; _cancelTaskService; _finishPolicyService; _callchain; _userComparatorService; _taskOperations; _permissionService; _userService; _isForced = false; constructor(_taskDataService, _assignTaskService, _cancelTaskService, _finishPolicyService, _callchain, _userComparatorService, _taskOperations, taskContentService, _permissionService, _userService) { super(taskContentService); this._taskDataService = _taskDataService; this._assignTaskService = _assignTaskService; this._cancelTaskService = _cancelTaskService; this._finishPolicyService = _finishPolicyService; this._callchain = _callchain; this._userComparatorService = _userComparatorService; this._taskOperations = _taskOperations; this._permissionService = _permissionService; this._userService = _userService; } get forced() { return this._isForced; } set forced(bool) { this._isForced = bool; } /** * Performs the actions that correspond to the policy defined by the Task on it's assignment. * @param taskOpened whether the Task was 'opened' (eg. task panel is expanding) or 'closed' (eg. task panel is collapsing) * @param afterAction the action that should be performed when the assign policy (and all following policies) finishes */ performAssignPolicy(taskOpened, afterAction = new AfterAction()) { if (!this._userService.isCurrentUserEmpty()) { this.performAssign(taskOpened, afterAction); } else { race([ this._userService.anonymousUser$, this._userService.user$ ]) .pipe(filter(user => !this._userService.isUserEmpty(user))) .pipe(take(1)) .subscribe(user => this.performAssign(taskOpened, afterAction)); } } performAssign(taskOpened, afterAction = new AfterAction()) { if (this._safeTask.assignPolicy === AssignPolicy.auto && this._permissionService.hasTaskPermission(this._safeTask, PermissionType.ASSIGN)) { this.autoAssignPolicy(taskOpened, afterAction); } else { this.manualAssignPolicy(taskOpened, afterAction); } } /** * Performs the actions that correspond to the [Auto Assign Policy]{@link AssignPolicy#auto}. * @param taskOpened whether the Task was 'opened' (eg. task panel is expanding) or 'closed' (eg. task panel is collapsing) * @param afterAction the action that should be performed when the assign policy (and all following policies) finishes */ autoAssignPolicy(taskOpened, afterAction) { if (taskOpened) { this.autoAssignOpenedPolicy(afterAction); } else { this.autoAssignClosedPolicy(afterAction); } } /** * Performs the actions that correspond to the [Auto Assign Policy]{@link AssignPolicy#auto} * when a task is 'opening' (eg. task panel is expanding). * * Assigns the task, reloads the current task page, loads task data and performs the finish policy. * * See [finish policy]{@link FinishPolicyService#performFinishPolicy} for more information. * * @param afterAction the action that should be performed when the assign policy (and all following policies) finishes */ autoAssignOpenedPolicy(afterAction) { this._assignTaskService.assign(this._callchain.create((assignSuccess => { this.afterAssignOpenPolicy(assignSuccess, afterAction); }))); } /** * Reloads the current page of tasks if the preceding assign operation succeeded. Then initializes the task's data fields. * @param assignSuccess whether the preceding assign succeeded or not * @param afterAction the action that should be performed when the assign policy (and all following policies) finishes */ afterAssignOpenPolicy(assignSuccess, afterAction) { if (!assignSuccess) { afterAction.resolve(false); return; } this._taskDataService.initializeTaskDataFields(this._callchain.create((requestSuccessful) => { if (requestSuccessful) { this._finishPolicyService.performFinishPolicy(afterAction); } else { afterAction.resolve(false); } }), this._isForced); } /** * Requests a reload of the task and then requests the task to be closed. * * @param afterAction the action that should be performed when the assign policy (and all following policies) finishes */ autoAssignClosedPolicy(afterAction) { if (!this._userComparatorService.compareUsers(this._task.userId)) { this._taskOperations.close(); afterAction.next(false); afterAction.complete(); return; } this._cancelTaskService.cancel(this._callchain.create((requestSuccess) => { this._taskOperations.close(); afterAction.next(requestSuccess); afterAction.complete(); })); } /** * Performs the actions that correspond to the [Manual Assign Policy]{@link AssignPolicy#manual}. * @param taskOpened whether the Task was 'opened' (eg. task panel is expanding) or 'closed' (eg. task panel is collapsing) * @param afterAction the action that should be performed when the assign policy (and all following policies) finishes */ manualAssignPolicy(taskOpened, afterAction) { if (taskOpened) { this.manualAssignOpenedPolicy(afterAction); } else { afterAction.resolve(false); } } /** * Performs the actions that correspond to the [Manual Assign Policy]{@link AssignPolicy#manual} * when a task is 'opening' (eg. task panel is expanding). * * Loads task data and performs the [finish policy]{@link FinishPolicyService#performFinishPolicy}. * * See [finish policy]{@link FinishPolicyService#performFinishPolicy} for more information. * * @param afterAction the action that should be performed when the assign policy (and all following policies) finishes */ manualAssignOpenedPolicy(afterAction) { this._taskDataService.initializeTaskDataFields(this._callchain.create((requestSuccessful) => { if (requestSuccessful) { this._finishPolicyService.performFinishPolicy(afterAction); } else { afterAction.resolve(false); } }), this._isForced); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AssignPolicyService, deps: [{ token: i1.TaskDataService }, { token: i2.AssignTaskService }, { token: i3.CancelTaskService }, { token: i4.FinishPolicyService }, { token: i5.CallChainService }, { token: i6.UserComparatorService }, { token: NAE_TASK_OPERATIONS }, { token: i7.TaskContentService }, { token: i8.PermissionService }, { token: i9.UserService }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AssignPolicyService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AssignPolicyService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.TaskDataService }, { type: i2.AssignTaskService }, { type: i3.CancelTaskService }, { type: i4.FinishPolicyService }, { type: i5.CallChainService }, { type: i6.UserComparatorService }, { type: undefined, decorators: [{ type: Inject, args: [NAE_TASK_OPERATIONS] }] }, { type: i7.TaskContentService }, { type: i8.PermissionService }, { type: i9.UserService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaWduLXBvbGljeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi90YXNrL3NlcnZpY2VzL2Fzc2lnbi1wb2xpY3kuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDN0QsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFNNUQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFHOUUsT0FBTyxFQUFDLElBQUksRUFBVSxNQUFNLE1BQU0sQ0FBQztBQUVuQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFFbEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBRTVDOztHQUVHO0FBRUgsTUFBTSxPQUFPLG1CQUFvQixTQUFRLG1CQUFtQjtJQUlsQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDNkI7SUFFN0I7SUFDQTtJQVhkLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFMUIsWUFBc0IsZ0JBQWlDLEVBQ2pDLGtCQUFxQyxFQUNyQyxrQkFBcUMsRUFDckMsb0JBQXlDLEVBQ3pDLFVBQTRCLEVBQzVCLHNCQUE2QyxFQUNoQixlQUErQixFQUN0RSxrQkFBc0MsRUFDNUIsa0JBQXFDLEVBQ3JDLFlBQXlCO1FBQzNDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBVlIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUNqQyx1QkFBa0Is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Q08sd0JBQXdCLENBQUMsV0FBd0I7UUFDdkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHdCQUF3QixDQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEVBQUU7WUFDekMsSUFBSSxpQkFBaUIsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzlEO2lCQUFNO2dCQUNILFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDOUI7UUFDTCxDQUFDLENBQUMsRUFDRixJQUFJLENBQUMsU0FBUyxDQUNqQixDQUFDO0lBQ04sQ0FBQzt3R0FsS1EsbUJBQW1CLDJOQVVSLG1CQUFtQjs0R0FWOUIsbUJBQW1COzs0RkFBbkIsbUJBQW1CO2tCQUQvQixVQUFVOzswQkFXTSxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QXNzaWduUG9saWN5fSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvbW9kZWwvcG9saWN5JztcbmltcG9ydCB7VGFza0hhbmRsaW5nU2VydmljZX0gZnJvbSAnLi90YXNrLWhhbmRsaW5nLXNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrQ29udGVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy90YXNrLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tEYXRhU2VydmljZX0gZnJvbSAnLi90YXNrLWRhdGEuc2VydmljZSc7XG5pbXBvcnQge0Fzc2lnblRhc2tTZXJ2aWNlfSBmcm9tICcuL2Fzc2lnbi10YXNrLnNlcnZpY2UnO1xuaW1wb3J0IHtDYW5jZWxUYXNrU2VydmljZX0gZnJvbSAnLi9jYW5jZWwtdGFzay5zZXJ2aWNlJztcbmltcG9ydCB7RmluaXNoUG9saWN5U2VydmljZX0gZnJvbSAnLi9maW5pc2gtcG9saWN5LnNlcnZpY2UnO1xuaW1wb3J0IHtOQUVfVEFTS19PUEVSQVRJT05TfSBmcm9tICcuLi9tb2RlbHMvdGFzay1vcGVyYXRpb25zLWluamVjdGlvbi10b2tlbic7XG5pbXBvcnQge1Rhc2tPcGVyYXRpb25zfSBmcm9tICcuLi9pbnRlcmZhY2VzL3Rhc2stb3BlcmF0aW9ucyc7XG5pbXBvcnQge0NhbGxDaGFpblNlcnZpY2V9IGZyb20gJy4uLy4uL3V0aWxpdHkvY2FsbC1jaGFpbi9jYWxsLWNoYWluLnNlcnZpY2UnO1xuaW1wb3J0IHtyYWNlLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7VXNlckNvbXBhcmF0b3JTZXJ2aWNlfSBmcm9tICcuLi8uLi91c2VyL3NlcnZpY2VzL3VzZXItY29tcGFyYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7QWZ0ZXJBY3Rpb259IGZyb20gJy4uLy4uL3V0aWxpdHkvY2FsbC1jaGFpbi9hZnRlci1hY3Rpb24nO1xuaW1wb3J0IHtQZXJtaXNzaW9uU2VydmljZX0gZnJvbSAnLi4vLi4vYXV0aG9yaXphdGlvbi9wZXJtaXNzaW9uL3Blcm1pc3Npb24uc2VydmljZSc7XG5pbXBvcnQge1Blcm1pc3Npb25UeXBlfSBmcm9tICcuLi8uLi9wcm9jZXNzL3Blcm1pc3Npb25zJztcbmltcG9ydCB7VXNlclNlcnZpY2V9IGZyb20gXCIuLi8uLi91c2VyL3NlcnZpY2VzL3VzZXIuc2VydmljZVwiO1xuaW1wb3J0IHtmaWx0ZXIsIHRha2V9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG4vKipcbiAqIEhhbmRsZXMgdGhlIHNlcXVlbmNlIG9mIGFjdGlvbnMgdGhhdCBhcmUgcGVyZm9ybWVkIHdoZW4gYSB0YXNrIGlzIGJlaW5nIGFzc2lnbmVkLCBiYXNlZCBvbiB0aGUgdGFzaydzIGNvbmZpZ3VyYXRpb24uXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBc3NpZ25Qb2xpY3lTZXJ2aWNlIGV4dGVuZHMgVGFza0hhbmRsaW5nU2VydmljZSB7XG5cbiAgICBwcml2YXRlIF9pc0ZvcmNlZCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF90YXNrRGF0YVNlcnZpY2U6IFRhc2tEYXRhU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2Fzc2lnblRhc2tTZXJ2aWNlOiBBc3NpZ25UYXNrU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2NhbmNlbFRhc2tTZXJ2aWNlOiBDYW5jZWxUYXNrU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2ZpbmlzaFBvbGljeVNlcnZpY2U6IEZpbmlzaFBvbGljeVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9jYWxsY2hhaW46IENhbGxDaGFpblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF91c2VyQ29tcGFyYXRvclNlcnZpY2U6IFVzZXJDb21wYXJhdG9yU2VydmljZSxcbiAgICAgICAgICAgICAgICBASW5qZWN0KE5BRV9UQVNLX09QRVJBVElPTlMpIHByb3RlY3RlZCBfdGFza09wZXJhdGlvbnM6IFRhc2tPcGVyYXRpb25zLFxuICAgICAgICAgICAgICAgIHRhc2tDb250ZW50U2VydmljZTogVGFza0NvbnRlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfcGVybWlzc2lvblNlcnZpY2U6IFBlcm1pc3Npb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKHRhc2tDb250ZW50U2VydmljZSk7XG4gICAgfVxuXG4gICAgZ2V0IGZvcmNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRm9yY2VkO1xuICAgIH1cblxuICAgIHNldCBmb3JjZWQoYm9vbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9pc0ZvcmNlZCA9IGJvb2w7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGFjdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBwb2xpY3kgZGVmaW5lZCBieSB0aGUgVGFzayBvbiBpdCdzIGFzc2lnbm1lbnQuXG4gICAgICogQHBhcmFtIHRhc2tPcGVuZWQgd2hldGhlciB0aGUgVGFzayB3YXMgJ29wZW5lZCcgKGVnLiB0YXNrIHBhbmVsIGlzIGV4cGFuZGluZykgb3IgJ2Nsb3NlZCcgKGVnLiB0YXNrIHBhbmVsIGlzIGNvbGxhcHNpbmcpXG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIGFzc2lnbiBwb2xpY3kgKGFuZCBhbGwgZm9sbG93aW5nIHBvbGljaWVzKSBmaW5pc2hlc1xuICAgICAqL1xuICAgIHB1YmxpYyBwZXJmb3JtQXNzaWduUG9saWN5KHRhc2tPcGVuZWQ6IGJvb2xlYW4sIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiA9IG5ldyBBZnRlckFjdGlvbigpKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fdXNlclNlcnZpY2UuaXNDdXJyZW50VXNlckVtcHR5KCkpIHtcbiAgICAgICAgICAgIHRoaXMucGVyZm9ybUFzc2lnbih0YXNrT3BlbmVkLCBhZnRlckFjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYWNlKFtcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyU2VydmljZS5hbm9ueW1vdXNVc2VyJCxcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyU2VydmljZS51c2VyJFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIodXNlciA9PiAhdGhpcy5fdXNlclNlcnZpY2UuaXNVc2VyRW1wdHkodXNlcikpKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh1c2VyID0+IHRoaXMucGVyZm9ybUFzc2lnbih0YXNrT3BlbmVkLCBhZnRlckFjdGlvbikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwZXJmb3JtQXNzaWduKHRhc2tPcGVuZWQ6IGJvb2xlYW4sIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiA9IG5ldyBBZnRlckFjdGlvbigpKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9zYWZlVGFzay5hc3NpZ25Qb2xpY3kgPT09IEFzc2lnblBvbGljeS5hdXRvXG4gICAgICAgICAgICAmJiB0aGlzLl9wZXJtaXNzaW9uU2VydmljZS5oYXNUYXNrUGVybWlzc2lvbih0aGlzLl9zYWZlVGFzaywgUGVybWlzc2lvblR5cGUuQVNTSUdOKSkge1xuICAgICAgICAgICAgdGhpcy5hdXRvQXNzaWduUG9saWN5KHRhc2tPcGVuZWQsIGFmdGVyQWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWFudWFsQXNzaWduUG9saWN5KHRhc2tPcGVuZWQsIGFmdGVyQWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHRoZSBhY3Rpb25zIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgW0F1dG8gQXNzaWduIFBvbGljeV17QGxpbmsgQXNzaWduUG9saWN5I2F1dG99LlxuICAgICAqIEBwYXJhbSB0YXNrT3BlbmVkIHdoZXRoZXIgdGhlIFRhc2sgd2FzICdvcGVuZWQnIChlZy4gdGFzayBwYW5lbCBpcyBleHBhbmRpbmcpIG9yICdjbG9zZWQnIChlZy4gdGFzayBwYW5lbCBpcyBjb2xsYXBzaW5nKVxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBhc3NpZ24gcG9saWN5IChhbmQgYWxsIGZvbGxvd2luZyBwb2xpY2llcykgZmluaXNoZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXV0b0Fzc2lnblBvbGljeSh0YXNrT3BlbmVkOiBib29sZWFuLCBhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRhc2tPcGVuZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b0Fzc2lnbk9wZW5lZFBvbGljeShhZnRlckFjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9Bc3NpZ25DbG9zZWRQb2xpY3koYWZ0ZXJBY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGFjdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBbQXV0byBBc3NpZ24gUG9saWN5XXtAbGluayBBc3NpZ25Qb2xpY3kjYXV0b31cbiAgICAgKiB3aGVuIGEgdGFzayBpcyAnb3BlbmluZycgKGVnLiB0YXNrIHBhbmVsIGlzIGV4cGFuZGluZykuXG4gICAgICpcbiAgICAgKiBBc3NpZ25zIHRoZSB0YXNrLCByZWxvYWRzIHRoZSBjdXJyZW50IHRhc2sgcGFnZSwgbG9hZHMgdGFzayBkYXRhIGFuZCBwZXJmb3JtcyB0aGUgZmluaXNoIHBvbGljeS5cbiAgICAgKlxuICAgICAqIFNlZSBbZmluaXNoIHBvbGljeV17QGxpbmsgRmluaXNoUG9saWN5U2VydmljZSNwZXJmb3JtRmluaXNoUG9saWN5fSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBhc3NpZ24gcG9saWN5IChhbmQgYWxsIGZvbGxvd2luZyBwb2xpY2llcykgZmluaXNoZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXV0b0Fzc2lnbk9wZW5lZFBvbGljeShhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYXNzaWduVGFza1NlcnZpY2UuYXNzaWduKFxuICAgICAgICAgICAgdGhpcy5fY2FsbGNoYWluLmNyZWF0ZSgoYXNzaWduU3VjY2VzcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlckFzc2lnbk9wZW5Qb2xpY3koYXNzaWduU3VjY2VzcywgYWZ0ZXJBY3Rpb24pO1xuICAgICAgICAgICAgfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsb2FkcyB0aGUgY3VycmVudCBwYWdlIG9mIHRhc2tzIGlmIHRoZSBwcmVjZWRpbmcgYXNzaWduIG9wZXJhdGlvbiBzdWNjZWVkZWQuIFRoZW4gaW5pdGlhbGl6ZXMgdGhlIHRhc2sncyBkYXRhIGZpZWxkcy5cbiAgICAgKiBAcGFyYW0gYXNzaWduU3VjY2VzcyB3aGV0aGVyIHRoZSBwcmVjZWRpbmcgYXNzaWduIHN1Y2NlZWRlZCBvciBub3RcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgYXNzaWduIHBvbGljeSAoYW5kIGFsbCBmb2xsb3dpbmcgcG9saWNpZXMpIGZpbmlzaGVzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFmdGVyQXNzaWduT3BlblBvbGljeShhc3NpZ25TdWNjZXNzOiBib29sZWFuLCBhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFhc3NpZ25TdWNjZXNzKSB7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Rhc2tEYXRhU2VydmljZS5pbml0aWFsaXplVGFza0RhdGFGaWVsZHMoXG4gICAgICAgICAgICB0aGlzLl9jYWxsY2hhaW4uY3JlYXRlKChyZXF1ZXN0U3VjY2Vzc2Z1bCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0U3VjY2Vzc2Z1bCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9maW5pc2hQb2xpY3lTZXJ2aWNlLnBlcmZvcm1GaW5pc2hQb2xpY3koYWZ0ZXJBY3Rpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uLnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGhpcy5faXNGb3JjZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0cyBhIHJlbG9hZCBvZiB0aGUgdGFzayBhbmQgdGhlbiByZXF1ZXN0cyB0aGUgdGFzayB0byBiZSBjbG9zZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgYXNzaWduIHBvbGljeSAoYW5kIGFsbCBmb2xsb3dpbmcgcG9saWNpZXMpIGZpbmlzaGVzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGF1dG9Bc3NpZ25DbG9zZWRQb2xpY3koYWZ0ZXJBY3Rpb246IFN1YmplY3Q8Ym9vbGVhbj4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl91c2VyQ29tcGFyYXRvclNlcnZpY2UuY29tcGFyZVVzZXJzKHRoaXMuX3Rhc2sudXNlcklkKSkge1xuICAgICAgICAgICAgdGhpcy5fdGFza09wZXJhdGlvbnMuY2xvc2UoKTtcbiAgICAgICAgICAgIGFmdGVyQWN0aW9uLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgYWZ0ZXJBY3Rpb24uY29tcGxldGUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYW5jZWxUYXNrU2VydmljZS5jYW5jZWwoXG4gICAgICAgICAgICB0aGlzLl9jYWxsY2hhaW4uY3JlYXRlKChyZXF1ZXN0U3VjY2VzcykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tPcGVyYXRpb25zLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb24ubmV4dChyZXF1ZXN0U3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb24uY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGFjdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBbTWFudWFsIEFzc2lnbiBQb2xpY3lde0BsaW5rIEFzc2lnblBvbGljeSNtYW51YWx9LlxuICAgICAqIEBwYXJhbSB0YXNrT3BlbmVkIHdoZXRoZXIgdGhlIFRhc2sgd2FzICdvcGVuZWQnIChlZy4gdGFzayBwYW5lbCBpcyBleHBhbmRpbmcpIG9yICdjbG9zZWQnIChlZy4gdGFzayBwYW5lbCBpcyBjb2xsYXBzaW5nKVxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBhc3NpZ24gcG9saWN5IChhbmQgYWxsIGZvbGxvd2luZyBwb2xpY2llcykgZmluaXNoZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFudWFsQXNzaWduUG9saWN5KHRhc2tPcGVuZWQ6IGJvb2xlYW4sIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAodGFza09wZW5lZCkge1xuICAgICAgICAgICAgdGhpcy5tYW51YWxBc3NpZ25PcGVuZWRQb2xpY3koYWZ0ZXJBY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgYWN0aW9ucyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIFtNYW51YWwgQXNzaWduIFBvbGljeV17QGxpbmsgQXNzaWduUG9saWN5I21hbnVhbH1cbiAgICAgKiB3aGVuIGEgdGFzayBpcyAnb3BlbmluZycgKGVnLiB0YXNrIHBhbmVsIGlzIGV4cGFuZGluZykuXG4gICAgICpcbiAgICAgKiBMb2FkcyB0YXNrIGRhdGEgYW5kIHBlcmZvcm1zIHRoZSBbZmluaXNoIHBvbGljeV17QGxpbmsgRmluaXNoUG9saWN5U2VydmljZSNwZXJmb3JtRmluaXNoUG9saWN5fS5cbiAgICAgKlxuICAgICAqIFNlZSBbZmluaXNoIHBvbGljeV17QGxpbmsgRmluaXNoUG9saWN5U2VydmljZSNwZXJmb3JtRmluaXNoUG9saWN5fSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBhc3NpZ24gcG9saWN5IChhbmQgYWxsIGZvbGxvd2luZyBwb2xpY2llcykgZmluaXNoZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFudWFsQXNzaWduT3BlbmVkUG9saWN5KGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLl90YXNrRGF0YVNlcnZpY2UuaW5pdGlhbGl6ZVRhc2tEYXRhRmllbGRzKFxuICAgICAgICAgICAgdGhpcy5fY2FsbGNoYWluLmNyZWF0ZSgocmVxdWVzdFN1Y2Nlc3NmdWwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFN1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmluaXNoUG9saWN5U2VydmljZS5wZXJmb3JtRmluaXNoUG9saWN5KGFmdGVyQWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuX2lzRm9yY2VkXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19