UNPKG

@pepperi/lib

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.1.

109 lines 18.3 kB
import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "../../common/services/session.service"; export class AuthInterceptor { // private SESSION_TOKEN_KEY = 'auth_token'; // private token = 'secrettoken'; // private refreshTokenInProgress = false; // private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null); constructor(sessionService) { this.sessionService = sessionService; this.AUTH_HEADER = 'Authorization'; this.PEPPERI_TOKEN_HEADER = 'PepperiSessionToken'; this.PEPPERI_CONSUMER_KEY_HEADER = 'X-Pepperi-ConsumerKey'; } // Add authorization token if the token exist. addAuthorizationToken(request) { if (!request.headers.has(this.AUTH_HEADER)) { const idpToken = this.sessionService.getIdpToken(); if (idpToken) { request = request.clone({ headers: request.headers.set(this.AUTH_HEADER, `Bearer ${idpToken}`) }); } } return request; } // Add pepperi consumer token if calling to papi domain. addPepperiConsumerToken(request) { if (!request.headers.has(this.PEPPERI_CONSUMER_KEY_HEADER)) { const papiBaseUrl = this.sessionService.getPapiBaseUrl(); if (papiBaseUrl && request.url.match(new RegExp(papiBaseUrl, 'g'))) { const pepperiConsumerToken = this.sessionService.getPepperiConsumerToken(); if (pepperiConsumerToken) { request = request.clone({ headers: request.headers.set(this.PEPPERI_CONSUMER_KEY_HEADER, pepperiConsumerToken) }); } } } return request; } // Add web api token if calling to wapi domain. addWebApiToken(request) { if (!request.headers.has(this.PEPPERI_TOKEN_HEADER)) { const wapiBaseUrl = this.sessionService.getWapiBaseUrl(); if (wapiBaseUrl && request.url.match(new RegExp(wapiBaseUrl, 'g'))) { const webApiToken = this.sessionService.gettWapiToken(); if (webApiToken) { request = request.clone({ headers: request.headers.set(this.PEPPERI_TOKEN_HEADER, webApiToken) }); } } } return request; } intercept(req, next) { console.warn('AuthInterceptor'); // Add content type if (!req.headers.has('Content-Type')) { req = req.clone({ headers: req.headers.set('Content-Type', 'application/json') }); } req = this.addAuthorizationToken(req); req = this.addPepperiConsumerToken(req); req = this.addWebApiToken(req); return next.handle(req); // TODO: Check if we need this - this is an advance code that try to refresh the token in case of expired. // return next.handle(req).pipe( // catchError((error: HttpErrorResponse) => { // if (error && error.status === 401) { // // 401 errors are most likely going to be because we have an expired token that we need to refresh. // if (this.refreshTokenInProgress) { // // If refreshTokenInProgress is true, we will wait until refreshTokenSubject has a non-null value // // which means the new token is ready and we can retry the request again // return this.refreshTokenSubject.pipe( // filter(result => result !== null), // take(1), // switchMap(() => next.handle(this.addAuthenticationToken(req))) // ); // } else { // this.refreshTokenInProgress = true; // // Set the refreshTokenSubject to null so that subsequent API calls will // // wait until the new token has been retrieved // this.refreshTokenSubject.next(null); // return this.refreshAccessToken().pipe( // switchMap((success: boolean) => { // this.refreshTokenSubject.next(success); // return next.handle(this.addAuthenticationToken(req)); // }), // // When the call to refreshToken completes we reset the refreshTokenInProgress to false // // for the next time the token needs to be refreshed // finalize(() => (this.refreshTokenInProgress = false)) // ); // } // } else { // return throwError(error); // } // }) // ); } } AuthInterceptor.ɵfac = function AuthInterceptor_Factory(t) { return new (t || AuthInterceptor)(i0.ɵɵinject(i1.SessionService)); }; AuthInterceptor.ɵprov = i0.ɵɵdefineInjectable({ token: AuthInterceptor, factory: AuthInterceptor.ɵfac }); /*@__PURE__*/ (function () { i0.ɵsetClassMetadata(AuthInterceptor, [{ type: Injectable }], function () { return [{ type: i1.SessionService }]; }, null); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BlcHBlcmktbGliL3NyYy9jb3JlL2h0dHAvaW50ZXJjZXB0b3JzL2F1dGguaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBYTNDLE1BQU0sT0FBTyxlQUFlO0lBS3hCLDRDQUE0QztJQUM1QyxpQ0FBaUM7SUFDakMsMENBQTBDO0lBQzFDLHNGQUFzRjtJQUV0RixZQUFvQixjQUE4QjtRQUE5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFUMUMsZ0JBQVcsR0FBRyxlQUFlLENBQUM7UUFDOUIseUJBQW9CLEdBQUcscUJBQXFCLENBQUM7UUFDN0MsZ0NBQTJCLEdBQUcsdUJBQXVCLENBQUM7SUFPVCxDQUFDO0lBRXRELDhDQUE4QztJQUN0QyxxQkFBcUIsQ0FBQyxPQUF5QjtRQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFbkQsSUFBSSxRQUFRLEVBQUU7Z0JBQ1YsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQ3BCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsUUFBUSxFQUFFLENBQUM7aUJBQ3ZFLENBQUMsQ0FBQzthQUNOO1NBQ0o7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQsd0RBQXdEO0lBQ2hELHVCQUF1QixDQUFDLE9BQXlCO1FBQ3JELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsMkJB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bUI7UUFDbkIsd0NBQXdDO1FBQ3hDLFlBQVk7UUFDWixTQUFTO1FBQ1QsS0FBSztJQUNULENBQUM7OzhFQXBIUSxlQUFlO3VEQUFmLGVBQWUsV0FBZixlQUFlO2tEQUFmLGVBQWU7Y0FEM0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICAgIEh0dHBFdmVudCxcclxuICAgIEh0dHBJbnRlcmNlcHRvcixcclxuICAgIEh0dHBIYW5kbGVyLFxyXG4gICAgSHR0cFJlcXVlc3QsXHJcbiAgICBIdHRwRXJyb3JSZXNwb25zZVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgdGhyb3dFcnJvciwgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaWx0ZXIsIGZpbmFsaXplLCB0YWtlLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL3Nlc3Npb24uc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBBdXRoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xyXG4gICAgcHJpdmF0ZSBBVVRIX0hFQURFUiA9ICdBdXRob3JpemF0aW9uJztcclxuICAgIHByaXZhdGUgUEVQUEVSSV9UT0tFTl9IRUFERVIgPSAnUGVwcGVyaVNlc3Npb25Ub2tlbic7XHJcbiAgICBwcml2YXRlIFBFUFBFUklfQ09OU1VNRVJfS0VZX0hFQURFUiA9ICdYLVBlcHBlcmktQ29uc3VtZXJLZXknO1xyXG5cclxuICAgIC8vIHByaXZhdGUgU0VTU0lPTl9UT0tFTl9LRVkgPSAnYXV0aF90b2tlbic7XHJcbiAgICAvLyBwcml2YXRlIHRva2VuID0gJ3NlY3JldHRva2VuJztcclxuICAgIC8vIHByaXZhdGUgcmVmcmVzaFRva2VuSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgLy8gcHJpdmF0ZSByZWZyZXNoVG9rZW5TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55PiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNlc3Npb25TZXJ2aWNlOiBTZXNzaW9uU2VydmljZSkge31cclxuXHJcbiAgICAvLyBBZGQgYXV0aG9yaXphdGlvbiB0b2tlbiBpZiB0aGUgdG9rZW4gZXhpc3QuXHJcbiAgICBwcml2YXRlIGFkZEF1dGhvcml6YXRpb25Ub2tlbihyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+KTogSHR0cFJlcXVlc3Q8YW55PiB7XHJcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmhlYWRlcnMuaGFzKHRoaXMuQVVUSF9IRUFERVIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkcFRva2VuID0gdGhpcy5zZXNzaW9uU2VydmljZS5nZXRJZHBUb2tlbigpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlkcFRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdC5jbG9uZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLnNldCh0aGlzLkFVVEhfSEVBREVSLCBgQmVhcmVyICR7aWRwVG9rZW59YClcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgcGVwcGVyaSBjb25zdW1lciB0b2tlbiBpZiBjYWxsaW5nIHRvIHBhcGkgZG9tYWluLlxyXG4gICAgcHJpdmF0ZSBhZGRQZXBwZXJpQ29uc3VtZXJUb2tlbihyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+KTogSHR0cFJlcXVlc3Q8YW55PiB7XHJcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmhlYWRlcnMuaGFzKHRoaXMuUEVQUEVSSV9DT05TVU1FUl9LRVlfSEVBREVSKSkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXBpQmFzZVVybCA9IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0UGFwaUJhc2VVcmwoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwYXBpQmFzZVVybCAmJiByZXF1ZXN0LnVybC5tYXRjaChuZXcgUmVnRXhwKHBhcGlCYXNlVXJsLCAnZycpKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGVwcGVyaUNvbnN1bWVyVG9rZW4gPSB0aGlzLnNlc3Npb25TZXJ2aWNlLmdldFBlcHBlcmlDb25zdW1lclRva2VuKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGVwcGVyaUNvbnN1bWVyVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdC5jbG9uZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycy5zZXQodGhpcy5QRVBQRVJJX0NPTlNVTUVSX0tFWV9IRUFERVIsIHBlcHBlcmlDb25zdW1lclRva2VuKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgd2ViIGFwaSB0b2tlbiBpZiBjYWxsaW5nIHRvIHdhcGkgZG9tYWluLlxyXG4gICAgcHJpdmF0ZSBhZGRXZWJBcGlUb2tlbihyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+KTogSHR0cFJlcXVlc3Q8YW55PiB7XHJcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmhlYWRlcnMuaGFzKHRoaXMuUEVQUEVSSV9UT0tFTl9IRUFERVIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdhcGlCYXNlVXJsID0gdGhpcy5zZXNzaW9uU2VydmljZS5nZXRXYXBpQmFzZVVybCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHdhcGlCYXNlVXJsICYmIHJlcXVlc3QudXJsLm1hdGNoKG5ldyBSZWdFeHAod2FwaUJhc2VVcmwsICdnJykpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB3ZWJBcGlUb2tlbiA9IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0dFdhcGlUb2tlbigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHdlYkFwaVRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHJlcXVlc3QuY2xvbmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMuc2V0KHRoaXMuUEVQUEVSSV9UT0tFTl9IRUFERVIsIHdlYkFwaVRva2VuKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcclxuICAgIH1cclxuXHJcbiAgICBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ0F1dGhJbnRlcmNlcHRvcicpO1xyXG5cclxuICAgICAgICAvLyBBZGQgY29udGVudCB0eXBlXHJcbiAgICAgICAgaWYgKCFyZXEuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpKSB7XHJcbiAgICAgICAgICAgIHJlcSA9IHJlcS5jbG9uZSh7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXEuaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJylcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXEgPSB0aGlzLmFkZEF1dGhvcml6YXRpb25Ub2tlbihyZXEpO1xyXG5cclxuICAgICAgICByZXEgPSB0aGlzLmFkZFBlcHBlcmlDb25zdW1lclRva2VuKHJlcSk7XHJcblxyXG4gICAgICAgIHJlcSA9IHRoaXMuYWRkV2ViQXBpVG9rZW4ocmVxKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcSk7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IENoZWNrIGlmIHdlIG5lZWQgdGhpcyAtIHRoaXMgaXMgYW4gYWR2YW5jZSBjb2RlIHRoYXQgdHJ5IHRvIHJlZnJlc2ggdGhlIHRva2VuIGluIGNhc2Ugb2YgZXhwaXJlZC5cclxuICAgICAgICAvLyByZXR1cm4gbmV4dC5oYW5kbGUocmVxKS5waXBlKFxyXG4gICAgICAgIC8vICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAvLyAgICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5zdGF0dXMgPT09IDQwMSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIC8vIDQwMSBlcnJvcnMgYXJlIG1vc3QgbGlrZWx5IGdvaW5nIHRvIGJlIGJlY2F1c2Ugd2UgaGF2ZSBhbiBleHBpcmVkIHRva2VuIHRoYXQgd2UgbmVlZCB0byByZWZyZXNoLlxyXG4gICAgICAgIC8vICAgICAgICAgICAgIGlmICh0aGlzLnJlZnJlc2hUb2tlbkluUHJvZ3Jlc3MpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgLy8gSWYgcmVmcmVzaFRva2VuSW5Qcm9ncmVzcyBpcyB0cnVlLCB3ZSB3aWxsIHdhaXQgdW50aWwgcmVmcmVzaFRva2VuU3ViamVjdCBoYXMgYSBub24tbnVsbCB2YWx1ZVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAvLyB3aGljaCBtZWFucyB0aGUgbmV3IHRva2VuIGlzIHJlYWR5IGFuZCB3ZSBjYW4gcmV0cnkgdGhlIHJlcXVlc3QgYWdhaW5cclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuU3ViamVjdC5waXBlKFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHJlc3VsdCA9PiByZXN1bHQgIT09IG51bGwpLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiBuZXh0LmhhbmRsZSh0aGlzLmFkZEF1dGhlbnRpY2F0aW9uVG9rZW4ocmVxKSkpXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5JblByb2dyZXNzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcmVmcmVzaFRva2VuU3ViamVjdCB0byBudWxsIHNvIHRoYXQgc3Vic2VxdWVudCBBUEkgY2FsbHMgd2lsbFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAvLyB3YWl0IHVudGlsIHRoZSBuZXcgdG9rZW4gaGFzIGJlZW4gcmV0cmlldmVkXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuU3ViamVjdC5uZXh0KG51bGwpO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuKCkucGlwZShcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoc3VjY2VzczogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuU3ViamVjdC5uZXh0KHN1Y2Nlc3MpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZSh0aGlzLmFkZEF1dGhlbnRpY2F0aW9uVG9rZW4ocmVxKSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIGNhbGwgdG8gcmVmcmVzaFRva2VuIGNvbXBsZXRlcyB3ZSByZXNldCB0aGUgcmVmcmVzaFRva2VuSW5Qcm9ncmVzcyB0byBmYWxzZVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBuZXh0IHRpbWUgdGhlIHRva2VuIG5lZWRzIHRvIGJlIHJlZnJlc2hlZFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gKHRoaXMucmVmcmVzaFRva2VuSW5Qcm9ncmVzcyA9IGZhbHNlKSlcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfSlcclxuICAgICAgICAvLyApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHByaXZhdGUgcmVmcmVzaEFjY2Vzc1Rva2VuKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyAgICAgcmV0dXJuIG9mKCdzZWNyZXQgdG9rZW4nKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIGFkZEF1dGhlbnRpY2F0aW9uVG9rZW4ocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55Pik6IEh0dHBSZXF1ZXN0PGFueT4ge1xyXG4gICAgLy8gICAgIC8vIElmIHdlIGRvIG5vdCBoYXZlIGEgdG9rZW4geWV0IHRoZW4gd2Ugc2hvdWxkIG5vdCBzZXQgdGhlIGhlYWRlci5cclxuICAgIC8vICAgICAvLyBIZXJlIHdlIGNvdWxkIGZpcnN0IHJldHJpZXZlIHRoZSB0b2tlbiBmcm9tIHdoZXJlIHdlIHN0b3JlIGl0LlxyXG4gICAgLy8gICAgIGlmICghdGhpcy50b2tlbikge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gcmVxdWVzdDtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgLy8gSWYgeW91IGFyZSBjYWxsaW5nIGFuIG91dHNpZGUgZG9tYWluIHRoZW4gZG8gbm90IGFkZCB0aGUgdG9rZW4uXHJcbiAgICAvLyAgICAgaWYgKCFyZXF1ZXN0LnVybC5tYXRjaCgvd3d3Lm15ZG9tYWluLmNvbVxcLy8pKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICByZXR1cm4gcmVxdWVzdC5jbG9uZSh7XHJcbiAgICAvLyAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycy5zZXQodGhpcy5BVVRIX0hFQURFUiwgYEJlYXJlciAke3RoaXMudG9rZW59YClcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxufSJdfQ==