@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
199 lines • 28.9 kB
JavaScript
import { TemplateType } from '../sso-configuration.model';
import { cloneDeep, pick, defaults, at, map, defaultsDeep, has, head, reject, isUndefined } from 'lodash-es';
import { GrantType, TenantLoginOptionType, UserManagementSource } from '@c8y/client';
import { SignatureConfiguration } from '../template-parts/signature-configuration.model';
import { Injectable } from '@angular/core';
import { ExternalToken } from '../template-parts/external-token-config.model';
import * as i0 from "@angular/core";
export class AadConfigurationMapper {
constructor() {
this.defaults = {
visibleOnLoginPage: true
};
this.urlPattern = /^(.+)\/((.+?)\/oauth2\/(authorize|token))$/;
}
mapFrom(templateModel) {
const baseUrl = `${templateModel.aadAddress}/${templateModel.tenant}/oauth2`;
const ssoConfiguration = {
audience: templateModel.applicationId,
clientId: templateModel.applicationId,
logoutRequest: templateModel.redirectAfterLogout
? {
method: 'POST',
url: `${baseUrl}/logout`,
requestParams: {
post_logout_redirect_uri: templateModel.redirectAfterLogoutUrl
},
headers: {},
body: '',
operation: 'REDIRECT'
}
: {
method: 'POST',
headers: {},
operation: 'REDIRECT',
requestParams: {}
},
authorizationRequest: {
method: 'GET',
url: `${baseUrl}/authorize`,
requestParams: {
redirect_uri: '${redirectUri}',
client_id: '${clientId}',
response_type: 'code'
},
headers: {},
body: '',
operation: 'REDIRECT'
},
tokenRequest: {
method: 'POST',
url: `${baseUrl}/token`,
requestParams: {},
headers: {},
body: this.getQueryString({
grant_type: 'authorization_code',
code: '${code}',
redirect_uri: '${redirectUri}',
resource: '${clientId}',
client_id: '${clientId}',
client_secret: encodeURIComponent(templateModel.clientSecret)
}),
operation: 'EXECUTE'
},
refreshRequest: {
method: 'POST',
url: `${baseUrl}/token`,
requestParams: {},
headers: {},
body: this.getQueryString({
grant_type: 'refresh_token',
refresh_token: '${refreshToken}',
resource: '${clientId}',
client_id: '${clientId}',
client_secret: encodeURIComponent(templateModel.clientSecret)
}),
operation: 'EXECUTE'
},
buttonName: templateModel.buttonName,
providerName: 'Azure AD',
issuer: templateModel.issuer,
onNewUser: templateModel.onNewUser,
accessTokenToUserDataMappings: templateModel.accessTokenToUserDataMappings,
redirectToPlatform: templateModel.redirectToPlatform || null,
template: TemplateType.AZURE,
userIdConfig: {
useConstantValue: false,
jwtField: templateModel.userIdConfig.jwtField
},
visibleOnLoginPage: templateModel.visibleOnLoginPage,
signatureVerificationConfig: templateModel.signatureVerificationConfig.toSignatureVerificationConfig(),
userManagementSource: UserManagementSource.REMOTE,
type: TenantLoginOptionType.OAUTH2,
grantType: GrantType.AUTHORIZATION_CODE,
externalTokenConfig: templateModel.externalTokenConfig.toExternalTokenConfig(),
useIdToken: templateModel.useIdToken
};
return ssoConfiguration;
}
mapTo(ssoConfiguration) {
const ssoConfigurationForAad = cloneDeep(ssoConfiguration);
const applicationsId = at(ssoConfigurationForAad, ['audience', 'clientId']);
this.setupDefaults(ssoConfigurationForAad);
this.setupUserIdConfig(ssoConfigurationForAad);
this.setupSignatureVerificationConfig(ssoConfigurationForAad);
const aadConfiguration = {
aadAddress: this.getAadAddress(ssoConfigurationForAad),
tenant: this.getTenant(ssoConfigurationForAad),
applicationId: this.getFirstDefined(applicationsId),
redirectToPlatform: ssoConfigurationForAad.redirectToPlatform,
clientSecret: this.getClientSecret(ssoConfigurationForAad),
issuer: ssoConfigurationForAad.issuer,
buttonName: ssoConfigurationForAad.buttonName,
visibleOnLoginPage: ssoConfigurationForAad.visibleOnLoginPage,
redirectAfterLogout: this.getRedirectAfterLogout(ssoConfigurationForAad),
redirectAfterLogoutUrl: this.getRedirectAfterLogoutUrl(ssoConfigurationForAad),
accessTokenToUserDataMappings: ssoConfigurationForAad.accessTokenToUserDataMappings,
userIdConfig: {
jwtField: ssoConfigurationForAad.userIdConfig.jwtField
},
publicKeyDiscoveryUrl: ssoConfigurationForAad.signatureVerificationConfig.aad.publicKeyDiscoveryUrl,
signatureVerificationConfig: new SignatureConfiguration(ssoConfigurationForAad.signatureVerificationConfig),
onNewUser: ssoConfigurationForAad.onNewUser,
externalTokenConfig: new ExternalToken(ssoConfigurationForAad.externalTokenConfig),
useIdToken: ssoConfiguration.useIdToken
};
return aadConfiguration;
}
setupDefaults(ssoConfiguration) {
defaults(ssoConfiguration, this.defaults);
}
getAadAddress(ssoConfiguration) {
const urls = this.getUrlsFromRequests(ssoConfiguration);
const aadAddresses = map(urls, url => this.getAadAddressFromUrl(url));
return this.getFirstDefined(aadAddresses);
}
getTenant(ssoConfiguration) {
const urls = this.getUrlsFromRequests(ssoConfiguration);
const tenants = map(urls, url => this.getTenantFromUrl(url));
return this.getFirstDefined(tenants);
}
getUrlsFromRequests(ssoConfiguration) {
return at(ssoConfiguration, [
'authorizationRequest.url',
'tokenRequest.url',
'refreshRequest.url'
]);
}
getAadAddressFromUrl(url) {
const [, aadAddress] = (url || '').match(this.urlPattern) || [];
return aadAddress;
}
getTenantFromUrl(url) {
const [, , , tenant] = (url || '').match(this.urlPattern) || [];
return tenant;
}
getClientSecret(ssoConfiguration) {
const bodies = at(ssoConfiguration, ['tokenRequest.body', 'refreshRequest.body']);
const clientSecrets = map(bodies, body => this.getClientSecretFromBody(body));
return this.getFirstDefined(clientSecrets);
}
getClientSecretFromBody(body) {
const [, clientSecret] = (body || '').match(/client_secret=([^&]+)/) || [];
return clientSecret ? decodeURIComponent(clientSecret) : undefined;
}
setupUserIdConfig(ssoConfiguration) {
defaultsDeep(ssoConfiguration, { userIdConfig: { jwtField: 'upn' } });
}
setupSignatureVerificationConfig(ssoConfiguration) {
defaultsDeep(ssoConfiguration, {
signatureVerificationConfig: { aad: { publicKeyDiscoveryUrl: '' } }
});
ssoConfiguration.signatureVerificationConfig = pick(ssoConfiguration.signatureVerificationConfig, 'aad');
}
getRedirectAfterLogout(ssoConfiguration) {
return has(ssoConfiguration, 'logoutRequest.requestParams.post_logout_redirect_uri')
? true
: false;
}
getRedirectAfterLogoutUrl(ssoConfiguration) {
return ssoConfiguration.logoutRequest.requestParams.post_logout_redirect_uri
? ssoConfiguration.logoutRequest.requestParams.post_logout_redirect_uri
: null;
}
getFirstDefined(values) {
return head(reject(values, isUndefined));
}
getQueryString(params) {
return map(params, (value, key) => `${key}=${value}`).join('&');
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AadConfigurationMapper, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AadConfigurationMapper, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AadConfigurationMapper, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWFkLWNvbmZpZ3VyYXRpb24tbWFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vYXV0aC1jb25maWd1cmF0aW9uL3Nzby1jb25maWd1cmF0aW9uL3RlbXBsYXRlcy9hYWQtY29uZmlndXJhdGlvbi1tYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFvQixZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RSxPQUFPLEVBQ0wsU0FBUyxFQUNULElBQUksRUFDSixRQUFRLEVBQ1IsRUFBRSxFQUNGLEdBQUcsRUFDSCxZQUFZLEVBQ1osR0FBRyxFQUNILElBQUksRUFDSixNQUFNLEVBQ04sV0FBVyxFQUNaLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDckYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDekYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0NBQStDLENBQUM7O0FBSzlFLE1BQU0sT0FBTyxzQkFBc0I7SUFIbkM7UUFJVSxhQUFRLEdBQUc7WUFDakIsa0JBQWtCLEVBQUUsSUFBSTtTQUN6QixDQUFDO1FBRU0sZUFBVSxHQUFHLDRDQUE0QyxDQUFDO0tBNE1uRTtJQTFNQyxPQUFPLENBQUMsYUFBK0I7UUFDckMsTUFBTSxPQUFPLEdBQUcsR0FBRyxhQUFhLENBQUMsVUFBVSxJQUFJLGFBQWEsQ0FBQyxNQUFNLFNBQVMsQ0FBQztRQUU3RSxNQUFNLGdCQUFnQixHQUFxQjtZQUN6QyxRQUFRLEVBQUUsYUFBYSxDQUFDLGFBQWE7WUFDckMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxhQUFhO1lBQ3JDLGFBQWEsRUFBRSxhQUFhLENBQUMsbUJBQW1CO2dCQUM5QyxDQUFDLENB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c0I7a0JBSGxDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3NvQ29uZmlndXJhdGlvbk1hcHBlciB9IGZyb20gJy4vc3NvLWNvbmZpZ3VyYXRpb24ubWFwcGVyJztcbmltcG9ydCB7IEFhZENvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2FhZC5tb2RlbCc7XG5pbXBvcnQgeyBTc29Db25maWd1cmF0aW9uLCBUZW1wbGF0ZVR5cGUgfSBmcm9tICcuLi9zc28tY29uZmlndXJhdGlvbi5tb2RlbCc7XG5pbXBvcnQge1xuICBjbG9uZURlZXAsXG4gIHBpY2ssXG4gIGRlZmF1bHRzLFxuICBhdCxcbiAgbWFwLFxuICBkZWZhdWx0c0RlZXAsXG4gIGhhcyxcbiAgaGVhZCxcbiAgcmVqZWN0LFxuICBpc1VuZGVmaW5lZFxufSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgR3JhbnRUeXBlLCBUZW5hbnRMb2dpbk9wdGlvblR5cGUsIFVzZXJNYW5hZ2VtZW50U291cmNlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgU2lnbmF0dXJlQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL3RlbXBsYXRlLXBhcnRzL3NpZ25hdHVyZS1jb25maWd1cmF0aW9uLm1vZGVsJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV4dGVybmFsVG9rZW4gfSBmcm9tICcuLi90ZW1wbGF0ZS1wYXJ0cy9leHRlcm5hbC10b2tlbi1jb25maWcubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBYWRDb25maWd1cmF0aW9uTWFwcGVyIGltcGxlbWVudHMgU3NvQ29uZmlndXJhdGlvbk1hcHBlcjxBYWRDb25maWd1cmF0aW9uPiB7XG4gIHByaXZhdGUgZGVmYXVsdHMgPSB7XG4gICAgdmlzaWJsZU9uTG9naW5QYWdlOiB0cnVlXG4gIH07XG5cbiAgcHJpdmF0ZSB1cmxQYXR0ZXJuID0gL14oLispXFwvKCguKz8pXFwvb2F1dGgyXFwvKGF1dGhvcml6ZXx0b2tlbikpJC87XG5cbiAgbWFwRnJvbSh0ZW1wbGF0ZU1vZGVsOiBBYWRDb25maWd1cmF0aW9uKTogU3NvQ29uZmlndXJhdGlvbiB7XG4gICAgY29uc3QgYmFzZVVybCA9IGAke3RlbXBsYXRlTW9kZWwuYWFkQWRkcmVzc30vJHt0ZW1wbGF0ZU1vZGVsLnRlbmFudH0vb2F1dGgyYDtcblxuICAgIGNvbnN0IHNzb0NvbmZpZ3VyYXRpb246IFNzb0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgICBhdWRpZW5jZTogdGVtcGxhdGVNb2RlbC5hcHBsaWNhdGlvbklkLFxuICAgICAgY2xpZW50SWQ6IHRlbXBsYXRlTW9kZWwuYXBwbGljYXRpb25JZCxcbiAgICAgIGxvZ291dFJlcXVlc3Q6IHRlbXBsYXRlTW9kZWwucmVkaXJlY3RBZnRlckxvZ291dFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgdXJsOiBgJHtiYXNlVXJsfS9sb2dvdXRgLFxuICAgICAgICAgICAgcmVxdWVzdFBhcmFtczoge1xuICAgICAgICAgICAgICBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmk6IHRlbXBsYXRlTW9kZWwucmVkaXJlY3RBZnRlckxvZ291dFVybFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgYm9keTogJycsXG4gICAgICAgICAgICBvcGVyYXRpb246ICdSRURJUkVDVCdcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ1JFRElSRUNUJyxcbiAgICAgICAgICAgIHJlcXVlc3RQYXJhbXM6IHt9XG4gICAgICAgICAgfSxcbiAgICAgIGF1dGhvcml6YXRpb25SZXF1ZXN0OiB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHVybDogYCR7YmFzZVVybH0vYXV0aG9yaXplYCxcbiAgICAgICAgcmVxdWVzdFBhcmFtczoge1xuICAgICAgICAgIHJlZGlyZWN0X3VyaTogJyR7cmVkaXJlY3RVcml9JyxcbiAgICAgICAgICBjbGllbnRfaWQ6ICcke2NsaWVudElkfScsXG4gICAgICAgICAgcmVzcG9uc2VfdHlwZTogJ2NvZGUnXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiAnJyxcbiAgICAgICAgb3BlcmF0aW9uOiAnUkVESVJFQ1QnXG4gICAgICB9LFxuICAgICAgdG9rZW5SZXF1ZXN0OiB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICB1cmw6IGAke2Jhc2VVcmx9L3Rva2VuYCxcbiAgICAgICAgcmVxdWVzdFBhcmFtczoge30sXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiB0aGlzLmdldFF1ZXJ5U3RyaW5nKHtcbiAgICAgICAgICBncmFudF90eXBlOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcbiAgICAgICAgICBjb2RlOiAnJHtjb2RlfScsXG4gICAgICAgICAgcmVkaXJlY3RfdXJpOiAnJHtyZWRpcmVjdFVyaX0nLFxuICAgICAgICAgIHJlc291cmNlOiAnJHtjbGllbnRJZH0nLFxuICAgICAgICAgIGNsaWVudF9pZDogJyR7Y2xpZW50SWR9JyxcbiAgICAgICAgICBjbGllbnRfc2VjcmV0OiBlbmNvZGVVUklDb21wb25lbnQodGVtcGxhdGVNb2RlbC5jbGllbnRTZWNyZXQpXG4gICAgICAgIH0pLFxuICAgICAgICBvcGVyYXRpb246ICdFWEVDVVRFJ1xuICAgICAgfSxcbiAgICAgIHJlZnJlc2hSZXF1ZXN0OiB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICB1cmw6IGAke2Jhc2VVcmx9L3Rva2VuYCxcbiAgICAgICAgcmVxdWVzdFBhcmFtczoge30sXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiB0aGlzLmdldFF1ZXJ5U3RyaW5nKHtcbiAgICAgICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbicsXG4gICAgICAgICAgcmVmcmVzaF90b2tlbjogJyR7cmVmcmVzaFRva2VufScsXG4gICAgICAgICAgcmVzb3VyY2U6ICcke2NsaWVudElkfScsXG4gICAgICAgICAgY2xpZW50X2lkOiAnJHtjbGllbnRJZH0nLFxuICAgICAgICAgIGNsaWVudF9zZWNyZXQ6IGVuY29kZVVSSUNvbXBvbmVudCh0ZW1wbGF0ZU1vZGVsLmNsaWVudFNlY3JldClcbiAgICAgICAgfSksXG4gICAgICAgIG9wZXJhdGlvbjogJ0VYRUNVVEUnXG4gICAgICB9LFxuICAgICAgYnV0dG9uTmFtZTogdGVtcGxhdGVNb2RlbC5idXR0b25OYW1lLFxuICAgICAgcHJvdmlkZXJOYW1lOiAnQXp1cmUgQUQnLFxuICAgICAgaXNzdWVyOiB0ZW1wbGF0ZU1vZGVsLmlzc3VlcixcbiAgICAgIG9uTmV3VXNlcjogdGVtcGxhdGVNb2RlbC5vbk5ld1VzZXIsXG4gICAgICBhY2Nlc3NUb2tlblRvVXNlckRhdGFNYXBwaW5nczogdGVtcGxhdGVNb2RlbC5hY2Nlc3NUb2tlblRvVXNlckRhdGFNYXBwaW5ncyxcbiAgICAgIHJlZGlyZWN0VG9QbGF0Zm9ybTogdGVtcGxhdGVNb2RlbC5yZWRpcmVjdFRvUGxhdGZvcm0gfHwgbnVsbCxcbiAgICAgIHRlbXBsYXRlOiBUZW1wbGF0ZVR5cGUuQVpVUkUsXG4gICAgICB1c2VySWRDb25maWc6IHtcbiAgICAgICAgdXNlQ29uc3RhbnRWYWx1ZTogZmFsc2UsXG4gICAgICAgIGp3dEZpZWxkOiB0ZW1wbGF0ZU1vZGVsLnVzZXJJZENvbmZpZy5qd3RGaWVsZFxuICAgICAgfSxcbiAgICAgIHZpc2libGVPbkxvZ2luUGFnZTogdGVtcGxhdGVNb2RlbC52aXNpYmxlT25Mb2dpblBhZ2UsXG4gICAgICBzaWduYXR1cmVWZXJpZmljYXRpb25Db25maWc6XG4gICAgICAgIHRlbXBsYXRlTW9kZWwuc2lnbmF0dXJlVmVyaWZpY2F0aW9uQ29uZmlnLnRvU2lnbmF0dXJlVmVyaWZpY2F0aW9uQ29uZmlnKCksXG4gICAgICB1c2VyTWFuYWdlbWVudFNvdXJjZTogVXNlck1hbmFnZW1lbnRTb3VyY2UuUkVNT1RFLFxuICAgICAgdHlwZTogVGVuYW50TG9naW5PcHRpb25UeXBlLk9BVVRIMixcbiAgICAgIGdyYW50VHlwZTogR3JhbnRUeXBlLkFVVEhPUklaQVRJT05fQ09ERSxcbiAgICAgIGV4dGVybmFsVG9rZW5Db25maWc6IHRlbXBsYXRlTW9kZWwuZXh0ZXJuYWxUb2tlbkNvbmZpZy50b0V4dGVybmFsVG9rZW5Db25maWcoKSxcbiAgICAgIHVzZUlkVG9rZW46IHRlbXBsYXRlTW9kZWwudXNlSWRUb2tlblxuICAgIH07XG4gICAgcmV0dXJuIHNzb0NvbmZpZ3VyYXRpb247XG4gIH1cblxuICBtYXBUbyhzc29Db25maWd1cmF0aW9uOiBTc29Db25maWd1cmF0aW9uKTogQWFkQ29uZmlndXJhdGlvbiB7XG4gICAgY29uc3Qgc3NvQ29uZmlndXJhdGlvbkZvckFhZCA9IGNsb25lRGVlcChzc29Db25maWd1cmF0aW9uKTtcblxuICAgIGNvbnN0IGFwcGxpY2F0aW9uc0lkID0gYXQoc3NvQ29uZmlndXJhdGlvbkZvckFhZCwgWydhdWRpZW5jZScsICdjbGllbnRJZCddKTtcbiAgICB0aGlzLnNldHVwRGVmYXVsdHMoc3NvQ29uZmlndXJhdGlvbkZvckFhZCk7XG4gICAgdGhpcy5zZXR1cFVzZXJJZENvbmZpZyhzc29Db25maWd1cmF0aW9uRm9yQWFkKTtcbiAgICB0aGlzLnNldHVwU2lnbmF0dXJlVmVyaWZpY2F0aW9uQ29uZmlnKHNzb0NvbmZpZ3VyYXRpb25Gb3JBYWQpO1xuXG4gICAgY29uc3QgYWFkQ29uZmlndXJhdGlvbjogQWFkQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgIGFhZEFkZHJlc3M6IHRoaXMuZ2V0QWFkQWRkcmVzcyhzc29Db25maWd1cmF0aW9uRm9yQWFkKSxcbiAgICAgIHRlbmFudDogdGhpcy5nZXRUZW5hbnQoc3NvQ29uZmlndXJhdGlvbkZvckFhZCksXG4gICAgICBhcHBsaWNhdGlvbklkOiB0aGlzLmdldEZpcnN0RGVmaW5lZChhcHBsaWNhdGlvbnNJZCksXG4gICAgICByZWRpcmVjdFRvUGxhdGZvcm06IHNzb0NvbmZpZ3VyYXRpb25Gb3JBYWQucmVkaXJlY3RUb1BsYXRmb3JtLFxuICAgICAgY2xpZW50U2VjcmV0OiB0aGlzLmdldENsaWVudFNlY3JldChzc29Db25maWd1cmF0aW9uRm9yQWFkKSxcbiAgICAgIGlzc3Vlcjogc3NvQ29uZmlndXJhdGlvbkZvckFhZC5pc3N1ZXIsXG4gICAgICBidXR0b25OYW1lOiBzc29Db25maWd1cmF0aW9uRm9yQWFkLmJ1dHRvbk5hbWUsXG4gICAgICB2aXNpYmxlT25Mb2dpblBhZ2U6IHNzb0NvbmZpZ3VyYXRpb25Gb3JBYWQudmlzaWJsZU9uTG9naW5QYWdlLFxuICAgICAgcmVkaXJlY3RBZnRlckxvZ291dDogdGhpcy5nZXRSZWRpcmVjdEFmdGVyTG9nb3V0KHNzb0NvbmZpZ3VyYXRpb25Gb3JBYWQpLFxuICAgICAgcmVkaXJlY3RBZnRlckxvZ291dFVybDogdGhpcy5nZXRSZWRpcmVjdEFmdGVyTG9nb3V0VXJsKHNzb0NvbmZpZ3VyYXRpb25Gb3JBYWQpLFxuICAgICAgYWNjZXNzVG9rZW5Ub1VzZXJEYXRhTWFwcGluZ3M6IHNzb0NvbmZpZ3VyYXRpb25Gb3JBYWQuYWNjZXNzVG9rZW5Ub1VzZXJEYXRhTWFwcGluZ3MsXG4gICAgICB1c2VySWRDb25maWc6IHtcbiAgICAgICAgand0RmllbGQ6IHNzb0NvbmZpZ3VyYXRpb25Gb3JBYWQudXNlcklkQ29uZmlnLmp3dEZpZWxkXG4gICAgICB9LFxuICAgICAgcHVibGljS2V5RGlzY292ZXJ5VXJsOlxuICAgICAgICBzc29Db25maWd1cmF0aW9uRm9yQWFkLnNpZ25hdHVyZVZlcmlmaWNhdGlvbkNvbmZpZy5hYWQucHVibGljS2V5RGlzY292ZXJ5VXJsLFxuICAgICAgc2lnbmF0dXJlVmVyaWZpY2F0aW9uQ29uZmlnOiBuZXcgU2lnbmF0dXJlQ29uZmlndXJhdGlvbihcbiAgICAgICAgc3NvQ29uZmlndXJhdGlvbkZvckFhZC5zaWduYXR1cmVWZXJpZmljYXRpb25Db25maWdcbiAgICAgICksXG4gICAgICBvbk5ld1VzZXI6IHNzb0NvbmZpZ3VyYXRpb25Gb3JBYWQub25OZXdVc2VyLFxuICAgICAgZXh0ZXJuYWxUb2tlbkNvbmZpZzogbmV3IEV4dGVybmFsVG9rZW4oc3NvQ29uZmlndXJhdGlvbkZvckFhZC5leHRlcm5hbFRva2VuQ29uZmlnKSxcbiAgICAgIHVzZUlkVG9rZW46IHNzb0NvbmZpZ3VyYXRpb24udXNlSWRUb2tlblxuICAgIH07XG4gICAgcmV0dXJuIGFhZENvbmZpZ3VyYXRpb247XG4gIH1cblxuICBwcml2YXRlIHNldHVwRGVmYXVsdHMoc3NvQ29uZmlndXJhdGlvbikge1xuICAgIGRlZmF1bHRzKHNzb0NvbmZpZ3VyYXRpb24sIHRoaXMuZGVmYXVsdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBYWRBZGRyZXNzKHNzb0NvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCB1cmxzID0gdGhpcy5nZXRVcmxzRnJvbVJlcXVlc3RzKHNzb0NvbmZpZ3VyYXRpb24pO1xuXG4gICAgY29uc3QgYWFkQWRkcmVzc2VzID0gbWFwKHVybHMsIHVybCA9PiB0aGlzLmdldEFhZEFkZHJlc3NGcm9tVXJsKHVybCkpO1xuICAgIHJldHVybiB0aGlzLmdldEZpcnN0RGVmaW5lZChhYWRBZGRyZXNzZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUZW5hbnQoc3NvQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IHVybHMgPSB0aGlzLmdldFVybHNGcm9tUmVxdWVzdHMoc3NvQ29uZmlndXJhdGlvbik7XG5cbiAgICBjb25zdCB0ZW5hbnRzID0gbWFwKHVybHMsIHVybCA9PiB0aGlzLmdldFRlbmFudEZyb21VcmwodXJsKSk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Rmlyc3REZWZpbmVkKHRlbmFudHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVcmxzRnJvbVJlcXVlc3RzKHNzb0NvbmZpZ3VyYXRpb24pIHtcbiAgICByZXR1cm4gYXQoc3NvQ29uZmlndXJhdGlvbiwgW1xuICAgICAgJ2F1dGhvcml6YXRpb25SZXF1ZXN0LnVybCcsXG4gICAgICAndG9rZW5SZXF1ZXN0LnVybCcsXG4gICAgICAncmVmcmVzaFJlcXVlc3QudXJsJ1xuICAgIF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBYWRBZGRyZXNzRnJvbVVybCh1cmwpIHtcbiAgICBjb25zdCBbLCBhYWRBZGRyZXNzXSA9ICh1cmwgfHwgJycpLm1hdGNoKHRoaXMudXJsUGF0dGVybikgfHwgW107XG4gICAgcmV0dXJuIGFhZEFkZHJlc3M7XG4gIH1cblxuICBwcml2YXRlIGdldFRlbmFudEZyb21VcmwodXJsKSB7XG4gICAgY29uc3QgWywgLCAsIHRlbmFudF0gPSAodXJsIHx8ICcnKS5tYXRjaCh0aGlzLnVybFBhdHRlcm4pIHx8IFtdO1xuICAgIHJldHVybiB0ZW5hbnQ7XG4gIH1cblxuICBwcml2YXRlIGdldENsaWVudFNlY3JldChzc29Db25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgYm9kaWVzID0gYXQoc3NvQ29uZmlndXJhdGlvbiwgWyd0b2tlblJlcXVlc3QuYm9keScsICdyZWZyZXNoUmVxdWVzdC5ib2R5J10pO1xuICAgIGNvbnN0IGNsaWVudFNlY3JldHMgPSBtYXAoYm9kaWVzLCBib2R5ID0+IHRoaXMuZ2V0Q2xpZW50U2VjcmV0RnJvbUJvZHkoYm9keSkpO1xuICAgIHJldHVybiB0aGlzLmdldEZpcnN0RGVmaW5lZChjbGllbnRTZWNyZXRzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2xpZW50U2VjcmV0RnJvbUJvZHkoYm9keSkge1xuICAgIGNvbnN0IFssIGNsaWVudFNlY3JldF0gPSAoYm9keSB8fCAnJykubWF0Y2goL2NsaWVudF9zZWNyZXQ9KFteJl0rKS8pIHx8IFtdO1xuICAgIHJldHVybiBjbGllbnRTZWNyZXQgPyBkZWNvZGVVUklDb21wb25lbnQoY2xpZW50U2VjcmV0KSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBVc2VySWRDb25maWcoc3NvQ29uZmlndXJhdGlvbikge1xuICAgIGRlZmF1bHRzRGVlcChzc29Db25maWd1cmF0aW9uLCB7IHVzZXJJZENvbmZpZzogeyBqd3RGaWVsZDogJ3VwbicgfSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBTaWduYXR1cmVWZXJpZmljYXRpb25Db25maWcoc3NvQ29uZmlndXJhdGlvbikge1xuICAgIGRlZmF1bHRzRGVlcChzc29Db25maWd1cmF0aW9uLCB7XG4gICAgICBzaWduYXR1cmVWZXJpZmljYXRpb25Db25maWc6IHsgYWFkOiB7IHB1YmxpY0tleURpc2NvdmVyeVVybDogJycgfSB9XG4gICAgfSk7XG4gICAgc3NvQ29uZmlndXJhdGlvbi5zaWduYXR1cmVWZXJpZmljYXRpb25Db25maWcgPSBwaWNrKFxuICAgICAgc3NvQ29uZmlndXJhdGlvbi5zaWduYXR1cmVWZXJpZmljYXRpb25Db25maWcsXG4gICAgICAnYWFkJ1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFJlZGlyZWN0QWZ0ZXJMb2dvdXQoc3NvQ29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBoYXMoc3NvQ29uZmlndXJhdGlvbiwgJ2xvZ291dFJlcXVlc3QucmVxdWVzdFBhcmFtcy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmknKVxuICAgICAgPyB0cnVlXG4gICAgICA6IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWRpcmVjdEFmdGVyTG9nb3V0VXJsKHNzb0NvbmZpZ3VyYXRpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBzc29Db25maWd1cmF0aW9uLmxvZ291dFJlcXVlc3QucmVxdWVzdFBhcmFtcy5wb3N0X2xvZ291dF9yZWRpcmVjdF91cmlcbiAgICAgID8gc3NvQ29uZmlndXJhdGlvbi5sb2dvdXRSZXF1ZXN0LnJlcXVlc3RQYXJhbXMucG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEZpcnN0RGVmaW5lZCh2YWx1ZXMpIHtcbiAgICByZXR1cm4gaGVhZChyZWplY3QodmFsdWVzLCBpc1VuZGVmaW5lZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRRdWVyeVN0cmluZyhwYXJhbXMpIHtcbiAgICByZXR1cm4gbWFwKHBhcmFtcywgKHZhbHVlLCBrZXkpID0+IGAke2tleX09JHt2YWx1ZX1gKS5qb2luKCcmJyk7XG4gIH1cbn1cbiJdfQ==