bc-adal-angular
Version:
Library wrapper for Angular 6+, development over Microsoft ADAL (Azure Active Directory Authentication Library) - [https://github.com/AzureAD/azure-activedirectory-library-for-js](https://github.com/AzureAD/azure-activedirectory-library-for-js) that helps
348 lines (337 loc) • 26.1 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('adal-angular'), require('rxjs'), require('rxjs/operators'), require('@angular/router'), require('rxjs/internal/operators/mergeMap'), require('@angular/common'), require('@angular/common/http')) :
typeof define === 'function' && define.amd ? define('bc-adal-angular', ['exports', '@angular/core', 'adal-angular', 'rxjs', 'rxjs/operators', '@angular/router', 'rxjs/internal/operators/mergeMap', '@angular/common', '@angular/common/http'], factory) :
(factory((global['bc-adal-angular'] = {}),global.ng.core,global.AuthenticationContext,global.rxjs,global.rxjs.operators,global.ng.router,global.rxjs['internal/operators/mergeMap'],global.ng.common,global.ng.common.http));
}(this, (function (exports,core,AuthenticationContext,rxjs,operators,router,mergeMap,common,http) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/** @type {?} */
var ADAL_OPTIONS = new core.InjectionToken('bc.adal.angular.options');
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var BcAdalAngularService = /** @class */ (function () {
function BcAdalAngularService(adalOptions) {
this.adalOptions = adalOptions;
this.setOptions(adalOptions);
this.initAuthenticationContext();
}
/**
* @return {?}
*/
BcAdalAngularService.prototype.login = /**
* @return {?}
*/
function () {
this.context.login();
};
/**
* @return {?}
*/
BcAdalAngularService.prototype.logout = /**
* @return {?}
*/
function () {
this.context.logOut();
};
/**
* @return {?}
*/
BcAdalAngularService.prototype.getOptions = /**
* @return {?}
*/
function () {
return this.options;
};
/**
* @param {?} adalOptions
* @return {?}
*/
BcAdalAngularService.prototype.setOptions = /**
* @param {?} adalOptions
* @return {?}
*/
function (adalOptions) {
this.options = adalOptions;
};
Object.defineProperty(BcAdalAngularService.prototype, "authContext", {
get: /**
* @return {?}
*/ function () {
return this.context;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
BcAdalAngularService.prototype.handleWindowCallback = /**
* @return {?}
*/
function () {
this.context.handleWindowCallback();
};
Object.defineProperty(BcAdalAngularService.prototype, "userInfo", {
get: /**
* @return {?}
*/ function () {
return this.context.getCachedUser();
},
enumerable: true,
configurable: true
});
Object.defineProperty(BcAdalAngularService.prototype, "accessToken", {
get: /**
* @return {?}
*/ function () {
return this.context.getCachedToken(this.options.clientId);
},
enumerable: true,
configurable: true
});
Object.defineProperty(BcAdalAngularService.prototype, "isAuthenticated", {
get: /**
* @return {?}
*/ function () {
return this.userInfo && this.accessToken;
},
enumerable: true,
configurable: true
});
/**
* @param {?} url
* @return {?}
*/
BcAdalAngularService.prototype.getResourceForEndpoint = /**
* @param {?} url
* @return {?}
*/
function (url) {
return this.context.getResourceForEndpoint(url);
};
/**
* @param {?} hash
* @return {?}
*/
BcAdalAngularService.prototype.isCallback = /**
* @param {?} hash
* @return {?}
*/
function (hash) {
return this.context.isCallback(hash);
};
/**
* @return {?}
*/
BcAdalAngularService.prototype.getLoginError = /**
* @return {?}
*/
function () {
return this.context.getLoginError();
};
/**
* @param {?} endpoint
* @param {?} callbacks
* @return {?}
*/
BcAdalAngularService.prototype.getAccessToken = /**
* @param {?} endpoint
* @param {?} callbacks
* @return {?}
*/
function (endpoint, callbacks) {
return this.context.acquireToken(endpoint, callbacks);
};
/* istanbul ignore next */
/* istanbul ignore next */
/**
* @param {?} resource
* @return {?}
*/
BcAdalAngularService.prototype.acquireTokenResilient = /* istanbul ignore next */
/**
* @param {?} resource
* @return {?}
*/
function (resource) {
var _this = this;
return new rxjs.Observable(function (subscriber) {
return _this.context.acquireToken(resource, function (message, token) {
if (token) {
subscriber.next(token);
}
else {
subscriber.error(message);
}
});
}).pipe(operators.retry(3));
};
/**
* @private
* @return {?}
*/
BcAdalAngularService.prototype.initAuthenticationContext = /**
* @private
* @return {?}
*/
function () {
this.context = new AuthenticationContext(this.options);
};
BcAdalAngularService.decorators = [
{ type: core.Injectable }
];
BcAdalAngularService.ctorParameters = function () {
return [
{ type: undefined, decorators: [{ type: core.Inject, args: [ADAL_OPTIONS,] }] }
];
};
return BcAdalAngularService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var AdalAccessGuard = /** @class */ (function () {
function AdalAccessGuard(router$$1, adalService) {
this.router = router$$1;
this.adalService = adalService;
}
/**
* @param {?} route
* @param {?} state
* @return {?}
*/
AdalAccessGuard.prototype.canActivate = /**
* @param {?} route
* @param {?} state
* @return {?}
*/
function (route, state) {
/** @type {?} */
var navigationExtras = {
queryParams: { redirectUrl: route.url }
};
if (this.adalService.userInfo) {
return true;
}
this.router.navigate(['accessdenied'], navigationExtras);
return false;
};
AdalAccessGuard.decorators = [
{ type: core.Injectable }
];
AdalAccessGuard.ctorParameters = function () {
return [
{ type: router.Router },
{ type: BcAdalAngularService }
];
};
return AdalAccessGuard;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var BcAdalAngularInterceptor = /** @class */ (function () {
function BcAdalAngularInterceptor(adalService) {
this.adalService = adalService;
}
/**
* @param {?} request
* @param {?} next
* @return {?}
*/
BcAdalAngularInterceptor.prototype.intercept = /**
* @param {?} request
* @param {?} next
* @return {?}
*/
function (request, next) {
/** @type {?} */
var resource = this.adalService.getOptions()['resource'] ||
this.adalService.getResourceForEndpoint(request.url);
if (!resource) {
return next.handle(request);
}
if (!this.adalService.isAuthenticated) {
throw new Error('Cannot send request to registered endpoint if the user is not authenticated.');
}
return this.adalService.acquireTokenResilient(resource).pipe(mergeMap.mergeMap(function (token) {
if (!token) {
return next.handle(request);
}
/** @type {?} */
var requestWithAuthorization = request.clone({
headers: request.headers.set('Authorization', 'Bearer ' + token)
});
return next.handle(requestWithAuthorization);
}));
};
BcAdalAngularInterceptor.decorators = [
{ type: core.Injectable }
];
BcAdalAngularInterceptor.ctorParameters = function () {
return [
{ type: BcAdalAngularService }
];
};
return BcAdalAngularInterceptor;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var BcAdalAngularModule = /** @class */ (function () {
function BcAdalAngularModule() {
}
/**
* @param {?} options
* @return {?}
*/
BcAdalAngularModule.forRoot = /**
* @param {?} options
* @return {?}
*/
function (options) {
return {
ngModule: BcAdalAngularModule,
providers: [
BcAdalAngularService,
AdalAccessGuard,
{
provide: http.HTTP_INTERCEPTORS,
useClass: BcAdalAngularInterceptor,
multi: true
},
{ provide: ADAL_OPTIONS, useValue: options }
]
};
};
BcAdalAngularModule.decorators = [
{ type: core.NgModule, args: [{
imports: [common.CommonModule, http.HttpClientModule],
declarations: []
},] }
];
return BcAdalAngularModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
exports.BcAdalAngularService = BcAdalAngularService;
exports.AdalAccessGuard = AdalAccessGuard;
exports.BcAdalAngularModule = BcAdalAngularModule;
exports.ɵb = ADAL_OPTIONS;
exports.ɵc = BcAdalAngularInterceptor;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmMtYWRhbC1hbmd1bGFyLnVtZC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vYmMtYWRhbC1hbmd1bGFyL2xpYi9jb25maWcvYWRhbC5vcHRpb25zLnRzIiwibmc6Ly9iYy1hZGFsLWFuZ3VsYXIvbGliL3NlcnZpY2VzL2JjLWFkYWwtYW5ndWxhci5zZXJ2aWNlLnRzIiwibmc6Ly9iYy1hZGFsLWFuZ3VsYXIvbGliL2d1YXJkcy9hZGFsLWFjY2Vzcy5ndWFyZC50cyIsIm5nOi8vYmMtYWRhbC1hbmd1bGFyL2xpYi9zZXJ2aWNlcy9iYy1hZGFsLWFuZ3VsYXIuaW50ZXJjZXB0b3IudHMiLCJuZzovL2JjLWFkYWwtYW5ndWxhci9saWIvYmMtYWRhbC1hbmd1bGFyLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBBdXRoZW50aWNhdGlvbkNvbnRleHQgZnJvbSAnYWRhbC1hbmd1bGFyJztcclxuXHJcbmV4cG9ydCB0eXBlIEFkYWxPcHRpb25zID0gQXV0aGVudGljYXRpb25Db250ZXh0Lk9wdGlvbnM7XHJcblxyXG5leHBvcnQgY29uc3QgQURBTF9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuPEFkYWxPcHRpb25zPihcclxuICAnYmMuYWRhbC5hbmd1bGFyLm9wdGlvbnMnXHJcbik7XHJcbiIsImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBBdXRoZW50aWNhdGlvbkNvbnRleHQgZnJvbSAnYWRhbC1hbmd1bGFyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaWJlciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyByZXRyeSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IEFEQUxfT1BUSU9OUywgQWRhbE9wdGlvbnMgfSBmcm9tICcuLy4uL2NvbmZpZy9hZGFsLm9wdGlvbnMnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQmNBZGFsQW5ndWxhclNlcnZpY2Uge1xyXG4gIHByaXZhdGUgY29udGV4dDogQXV0aGVudGljYXRpb25Db250ZXh0O1xyXG4gIHByaXZhdGUgb3B0aW9uczogQWRhbE9wdGlvbnM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoQURBTF9PUFRJT05TKSBwcml2YXRlIGFkYWxPcHRpb25zOiBBZGFsT3B0aW9ucykge1xyXG4gICAgdGhpcy5zZXRPcHRpb25zKGFkYWxPcHRpb25zKTtcclxuICAgIHRoaXMuaW5pdEF1dGhlbnRpY2F0aW9uQ29udGV4dCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvZ2luKCkge1xyXG4gICAgdGhpcy5jb250ZXh0LmxvZ2luKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9nb3V0KCkge1xyXG4gICAgdGhpcy5jb250ZXh0LmxvZ091dCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE9wdGlvbnMoKTogQWRhbE9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRPcHRpb25zKGFkYWxPcHRpb25zOiBBZGFsT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0gYWRhbE9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICBnZXQgYXV0aENvbnRleHQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0O1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlV2luZG93Q2FsbGJhY2soKSB7XHJcbiAgICB0aGlzLmNvbnRleHQuaGFuZGxlV2luZG93Q2FsbGJhY2soKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdXNlckluZm8oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmdldENhY2hlZFVzZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgYWNjZXNzVG9rZW4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmdldENhY2hlZFRva2VuKHRoaXMub3B0aW9ucy5jbGllbnRJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGlzQXV0aGVudGljYXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLnVzZXJJbmZvICYmIHRoaXMuYWNjZXNzVG9rZW47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0UmVzb3VyY2VGb3JFbmRwb2ludCh1cmw6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5nZXRSZXNvdXJjZUZvckVuZHBvaW50KHVybCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNDYWxsYmFjayhoYXNoOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRleHQuaXNDYWxsYmFjayhoYXNoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRMb2dpbkVycm9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5nZXRMb2dpbkVycm9yKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QWNjZXNzVG9rZW4oXHJcbiAgICBlbmRwb2ludDogc3RyaW5nLFxyXG4gICAgY2FsbGJhY2tzOiAobWVzc2FnZTogc3RyaW5nLCB0b2tlbjogc3RyaW5nKSA9PiBhbnlcclxuICApIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRleHQuYWNxdWlyZVRva2VuKGVuZHBvaW50LCBjYWxsYmFja3MpO1xyXG4gIH1cclxuXHJcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cclxuICBwdWJsaWMgYWNxdWlyZVRva2VuUmVzaWxpZW50KHJlc291cmNlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPGFueT4oKHN1YnNjcmliZXI6IFN1YnNjcmliZXI8YW55PikgPT5cclxuICAgICAgdGhpcy5jb250ZXh0LmFjcXVpcmVUb2tlbihyZXNvdXJjZSwgKG1lc3NhZ2U6IHN0cmluZywgdG9rZW46IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHRva2VuKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApLnBpcGUocmV0cnkoMykpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0QXV0aGVudGljYXRpb25Db250ZXh0KCkge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gbmV3IEF1dGhlbnRpY2F0aW9uQ29udGV4dCh0aGlzLm9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcclxuICBDYW5BY3RpdmF0ZSxcclxuICBOYXZpZ2F0aW9uRXh0cmFzLFxyXG4gIFJvdXRlcixcclxuICBSb3V0ZXJTdGF0ZVNuYXBzaG90XHJcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgQmNBZGFsQW5ndWxhclNlcnZpY2UgfSBmcm9tICcuLy4uL3NlcnZpY2VzL2JjLWFkYWwtYW5ndWxhci5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEFkYWxBY2Nlc3NHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGFkYWxTZXJ2aWNlOiBCY0FkYWxBbmd1bGFyU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgY2FuQWN0aXZhdGUoXHJcbiAgICByb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcclxuICAgIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90XHJcbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuPiB8IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuIHtcclxuICAgIGNvbnN0IG5hdmlnYXRpb25FeHRyYXM6IE5hdmlnYXRpb25FeHRyYXMgPSB7XHJcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IHJlZGlyZWN0VXJsOiByb3V0ZS51cmwgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5hZGFsU2VydmljZS51c2VySW5mbykge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2FjY2Vzc2RlbmllZCddLCBuYXZpZ2F0aW9uRXh0cmFzKTtcclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7XHJcbiAgSHR0cEV2ZW50LFxyXG4gIEh0dHBIYW5kbGVyLFxyXG4gIEh0dHBJbnRlcmNlcHRvcixcclxuICBIdHRwUmVxdWVzdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1lcmdlTWFwIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VNYXAnO1xyXG5cclxuaW1wb3J0IHsgQmNBZGFsQW5ndWxhclNlcnZpY2UgfSBmcm9tICcuL2JjLWFkYWwtYW5ndWxhci5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEJjQWRhbEFuZ3VsYXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhZGFsU2VydmljZTogQmNBZGFsQW5ndWxhclNlcnZpY2UpIHt9XHJcblxyXG4gIGludGVyY2VwdChcclxuICAgIHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sXHJcbiAgICBuZXh0OiBIdHRwSGFuZGxlclxyXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcclxuICAgIGNvbnN0IHJlc291cmNlID1cclxuICAgICAgdGhpcy5hZGFsU2VydmljZS5nZXRPcHRpb25zKClbJ3Jlc291cmNlJ10gfHxcclxuICAgICAgdGhpcy5hZGFsU2VydmljZS5nZXRSZXNvdXJjZUZvckVuZHBvaW50KHJlcXVlc3QudXJsKTtcclxuXHJcbiAgICBpZiAoIXJlc291cmNlKSB7XHJcbiAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuYWRhbFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnQ2Fubm90IHNlbmQgcmVxdWVzdCB0byByZWdpc3RlcmVkIGVuZHBvaW50IGlmIHRoZSB1c2VyIGlzIG5vdCBhdXRoZW50aWNhdGVkLidcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5hZGFsU2VydmljZS5hY3F1aXJlVG9rZW5SZXNpbGllbnQocmVzb3VyY2UpLnBpcGUoXHJcbiAgICAgIG1lcmdlTWFwKCh0b2tlbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0b2tlbikge1xyXG4gICAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVxdWVzdFdpdGhBdXRob3JpemF0aW9uID0gcmVxdWVzdC5jbG9uZSh7XHJcbiAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgdG9rZW4pXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0V2l0aEF1dGhvcml6YXRpb24pO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSFRUUF9JTlRFUkNFUFRPUlMsIEh0dHBDbGllbnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21waWxlci9zcmMvY29yZSc7XHJcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBBREFMX09QVElPTlMsIEFkYWxPcHRpb25zIH0gZnJvbSAnLi9jb25maWcvYWRhbC5vcHRpb25zJztcclxuaW1wb3J0IHsgQWRhbEFjY2Vzc0d1YXJkIH0gZnJvbSAnLi9ndWFyZHMvYWRhbC1hY2Nlc3MuZ3VhcmQnO1xyXG5pbXBvcnQgeyBCY0FkYWxBbmd1bGFySW50ZXJjZXB0b3IgfSBmcm9tICcuL3NlcnZpY2VzL2JjLWFkYWwtYW5ndWxhci5pbnRlcmNlcHRvcic7XHJcbmltcG9ydCB7IEJjQWRhbEFuZ3VsYXJTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9iYy1hZGFsLWFuZ3VsYXIuc2VydmljZSc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEh0dHBDbGllbnRNb2R1bGVdLFxyXG4gIGRlY2xhcmF0aW9uczogW11cclxufSlcclxuZXhwb3J0IGNsYXNzIEJjQWRhbEFuZ3VsYXJNb2R1bGUge1xyXG4gIHN0YXRpYyBmb3JSb290KG9wdGlvbnM6IEFkYWxPcHRpb25zKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuZ01vZHVsZTogQmNBZGFsQW5ndWxhck1vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgQmNBZGFsQW5ndWxhclNlcnZpY2UsXHJcbiAgICAgICAgQWRhbEFjY2Vzc0d1YXJkLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTLFxyXG4gICAgICAgICAgdXNlQ2xhc3M6IEJjQWRhbEFuZ3VsYXJJbnRlcmNlcHRvcixcclxuICAgICAgICAgIG11bHRpOiB0cnVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IHByb3ZpZGU6IEFEQUxfT1BUSU9OUywgdXNlVmFsdWU6IG9wdGlvbnMgfVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOlsiSW5qZWN0aW9uVG9rZW4iLCJPYnNlcnZhYmxlIiwicmV0cnkiLCJJbmplY3RhYmxlIiwiSW5qZWN0Iiwicm91dGVyIiwiUm91dGVyIiwibWVyZ2VNYXAiLCJIVFRQX0lOVEVSQ0VQVE9SUyIsIk5nTW9kdWxlIiwiQ29tbW9uTW9kdWxlIiwiSHR0cENsaWVudE1vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBS0EsUUFBYSxZQUFZLEdBQUcsSUFBSUEsbUJBQWMsQ0FDNUMseUJBQXlCLENBQzFCOzs7Ozs7QUNQRDtRQVlFLDhCQUEwQyxXQUF3QjtZQUF4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtZQUNoRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1NBQ2xDOzs7O1FBRU0sb0NBQUs7OztZQUFaO2dCQUNFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDdEI7Ozs7UUFFTSxxQ0FBTTs7O1lBQWI7Z0JBQ0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUN2Qjs7OztRQUVNLHlDQUFVOzs7WUFBakI7Z0JBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQ3JCOzs7OztRQUVNLHlDQUFVOzs7O1lBQWpCLFVBQWtCLFdBQXdCO2dCQUN4QyxJQUFJLENBQUMs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