@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
120 lines • 19.8 kB
JavaScript
import { Injectable } from '@angular/core';
import { AuthenticationModule } from '../../authentication/authentication.module';
import * as i0 from "@angular/core";
import * as i1 from "../../routing/redirect-service/redirect.service";
import * as i2 from "../../user/services/user.service";
import * as i3 from "../../configuration/configuration.service";
import * as i4 from "../../logger/services/logger.service";
export class RoleGuardService {
_redirectService;
_userService;
_configService;
_log;
_loginUrl;
constructor(_redirectService, _userService, _configService, _log) {
this._redirectService = _redirectService;
this._userService = _userService;
this._configService = _configService;
this._log = _log;
this._loginUrl = this._redirectService.resolveLoginPath();
}
canActivate(route, state) {
this._redirectService.intendedRoute = route;
const view = this._configService.getViewByUrl(state.url.toString());
return this.canAccessView(view, state.url.toString());
}
canAccessView(view, url) {
if (typeof view.access !== 'string' && (view.access.hasOwnProperty('role') || view.access.hasOwnProperty('bannedRole'))) {
if (view.access.hasOwnProperty('role') && view.access.hasOwnProperty('bannedRole')) {
const bannedRoles = this.parseRoleConstraints(view.access.bannedRole, url);
const allowedRoles = this.parseRoleConstraints(view.access.role, url);
if (bannedRoles.some(role => this.decideAccessByRole(role))) {
return false;
}
if (allowedRoles.length === 0) {
this._log.warn(`View at '${url}' defines role access constraint with an empty array!`
+ ` No users will be allowed to enter this view!`);
}
return allowedRoles.some(role => this.decideAccessByRole(role)); // user was not denied access by a banned role, they need at least one allowed role
}
if (view.access.hasOwnProperty('bannedRole')) {
const bannedRoles = this.parseRoleConstraints(view.access.bannedRole, url);
return !bannedRoles.some(constraint => {
return this.decideAccessByRole(constraint);
});
}
if (view.access.hasOwnProperty('role')) {
const allowedRoles = this.parseRoleConstraints(view.access.role, url);
if (allowedRoles.length === 0) {
this._log.warn(`View at '${url}' defines role access constraint with an empty array!`
+ ` No users will be allowed to enter this view!`);
}
return allowedRoles.some(constraint => {
return this.decideAccessByRole(constraint);
});
}
}
throw new Error('Role guard is declared for a view with no role guard configuration!'
+ ` Add role guard configuration for view at ${url}, or remove the guard.`);
}
parseRoleConstraints(roleConstrains, viewUrl) {
if (typeof roleConstrains === 'string') {
return this.parseStringRoleConstraints(roleConstrains);
}
if (Array.isArray(roleConstrains)) {
if (roleConstrains.length === 0) {
return [];
}
if (typeof roleConstrains[0] === 'string') {
return this.parseStringRoleConstraints(roleConstrains);
}
}
return this.parseObjectRoleConstrains(roleConstrains);
}
/**
* @deprecated in 5.0.0
*/
parseStringRoleConstraints(roleConstrains) {
if (!Array.isArray(roleConstrains)) {
roleConstrains = [roleConstrains];
}
this._log.warn('Using string role guard configuration is deprecated! Migrate to object based configuration instead.');
return roleConstrains.map(constraint => {
const splitRoleArray = constraint.split('.');
if (splitRoleArray.length === 2) {
return { processIdentifier: splitRoleArray[0], roleName: splitRoleArray[1] };
}
else {
throw new Error('Please enter the correct format <net import id>.<role name>');
}
});
}
parseObjectRoleConstrains(roleConstrains) {
if (!Array.isArray(roleConstrains)) {
roleConstrains = [roleConstrains];
}
return roleConstrains.map(constraint => {
if (!constraint.roleId || !constraint.processId) {
throw new Error('Please enter both process and role id for a role constraint: ' + constraint);
}
return { processIdentifier: constraint.processId, roleIdentifier: constraint.roleId };
});
}
decideAccessByRole(constraint) {
if (constraint.roleIdentifier) {
return this._userService.hasRoleByIdentifier(constraint.roleIdentifier, constraint.processIdentifier);
}
else {
return this._userService.hasRoleByName(constraint.roleName, constraint.processIdentifier);
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RoleGuardService, deps: [{ token: i1.RedirectService }, { token: i2.UserService }, { token: i3.ConfigurationService }, { token: i4.LoggerService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RoleGuardService, providedIn: AuthenticationModule });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RoleGuardService, decorators: [{
type: Injectable,
args: [{
providedIn: AuthenticationModule
}]
}], ctorParameters: () => [{ type: i1.RedirectService }, { type: i2.UserService }, { type: i3.ConfigurationService }, { type: i4.LoggerService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1ndWFyZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi9hdXRob3JpemF0aW9uL3JvbGUvcm9sZS1ndWFyZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHekMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNENBQTRDLENBQUM7Ozs7OztBQWlCaEYsTUFBTSxPQUFPLGdCQUFnQjtJQUlIO0lBQ0E7SUFDQTtJQUNBO0lBTEwsU0FBUyxDQUFTO0lBRW5DLFlBQXNCLGdCQUFpQyxFQUNqQyxZQUF5QixFQUN6QixjQUFvQyxFQUNwQyxJQUFtQjtRQUhuQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBQ2pDLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBQ3pCLG1CQUFjLEdBQWQsY0FBYyxDQUFzQjtRQUNwQyxTQUFJLEdBQUosSUFBSSxDQUFlO1FBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUE2QixFQUM3QixLQUEwQjtRQUNsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUM1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDcEUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVNLGFBQWEsQ0FBQyxJQUFVLEVBQUUsR0FBVztRQUN4QyxJQUFJLE9BQU8s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LENBQUM7YUFDakc7WUFDRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBQyxDQUFDO1FBQ3hGLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFVBQTBCO1FBQ2pELElBQUksVUFBVSxDQUFDLGNBQWMsRUFBRTtZQUMzQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUN6RzthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQzdGO0lBQ0wsQ0FBQzt3R0FoSFEsZ0JBQWdCOzRHQUFoQixnQkFBZ0IsY0FGYixvQkFBb0I7OzRGQUV2QixnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLG9CQUFvQjtpQkFDbkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBDYW5BY3RpdmF0ZSwgUm91dGVyU3RhdGVTbmFwc2hvdCwgVXJsVHJlZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7VXNlclNlcnZpY2V9IGZyb20gJy4uLy4uL3VzZXIvc2VydmljZXMvdXNlci5zZXJ2aWNlJztcbmltcG9ydCB7QXV0aGVudGljYXRpb25Nb2R1bGV9IGZyb20gJy4uLy4uL2F1dGhlbnRpY2F0aW9uL2F1dGhlbnRpY2F0aW9uLm1vZHVsZSc7XG5pbXBvcnQge1JlZGlyZWN0U2VydmljZX0gZnJvbSAnLi4vLi4vcm91dGluZy9yZWRpcmVjdC1zZXJ2aWNlL3JlZGlyZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHtDb25maWd1cmF0aW9uU2VydmljZX0gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtBY2Nlc3MsIFJvbGVBY2Nlc3MsIFZpZXd9IGZyb20gJy4uLy4uLy4uL2NvbW1vbnMvc2NoZW1hJztcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vbG9nZ2VyL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5cblxuaW50ZXJmYWNlIFJvbGVDb25zdHJhaW50IHtcbiAgICBwcm9jZXNzSWRlbnRpZmllcjogc3RyaW5nO1xuICAgIHJvbGVJZGVudGlmaWVyPzogc3RyaW5nO1xuICAgIHJvbGVOYW1lPzogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogQXV0aGVudGljYXRpb25Nb2R1bGVcbn0pXG5leHBvcnQgY2xhc3MgUm9sZUd1YXJkU2VydmljZSBpbXBsZW1lbnRzIENhbkFjdGl2YXRlIHtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2luVXJsOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX3JlZGlyZWN0U2VydmljZTogUmVkaXJlY3RTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfY29uZmlnU2VydmljZTogQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5fbG9naW5VcmwgPSB0aGlzLl9yZWRpcmVjdFNlcnZpY2UucmVzb2x2ZUxvZ2luUGF0aCgpO1xuICAgIH1cblxuICAgIGNhbkFjdGl2YXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICAgICAgICAgICAgICAgIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT4gfCBQcm9taXNlPGJvb2xlYW4gfCBVcmxUcmVlPiB8IGJvb2xlYW4gfCBVcmxUcmVlIHtcbiAgICAgICAgdGhpcy5fcmVkaXJlY3RTZXJ2aWNlLmludGVuZGVkUm91dGUgPSByb3V0ZTtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMuX2NvbmZpZ1NlcnZpY2UuZ2V0Vmlld0J5VXJsKHN0YXRlLnVybC50b1N0cmluZygpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuQWNjZXNzVmlldyh2aWV3LCBzdGF0ZS51cmwudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbkFjY2Vzc1ZpZXcodmlldzogVmlldywgdXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2aWV3LmFjY2VzcyAhPT0gJ3N0cmluZycgJiYgKHZpZXcuYWNjZXNzLmhhc093blByb3BlcnR5KCdyb2xlJykgfHwgdmlldy5hY2Nlc3MuaGFzT3duUHJvcGVydHkoJ2Jhbm5lZFJvbGUnKSkpIHtcblxuICAgICAgICAgICAgaWYgKHZpZXcuYWNjZXNzLmhhc093blByb3BlcnR5KCdyb2xlJykgJiYgdmlldy5hY2Nlc3MuaGFzT3duUHJvcGVydHkoJ2Jhbm5lZFJvbGUnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhbm5lZFJvbGVzID0gdGhpcy5wYXJzZVJvbGVDb25zdHJhaW50cyh2aWV3LmFjY2Vzcy5iYW5uZWRSb2xlLCB1cmwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFsbG93ZWRSb2xlcyA9IHRoaXMucGFyc2VSb2xlQ29uc3RyYWludHModmlldy5hY2Nlc3Mucm9sZSwgdXJsKTtcblxuICAgICAgICAgICAgICAgIGlmIChiYW5uZWRSb2xlcy5zb21lKHJvbGUgPT4gdGhpcy5kZWNpZGVBY2Nlc3NCeVJvbGUocm9sZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cud2FybihgVmlldyBhdCAnJHt1cmx9JyBkZWZpbmVzIHJvbGUgYWNjZXNzIGNvbnN0cmFpbnQgd2l0aCBhbiBlbXB0eSBhcnJheSFgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGAgTm8gdXNlcnMgd2lsbCBiZSBhbGxvd2VkIHRvIGVudGVyIHRoaXMgdmlldyFgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93ZWRSb2xlcy5zb21lKHJvbGUgPT4gdGhpcy5kZWNpZGVBY2Nlc3NCeVJvbGUocm9sZSkpOyAvLyB1c2VyIHdhcyBub3QgZGVuaWVkIGFjY2VzcyBieSBhIGJhbm5lZCByb2xlLCB0aGV5IG5lZWQgYXQgbGVhc3Qgb25lIGFsbG93ZWQgcm9sZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmlldy5hY2Nlc3MuaGFzT3duUHJvcGVydHkoJ2Jhbm5lZFJvbGUnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhbm5lZFJvbGVzID0gdGhpcy5wYXJzZVJvbGVDb25zdHJhaW50cyh2aWV3LmFjY2Vzcy5iYW5uZWRSb2xlLCB1cmwpO1xuICAgICAgICAgICAgICAgIHJldHVybiAhYmFubmVkUm9sZXMuc29tZShjb25zdHJhaW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjaWRlQWNjZXNzQnlSb2xlKGNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmlldy5hY2Nlc3MuaGFzT3duUHJvcGVydHkoJ3JvbGUnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFsbG93ZWRSb2xlcyA9IHRoaXMucGFyc2VSb2xlQ29uc3RyYWludHModmlldy5hY2Nlc3Mucm9sZSwgdXJsKTtcbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cud2FybihgVmlldyBhdCAnJHt1cmx9JyBkZWZpbmVzIHJvbGUgYWNjZXNzIGNvbnN0cmFpbnQgd2l0aCBhbiBlbXB0eSBhcnJheSFgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGAgTm8gdXNlcnMgd2lsbCBiZSBhbGxvd2VkIHRvIGVudGVyIHRoaXMgdmlldyFgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93ZWRSb2xlcy5zb21lKGNvbnN0cmFpbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNpZGVBY2Nlc3NCeVJvbGUoY29uc3RyYWludCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSb2xlIGd1YXJkIGlzIGRlY2xhcmVkIGZvciBhIHZpZXcgd2l0aCBubyByb2xlIGd1YXJkIGNvbmZpZ3VyYXRpb24hJ1xuICAgICAgICAgICAgKyBgIEFkZCByb2xlIGd1YXJkIGNvbmZpZ3VyYXRpb24gZm9yIHZpZXcgYXQgJHt1cmx9LCBvciByZW1vdmUgdGhlIGd1YXJkLmApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwYXJzZVJvbGVDb25zdHJhaW50cyhyb2xlQ29uc3RyYWluczogQWNjZXNzWydyb2xlJ10gfCBBY2Nlc3NbJ2Jhbm5lZFJvbGUnXSwgdmlld1VybDogc3RyaW5nKTogQXJyYXk8Um9sZUNvbnN0cmFpbnQ+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByb2xlQ29uc3RyYWlucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlU3RyaW5nUm9sZUNvbnN0cmFpbnRzKHJvbGVDb25zdHJhaW5zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb2xlQ29uc3RyYWlucykpIHtcbiAgICAgICAgICAgIGlmIChyb2xlQ29uc3RyYWlucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJvbGVDb25zdHJhaW5zWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlU3RyaW5nUm9sZUNvbnN0cmFpbnRzKHJvbGVDb25zdHJhaW5zIGFzIEFycmF5PHN0cmluZz4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlT2JqZWN0Um9sZUNvbnN0cmFpbnMocm9sZUNvbnN0cmFpbnMgYXMgUm9sZUFjY2VzcyB8IEFycmF5PFJvbGVBY2Nlc3M+KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiA1LjAuMFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwYXJzZVN0cmluZ1JvbGVDb25zdHJhaW50cyhyb2xlQ29uc3RyYWluczogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPik6IEFycmF5PFJvbGVDb25zdHJhaW50PiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyb2xlQ29uc3RyYWlucykpIHtcbiAgICAgICAgICAgIHJvbGVDb25zdHJhaW5zID0gW3JvbGVDb25zdHJhaW5zXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvZy53YXJuKCdVc2luZyBzdHJpbmcgcm9sZSBndWFyZCBjb25maWd1cmF0aW9uIGlzIGRlcHJlY2F0ZWQhIE1pZ3JhdGUgdG8gb2JqZWN0IGJhc2VkIGNvbmZpZ3VyYXRpb24gaW5zdGVhZC4nKTtcblxuICAgICAgICByZXR1cm4gcm9sZUNvbnN0cmFpbnMubWFwKGNvbnN0cmFpbnQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3BsaXRSb2xlQXJyYXkgPSBjb25zdHJhaW50LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBpZiAoc3BsaXRSb2xlQXJyYXkubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtwcm9jZXNzSWRlbnRpZmllcjogc3BsaXRSb2xlQXJyYXlbMF0sIHJvbGVOYW1lOiBzcGxpdFJvbGVBcnJheVsxXX07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIGVudGVyIHRoZSBjb3JyZWN0IGZvcm1hdCA8bmV0IGltcG9ydCBpZD4uPHJvbGUgbmFtZT4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHBhcnNlT2JqZWN0Um9sZUNvbnN0cmFpbnMocm9sZUNvbnN0cmFpbnM6IFJvbGVBY2Nlc3MgfCBBcnJheTxSb2xlQWNjZXNzPik6IEFycmF5PFJvbGVDb25zdHJhaW50PiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyb2xlQ29uc3RyYWlucykpIHtcbiAgICAgICAgICAgIHJvbGVDb25zdHJhaW5zID0gW3JvbGVDb25zdHJhaW5zXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByb2xlQ29uc3RyYWlucy5tYXAoY29uc3RyYWludCA9PiB7XG4gICAgICAgICAgICBpZiAoIWNvbnN0cmFpbnQucm9sZUlkIHx8ICFjb25zdHJhaW50LnByb2Nlc3NJZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIGVudGVyIGJvdGggcHJvY2VzcyBhbmQgcm9sZSBpZCBmb3IgYSByb2xlIGNvbnN0cmFpbnQ6ICcgKyBjb25zdHJhaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7cHJvY2Vzc0lkZW50aWZpZXI6IGNvbnN0cmFpbnQucHJvY2Vzc0lkLCByb2xlSWRlbnRpZmllcjogY29uc3RyYWludC5yb2xlSWR9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlY2lkZUFjY2Vzc0J5Um9sZShjb25zdHJhaW50OiBSb2xlQ29uc3RyYWludCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoY29uc3RyYWludC5yb2xlSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJTZXJ2aWNlLmhhc1JvbGVCeUlkZW50aWZpZXIoY29uc3RyYWludC5yb2xlSWRlbnRpZmllciwgY29uc3RyYWludC5wcm9jZXNzSWRlbnRpZmllcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXNlclNlcnZpY2UuaGFzUm9sZUJ5TmFtZShjb25zdHJhaW50LnJvbGVOYW1lLCBjb25zdHJhaW50LnByb2Nlc3NJZGVudGlmaWVyKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIl19