UNPKG

@cause-911/management

Version:

Run `npm install @cause-911/management --save` to add this library to your project

525 lines 40.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input } from '@angular/core'; import { ManagementGroupService } from '../shared/services/management-group.service'; import { ManagementUserService } from '../shared/services/management-user.service'; import { ManagementPermissionService } from '../shared/services/management-permission.service'; import { BreakpointObserver } from '@angular/cdk/layout'; import { map } from 'rxjs/operators'; var CauseManagementGroupComponent = /** @class */ (function () { function CauseManagementGroupComponent(managementGroupService, managementUserService, managementPermissionService, breakpointObserver) { var _this = this; this.managementGroupService = managementGroupService; this.managementUserService = managementUserService; this.managementPermissionService = managementPermissionService; this.hoverStatePermission = true; this.groups = []; this.users = []; this.permissions = []; this.userFullName = {}; this.showColumn = true; this.showColumnXS = true; this.translations = []; this.calculateUsersCellValue = (/** * @param {?} e * @return {?} */ function (e) { /** @type {?} */ var users = (e.users ? (/** @type {?} */ (e.users)) : []); /** @type {?} */ var usersNames = []; users.forEach((/** * @param {?} user * @return {?} */ function (user) { /** @type {?} */ var userGroup = _this.users.filter((/** * @param {?} u * @return {?} */ function (u) { return u.id === user.idUser; })); if (userGroup && userGroup[0]) { usersNames.push(userGroup[0].firstName + ' ' + userGroup[0].lastName); } })); usersNames = usersNames.sort((/** * @param {?} one * @param {?} two * @return {?} */ function (one, two) { return (one < two ? -1 : 1); })); return usersNames.join(', '); }); this.groupNameAlreadyUsedValidation = (/** * @param {?} e * @return {?} */ function (e) { return _this.managementGroupService.hasExistingGroupName(e.data).pipe(map((/** * @param {?} exist * @return {?} */ function (exist) { return !exist; }))).toPromise(); }); breakpointObserver.observe(['(max-width: 1000px)']).subscribe((/** * @param {?} result * @return {?} */ function (result) { _this.showColumn = !result.matches; })); breakpointObserver.observe(['(max-width: 600px)']).subscribe((/** * @param {?} result * @return {?} */ function (result) { _this.showColumnXS = !result.matches; })); } /** * @return {?} */ CauseManagementGroupComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.managementUserService.getAll().subscribe((/** * @param {?} data * @return {?} */ function (data) { _this.users = data; _this.users.forEach((/** * @param {?} user * @return {?} */ function (user) { if (user.isActive) { if (user.firstName !== '' && user.lastName !== '') { _this.userFullName[user.id] = user.firstName + " " + user.lastName; } } })); })); this.managementPermissionService.getAll().subscribe((/** * @param {?} permissions * @return {?} */ function (permissions) { /** @type {?} */ var permissionIndex = permissions.findIndex((/** * @param {?} c * @return {?} */ function (c) { return c.tag === 'CanAccessPermissions'; })); if (permissionIndex !== -1) { permissions.splice(permissionIndex, 1); } permissions.sort((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { if (a.name < b.name) { return -1; } if (a.name > b.name) { return 1; } return 0; })); _this.permissions = permissions; })); this.getGroups(); }; /** * @param {?} data * @return {?} */ CauseManagementGroupComponent.prototype.fullName = /** * @param {?} data * @return {?} */ function (data) { if (!data) { return ''; } return data.firstName + " " + data.lastName; }; /** * @param {?} field * @param {?} e * @return {?} */ CauseManagementGroupComponent.prototype.getGroupUser = /** * @param {?} field * @param {?} e * @return {?} */ function (field, e) { /** @type {?} */ var users = []; if (this.groupUsers) { this.groupUsers.forEach((/** * @param {?} user * @return {?} */ function (user) { users.push(user.idUser); })); } e.component.option('value', users); }; /** * @param {?} field * @param {?} e * @return {?} */ CauseManagementGroupComponent.prototype.setGroupUser = /** * @param {?} field * @param {?} e * @return {?} */ function (field, e) { /** @type {?} */ var groupUser = []; e.value.forEach((/** * @param {?} idUser * @return {?} */ function (idUser) { /** @type {?} */ var groupIndex = (field.data.users || []).findIndex((/** * @param {?} g * @return {?} */ function (g) { return g.idUser === idUser; })); if (groupIndex === -1) { groupUser.push((/** @type {?} */ ({ idUser: idUser, }))); } else { groupUser.push(field.data.users[groupIndex]); } })); field.setValue(JSON.parse(JSON.stringify(groupUser))); }; /** * @param {?} field * @param {?} e * @return {?} */ CauseManagementGroupComponent.prototype.setGroupPermission = /** * @param {?} field * @param {?} e * @return {?} */ function (field, e) { /** @type {?} */ var groupUser = []; e.value.forEach((/** * @param {?} idUser * @return {?} */ function (idUser) { groupUser.push((/** @type {?} */ ({ idUser: idUser, }))); })); field.setValue(JSON.parse(JSON.stringify(groupUser))); }; /** * @param {?} field * @param {?} permission * @param {?} e * @return {?} */ CauseManagementGroupComponent.prototype.getPermissionStatus = /** * @param {?} field * @param {?} permission * @param {?} e * @return {?} */ function (field, permission, e) { /** @type {?} */ var groupPermission = (field.value || []).find((/** * @param {?} p * @return {?} */ function (p) { return p.idModulePermission === permission.id; })); if (groupPermission) { e.component.option('value', groupPermission.isAllowed); } else { e.component.option('value', undefined); } }; /** * @param {?} field * @param {?} permission * @param {?} e * @return {?} */ CauseManagementGroupComponent.prototype.checkBoxToggled = /** * @param {?} field * @param {?} permission * @param {?} e * @return {?} */ function (field, permission, e) { if (e.component.skipOnValueChanged) { e.component.skipOnValueChanged = false; return; } if (e.component.setUndefinedNextTime) { e.component.setUndefinedNextTime = false; e.component.skipOnValueChanged = true; e.component.option('value', undefined); this.setPermissionStatus(field, permission, undefined); return; } if (e.value === false) { e.component.setUndefinedNextTime = true; } this.setPermissionStatus(field, permission, e.value); }; /** * @param {?} e * @return {?} */ CauseManagementGroupComponent.prototype.onRowInserted = /** * @param {?} e * @return {?} */ function (e) { this.saveGroup((/** @type {?} */ (e.data))); }; /** * @param {?} e * @return {?} */ CauseManagementGroupComponent.prototype.onRowUpdated = /** * @param {?} e * @return {?} */ function (e) { this.saveGroup((/** @type {?} */ (e.data))); }; /** * @param {?} e * @return {?} */ CauseManagementGroupComponent.prototype.onRowRemoved = /** * @param {?} e * @return {?} */ function (e) { var _this = this; /** @type {?} */ var group = ((/** @type {?} */ (e.data))); this.managementGroupService.delete(group.id).subscribe((/** * @param {?} data * @return {?} */ function (data) { _this.getGroups(); })); }; /** * @param {?} e * @return {?} */ CauseManagementGroupComponent.prototype.onEditingStart = /** * @param {?} e * @return {?} */ function (e) { this.groupUsers = e.data.users; }; /** * @return {?} */ CauseManagementGroupComponent.prototype.onInitNewRow = /** * @return {?} */ function () { this.groupUsers = []; }; /** * @private * @param {?} field * @param {?} permission * @param {?} value * @return {?} */ CauseManagementGroupComponent.prototype.setPermissionStatus = /** * @private * @param {?} field * @param {?} permission * @param {?} value * @return {?} */ function (field, permission, value) { /** @type {?} */ var groupPermissions = field.value || []; /** @type {?} */ var groupIndex = groupPermissions.findIndex((/** * @param {?} p * @return {?} */ function (p) { return p.idModulePermission === permission.id; })); if (groupIndex > -1) { groupPermissions[groupIndex].isAllowed = value; } else { groupPermissions.push((/** @type {?} */ ({ idModulePermission: permission.id, isAllowed: value, }))); } field.setValue(JSON.parse(JSON.stringify(groupPermissions))); }; /** * @private * @param {?} group * @return {?} */ CauseManagementGroupComponent.prototype.saveGroup = /** * @private * @param {?} group * @return {?} */ function (group) { var _this = this; this.removePermissionUndefined(group); if (group.users) { group.users.forEach((/** * @param {?} userGroup * @return {?} */ function (userGroup) { userGroup.idGroup = group.id; })); } if (group.permissions) { group.permissions.forEach((/** * @param {?} groupPermission * @return {?} */ function (groupPermission) { groupPermission.idGroup = group.id; })); } this.managementGroupService.save(group).subscribe((/** * @return {?} */ function () { _this.getGroups(); })); this.groupUsers = []; }; /** * @private * @param {?} group * @return {?} */ CauseManagementGroupComponent.prototype.removePermissionUndefined = /** * @private * @param {?} group * @return {?} */ function (group) { group.permissions = group.permissions.filter((/** * @param {?} permission * @return {?} */ function (permission) { return permission.isAllowed !== undefined; })); }; /** * @private * @return {?} */ CauseManagementGroupComponent.prototype.getGroups = /** * @private * @return {?} */ function () { var _this = this; this.managementGroupService.getAll().subscribe((/** * @param {?} data * @return {?} */ function (data) { return _this.groups = data; })); }; CauseManagementGroupComponent.decorators = [ { type: Component, args: [{ selector: 'cause-management-group', template: "<cause-dx-data-grid\n keyExpr=\"id\"\n [dataSource]=\"groups\"\n (onRowInserted)=\"onRowInserted($event)\"\n (onInitNewRow)=\"onInitNewRow()\"\n (onRowUpdated)=\"onRowUpdated($event)\"\n (onEditingStart)=\"onEditingStart($event)\"\n (onRowRemoved)=\"onRowRemoved($event)\">\n\n <dxi-column dataField=\"name\" [caption]=\"'management.name' | translate\">\n <dxi-validation-rule type=\"async\" [message]=\"'management.groupNameAlreadyUsed' | translate\" [validationCallback]=\"groupNameAlreadyUsedValidation\"></dxi-validation-rule>\n </dxi-column>\n <dxi-column\n dataField=\"users\"\n [caption]=\"'management.users' | translate\"\n editCellTemplate=\"usersEditTemplate\"\n [calculateCellValue]=\"calculateUsersCellValue\">\n </dxi-column>\n <dxi-column\n dataField=\"permissions\"\n [caption]=\"'management.permissions' | translate\"\n [visible]=\"false\"\n editCellTemplate=\"permissionsEditTemplate\">\n </dxi-column>\n <dxo-export [enabled]=\"false\"></dxo-export>\n <dxo-editing mode=\"popup\" [allowAdding]=\"true\" [allowUpdating]=\"true\" [allowDeleting]=\"true\" [useIcons]=\"true\">\n <dxo-popup [showTitle]=\"true\" [title]=\"'management.group' | translate\" [fullScreen]=\"!showColumn\"></dxo-popup>\n <dxo-form colCount=\"1\" [labelLocation]=\"showColumnXS ? 'left' : 'top'\">\n <dxi-item dataField=\"name\" [isRequired]=\"true\"></dxi-item>\n <dxi-item dataField=\"users\"></dxi-item>\n <dxi-item dataField=\"permissions\"></dxi-item>\n </dxo-form>\n </dxo-editing>\n\n <div *dxTemplate=\"let field of 'usersEditTemplate'\">\n <dx-tag-box\n valueExpr=\"id\"\n [displayExpr]=\"fullName\"\n [dataSource]=\"users\"\n (onInitialized)=\"getGroupUser(field, $event)\"\n (onValueChanged)=\"setGroupUser(field, $event)\">\n </dx-tag-box>\n </div>\n <div *dxTemplate=\"let field of 'permissionsEditTemplate'\">\n <dx-list\n [dataSource]=\"permissions\"\n itemTemplate=\"rowTemplate\"\n [searchEnabled]=\"true\"\n [searchExpr]=\"['name', 'tag']\"\n [hoverStateEnabled]=\"hoverStatePermission\">\n <div *dxTemplate=\"let permission of 'rowTemplate'\">\n <dx-check-box\n [dataSource]=\"[true, false, undefined]\"\n [text]=\"permission.name\"\n (onInitialized)=\"getPermissionStatus(field, permission, $event)\"\n (onValueChanged)=\"checkBoxToggled(field, permission, $event)\">\n </dx-check-box>\n </div>\n </dx-list>\n </div>\n</cause-dx-data-grid>\n", styles: [""] }] } ]; /** @nocollapse */ CauseManagementGroupComponent.ctorParameters = function () { return [ { type: ManagementGroupService }, { type: ManagementUserService }, { type: ManagementPermissionService }, { type: BreakpointObserver } ]; }; CauseManagementGroupComponent.propDecorators = { hoverStatePermission: [{ type: Input }] }; return CauseManagementGroupComponent; }()); export { CauseManagementGroupComponent }; if (false) { /** * @type {?} * @private */ CauseManagementGroupComponent.prototype.groupUsers; /** @type {?} */ CauseManagementGroupComponent.prototype.hoverStatePermission; /** @type {?} */ CauseManagementGroupComponent.prototype.groups; /** @type {?} */ CauseManagementGroupComponent.prototype.users; /** @type {?} */ CauseManagementGroupComponent.prototype.permissions; /** @type {?} */ CauseManagementGroupComponent.prototype.userFullName; /** @type {?} */ CauseManagementGroupComponent.prototype.showColumn; /** @type {?} */ CauseManagementGroupComponent.prototype.showColumnXS; /** @type {?} */ CauseManagementGroupComponent.prototype.translations; /** @type {?} */ CauseManagementGroupComponent.prototype.calculateUsersCellValue; /** @type {?} */ CauseManagementGroupComponent.prototype.groupNameAlreadyUsedValidation; /** * @type {?} * @private */ CauseManagementGroupComponent.prototype.managementGroupService; /** * @type {?} * @private */ CauseManagementGroupComponent.prototype.managementUserService; /** * @type {?} * @private */ CauseManagementGroupComponent.prototype.managementPermissionService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F1c2UtbWFuYWdlbWVudC1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY2F1c2UtOTExL21hbmFnZW1lbnQvIiwic291cmNlcyI6WyJsaWIvY2F1c2UtbWFuYWdlbWVudC1ncm91cC9jYXVzZS1tYW5hZ2VtZW50LWdyb3VwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFNdkQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sNkNBQTZDLENBQUM7QUFDbkYsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFFakYsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sa0RBQWtELENBQUM7QUFDN0YsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDO0lBa0JJLHVDQUNZLHNCQUE4QyxFQUM5QyxxQkFBNEMsRUFDNUMsMkJBQXdELEVBQ2hFLGtCQUFzQztRQUoxQyxpQkFZQztRQVhXLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QyxnQ0FBMkIsR0FBM0IsMkJBQTJCLENBQTZCO1FBWjdELHlCQUFvQixHQUFHLElBQUksQ0FBQztRQUM1QixXQUFNLEdBQWlCLEVBQUUsQ0FBQztRQUMxQixVQUFLLEdBQWdCLEVBQUUsQ0FBQztRQUN4QixnQkFBVyxHQUFzQixFQUFFLENBQUM7UUFDcEMsaUJBQVksR0FBUSxFQUFFLENBQUM7UUFDdkIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFRLEVBQUUsQ0FBQztRQXNJdkIsNEJBQXVCOzs7O1FBQUcsVUFBQyxDQUFDOztn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QyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDekIsQ0FBQzs7Ozs7O0lBRU8saUVBQXlCOzs7OztJQUFqQyxVQUFrQyxLQUFpQjtRQUMvQyxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTTs7OztRQUFDLFVBQUMsVUFBZ0MsSUFBSyxPQUFBLFVBQVUsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFsQyxDQUFrQyxFQUFDLENBQUM7SUFDM0gsQ0FBQzs7Ozs7SUFFTyxpREFBUzs7OztJQUFqQjtRQUFBLGlCQUVDO1FBREcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVM7Ozs7UUFBQyxVQUFBLElBQUksSUFBSSxPQUFBLEtBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFsQixDQUFrQixFQUFDLENBQUM7SUFDL0UsQ0FBQzs7Z0JBM05KLFNBQVMsU0FBQztvQkFDUCxRQUFRLEVBQUUsd0JBQXdCO29CQUNsQywyMkZBQXNEOztpQkFFekQ7Ozs7Z0JBWE8sc0JBQXNCO2dCQUN0QixxQkFBcUI7Z0JBRXJCLDJCQUEyQjtnQkFDM0Isa0JBQWtCOzs7dUNBV3JCLEtBQUs7O0lBb05WLG9DQUFDO0NBQUEsQUE1TkQsSUE0TkM7U0F2TlksNkJBQTZCOzs7Ozs7SUFDdEMsbURBQXdCOztJQUV4Qiw2REFDbUM7O0lBQ25DLCtDQUFpQzs7SUFDakMsOENBQStCOztJQUMvQixvREFBMkM7O0lBQzNDLHFEQUE4Qjs7SUFDOUIsbURBQXlCOztJQUN6QixxREFBMkI7O0lBQzNCLHFEQUE4Qjs7SUFzSTlCLGdFQVdDOztJQVVELHVFQU1DOzs7OztJQTlKRywrREFBc0Q7Ozs7O0lBQ3RELDhEQUFvRDs7Ozs7SUFDcEQsb0VBQWdFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIElucHV0LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAY2F1c2UtOTExL2NvcmUnO1xuaW1wb3J0IHtVc2VyTW9kZWx9IGZyb20gJy4uL3NoYXJlZC9tb2RlbHMvdXNlci1tb2RlbCc7XG5pbXBvcnQge1VzZXJHcm91cE1vZGVsfSBmcm9tICcuLi9zaGFyZWQvbW9kZWxzL3VzZXItZ3JvdXAtbW9kZWwnO1xuaW1wb3J0IHtHcm91cE1vZGVsfSBmcm9tICcuLi9zaGFyZWQvbW9kZWxzL2dyb3VwLW1vZGVsJztcbmltcG9ydCB7R3JvdXBQZXJtaXNzaW9uTW9kZWx9IGZyb20gJy4uL3NoYXJlZC9tb2RlbHMvZ3JvdXAtcGVybWlzc2lvbi1tb2RlbCc7XG5pbXBvcnQge01hbmFnZW1lbnRHcm91cFNlcnZpY2V9IGZyb20gJy4uL3NoYXJlZC9zZXJ2aWNlcy9tYW5hZ2VtZW50LWdyb3VwLnNlcnZpY2UnO1xuaW1wb3J0IHtNYW5hZ2VtZW50VXNlclNlcnZpY2V9IGZyb20gJy4uL3NoYXJlZC9zZXJ2aWNlcy9tYW5hZ2VtZW50LXVzZXIuc2VydmljZSc7XG5pbXBvcnQge1Blcm1pc3Npb25Nb2RlbH0gZnJvbSAnLi4vc2hhcmVkL21vZGVscy9wZXJtaXNzaW9uLW1vZGVsJztcbmltcG9ydCB7TWFuYWdlbWVudFBlcm1pc3Npb25TZXJ2aWNlfSBmcm9tICcuLi9zaGFyZWQvc2VydmljZXMvbWFuYWdlbWVudC1wZXJtaXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtCcmVha3BvaW50T2JzZXJ2ZXJ9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2NhdXNlLW1hbmFnZW1lbnQtZ3JvdXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYXVzZS1tYW5hZ2VtZW50LWdyb3VwLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYXVzZS1tYW5hZ2VtZW50LWdyb3VwLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ2F1c2VNYW5hZ2VtZW50R3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIHByaXZhdGUgZ3JvdXBVc2VyczogYW55O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaG92ZXJTdGF0ZVBlcm1pc3Npb24gPSB0cnVlO1xuICAgIHB1YmxpYyBncm91cHM6IEdyb3VwTW9kZWxbXSA9IFtdO1xuICAgIHB1YmxpYyB1c2VyczogVXNlck1vZGVsW10gPSBbXTtcbiAgICBwdWJsaWMgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25Nb2RlbFtdID0gW107XG4gICAgcHVibGljIHVzZXJGdWxsTmFtZTogYW55ID0ge307XG4gICAgcHVibGljIHNob3dDb2x1bW4gPSB0cnVlO1xuICAgIHB1YmxpYyBzaG93Q29sdW1uWFMgPSB0cnVlO1xuICAgIHB1YmxpYyB0cmFuc2xhdGlvbnM6IGFueSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgbWFuYWdlbWVudEdyb3VwU2VydmljZTogTWFuYWdlbWVudEdyb3VwU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtYW5hZ2VtZW50VXNlclNlcnZpY2U6IE1hbmFnZW1lbnRVc2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtYW5hZ2VtZW50UGVybWlzc2lvblNlcnZpY2U6IE1hbmFnZW1lbnRQZXJtaXNzaW9uU2VydmljZSxcbiAgICAgICAgYnJlYWtwb2ludE9ic2VydmVyOiBCcmVha3BvaW50T2JzZXJ2ZXIsXG4gICAgKSB7XG4gICAgICAgIGJyZWFrcG9pbnRPYnNlcnZlci5vYnNlcnZlKFsnKG1heC13aWR0aDogMTAwMHB4KSddKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0NvbHVtbiA9ICFyZXN1bHQubWF0Y2hlcztcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrcG9pbnRPYnNlcnZlci5vYnNlcnZlKFsnKG1heC13aWR0aDogNjAwcHgpJ10pLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93Q29sdW1uWFMgPSAhcmVzdWx0Lm1hdGNoZXM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VtZW50VXNlclNlcnZpY2UuZ2V0QWxsPFVzZXJNb2RlbD4oKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVzZXJzID0gZGF0YTtcbiAgICAgICAgICAgIHRoaXMudXNlcnMuZm9yRWFjaCh1c2VyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodXNlci5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodXNlci5maXJzdE5hbWUgIT09ICcnICYmIHVzZXIubGFzdE5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJGdWxsTmFtZVt1c2VyLmlkXSAgPSBgJHt1c2VyLmZpcnN0TmFtZX0gJHt1c2VyLmxhc3ROYW1lfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFuYWdlbWVudFBlcm1pc3Npb25TZXJ2aWNlLmdldEFsbCgpLnN1YnNjcmliZShwZXJtaXNzaW9ucyA9PiB7XG4gICAgICAgICAgICBjb25zdCBwZXJtaXNzaW9uSW5kZXggPSBwZXJtaXNzaW9ucy5maW5kSW5kZXgoYyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGMudGFnID09PSAnQ2FuQWNjZXNzUGVybWlzc2lvbnMnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbkluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zLnNwbGljZShwZXJtaXNzaW9uSW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGVybWlzc2lvbnMuc29ydCgoYTogUGVybWlzc2lvbk1vZGVsLCBiOiBQZXJtaXNzaW9uTW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYS5uYW1lIDwgYi5uYW1lKSB7IHJldHVybiAtMTsgfVxuICAgICAgICAgICAgICAgIGlmIChhLm5hbWUgPiBiLm5hbWUpIHsgcmV0dXJuIDE7IH1cbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXRHcm91cHMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZnVsbE5hbWUoZGF0YSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke2RhdGEuZmlyc3ROYW1lfSAke2RhdGEubGFzdE5hbWV9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0R3JvdXBVc2VyKGZpZWxkLCBlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHVzZXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5ncm91cFVzZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwVXNlcnMuZm9yRWFjaCggdXNlciA9PiB7XG4gICAgICAgICAgICAgICAgdXNlcnMucHVzaCh1c2VyLmlkVXNlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJywgdXNlcnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRHcm91cFVzZXIoZmllbGQsIGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZ3JvdXBVc2VyOiBVc2VyR3JvdXBNb2RlbFtdID0gW107XG5cbiAgICAgICAgZS52YWx1ZS5mb3JFYWNoKGlkVXNlciA9PiB7XG4gICAgICAgICAgICBjb25zdCBncm91cEluZGV4ID0gKGZpZWxkLmRhdGEudXNlcnMgfHwgW10pLmZpbmRJbmRleChnID0+IGcuaWRVc2VyID09PSBpZFVzZXIpO1xuXG4gICAgICAgICAgICBpZiAoZ3JvdXBJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBncm91cFVzZXIucHVzaCh7IGlkVXNlciwgfSBhcyBVc2VyR3JvdXBNb2RlbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdyb3VwVXNlci5wdXNoKGZpZWxkLmRhdGEudXNlcnNbZ3JvdXBJbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBmaWVsZC5zZXRWYWx1ZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdyb3VwVXNlcikpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0R3JvdXBQZXJtaXNzaW9uKGZpZWxkLCBlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGdyb3VwVXNlcjogVXNlckdyb3VwTW9kZWxbXSA9IFtdO1xuXG4gICAgICAgIGUudmFsdWUuZm9yRWFjaChpZFVzZXIgPT4ge1xuICAgICAgICAgICAgZ3JvdXBVc2VyLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkVXNlcixcbiAgICAgICAgICAgIH0gYXMgVXNlckdyb3VwTW9kZWwpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmaWVsZC5zZXRWYWx1ZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdyb3VwVXNlcikpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGVybWlzc2lvblN0YXR1cyhmaWVsZCwgcGVybWlzc2lvbiwgZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBncm91cFBlcm1pc3Npb24gPSAoZmllbGQudmFsdWUgfHwgW10pLmZpbmQocCA9PiBwLmlkTW9kdWxlUGVybWlzc2lvbiA9PT0gcGVybWlzc2lvbi5pZCk7XG5cbiAgICAgICAgaWYgKGdyb3VwUGVybWlzc2lvbikge1xuICAgICAgICAgICAgZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScsIGdyb3VwUGVybWlzc2lvbi5pc0FsbG93ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2hlY2tCb3hUb2dnbGVkKGZpZWxkLCBwZXJtaXNzaW9uLCBlKTogdm9pZCB7XG4gICAgICAgIGlmIChlLmNvbXBvbmVudC5za2lwT25WYWx1ZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNraXBPblZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlLmNvbXBvbmVudC5zZXRVbmRlZmluZWROZXh0VGltZSkge1xuICAgICAgICAgICAgZS5jb21wb25lbnQuc2V0VW5kZWZpbmVkTmV4dFRpbWUgPSBmYWxzZTtcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNraXBPblZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICBlLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UGVybWlzc2lvblN0YXR1cyhmaWVsZCwgcGVybWlzc2lvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZS52YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNldFVuZGVmaW5lZE5leHRUaW1lID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0UGVybWlzc2lvblN0YXR1cyhmaWVsZCwgcGVybWlzc2lvbiwgZS52YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUm93SW5zZXJ0ZWQoZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNhdmVHcm91cChlLmRhdGEgYXMgR3JvdXBNb2RlbCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUm93VXBkYXRlZChlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2F2ZUdyb3VwKGUuZGF0YSBhcyBHcm91cE1vZGVsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Sb3dSZW1vdmVkKGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSAoZS5kYXRhIGFzIEdyb3VwTW9kZWwpO1xuICAgICAgICB0aGlzLm1hbmFnZW1lbnRHcm91cFNlcnZpY2UuZGVsZXRlKGdyb3VwLmlkKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldEdyb3VwcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FsY3VsYXRlVXNlcnNDZWxsVmFsdWUgPSAoZSk6IHN0cmluZyA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJzID0gKGUudXNlcnMgPyBlLnVzZXJzIGFzIFVzZXJHcm91cE1vZGVsW10gOiBbXSk7XG4gICAgICAgIGxldCB1c2Vyc05hbWVzOiBhbnlbXSA9IFtdO1xuICAgICAgICB1c2Vycy5mb3JFYWNoKHVzZXIgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXNlckdyb3VwID0gdGhpcy51c2Vycy5maWx0ZXIodSA9PiB1LmlkID09PSB1c2VyLmlkVXNlcik7XG4gICAgICAgICAgICBpZiAodXNlckdyb3VwICYmIHVzZXJHcm91cFswXSkge1xuICAgICAgICAgICAgICAgIHVzZXJzTmFtZXMucHVzaCh1c2VyR3JvdXBbMF0uZmlyc3ROYW1lICsgJyAnICsgdXNlckdyb3VwWzBdLmxhc3ROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHVzZXJzTmFtZXMgPSB1c2Vyc05hbWVzLnNvcnQoKG9uZSwgdHdvKSA9PiAob25lIDwgdHdvID8gLTEgOiAxKSk7XG4gICAgICAgIHJldHVybiB1c2Vyc05hbWVzLmpvaW4oJywgJyk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRWRpdGluZ1N0YXJ0KGU6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmdyb3VwVXNlcnMgPSBlLmRhdGEudXNlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSW5pdE5ld1JvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ncm91cFVzZXJzID0gW107XG4gICAgfVxuXG4gICAgcHVibGljIGdyb3VwTmFtZUFscmVhZHlVc2VkVmFsaWRhdGlvbiA9IChlKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZW1lbnRHcm91cFNlcnZpY2UuaGFzRXhpc3RpbmdHcm91cE5hbWUoZS5kYXRhKS5waXBlKFxuICAgICAgICAgICAgbWFwKChleGlzdDogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAhZXhpc3Q7XG4gICAgICAgICAgICB9KVxuICAgICAgICApLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0UGVybWlzc2lvblN0YXR1cyhmaWVsZDogYW55LCBwZXJtaXNzaW9uLCB2YWx1ZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBncm91cFBlcm1pc3Npb25zID0gZmllbGQudmFsdWUgfHwgW107XG4gICAgICAgIGNvbnN0IGdyb3VwSW5kZXggPSBncm91cFBlcm1pc3Npb25zLmZpbmRJbmRleChwID0+IHAuaWRNb2R1bGVQZXJtaXNzaW9uID09PSBwZXJtaXNzaW9uLmlkKTtcblxuICAgICAgICBpZiAoZ3JvdXBJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBncm91cFBlcm1pc3Npb25zW2dyb3VwSW5kZXhdLmlzQWxsb3dlZCA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ3JvdXBQZXJtaXNzaW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZE1vZHVsZVBlcm1pc3Npb246IHBlcm1pc3Npb24uaWQsXG4gICAgICAgICAgICAgICAgaXNBbGxvd2VkOiB2YWx1ZSxcbiAgICAgICAgICAgIH0gYXMgR3JvdXBQZXJtaXNzaW9uTW9kZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgZmllbGQuc2V0VmFsdWUoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShncm91cFBlcm1pc3Npb25zKSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZUdyb3VwKGdyb3VwOiBHcm91cE1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVtb3ZlUGVybWlzc2lvblVuZGVmaW5lZChncm91cCk7XG4gICAgICAgIGlmIChncm91cC51c2Vycykge1xuICAgICAgICAgICAgZ3JvdXAudXNlcnMuZm9yRWFjaCgodXNlckdyb3VwOiBVc2VyR3JvdXBNb2RlbCkgPT4ge1xuICAgICAgICAgICAgICAgIHVzZXJHcm91cC5pZEdyb3VwID0gZ3JvdXAuaWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ3JvdXAucGVybWlzc2lvbnMpIHtcbiAgICAgICAgICAgIGdyb3VwLnBlcm1pc3Npb25zLmZvckVhY2goKGdyb3VwUGVybWlzc2lvbjogR3JvdXBQZXJtaXNzaW9uTW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICBncm91cFBlcm1pc3Npb24uaWRHcm91cCA9IGdyb3VwLmlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYW5hZ2VtZW50R3JvdXBTZXJ2aWNlLnNhdmUoZ3JvdXApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldEdyb3VwcygpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ncm91cFVzZXJzID0gW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVQZXJtaXNzaW9uVW5kZWZpbmVkKGdyb3VwOiBHcm91cE1vZGVsKTogdm9pZCB7XG4gICAgICAgIGdyb3VwLnBlcm1pc3Npb25zID0gZ3JvdXAucGVybWlzc2lvbnMuZmlsdGVyKChwZXJtaXNzaW9uOiBHcm91cFBlcm1pc3Npb25Nb2RlbCkgPT4gcGVybWlzc2lvbi5pc0FsbG93ZWQgIT09IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRHcm91cHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFuYWdlbWVudEdyb3VwU2VydmljZS5nZXRBbGwoKS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLmdyb3VwcyA9IGRhdGEpO1xuICAgIH1cbn1cbiJdfQ==