UNPKG

angularx-social-login

Version:

Social login and authentication module for Angular 9+. Supports authentication with Google, Facebook, Amazon, and VK. Can be extended to other providers also.

165 lines 24.7 kB
import { BaseLoginProvider } from '../entities/base-login-provider'; import { SocialUser } from '../entities/social-user'; /** * Protocol modes supported by MSAL. */ export var ProtocolMode; (function (ProtocolMode) { ProtocolMode["AAD"] = "AAD"; ProtocolMode["OIDC"] = "OIDC"; })(ProtocolMode || (ProtocolMode = {})); const COMMON_AUTHORITY = 'https://login.microsoftonline.com/common/'; /** * Microsoft Authentication using MSAL v2: https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/lib/msal-browser */ export class MicrosoftLoginProvider extends BaseLoginProvider { constructor(clientId, initOptions) { super(); this.clientId = clientId; this.initOptions = { redirect_uri: location.origin, authority: COMMON_AUTHORITY, scopes: ['openid', 'profile', 'User.Read'], knownAuthorities: [], protocolMode: ProtocolMode.AAD, clientCapabilities: [], cacheLocation: 'sessionStorage' }; this.initOptions = Object.assign(Object.assign({}, this.initOptions), initOptions); } initialize() { return new Promise((resolve, reject) => { this.loadScript(MicrosoftLoginProvider.PROVIDER_ID, 'https://alcdn.msauth.net/browser/2.1.0/js/msal-browser.js', () => { try { const config = { auth: { clientId: this.clientId, redirectUri: this.initOptions.redirect_uri, authority: this.initOptions.authority, knownAuthorities: this.initOptions.knownAuthorities, protocolMode: this.initOptions.protocolMode, clientCapabilities: this.initOptions.clientCapabilities }, cache: !this.initOptions.cacheLocation ? null : { cacheLocation: this.initOptions.cacheLocation } }; this._instance = new msal.PublicClientApplication(config); resolve(); } catch (e) { reject(e); } }); }); } getSocialUser(loginResponse) { return new Promise((resolve, reject) => { //After login, use Microsoft Graph API to get user info let meRequest = new XMLHttpRequest(); meRequest.onreadystatechange = () => { if (meRequest.readyState == 4) { try { if (meRequest.status == 200) { let userInfo = JSON.parse(meRequest.responseText); let user = new SocialUser(); user.provider = MicrosoftLoginProvider.PROVIDER_ID; user.id = loginResponse.idToken; user.name = loginResponse.idTokenClaims.name; user.email = loginResponse.account.username; user.idToken = loginResponse.idToken; user.response = loginResponse; user.firstName = userInfo.givenName; user.lastName = userInfo.surname; resolve(user); } else { reject(`Error retrieving user info: ${meRequest.status}`); } } catch (err) { reject(err); } } }; //Microsoft Graph ME Endpoint: https://docs.microsoft.com/en-us/graph/api/user-get?view=graph-rest-1.0&tabs=http meRequest.open('GET', 'https://graph.microsoft.com/v1.0/me'); meRequest.setRequestHeader('Authorization', `Bearer ${loginResponse.accessToken}`); try { meRequest.send(); } catch (err) { reject(err); } }); } getLoginStatus() { return new Promise((resolve, reject) => { const accounts = this._instance.getAllAccounts(); if (accounts.length > 0) { try { this._instance.ssoSilent({ scopes: this.initOptions.scopes, loginHint: accounts[0].username }) .then(loginResponse => { this.getSocialUser(loginResponse) .then(user => resolve(user)) .catch(err => reject(err)); }) .catch(err => reject(err)); } catch (err) { reject(err); } } else { reject(`No user is currently logged in with ${MicrosoftLoginProvider.PROVIDER_ID}`); } }); } signIn() { return new Promise((resolve, reject) => { try { this._instance.loginPopup({ scopes: this.initOptions.scopes }) .then(loginResponse => { this.getSocialUser(loginResponse) .then(user => resolve(user)) .catch(err => reject(err)); }) .catch(err => reject(err)); } catch (err) { reject(err); } }); } signOut(revoke) { return new Promise((resolve, reject) => { try { const accounts = this._instance.getAllAccounts(); //TODO: This redirects to a Microsoft page, then sends us back to redirect_uri... this doesn't seem to match other providers //Open issues: // https://github.com/abacritt/angularx-social-login/issues/306 // https://github.com/AzureAD/microsoft-authentication-library-for-js/issues/2563 this._instance.logout({ account: accounts[0], postLogoutRedirectUri: this.initOptions.redirect_uri }) .then(() => { resolve(); }) .catch(err => { reject(err); }); } catch (err) { reject(err); } }); } } MicrosoftLoginProvider.PROVIDER_ID = 'MICROSOFT'; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9zb2Z0LWxvZ2luLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IkM6L1VzZXJzL0pBRFVUVEEvZGV2L3dlYi9hbmd1bGFyeC1zb2NpYWwtbG9naW4vcHJvamVjdHMvbGliL3NyYy8iLCJzb3VyY2VzIjpbInByb3ZpZGVycy9taWNyb3NvZnQtbG9naW4tcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXJEOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksWUFHWDtBQUhELFdBQVksWUFBWTtJQUN0QiwyQkFBVyxDQUFBO0lBQ1gsNkJBQWEsQ0FBQTtBQUNmLENBQUMsRUFIVyxZQUFZLEtBQVosWUFBWSxRQUd2QjtBQStFRCxNQUFNLGdCQUFnQixHQUFXLDJDQUEyQyxDQUFDO0FBRTdFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGlCQUFpQjtJQWMzRCxZQUNVLFFBQWdCLEVBQ3hCLFdBQThCO1FBRTlCLEtBQUssRUFBRSxDQUFDO1FBSEEsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQVhsQixnQkFBVyxHQUFxQjtZQUN0QyxZQUFZLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDN0IsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQztZQUMxQyxnQkFBZ0IsRUFBRSxFQUFFO1lBQ3BCLFlBQVksRUFBRSxZQUFZLENBQUMsR0FBRztZQUM5QixrQkFBa0IsRUFBRSxFQUFFO1lBQ3RCLGFBQWEsRUFBRSxnQkFBZ0I7U0FDaEMsQ0FBQztRQVFBLElBQUksQ0FBQyxXQUFXLG1DQUNYLElBQUksQ0FBQyxXQUFXLEdBQ2hCLFdBQVcsQ0FDZixDQUFDO0lBQ0osQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxVQUFVLENBQ2Isc0JBQXNCLENBQUMsV0FBVyxFQUNsQywyREFBMkQsRUFDM0QsR0FBRyxFQUFFO2dCQUNILElBQUk7b0JBQ0YsTUFBTSxNQUFNLEdBQUc7d0JBQ2IsSUFBSSxFQUFFOzRCQUNKLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTs0QkFDdkIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWTs0QkFDMUMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUzs0QkFDckMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0I7NEJBQ25ELFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVk7NEJBQzNDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCO3lCQUN4RDt3QkFDRCxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs0QkFDOUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYTt5QkFDOUM7cUJBQ0YsQ0FBQztvQkFFRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMxRCxPQUFPLEVBQUUsQ0FBQztpQkFDWDtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDVixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ1g7WUFDSCxDQUFDLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGFBQWEsQ0FBQyxhQUFhO1FBQ2pDLE9BQU8sSUFBSSxPQUFPLENBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDakQsdURBQXVEO1lBQ3ZELElBQUksU0FBUyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7WUFDckMsU0FBUyxDQUFDLGtCQUFrQixHQUFHLEdBQUcsRUFBRTtnQkFDbEMsSUFBSSxTQUFTLENBQUMsVUFBVSxJQUFJLENBQUMsRUFBRTtvQkFDN0IsSUFBSTt3QkFDRixJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFOzRCQUMzQixJQUFJLFFBQVEsR0FBb0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7NEJBRW5FLElBQUksSUFBSSxHQUFlLElBQUksVUFBVSxFQUFFLENBQUM7NEJBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsc0JBQXNCLENBQUMsV0FBVyxDQUFDOzRCQUNuRCxJQUFJLENBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7NEJBQ2hDLElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7NEJBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7NEJBQzVDLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQzs0QkFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUM7NEJBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQzs0QkFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDOzRCQUVqQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ2Y7NkJBQU07NEJBQ0wsTUFBTSxDQUFDLCtCQUErQixTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQzt5QkFDM0Q7cUJBQ0Y7b0JBQUMsT0FBTyxHQUFHLEVBQUU7d0JBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNiO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDO1lBRUYsZ0hBQWdIO1lBQ2hILFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLHFDQUFxQyxDQUFDLENBQUM7WUFDN0QsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxVQUFVLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ25GLElBQUk7Z0JBQ0YsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2xCO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2I7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLE9BQU8sQ0FBYSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNqRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2pELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZCLElBQUk7b0JBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7d0JBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07d0JBQy9CLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtxQkFDaEMsQ0FBQzt5QkFDQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUU7d0JBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDOzZCQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7NkJBQzNCLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUMvQixDQUFDLENBQUM7eUJBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQzlCO2dCQUFDLE9BQU8sR0FBRyxFQUFFO29CQUNaLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDYjthQUNGO2lCQUFNO2dCQUNMLE1BQU0sQ0FBQyx1Q0FBdUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzthQUNyRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksT0FBTyxDQUFhLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2pELElBQUk7Z0JBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7b0JBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07aUJBQ2hDLENBQUM7cUJBQ0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFO29CQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQzt5QkFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUMzQixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsQ0FBQyxDQUFDO3FCQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzlCO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2I7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLENBQUMsTUFBZ0I7UUFDdEIsT0FBTyxJQUFJLE9BQU8sQ0FBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMxQyxJQUFJO2dCQUNGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ2pELDRIQUE0SDtnQkFDNUgsY0FBYztnQkFDZCwrREFBK0Q7Z0JBQy9ELGlGQUFpRjtnQkFDakYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7b0JBQ3BCLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUNwQixxQkFBcUIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVk7aUJBQ3JELENBQUM7cUJBQ0MsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDVCxPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDLENBQUM7cUJBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNYLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDZCxDQUFDLENBQUMsQ0FBQzthQUNOO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2I7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBaEtzQixrQ0FBVyxHQUFXLFdBQVcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VMb2dpblByb3ZpZGVyIH0gZnJvbSAnLi4vZW50aXRpZXMvYmFzZS1sb2dpbi1wcm92aWRlcic7XHJcbmltcG9ydCB7IFNvY2lhbFVzZXIgfSBmcm9tICcuLi9lbnRpdGllcy9zb2NpYWwtdXNlcic7XHJcblxyXG4vKipcclxuICogUHJvdG9jb2wgbW9kZXMgc3VwcG9ydGVkIGJ5IE1TQUwuXHJcbiAqL1xyXG5leHBvcnQgZW51bSBQcm90b2NvbE1vZGUge1xyXG4gIEFBRCA9ICdBQUQnLFxyXG4gIE9JREMgPSAnT0lEQydcclxufVxyXG5cclxuLyoqXHJcbiAqIEluaXRpYWxpemF0aW9uIE9wdGlvbnMgZm9yIE1pY3Jvc29mdCBQcm92aWRlcjogaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlQUQvbWljcm9zb2Z0LWF1dGhlbnRpY2F0aW9uLWxpYnJhcnktZm9yLWpzL2Jsb2IvZGV2L2xpYi9tc2FsLWJyb3dzZXIvZG9jcy9pbml0aWFsaXphdGlvbi5tZFxyXG4gKiBEZXRhaWxzIChub3QgYWxsIG9wdGlvbnMgYXJlIHN1cHBvcnRlZCk6IGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZUFEL21pY3Jvc29mdC1hdXRoZW50aWNhdGlvbi1saWJyYXJ5LWZvci1qcy9ibG9iL2Rldi9saWIvbXNhbC1icm93c2VyL2RvY3MvY29uZmlndXJhdGlvbi5tZFxyXG4gKi9cclxuZXhwb3J0IHR5cGUgTWljcm9zb2Z0T3B0aW9ucyA9IHtcclxuICByZWRpcmVjdF91cmk6IHN0cmluZyxcclxuICBhdXRob3JpdHk/OiBzdHJpbmcsXHJcbiAga25vd25BdXRob3JpdGllcz86IHN0cmluZ1tdLFxyXG4gIHByb3RvY29sTW9kZT86IFByb3RvY29sTW9kZSxcclxuICBjbGllbnRDYXBhYmlsaXRpZXM/OiBzdHJpbmdbXSxcclxuICBjYWNoZUxvY2F0aW9uPzogc3RyaW5nLFxyXG4gIHNjb3Blcz86IHN0cmluZ1tdXHJcbn07XHJcblxyXG4vLyBDb2xsZWN0aW9uIG9mIGludGVybmFsIE1TQUwgaW50ZXJmYWNlcyBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vQXp1cmVBRC9taWNyb3NvZnQtYXV0aGVudGljYXRpb24tbGlicmFyeS1mb3ItanMvdHJlZS9kZXYvbGliL21zYWwtYnJvd3Nlci9zcmNcclxuXHJcbmludGVyZmFjZSBNU0FMQWNjb3VudCB7XHJcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcclxuICBob21lQWNjb3VudElkOiBzdHJpbmc7XHJcbiAgdGVuYW50SWQ6IHN0cmluZztcclxuICB1c2VybmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgTVNHcmFwaFVzZXJJbmZvIHtcclxuICBidXNpbmVzc1Bob25lczogc3RyaW5nW107XHJcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcclxuICBnaXZlbk5hbWU6IHN0cmluZztcclxuICBpZDogc3RyaW5nO1xyXG4gIGpvYlRpdGxlOiBzdHJpbmc7XHJcbiAgbWFpbDogc3RyaW5nO1xyXG4gIG1vYmlsZVBob25lOiBzdHJpbmc7XHJcbiAgb2ZmaWNlTG9jYXRpb246IHN0cmluZztcclxuICBwcmVmZXJyZWRMYW5ndWFnZTogc3RyaW5nO1xyXG4gIHN1cm5hbWU6IHN0cmluZztcclxuICB1c2VyUHJpbmNpcGFsTmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgTVNBTExvZ2luUmVxdWVzdCB7XHJcbiAgc2NvcGVzPzogc3RyaW5nW107XHJcbiAgc2lkPzogc3RyaW5nO1xyXG4gIGxvZ2luSGludD86IHN0cmluZztcclxuICBkb21haW5IaW50Pzogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgTVNBTExvZ2luUmVzcG9uc2Uge1xyXG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XHJcbiAgYWNjb3VudDogTVNBTEFjY291bnQ7XHJcbiAgZXhwaXJlc09uOiBEYXRlO1xyXG4gIGV4dEV4cGlyZXNPbjogRGF0ZTtcclxuICBmYW1pbHlJZDogc3RyaW5nO1xyXG4gIGZyb21DYWNoZTogYm9vbGVhbjtcclxuICBpZFRva2VuOiBzdHJpbmc7XHJcbiAgaWRUb2tlbkNsYWltczogYW55O1xyXG4gIHNjb3Blczogc3RyaW5nW107XHJcbiAgc3RhdGU6IHN0cmluZztcclxuICB0ZW5hbnRJZDogc3RyaW5nO1xyXG4gIHVuaXF1ZUlkOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBNU0FMTG9nb3V0UmVxdWVzdCB7XHJcbiAgYWNjb3VudD86IE1TQUxBY2NvdW50O1xyXG4gIHBvc3RMb2dvdXRSZWRpcmVjdFVyaT86IHN0cmluZztcclxuICBhdXRob3JpdHk/OiBzdHJpbmc7XHJcbiAgY29ycmVsYXRpb25JZD86IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIE1TQUxDbGllbnRBcHBsaWNhdGlvbiB7XHJcbiAgZ2V0QWxsQWNjb3VudHMoKTogTVNBTEFjY291bnRbXTtcclxuICBsb2dvdXQobG9nb3V0UmVxdWVzdD86IE1TQUxMb2dvdXRSZXF1ZXN0KTogUHJvbWlzZTx2b2lkPjtcclxuICBsb2dpblBvcHVwKGxvZ2luUmVxdWVzdDogTVNBTExvZ2luUmVxdWVzdCk6IFByb21pc2U8TVNBTExvZ2luUmVzcG9uc2U+O1xyXG4gIHNzb1NpbGVudChsb2dpblJlcXVlc3Q6IE1TQUxMb2dpblJlcXVlc3QpOiBQcm9taXNlPE1TQUxMb2dpblJlc3BvbnNlPjtcclxuICBhY3F1aXJlVG9rZW5TaWxlbnQobG9naW5SZXF1ZXN0OiBNU0FMTG9naW5SZXF1ZXN0KTogUHJvbWlzZTxNU0FMTG9naW5SZXNwb25zZT47XHJcbiAgZ2V0QWNjb3VudEJ5SG9tZUlkKGhvbWVBY2NvdW50SWQ6IHN0cmluZyk6IE1TQUxBY2NvdW50O1xyXG59XHJcblxyXG5kZWNsYXJlIGxldCBtc2FsOiBhbnk7XHJcblxyXG5jb25zdCBDT01NT05fQVVUSE9SSVRZOiBzdHJpbmcgPSAnaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2NvbW1vbi8nO1xyXG5cclxuLyoqXHJcbiAqIE1pY3Jvc29mdCBBdXRoZW50aWNhdGlvbiB1c2luZyBNU0FMIHYyOiBodHRwczovL2dpdGh1Yi5jb20vQXp1cmVBRC9taWNyb3NvZnQtYXV0aGVudGljYXRpb24tbGlicmFyeS1mb3ItanMvdHJlZS9kZXYvbGliL21zYWwtYnJvd3NlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1pY3Jvc29mdExvZ2luUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTG9naW5Qcm92aWRlciB7XHJcbiAgcHJpdmF0ZSBfaW5zdGFuY2U6IE1TQUxDbGllbnRBcHBsaWNhdGlvbjtcclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1ZJREVSX0lEOiBzdHJpbmcgPSAnTUlDUk9TT0ZUJztcclxuXHJcbiAgcHJpdmF0ZSBpbml0T3B0aW9uczogTWljcm9zb2Z0T3B0aW9ucyA9IHtcclxuICAgIHJlZGlyZWN0X3VyaTogbG9jYXRpb24ub3JpZ2luLFxyXG4gICAgYXV0aG9yaXR5OiBDT01NT05fQVVUSE9SSVRZLFxyXG4gICAgc2NvcGVzOiBbJ29wZW5pZCcsICdwcm9maWxlJywgJ1VzZXIuUmVhZCddLFxyXG4gICAga25vd25BdXRob3JpdGllczogW10sXHJcbiAgICBwcm90b2NvbE1vZGU6IFByb3RvY29sTW9kZS5BQUQsXHJcbiAgICBjbGllbnRDYXBhYmlsaXRpZXM6IFtdLFxyXG4gICAgY2FjaGVMb2NhdGlvbjogJ3Nlc3Npb25TdG9yYWdlJ1xyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjbGllbnRJZDogc3RyaW5nLFxyXG4gICAgaW5pdE9wdGlvbnM/OiBNaWNyb3NvZnRPcHRpb25zXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIHRoaXMuaW5pdE9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLnRoaXMuaW5pdE9wdGlvbnMsXHJcbiAgICAgIC4uLmluaXRPcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMubG9hZFNjcmlwdChcclxuICAgICAgICBNaWNyb3NvZnRMb2dpblByb3ZpZGVyLlBST1ZJREVSX0lELFxyXG4gICAgICAgICdodHRwczovL2FsY2RuLm1zYXV0aC5uZXQvYnJvd3Nlci8yLjEuMC9qcy9tc2FsLWJyb3dzZXIuanMnLFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICBhdXRoOiB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXJpOiB0aGlzLmluaXRPcHRpb25zLnJlZGlyZWN0X3VyaSxcclxuICAgICAgICAgICAgICAgIGF1dGhvcml0eTogdGhpcy5pbml0T3B0aW9ucy5hdXRob3JpdHksXHJcbiAgICAgICAgICAgICAgICBrbm93bkF1dGhvcml0aWVzOiB0aGlzLmluaXRPcHRpb25zLmtub3duQXV0aG9yaXRpZXMsXHJcbiAgICAgICAgICAgICAgICBwcm90b2NvbE1vZGU6IHRoaXMuaW5pdE9wdGlvbnMucHJvdG9jb2xNb2RlLFxyXG4gICAgICAgICAgICAgICAgY2xpZW50Q2FwYWJpbGl0aWVzOiB0aGlzLmluaXRPcHRpb25zLmNsaWVudENhcGFiaWxpdGllc1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgY2FjaGU6ICF0aGlzLmluaXRPcHRpb25zLmNhY2hlTG9jYXRpb24gPyBudWxsIDoge1xyXG4gICAgICAgICAgICAgICAgY2FjaGVMb2NhdGlvbjogdGhpcy5pbml0T3B0aW9ucy5jYWNoZUxvY2F0aW9uXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgbXNhbC5QdWJsaWNDbGllbnRBcHBsaWNhdGlvbihjb25maWcpO1xyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U29jaWFsVXNlcihsb2dpblJlc3BvbnNlKTogUHJvbWlzZTxTb2NpYWxVc2VyPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8U29jaWFsVXNlcj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAvL0FmdGVyIGxvZ2luLCB1c2UgTWljcm9zb2Z0IEdyYXBoIEFQSSB0byBnZXQgdXNlciBpbmZvXHJcbiAgICAgIGxldCBtZVJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgbWVSZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcclxuICAgICAgICBpZiAobWVSZXF1ZXN0LnJlYWR5U3RhdGUgPT0gNCkge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKG1lUmVxdWVzdC5zdGF0dXMgPT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHVzZXJJbmZvID0gPE1TR3JhcGhVc2VySW5mbz5KU09OLnBhcnNlKG1lUmVxdWVzdC5yZXNwb25zZVRleHQpO1xyXG5cclxuICAgICAgICAgICAgICBsZXQgdXNlcjogU29jaWFsVXNlciA9IG5ldyBTb2NpYWxVc2VyKCk7XHJcbiAgICAgICAgICAgICAgdXNlci5wcm92aWRlciA9IE1pY3Jvc29mdExvZ2luUHJvdmlkZXIuUFJPVklERVJfSUQ7XHJcbiAgICAgICAgICAgICAgdXNlci5pZCA9IGxvZ2luUmVzcG9uc2UuaWRUb2tlbjtcclxuICAgICAgICAgICAgICB1c2VyLm5hbWUgPSBsb2dpblJlc3BvbnNlLmlkVG9rZW5DbGFpbXMubmFtZTtcclxuICAgICAgICAgICAgICB1c2VyLmVtYWlsID0gbG9naW5SZXNwb25zZS5hY2NvdW50LnVzZXJuYW1lO1xyXG4gICAgICAgICAgICAgIHVzZXIuaWRUb2tlbiA9IGxvZ2luUmVzcG9uc2UuaWRUb2tlbjtcclxuICAgICAgICAgICAgICB1c2VyLnJlc3BvbnNlID0gbG9naW5SZXNwb25zZTtcclxuICAgICAgICAgICAgICB1c2VyLmZpcnN0TmFtZSA9IHVzZXJJbmZvLmdpdmVuTmFtZTtcclxuICAgICAgICAgICAgICB1c2VyLmxhc3ROYW1lID0gdXNlckluZm8uc3VybmFtZTtcclxuXHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSh1c2VyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZWplY3QoYEVycm9yIHJldHJpZXZpbmcgdXNlciBpbmZvOiAke21lUmVxdWVzdC5zdGF0dXN9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvL01pY3Jvc29mdCBHcmFwaCBNRSBFbmRwb2ludDogaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvZ3JhcGgvYXBpL3VzZXItZ2V0P3ZpZXc9Z3JhcGgtcmVzdC0xLjAmdGFicz1odHRwXHJcbiAgICAgIG1lUmVxdWVzdC5vcGVuKCdHRVQnLCAnaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tL3YxLjAvbWUnKTtcclxuICAgICAgbWVSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0F1dGhvcml6YXRpb24nLCBgQmVhcmVyICR7bG9naW5SZXNwb25zZS5hY2Nlc3NUb2tlbn1gKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBtZVJlcXVlc3Quc2VuZCgpO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRMb2dpblN0YXR1cygpOiBQcm9taXNlPFNvY2lhbFVzZXI+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxTb2NpYWxVc2VyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGFjY291bnRzID0gdGhpcy5faW5zdGFuY2UuZ2V0QWxsQWNjb3VudHMoKTtcclxuICAgICAgaWYgKGFjY291bnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5faW5zdGFuY2Uuc3NvU2lsZW50KHtcclxuICAgICAgICAgICAgc2NvcGVzOiB0aGlzLmluaXRPcHRpb25zLnNjb3BlcyxcclxuICAgICAgICAgICAgbG9naW5IaW50OiBhY2NvdW50c1swXS51c2VybmFtZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnRoZW4obG9naW5SZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRTb2NpYWxVc2VyKGxvZ2luUmVzcG9uc2UpXHJcbiAgICAgICAgICAgICAgICAudGhlbih1c2VyID0+IHJlc29sdmUodXNlcikpXHJcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHJlamVjdChlcnIpKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiByZWplY3QoZXJyKSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVqZWN0KGBObyB1c2VyIGlzIGN1cnJlbnRseSBsb2dnZWQgaW4gd2l0aCAke01pY3Jvc29mdExvZ2luUHJvdmlkZXIuUFJPVklERVJfSUR9YCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2lnbkluKCk6IFByb21pc2U8U29jaWFsVXNlcj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFNvY2lhbFVzZXI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLl9pbnN0YW5jZS5sb2dpblBvcHVwKHtcclxuICAgICAgICAgIHNjb3BlczogdGhpcy5pbml0T3B0aW9ucy5zY29wZXNcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgLnRoZW4obG9naW5SZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U29jaWFsVXNlcihsb2dpblJlc3BvbnNlKVxyXG4gICAgICAgICAgICAgIC50aGVuKHVzZXIgPT4gcmVzb2x2ZSh1c2VyKSlcclxuICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHJlamVjdChlcnIpKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuY2F0Y2goZXJyID0+IHJlamVjdChlcnIpKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2lnbk91dChyZXZva2U/OiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBhY2NvdW50cyA9IHRoaXMuX2luc3RhbmNlLmdldEFsbEFjY291bnRzKCk7XHJcbiAgICAgICAgLy9UT0RPOiBUaGlzIHJlZGlyZWN0cyB0byBhIE1pY3Jvc29mdCBwYWdlLCB0aGVuIHNlbmRzIHVzIGJhY2sgdG8gcmVkaXJlY3RfdXJpLi4uIHRoaXMgZG9lc24ndCBzZWVtIHRvIG1hdGNoIG90aGVyIHByb3ZpZGVyc1xyXG4gICAgICAgIC8vT3BlbiBpc3N1ZXM6XHJcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FiYWNyaXR0L2FuZ3VsYXJ4LXNvY2lhbC1sb2dpbi9pc3N1ZXMvMzA2XHJcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlQUQvbWljcm9zb2Z0LWF1dGhlbnRpY2F0aW9uLWxpYnJhcnktZm9yLWpzL2lzc3Vlcy8yNTYzXHJcbiAgICAgICAgdGhpcy5faW5zdGFuY2UubG9nb3V0KHtcclxuICAgICAgICAgIGFjY291bnQ6IGFjY291bnRzWzBdLFxyXG4gICAgICAgICAgcG9zdExvZ291dFJlZGlyZWN0VXJpOiB0aGlzLmluaXRPcHRpb25zLnJlZGlyZWN0X3VyaVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=