UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

126 lines 19.2 kB
import { TemplateType } from '../sso-configuration.model'; import { at, get, head, isUndefined, map, reject } from 'lodash-es'; import { GrantType, TenantLoginOptionType, UserManagementSource } from '@c8y/client'; import { RequestConfiguration } from '../template-parts/request-configuration.model'; import { Injectable } from '@angular/core'; import { ExternalToken } from '../template-parts/external-token-config.model'; import * as i0 from "@angular/core"; export class KeyCloakConfigurationMapper { constructor() { this.urlPattern = /^(.+)\/auth\/realms\/((.+?))$/; } mapFrom(templateModel) { const ssoConfiguration = { template: TemplateType.KEYCLOAK, buttonName: templateModel.buttonName, userIdConfig: templateModel.userIdConfig, userManagementSource: UserManagementSource.REMOTE, type: TenantLoginOptionType.OAUTH2, onNewUser: templateModel.onNewUser, issuer: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}`, redirectToPlatform: templateModel.redirectToPlatform || null, providerName: 'keycloak', audience: templateModel.audience, clientId: templateModel.clientId, logoutRequest: templateModel.logoutRequest.toRequest(), visibleOnLoginPage: templateModel.visibleOnLoginPage, signatureVerificationConfig: { jwks: { jwksUri: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/certs` } }, tokenRequest: { headers: {}, method: 'POST', requestParams: {}, operation: 'EXECUTE', url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/token`, body: 'grant_type=authorization_code&code=${code}&redirect_uri=${redirectUri}&client_id=${clientId}&client_secret=' + templateModel.clientSecret }, authorizationRequest: { headers: {}, method: 'GET', requestParams: { scope: templateModel.scopeId, client_id: '${clientId}', redirect_uri: '${redirectUri}', response_type: 'code' }, operation: 'REDIRECT', url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/auth`, body: '' }, refreshRequest: { headers: {}, method: 'POST', requestParams: { client_id: '${clientId}', redirect_uri: '${redirectUri}', response_type: 'refresh' }, operation: 'EXECUTE', url: `${templateModel.keyCloakAddress}/auth/realms/${templateModel.realmName}/protocol/openid-connect/token`, body: 'grant_type=refresh_token&refresh_token=${refreshToken}&client_id=${clientId}&client_secret=' + templateModel.clientSecret }, grantType: GrantType.AUTHORIZATION_CODE, accessTokenToUserDataMappings: templateModel.accessTokenToUserDataMappings, externalTokenConfig: templateModel.externalTokenConfig.toExternalTokenConfig(), useIdToken: templateModel.useIdToken }; return ssoConfiguration; } mapTo(ssoConfiguration) { return { keyCloakAddress: this.getKeyCloakAddressFromUrl(ssoConfiguration.issuer), realmName: this.getRealmName(ssoConfiguration.issuer), clientId: ssoConfiguration.clientId, clientSecret: this.getClientSecret(ssoConfiguration), scopeId: this.getScopeId(ssoConfiguration), buttonName: ssoConfiguration.buttonName, userIdConfig: ssoConfiguration.userIdConfig, onNewUser: ssoConfiguration.onNewUser, redirectToPlatform: ssoConfiguration.redirectToPlatform, audience: ssoConfiguration.audience, logoutRequest: new RequestConfiguration(ssoConfiguration.logoutRequest), visibleOnLoginPage: ssoConfiguration.visibleOnLoginPage, accessTokenToUserDataMappings: ssoConfiguration.accessTokenToUserDataMappings, externalTokenConfig: new ExternalToken(ssoConfiguration.externalTokenConfig), useIdToken: ssoConfiguration.useIdToken }; } getKeyCloakAddressFromUrl(url) { const [, keyCloakAddress] = (url || '').match(this.urlPattern) || []; return keyCloakAddress; } getRealmName(url) { const [, , realmName] = (url || '').match(this.urlPattern) || []; return realmName; } getClientSecret(ssoConfiguration) { const bodies = at(ssoConfiguration, ['tokenRequest.body', 'refreshRequest.body']); const clientSecrets = map(bodies, body => this.getClientSecretFromBody(body)); const clientSecret = this.getFirstDefined(clientSecrets); return clientSecret ? decodeURIComponent(clientSecret) : ''; } getClientSecretFromBody(body) { const [, clientSecret] = (body || '').match(/client_secret=([^&]+)/) || []; return clientSecret; } getFirstDefined(values) { return head(reject(values, isUndefined)); } getScopeId(ssoConfiguration) { return get(ssoConfiguration, 'authorizationRequest.requestParams.scope', ''); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyCloakConfigurationMapper, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyCloakConfigurationMapper, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyCloakConfigurationMapper, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LWNsb2FrLWNvbmZpZ3VyYXRpb24tbWFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vYXV0aC1jb25maWd1cmF0aW9uL3Nzby1jb25maWd1cmF0aW9uL3RlbXBsYXRlcy9rZXktY2xvYWstY29uZmlndXJhdGlvbi1tYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFvQixZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQzs7QUFLOUUsTUFBTSxPQUFPLDJCQUEyQjtJQUh4QztRQUlVLGVBQVUsR0FBRywrQkFBK0IsQ0FBQztLQW9IdEQ7SUFsSEMsT0FBTyxDQUFDLGFBQW9DO1FBQzFDLE1BQU0sZ0JBQWdCLEdBQXFCO1lBQ3pDLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUTtZQUMvQixVQUFVLEVBQUUsYUFBYSxDQUFDLFVBQVU7WUFDcEMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxZQUFZO1lBQ3hDLG9CQUFvQixFQUFFLG9CQUFvQixDQUFDLE1BQU07WUFDakQsSUFBSSxFQUFFLHFCQUFxQixDQUFDLE1BQU07WUFDbEMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxTQUFTO1lBQ2xDLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxlQUFlLGdCQUFnQixhQUFhLENBQUMsU0FBUyxFQUFFO1lB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dUIsQ0FBQyxJQUFJO1FBQ2xDLE1BQU0sQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRSxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU8sZUFBZSxDQUFDLE1BQU07UUFDNUIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTyxVQUFVLENBQUMsZ0JBQWdCO1FBQ2pDLE9BQU8sR0FBRyxDQUFDLGdCQUFnQixFQUFFLDBDQUEwQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLENBQUM7K0dBcEhVLDJCQUEyQjttSEFBM0IsMkJBQTJCLGNBRjFCLE1BQU07OzRGQUVQLDJCQUEyQjtrQkFIdkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTc29Db25maWd1cmF0aW9uTWFwcGVyIH0gZnJvbSAnLi9zc28tY29uZmlndXJhdGlvbi5tYXBwZXInO1xuaW1wb3J0IHsgS2V5Q2xvYWtDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9rZXktY2xvYWsubW9kZWwnO1xuaW1wb3J0IHsgU3NvQ29uZmlndXJhdGlvbiwgVGVtcGxhdGVUeXBlIH0gZnJvbSAnLi4vc3NvLWNvbmZpZ3VyYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgYXQsIGdldCwgaGVhZCwgaXNVbmRlZmluZWQsIG1hcCwgcmVqZWN0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEdyYW50VHlwZSwgVGVuYW50TG9naW5PcHRpb25UeXBlLCBVc2VyTWFuYWdlbWVudFNvdXJjZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IFJlcXVlc3RDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vdGVtcGxhdGUtcGFydHMvcmVxdWVzdC1jb25maWd1cmF0aW9uLm1vZGVsJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV4dGVybmFsVG9rZW4gfSBmcm9tICcuLi90ZW1wbGF0ZS1wYXJ0cy9leHRlcm5hbC10b2tlbi1jb25maWcubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBLZXlDbG9ha0NvbmZpZ3VyYXRpb25NYXBwZXIgaW1wbGVtZW50cyBTc29Db25maWd1cmF0aW9uTWFwcGVyPEtleUNsb2FrQ29uZmlndXJhdGlvbj4ge1xuICBwcml2YXRlIHVybFBhdHRlcm4gPSAvXiguKylcXC9hdXRoXFwvcmVhbG1zXFwvKCguKz8pKSQvO1xuXG4gIG1hcEZyb20odGVtcGxhdGVNb2RlbDogS2V5Q2xvYWtDb25maWd1cmF0aW9uKTogU3NvQ29uZmlndXJhdGlvbiB7XG4gICAgY29uc3Qgc3NvQ29uZmlndXJhdGlvbjogU3NvQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgIHRlbXBsYXRlOiBUZW1wbGF0ZVR5cGUuS0VZQ0xPQUssXG4gICAgICBidXR0b25OYW1lOiB0ZW1wbGF0ZU1vZGVsLmJ1dHRvbk5hbWUsXG4gICAgICB1c2VySWRDb25maWc6IHRlbXBsYXRlTW9kZWwudXNlcklkQ29uZmlnLFxuICAgICAgdXNlck1hbmFnZW1lbnRTb3VyY2U6IFVzZXJNYW5hZ2VtZW50U291cmNlLlJFTU9URSxcbiAgICAgIHR5cGU6IFRlbmFudExvZ2luT3B0aW9uVHlwZS5PQVVUSDIsXG4gICAgICBvbk5ld1VzZXI6IHRlbXBsYXRlTW9kZWwub25OZXdVc2VyLFxuICAgICAgaXNzdWVyOiBgJHt0ZW1wbGF0ZU1vZGVsLmtleUNsb2FrQWRkcmVzc30vYXV0aC9yZWFsbXMvJHt0ZW1wbGF0ZU1vZGVsLnJlYWxtTmFtZX1gLFxuICAgICAgcmVkaXJlY3RUb1BsYXRmb3JtOiB0ZW1wbGF0ZU1vZGVsLnJlZGlyZWN0VG9QbGF0Zm9ybSB8fCBudWxsLFxuICAgICAgcHJvdmlkZXJOYW1lOiAna2V5Y2xvYWsnLFxuICAgICAgYXVkaWVuY2U6IHRlbXBsYXRlTW9kZWwuYXVkaWVuY2UsXG4gICAgICBjbGllbnRJZDogdGVtcGxhdGVNb2RlbC5jbGllbnRJZCxcbiAgICAgIGxvZ291dFJlcXVlc3Q6IHRlbXBsYXRlTW9kZWwubG9nb3V0UmVxdWVzdC50b1JlcXVlc3QoKSxcbiAgICAgIHZpc2libGVPbkxvZ2luUGFnZTogdGVtcGxhdGVNb2RlbC52aXNpYmxlT25Mb2dpblBhZ2UsXG4gICAgICBzaWduYXR1cmVWZXJpZmljYXRpb25Db25maWc6IHtcbiAgICAgICAgandrczoge1xuICAgICAgICAgIGp3a3NVcmk6IGAke3RlbXBsYXRlTW9kZWwua2V5Q2xvYWtBZGRyZXNzfS9hdXRoL3JlYWxtcy8ke3RlbXBsYXRlTW9kZWwucmVhbG1OYW1lfS9wcm90b2NvbC9vcGVuaWQtY29ubmVjdC9jZXJ0c2BcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRva2VuUmVxdWVzdDoge1xuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIHJlcXVlc3RQYXJhbXM6IHt9LFxuICAgICAgICBvcGVyYXRpb246ICdFWEVDVVRFJyxcbiAgICAgICAgdXJsOiBgJHt0ZW1wbGF0ZU1vZGVsLmtleUNsb2FrQWRkcmVzc30vYXV0aC9yZWFsbXMvJHt0ZW1wbGF0ZU1vZGVsLnJlYWxtTmFtZX0vcHJvdG9jb2wvb3BlbmlkLWNvbm5lY3QvdG9rZW5gLFxuICAgICAgICBib2R5OlxuICAgICAgICAgICdncmFudF90eXBlPWF1dGhvcml6YXRpb25fY29kZSZjb2RlPSR7Y29kZX0mcmVkaXJlY3RfdXJpPSR7cmVkaXJlY3RVcml9JmNsaWVudF9pZD0ke2NsaWVudElkfSZjbGllbnRfc2VjcmV0PScgK1xuICAgICAgICAgIHRlbXBsYXRlTW9kZWwuY2xpZW50U2VjcmV0XG4gICAgICB9LFxuICAgICAgYXV0aG9yaXphdGlvblJlcXVlc3Q6IHtcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHJlcXVlc3RQYXJhbXM6IHtcbiAgICAgICAgICBzY29wZTogdGVtcGxhdGVNb2RlbC5zY29wZUlkLFxuICAgICAgICAgIGNsaWVudF9pZDogJyR7Y2xpZW50SWR9JyxcbiAgICAgICAgICByZWRpcmVjdF91cmk6ICcke3JlZGlyZWN0VXJpfScsXG4gICAgICAgICAgcmVzcG9uc2VfdHlwZTogJ2NvZGUnXG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbjogJ1JFRElSRUNUJyxcbiAgICAgICAgdXJsOiBgJHt0ZW1wbGF0ZU1vZGVsLmtleUNsb2FrQWRkcmVzc30vYXV0aC9yZWFsbXMvJHt0ZW1wbGF0ZU1vZGVsLnJlYWxtTmFtZX0vcHJvdG9jb2wvb3BlbmlkLWNvbm5lY3QvYXV0aGAsXG4gICAgICAgIGJvZHk6ICcnXG4gICAgICB9LFxuICAgICAgcmVmcmVzaFJlcXVlc3Q6IHtcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICByZXF1ZXN0UGFyYW1zOiB7XG4gICAgICAgICAgY2xpZW50X2lkOiAnJHtjbGllbnRJZH0nLFxuICAgICAgICAgIHJlZGlyZWN0X3VyaTogJyR7cmVkaXJlY3RVcml9JyxcbiAgICAgICAgICByZXNwb25zZV90eXBlOiAncmVmcmVzaCdcbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uOiAnRVhFQ1VURScsXG4gICAgICAgIHVybDogYCR7dGVtcGxhdGVNb2RlbC5rZXlDbG9ha0FkZHJlc3N9L2F1dGgvcmVhbG1zLyR7dGVtcGxhdGVNb2RlbC5yZWFsbU5hbWV9L3Byb3RvY29sL29wZW5pZC1jb25uZWN0L3Rva2VuYCxcbiAgICAgICAgYm9keTpcbiAgICAgICAgICAnZ3JhbnRfdHlwZT1yZWZyZXNoX3Rva2VuJnJlZnJlc2hfdG9rZW49JHtyZWZyZXNoVG9rZW59JmNsaWVudF9pZD0ke2NsaWVudElkfSZjbGllbnRfc2VjcmV0PScgK1xuICAgICAgICAgIHRlbXBsYXRlTW9kZWwuY2xpZW50U2VjcmV0XG4gICAgICB9LFxuICAgICAgZ3JhbnRUeXBlOiBHcmFudFR5cGUuQVVUSE9SSVpBVElPTl9DT0RFLFxuICAgICAgYWNjZXNzVG9rZW5Ub1VzZXJEYXRhTWFwcGluZ3M6IHRlbXBsYXRlTW9kZWwuYWNjZXNzVG9rZW5Ub1VzZXJEYXRhTWFwcGluZ3MsXG4gICAgICBleHRlcm5hbFRva2VuQ29uZmlnOiB0ZW1wbGF0ZU1vZGVsLmV4dGVybmFsVG9rZW5Db25maWcudG9FeHRlcm5hbFRva2VuQ29uZmlnKCksXG4gICAgICB1c2VJZFRva2VuOiB0ZW1wbGF0ZU1vZGVsLnVzZUlkVG9rZW5cbiAgICB9O1xuICAgIHJldHVybiBzc29Db25maWd1cmF0aW9uO1xuICB9XG5cbiAgbWFwVG8oc3NvQ29uZmlndXJhdGlvbjogU3NvQ29uZmlndXJhdGlvbik6IEtleUNsb2FrQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleUNsb2FrQWRkcmVzczogdGhpcy5nZXRLZXlDbG9ha0FkZHJlc3NGcm9tVXJsKHNzb0NvbmZpZ3VyYXRpb24uaXNzdWVyKSxcbiAgICAgIHJlYWxtTmFtZTogdGhpcy5nZXRSZWFsbU5hbWUoc3NvQ29uZmlndXJhdGlvbi5pc3N1ZXIpLFxuICAgICAgY2xpZW50SWQ6IHNzb0NvbmZpZ3VyYXRpb24uY2xpZW50SWQsXG4gICAgICBjbGllbnRTZWNyZXQ6IHRoaXMuZ2V0Q2xpZW50U2VjcmV0KHNzb0NvbmZpZ3VyYXRpb24pLFxuICAgICAgc2NvcGVJZDogdGhpcy5nZXRTY29wZUlkKHNzb0NvbmZpZ3VyYXRpb24pLFxuICAgICAgYnV0dG9uTmFtZTogc3NvQ29uZmlndXJhdGlvbi5idXR0b25OYW1lLFxuICAgICAgdXNlcklkQ29uZmlnOiBzc29Db25maWd1cmF0aW9uLnVzZXJJZENvbmZpZyxcbiAgICAgIG9uTmV3VXNlcjogc3NvQ29uZmlndXJhdGlvbi5vbk5ld1VzZXIsXG4gICAgICByZWRpcmVjdFRvUGxhdGZvcm06IHNzb0NvbmZpZ3VyYXRpb24ucmVkaXJlY3RUb1BsYXRmb3JtLFxuICAgICAgYXVkaWVuY2U6IHNzb0NvbmZpZ3VyYXRpb24uYXVkaWVuY2UsXG4gICAgICBsb2dvdXRSZXF1ZXN0OiBuZXcgUmVxdWVzdENvbmZpZ3VyYXRpb24oc3NvQ29uZmlndXJhdGlvbi5sb2dvdXRSZXF1ZXN0KSxcbiAgICAgIHZpc2libGVPbkxvZ2luUGFnZTogc3NvQ29uZmlndXJhdGlvbi52aXNpYmxlT25Mb2dpblBhZ2UsXG4gICAgICBhY2Nlc3NUb2tlblRvVXNlckRhdGFNYXBwaW5nczogc3NvQ29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlblRvVXNlckRhdGFNYXBwaW5ncyxcbiAgICAgIGV4dGVybmFsVG9rZW5Db25maWc6IG5ldyBFeHRlcm5hbFRva2VuKHNzb0NvbmZpZ3VyYXRpb24uZXh0ZXJuYWxUb2tlbkNvbmZpZyksXG4gICAgICB1c2VJZFRva2VuOiBzc29Db25maWd1cmF0aW9uLnVzZUlkVG9rZW5cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRLZXlDbG9ha0FkZHJlc3NGcm9tVXJsKHVybCkge1xuICAgIGNvbnN0IFssIGtleUNsb2FrQWRkcmVzc10gPSAodXJsIHx8ICcnKS5tYXRjaCh0aGlzLnVybFBhdHRlcm4pIHx8IFtdO1xuICAgIHJldHVybiBrZXlDbG9ha0FkZHJlc3M7XG4gIH1cblxuICBwcml2YXRlIGdldFJlYWxtTmFtZSh1cmwpIHtcbiAgICBjb25zdCBbLCAsIHJlYWxtTmFtZV0gPSAodXJsIHx8ICcnKS5tYXRjaCh0aGlzLnVybFBhdHRlcm4pIHx8IFtdO1xuICAgIHJldHVybiByZWFsbU5hbWU7XG4gIH1cblxuICBwcml2YXRlIGdldENsaWVudFNlY3JldChzc29Db25maWd1cmF0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBib2RpZXMgPSBhdChzc29Db25maWd1cmF0aW9uLCBbJ3Rva2VuUmVxdWVzdC5ib2R5JywgJ3JlZnJlc2hSZXF1ZXN0LmJvZHknXSk7XG4gICAgY29uc3QgY2xpZW50U2VjcmV0cyA9IG1hcChib2RpZXMsIGJvZHkgPT4gdGhpcy5nZXRDbGllbnRTZWNyZXRGcm9tQm9keShib2R5KSk7XG4gICAgY29uc3QgY2xpZW50U2VjcmV0ID0gdGhpcy5nZXRGaXJzdERlZmluZWQoY2xpZW50U2VjcmV0cyk7XG4gICAgcmV0dXJuIGNsaWVudFNlY3JldCA/IGRlY29kZVVSSUNvbXBvbmVudChjbGllbnRTZWNyZXQpIDogJyc7XG4gIH1cblxuICBwcml2YXRlIGdldENsaWVudFNlY3JldEZyb21Cb2R5KGJvZHkpIHtcbiAgICBjb25zdCBbLCBjbGllbnRTZWNyZXRdID0gKGJvZHkgfHwgJycpLm1hdGNoKC9jbGllbnRfc2VjcmV0PShbXiZdKykvKSB8fCBbXTtcbiAgICByZXR1cm4gY2xpZW50U2VjcmV0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaXJzdERlZmluZWQodmFsdWVzKSB7XG4gICAgcmV0dXJuIGhlYWQocmVqZWN0KHZhbHVlcywgaXNVbmRlZmluZWQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NvcGVJZChzc29Db25maWd1cmF0aW9uKSB7XG4gICAgcmV0dXJuIGdldChzc29Db25maWd1cmF0aW9uLCAnYXV0aG9yaXphdGlvblJlcXVlc3QucmVxdWVzdFBhcmFtcy5zY29wZScsICcnKTtcbiAgfVxufVxuIl19