@ariyana/appauth
Version:
A general purpose OAuth client.
130 lines • 19.5 kB
JavaScript
;
/*
* Copyright 2017 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.App = void 0;
// Represents a Node application, that uses the AppAuthJS library.
var authorization_request_1 = require("../authorization_request");
var authorization_request_handler_1 = require("../authorization_request_handler");
var authorization_service_configuration_1 = require("../authorization_service_configuration");
var logger_1 = require("../logger");
var node_support_1 = require("../node_support");
var node_requestor_1 = require("../node_support/node_requestor");
var node_request_handler_1 = require("../node_support/node_request_handler");
var revoke_token_request_1 = require("../revoke_token_request");
var token_request_1 = require("../token_request");
var token_request_handler_1 = require("../token_request_handler");
var PORT = 32111;
/* the Node.js based HTTP client. */
var requestor = new node_requestor_1.NodeRequestor();
/* an example open id connect provider */
var openIdConnectUrl = 'https://accounts.google.com';
/* example client configuration */
var clientId = '511828570984-7nmej36h9j2tebiqmpqh835naet4vci4.apps.googleusercontent.com';
var redirectUri = "http://127.0.0.1:" + PORT;
var scope = 'openid';
var App = /** @class */ (function () {
function App() {
var _this = this;
this.notifier = new authorization_request_handler_1.AuthorizationNotifier();
this.authorizationHandler = new node_request_handler_1.NodeBasedHandler(PORT);
this.tokenHandler = new token_request_handler_1.BaseTokenRequestHandler(requestor);
// set notifier to deliver responses
this.authorizationHandler.setAuthorizationNotifier(this.notifier);
// set a listener to listen for authorization responses
// make refresh and access token requests.
this.notifier.setAuthorizationListener(function (request, response, error) {
logger_1.log('Authorization request complete ', request, response, error);
if (response) {
_this.makeRefreshTokenRequest(_this.configuration, request, response)
.then(function (result) { return _this.makeAccessTokenRequest(_this.configuration, result.refreshToken); })
.then(function () { return logger_1.log('All done.'); });
}
});
}
App.prototype.fetchServiceConfiguration = function () {
return authorization_service_configuration_1.AuthorizationServiceConfiguration.fetchFromIssuer(openIdConnectUrl, requestor)
.then(function (response) {
logger_1.log('Fetched service configuration', response);
return response;
});
};
App.prototype.makeAuthorizationRequest = function (configuration) {
// create a request
var request = new authorization_request_1.AuthorizationRequest({
client_id: clientId,
redirect_uri: redirectUri,
scope: scope,
response_type: authorization_request_1.AuthorizationRequest.RESPONSE_TYPE_CODE,
state: undefined,
extras: { 'prompt': 'consent', 'access_type': 'offline' }
}, new node_support_1.NodeCrypto());
logger_1.log('Making authorization request ', configuration, request);
this.authorizationHandler.performAuthorizationRequest(configuration, request);
};
App.prototype.makeRefreshTokenRequest = function (configuration, request, response) {
var extras = undefined;
if (request && request.internal) {
extras = {};
extras['code_verifier'] = request.internal['code_verifier'];
}
var tokenRequest = new token_request_1.TokenRequest({
client_id: clientId,
redirect_uri: redirectUri,
grant_type: token_request_1.GRANT_TYPE_AUTHORIZATION_CODE,
code: response.code,
refresh_token: undefined,
extras: extras
});
return this.tokenHandler.performTokenRequest(configuration, tokenRequest).then(function (response) {
logger_1.log("Refresh Token is " + response.refreshToken);
return response;
});
};
App.prototype.makeAccessTokenRequest = function (configuration, refreshToken) {
var request = new token_request_1.TokenRequest({
client_id: clientId,
redirect_uri: redirectUri,
grant_type: token_request_1.GRANT_TYPE_REFRESH_TOKEN,
code: undefined,
refresh_token: refreshToken,
extras: undefined
});
return this.tokenHandler.performTokenRequest(configuration, request).then(function (response) {
logger_1.log("Access Token is " + response.accessToken + ", Id Token is " + response.idToken);
return response;
});
};
App.prototype.makeRevokeTokenRequest = function (configuration, refreshToken) {
var request = new revoke_token_request_1.RevokeTokenRequest({ token: refreshToken });
return this.tokenHandler.performRevokeTokenRequest(configuration, request).then(function (response) {
logger_1.log('revoked refreshToken');
return response;
});
};
return App;
}());
exports.App = App;
logger_1.log('Application is ready.');
var app = new App();
app.fetchServiceConfiguration()
.then(function (configuration) {
app.configuration = configuration;
app.makeAuthorizationRequest(configuration);
// notifier makes token requests.
})
.catch(function (error) {
logger_1.log('Something bad happened ', error);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbm9kZV9hcHAvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7R0FZRzs7O0FBRUgsa0VBQWtFO0FBRWxFLGtFQUFnRTtBQUNoRSxrRkFBc0c7QUFFdEcsOEZBQTJGO0FBQzNGLG9DQUFnQztBQUNoQyxnREFBNkM7QUFDN0MsaUVBQStEO0FBQy9ELDZFQUF3RTtBQUN4RSxnRUFBNkQ7QUFDN0Qsa0RBQXlHO0FBQ3pHLGtFQUF3RjtBQUd4RixJQUFNLElBQUksR0FBRyxLQUFLLENBQUM7QUFFbkIsb0NBQW9DO0FBQ3BDLElBQU0sU0FBUyxHQUFHLElBQUksOEJBQWEsRUFBRSxDQUFDO0FBRXRDLHlDQUF5QztBQUN6QyxJQUFNLGdCQUFnQixHQUFHLDZCQUE2QixDQUFDO0FBRXZELGtDQUFrQztBQUNsQyxJQUFNLFFBQVEsR0FBRywwRUFBMEUsQ0FBQztBQUM1RixJQUFNLFdBQVcsR0FBRyxzQkFBb0IsSUFBTSxDQUFDO0FBQy9DLElBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQztBQUV2QjtJQVFFO1FBQUEsaUJBZ0JDO1FBZkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHFEQUFxQixFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksdUNBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLCtDQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNELG9DQUFvQztRQUNwQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xFLHVEQUF1RDtRQUN2RCwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSztZQUM5RCxZQUFHLENB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dCAyMDE3IEdvb2dsZSBJbmMuXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0XHJcbiAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZVxyXG4gKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlclxyXG4gKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5cclxuLy8gUmVwcmVzZW50cyBhIE5vZGUgYXBwbGljYXRpb24sIHRoYXQgdXNlcyB0aGUgQXBwQXV0aEpTIGxpYnJhcnkuXHJcblxyXG5pbXBvcnQgeyBBdXRob3JpemF0aW9uUmVxdWVzdCB9IGZyb20gJy4uL2F1dGhvcml6YXRpb25fcmVxdWVzdCc7XHJcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Ob3RpZmllciwgQXV0aG9yaXphdGlvblJlcXVlc3RIYW5kbGVyIH0gZnJvbSAnLi4vYXV0aG9yaXphdGlvbl9yZXF1ZXN0X2hhbmRsZXInO1xyXG5pbXBvcnQgeyBBdXRob3JpemF0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9hdXRob3JpemF0aW9uX3Jlc3BvbnNlJztcclxuaW1wb3J0IHsgQXV0aG9yaXphdGlvblNlcnZpY2VDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vYXV0aG9yaXphdGlvbl9zZXJ2aWNlX2NvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuLi9sb2dnZXInO1xyXG5pbXBvcnQgeyBOb2RlQ3J5cHRvIH0gZnJvbSAnLi4vbm9kZV9zdXBwb3J0JztcclxuaW1wb3J0IHsgTm9kZVJlcXVlc3RvciB9IGZyb20gJy4uL25vZGVfc3VwcG9ydC9ub2RlX3JlcXVlc3Rvcic7XHJcbmltcG9ydCB7IE5vZGVCYXNlZEhhbmRsZXIgfSBmcm9tICcuLi9ub2RlX3N1cHBvcnQvbm9kZV9yZXF1ZXN0X2hhbmRsZXInO1xyXG5pbXBvcnQgeyBSZXZva2VUb2tlblJlcXVlc3QgfSBmcm9tICcuLi9yZXZva2VfdG9rZW5fcmVxdWVzdCc7XHJcbmltcG9ydCB7IEdSQU5UX1RZUEVfQVVUSE9SSVpBVElPTl9DT0RFLCBHUkFOVF9UWVBFX1JFRlJFU0hfVE9LRU4sIFRva2VuUmVxdWVzdCB9IGZyb20gJy4uL3Rva2VuX3JlcXVlc3QnO1xyXG5pbXBvcnQgeyBCYXNlVG9rZW5SZXF1ZXN0SGFuZGxlciwgVG9rZW5SZXF1ZXN0SGFuZGxlciB9IGZyb20gJy4uL3Rva2VuX3JlcXVlc3RfaGFuZGxlcic7XHJcbmltcG9ydCB7IFN0cmluZ01hcCB9IGZyb20gJy4uL3R5cGVzJztcclxuXHJcbmNvbnN0IFBPUlQgPSAzMjExMTtcclxuXHJcbi8qIHRoZSBOb2RlLmpzIGJhc2VkIEhUVFAgY2xpZW50LiAqL1xyXG5jb25zdCByZXF1ZXN0b3IgPSBuZXcgTm9kZVJlcXVlc3RvcigpO1xyXG5cclxuLyogYW4gZXhhbXBsZSBvcGVuIGlkIGNvbm5lY3QgcHJvdmlkZXIgKi9cclxuY29uc3Qgb3BlbklkQ29ubmVjdFVybCA9ICdodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20nO1xyXG5cclxuLyogZXhhbXBsZSBjbGllbnQgY29uZmlndXJhdGlvbiAqL1xyXG5jb25zdCBjbGllbnRJZCA9ICc1MTE4Mjg1NzA5ODQtN25tZWozNmg5ajJ0ZWJpcW1wcWg4MzVuYWV0NHZjaTQuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20nO1xyXG5jb25zdCByZWRpcmVjdFVyaSA9IGBodHRwOi8vMTI3LjAuMC4xOiR7UE9SVH1gO1xyXG5jb25zdCBzY29wZSA9ICdvcGVuaWQnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFwcCB7XHJcbiAgcHJpdmF0ZSBub3RpZmllcjogQXV0aG9yaXphdGlvbk5vdGlmaWVyO1xyXG4gIHByaXZhdGUgYXV0aG9yaXphdGlvbkhhbmRsZXI6IEF1dGhvcml6YXRpb25SZXF1ZXN0SGFuZGxlcjtcclxuICBwcml2YXRlIHRva2VuSGFuZGxlcjogVG9rZW5SZXF1ZXN0SGFuZGxlcjtcclxuXHJcbiAgLy8gc3RhdGVcclxuICBjb25maWd1cmF0aW9uOiBBdXRob3JpemF0aW9uU2VydmljZUNvbmZpZ3VyYXRpb258dW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMubm90aWZpZXIgPSBuZXcgQXV0aG9yaXphdGlvbk5vdGlmaWVyKCk7XHJcbiAgICB0aGlzLmF1dGhvcml6YXRpb25IYW5kbGVyID0gbmV3IE5vZGVCYXNlZEhhbmRsZXIoUE9SVCk7XHJcbiAgICB0aGlzLnRva2VuSGFuZGxlciA9IG5ldyBCYXNlVG9rZW5SZXF1ZXN0SGFuZGxlcihyZXF1ZXN0b3IpO1xyXG4gICAgLy8gc2V0IG5vdGlmaWVyIHRvIGRlbGl2ZXIgcmVzcG9uc2VzXHJcbiAgICB0aGlzLmF1dGhvcml6YXRpb25IYW5kbGVyLnNldEF1dGhvcml6YXRpb25Ob3RpZmllcih0aGlzLm5vdGlmaWVyKTtcclxuICAgIC8vIHNldCBhIGxpc3RlbmVyIHRvIGxpc3RlbiBmb3IgYXV0aG9yaXphdGlvbiByZXNwb25zZXNcclxuICAgIC8vIG1ha2UgcmVmcmVzaCBhbmQgYWNjZXNzIHRva2VuIHJlcXVlc3RzLlxyXG4gICAgdGhpcy5ub3RpZmllci5zZXRBdXRob3JpemF0aW9uTGlzdGVuZXIoKHJlcXVlc3QsIHJlc3BvbnNlLCBlcnJvcikgPT4ge1xyXG4gICAgICBsb2coJ0F1dGhvcml6YXRpb24gcmVxdWVzdCBjb21wbGV0ZSAnLCByZXF1ZXN0LCByZXNwb25zZSwgZXJyb3IpO1xyXG4gICAgICBpZiAocmVzcG9uc2UpIHtcclxuICAgICAgICB0aGlzLm1ha2VSZWZyZXNoVG9rZW5SZXF1ZXN0KHRoaXMuY29uZmlndXJhdGlvbiEsIHJlcXVlc3QsIHJlc3BvbnNlKVxyXG4gICAgICAgICAgICAudGhlbihyZXN1bHQgPT4gdGhpcy5tYWtlQWNjZXNzVG9rZW5SZXF1ZXN0KHRoaXMuY29uZmlndXJhdGlvbiEsIHJlc3VsdC5yZWZyZXNoVG9rZW4hKSlcclxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gbG9nKCdBbGwgZG9uZS4nKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hTZXJ2aWNlQ29uZmlndXJhdGlvbigpOiBQcm9taXNlPEF1dGhvcml6YXRpb25TZXJ2aWNlQ29uZmlndXJhdGlvbj4ge1xyXG4gICAgcmV0dXJuIEF1dGhvcml6YXRpb25TZXJ2aWNlQ29uZmlndXJhdGlvbi5mZXRjaEZyb21Jc3N1ZXIob3BlbklkQ29ubmVjdFVybCwgcmVxdWVzdG9yKVxyXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgIGxvZygnRmV0Y2hlZCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24nLCByZXNwb25zZSk7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBtYWtlQXV0aG9yaXphdGlvblJlcXVlc3QoY29uZmlndXJhdGlvbjogQXV0aG9yaXphdGlvblNlcnZpY2VDb25maWd1cmF0aW9uKSB7XHJcbiAgICAvLyBjcmVhdGUgYSByZXF1ZXN0XHJcbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBBdXRob3JpemF0aW9uUmVxdWVzdCh7XHJcbiAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXHJcbiAgICAgIHJlZGlyZWN0X3VyaTogcmVkaXJlY3RVcmksXHJcbiAgICAgIHNjb3BlOiBzY29wZSxcclxuICAgICAgcmVzcG9uc2VfdHlwZTogQXV0aG9yaXphdGlvblJlcXVlc3QuUkVTUE9OU0VfVFlQRV9DT0RFLFxyXG4gICAgICBzdGF0ZTogdW5kZWZpbmVkLFxyXG4gICAgICBleHRyYXM6IHsncHJvbXB0JzogJ2NvbnNlbnQnLCAnYWNjZXNzX3R5cGUnOiAnb2ZmbGluZSd9XHJcbiAgICB9LCBuZXcgTm9kZUNyeXB0bygpKTtcclxuXHJcbiAgICBsb2coJ01ha2luZyBhdXRob3JpemF0aW9uIHJlcXVlc3QgJywgY29uZmlndXJhdGlvbiwgcmVxdWVzdCk7XHJcbiAgICB0aGlzLmF1dGhvcml6YXRpb25IYW5kbGVyLnBlcmZvcm1BdXRob3JpemF0aW9uUmVxdWVzdChjb25maWd1cmF0aW9uLCByZXF1ZXN0KTtcclxuICB9XHJcblxyXG4gIG1ha2VSZWZyZXNoVG9rZW5SZXF1ZXN0KFxyXG4gICAgICBjb25maWd1cmF0aW9uOiBBdXRob3JpemF0aW9uU2VydmljZUNvbmZpZ3VyYXRpb24sXHJcbiAgICAgIHJlcXVlc3Q6IEF1dGhvcml6YXRpb25SZXF1ZXN0LFxyXG4gICAgICByZXNwb25zZTogQXV0aG9yaXphdGlvblJlc3BvbnNlKSB7XHJcbiAgICBcclxuICAgIGxldCBleHRyYXM6IFN0cmluZ01hcHx1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICBpZiAocmVxdWVzdCAmJiByZXF1ZXN0LmludGVybmFsKSB7XHJcbiAgICAgIGV4dHJhcyA9IHt9O1xyXG4gICAgICBleHRyYXNbJ2NvZGVfdmVyaWZpZXInXSA9IHJlcXVlc3QuaW50ZXJuYWxbJ2NvZGVfdmVyaWZpZXInXTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdG9rZW5SZXF1ZXN0ID0gbmV3IFRva2VuUmVxdWVzdCh7XHJcbiAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXHJcbiAgICAgIHJlZGlyZWN0X3VyaTogcmVkaXJlY3RVcmksXHJcbiAgICAgIGdyYW50X3R5cGU6IEdSQU5UX1RZUEVfQVVUSE9SSVpBVElPTl9DT0RFLFxyXG4gICAgICBjb2RlOiByZXNwb25zZS5jb2RlLFxyXG4gICAgICByZWZyZXNoX3Rva2VuOiB1bmRlZmluZWQsXHJcbiAgICAgIGV4dHJhczogZXh0cmFzXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy50b2tlbkhhbmRsZXIucGVyZm9ybVRva2VuUmVxdWVzdChjb25maWd1cmF0aW9uLCB0b2tlblJlcXVlc3QpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICBsb2coYFJlZnJlc2ggVG9rZW4gaXMgJHtyZXNwb25zZS5yZWZyZXNoVG9rZW59YCk7XHJcbiAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbWFrZUFjY2Vzc1Rva2VuUmVxdWVzdChjb25maWd1cmF0aW9uOiBBdXRob3JpemF0aW9uU2VydmljZUNvbmZpZ3VyYXRpb24sIHJlZnJlc2hUb2tlbjogc3RyaW5nKSB7XHJcbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBUb2tlblJlcXVlc3Qoe1xyXG4gICAgICBjbGllbnRfaWQ6IGNsaWVudElkLFxyXG4gICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxyXG4gICAgICBncmFudF90eXBlOiBHUkFOVF9UWVBFX1JFRlJFU0hfVE9LRU4sXHJcbiAgICAgIGNvZGU6IHVuZGVmaW5lZCxcclxuICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxyXG4gICAgICBleHRyYXM6IHVuZGVmaW5lZFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudG9rZW5IYW5kbGVyLnBlcmZvcm1Ub2tlblJlcXVlc3QoY29uZmlndXJhdGlvbiwgcmVxdWVzdCkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgIGxvZyhgQWNjZXNzIFRva2VuIGlzICR7cmVzcG9uc2UuYWNjZXNzVG9rZW59LCBJZCBUb2tlbiBpcyAke3Jlc3BvbnNlLmlkVG9rZW59YCk7XHJcbiAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbWFrZVJldm9rZVRva2VuUmVxdWVzdChjb25maWd1cmF0aW9uOiBBdXRob3JpemF0aW9uU2VydmljZUNvbmZpZ3VyYXRpb24sIHJlZnJlc2hUb2tlbjogc3RyaW5nKSB7XHJcbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXZva2VUb2tlblJlcXVlc3Qoe3Rva2VuOiByZWZyZXNoVG9rZW59KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy50b2tlbkhhbmRsZXIucGVyZm9ybVJldm9rZVRva2VuUmVxdWVzdChjb25maWd1cmF0aW9uLCByZXF1ZXN0KS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgbG9nKCdyZXZva2VkIHJlZnJlc2hUb2tlbicpO1xyXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmxvZygnQXBwbGljYXRpb24gaXMgcmVhZHkuJyk7XHJcbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcclxuXHJcbmFwcC5mZXRjaFNlcnZpY2VDb25maWd1cmF0aW9uKClcclxuICAgIC50aGVuKGNvbmZpZ3VyYXRpb24gPT4ge1xyXG4gICAgICBhcHAuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XHJcbiAgICAgIGFwcC5tYWtlQXV0aG9yaXphdGlvblJlcXVlc3QoY29uZmlndXJhdGlvbik7XHJcbiAgICAgIC8vIG5vdGlmaWVyIG1ha2VzIHRva2VuIHJlcXVlc3RzLlxyXG4gICAgfSlcclxuICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgIGxvZygnU29tZXRoaW5nIGJhZCBoYXBwZW5lZCAnLCBlcnJvcik7XHJcbiAgICB9KTtcclxuIl19