@delewis13/appauth
Version:
A general purpose OAuth client. Vendored awaiting PR merge
164 lines • 22.4 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 the test web app 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 redirect_based_handler_1 = require("../redirect_based_handler");
var token_request_1 = require("../token_request");
var token_request_handler_1 = require("../token_request_handler");
/* an example open id connect provider */
var openIdConnectUrl = 'https://accounts.google.com';
/* example client configuration */
var clientId = '674027045299-a31g2q39v6qgngqvh8psi99km931rn8f.apps.googleusercontent.com';
var clientSecret = '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';
var redirectUri = 'http://localhost:8000/app/redirect.html';
var scope = 'openid profile email';
/**
* The Test application.
*/
var App = /** @class */ (function () {
function App(snackbar) {
var _this = this;
this.snackbar = snackbar;
this.notifier = new authorization_request_handler_1.AuthorizationNotifier();
this.authorizationHandler = new redirect_based_handler_1.RedirectRequestHandler();
this.tokenHandler = new token_request_handler_1.BaseTokenRequestHandler();
// set notifier to deliver responses
this.authorizationHandler.setAuthorizationNotifier(this.notifier);
// set a listener to listen for authorization responses
this.notifier.setAuthorizationListener(function (request, response, error) {
(0, logger_1.log)('Authorization request complete ', request, response, error);
if (response) {
_this.request = request;
_this.response = response;
_this.code = response.code;
_this.showMessage("Authorization Code " + response.code);
}
});
}
App.prototype.showMessage = function (message) {
var snackbar = this.snackbar['MaterialSnackbar'];
snackbar.showSnackbar({ message: message });
};
App.prototype.fetchServiceConfiguration = function () {
var _this = this;
authorization_service_configuration_1.AuthorizationServiceConfiguration.fetchFromIssuer(openIdConnectUrl)
.then(function (response) {
(0, logger_1.log)('Fetched service configuration', response);
_this.configuration = response;
_this.showMessage('Completed fetching configuration');
})
.catch(function (error) {
(0, logger_1.log)('Something bad happened', error);
_this.showMessage("Something bad happened " + error);
});
};
App.prototype.makeAuthorizationRequest = function () {
// 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' }
});
if (this.configuration) {
this.authorizationHandler.performAuthorizationRequest(this.configuration, request);
}
else {
this.showMessage('Fetch Authorization Service configuration, before you make the authorization request.');
}
};
App.prototype.makeTokenRequest = function () {
var _this = this;
if (!this.configuration) {
this.showMessage('Please fetch service configuration.');
return;
}
var request = null;
if (this.code) {
var extras = undefined;
if (this.request && this.request.internal) {
extras = {};
extras['code_verifier'] = this.request.internal['code_verifier'];
}
// use the code to make the token request.
request = new token_request_1.TokenRequest({
client_id: clientId,
client_secret: clientSecret,
redirect_uri: redirectUri,
grant_type: token_request_1.GRANT_TYPE_AUTHORIZATION_CODE,
code: this.code,
refresh_token: undefined,
extras: extras
});
}
else if (this.tokenResponse) {
// use the token response to make a request for an access token
request = new token_request_1.TokenRequest({
client_id: clientId,
client_secret: clientSecret,
redirect_uri: redirectUri,
grant_type: token_request_1.GRANT_TYPE_REFRESH_TOKEN,
code: undefined,
refresh_token: this.tokenResponse.refreshToken,
extras: undefined
});
}
if (request) {
this.tokenHandler.performTokenRequest(this.configuration, request)
.then(function (response) {
var isFirstRequest = false;
if (_this.tokenResponse) {
// copy over new fields
_this.tokenResponse.accessToken = response.accessToken;
_this.tokenResponse.issuedAt = response.issuedAt;
_this.tokenResponse.expiresIn = response.expiresIn;
_this.tokenResponse.tokenType = response.tokenType;
_this.tokenResponse.scope = response.scope;
}
else {
isFirstRequest = true;
_this.tokenResponse = response;
}
// unset code, so we can do refresh token exchanges subsequently
_this.code = undefined;
if (isFirstRequest) {
_this.showMessage("Obtained a refresh token " + response.refreshToken);
}
else {
_this.showMessage("Obtained an access token " + response.accessToken + ".");
}
})
.catch(function (error) {
(0, logger_1.log)('Something bad happened', error);
_this.showMessage("Something bad happened " + error);
});
}
};
App.prototype.checkForAuthorizationResponse = function () {
this.authorizationHandler.completeAuthorizationRequestIfPossible();
};
return App;
}());
exports.App = App;
// export App
window['App'] = App;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7OztBQUVILCtEQUErRDtBQUUvRCxrRUFBOEQ7QUFDOUQsa0ZBQW9HO0FBQ3BHLDhGQUF5RjtBQUN6RixvQ0FBOEI7QUFDOUIsb0VBQWlFO0FBQ2pFLGtEQUF1RztBQUN2RyxrRUFBc0Y7QUFzQnRGLHlDQUF5QztBQUN6QyxJQUFNLGdCQUFnQixHQUFHLDZCQUE2QixDQUFDO0FBRXZELGtDQUFrQztBQUNsQyxJQUFNLFFBQVEsR0FBRywwRUFBMEUsQ0FBQztBQUM1RixJQUFNLFlBQVksR0FBRyxxQ0FBcUMsQ0FBQztBQUMzRCxJQUFNLFdBQVcsR0FBRyx5Q0FBeUMsQ0FBQztBQUM5RCxJQUFNLEtBQUssR0FBRyxzQkFBc0IsQ0FBQztBQUVyQzs7R0FFRztBQUNIO0lBWUUsYUFBbUIsUUFBaUI7UUFBcEMsaUJBZ0JDO1FBaEJrQixhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxxREFBcUIsRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLCtDQUFzQixFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLCtDQUF1QixFQUFFLENBQUM7UUFDbEQsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEUsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsVUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUs7WUFDOUQsSUFBQSxZQUFHLEVBQUMsaUNBQWlDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRSxJQUFJLFFBQVEsRUFBRTtnQkFD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SSxjQUFjLEVBQUU7b0JBQ2xCLEtBQUksQ0FBQyxXQUFXLENBQUMsOEJBQTRCLFFBQVEsQ0FBQyxZQUFjLENBQUMsQ0FBQztpQkFDdkU7cUJBQU07b0JBQ0wsS0FBSSxDQUFDLFdBQVcsQ0FBQyw4QkFBNEIsUUFBUSxDQUFDLFdBQVcsTUFBRyxDQUFDLENBQUM7aUJBQ3ZFO1lBQ0gsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxVQUFBLEtBQUs7Z0JBQ1YsSUFBQSxZQUFHLEVBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3JDLEtBQUksQ0FBQyxXQUFXLENBQUMsNEJBQTBCLEtBQU8sQ0FBQyxDQUFBO1lBQ3JELENBQUMsQ0FBQyxDQUFDO1NBQ1I7SUFDSCxDQUFDO0lBRUQsMkNBQTZCLEdBQTdCO1FBQ0UsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNDQUFzQyxFQUFFLENBQUM7SUFDckUsQ0FBQztJQUNILFVBQUM7QUFBRCxDQUFDLEFBeklELElBeUlDO0FBeklZLGtCQUFHO0FBMkloQixhQUFhO0FBQ1osTUFBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0XG4gKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlXG4gKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlclxuICogZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vLyBSZXByZXNlbnRzIHRoZSB0ZXN0IHdlYiBhcHAgdGhhdCB1c2VzIHRoZSBBcHBBdXRoSlMgbGlicmFyeS5cblxuaW1wb3J0IHtBdXRob3JpemF0aW9uUmVxdWVzdH0gZnJvbSAnLi4vYXV0aG9yaXphdGlvbl9yZXF1ZXN0JztcbmltcG9ydCB7QXV0aG9yaXphdGlvbk5vdGlmaWVyLCBBdXRob3JpemF0aW9uUmVxdWVzdEhhbmRsZXJ9IGZyb20gJy4uL2F1dGhvcml6YXRpb25fcmVxdWVzdF9oYW5kbGVyJztcbmltcG9ydCB7QXV0aG9yaXphdGlvblNlcnZpY2VDb25maWd1cmF0aW9ufSBmcm9tICcuLi9hdXRob3JpemF0aW9uX3NlcnZpY2VfY29uZmlndXJhdGlvbic7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7UmVkaXJlY3RSZXF1ZXN0SGFuZGxlcn0gZnJvbSAnLi4vcmVkaXJlY3RfYmFzZWRfaGFuZGxlcic7XG5pbXBvcnQge0dSQU5UX1RZUEVfQVVUSE9SSVpBVElPTl9DT0RFLCBHUkFOVF9UWVBFX1JFRlJFU0hfVE9LRU4sIFRva2VuUmVxdWVzdH0gZnJvbSAnLi4vdG9rZW5fcmVxdWVzdCc7XG5pbXBvcnQge0Jhc2VUb2tlblJlcXVlc3RIYW5kbGVyLCBUb2tlblJlcXVlc3RIYW5kbGVyfSBmcm9tICcuLi90b2tlbl9yZXF1ZXN0X2hhbmRsZXInO1xuaW1wb3J0IHtUb2tlblJlc3BvbnNlfSBmcm9tICcuLi90b2tlbl9yZXNwb25zZSc7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9hdXRob3JpemF0aW9uX3Jlc3BvbnNlJztcbmltcG9ydCB7IFN0cmluZ01hcCB9IGZyb20gJy4uL3R5cGVzJztcblxuLyogU29tZSBpbnRlcmZhY2UgZGVjbGFyYXRpb25zIGZvciBNYXRlcmlhbCBkZXNpZ24gbGl0ZS4gKi9cblxuLyoqXG4gKiBTbmFja2JhciBvcHRpb25zLlxuICovXG5kZWNsYXJlIGludGVyZmFjZSBTbmFja0Jhck9wdGlvbnMge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIHRoYXQgZGVmaW5lcyB0aGUgTURMIE1hdGVyaWFsIFNuYWNrIEJhciBBUEkuXG4gKi9cbmRlY2xhcmUgaW50ZXJmYWNlIE1hdGVyaWFsU25hY2tCYXIge1xuICBzaG93U25hY2tiYXI6IChvcHRpb25zOiBTbmFja0Jhck9wdGlvbnMpID0+IHZvaWQ7XG59XG5cbi8qIGFuIGV4YW1wbGUgb3BlbiBpZCBjb25uZWN0IHByb3ZpZGVyICovXG5jb25zdCBvcGVuSWRDb25uZWN0VXJsID0gJ2h0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbSc7XG5cbi8qIGV4YW1wbGUgY2xpZW50IGNvbmZpZ3VyYXRpb24gKi9cbmNvbnN0IGNsaWVudElkID0gJzY3NDAyNzA0NTI5OS1hMzFnMnEzOXY2cWduZ3F2aDhwc2k5OWttOTMxcm44Zi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSc7XG5jb25zdCBjbGllbnRTZWNyZXQgPSAnR09DU1BYLUpqZVoyOC04TndxVjZjS2RTNzRoWWhPOFpnOWQnO1xuY29uc3QgcmVkaXJlY3RVcmkgPSAnaHR0cDovL2xvY2FsaG9zdDo4MDAwL2FwcC9yZWRpcmVjdC5odG1sJztcbmNvbnN0IHNjb3BlID0gJ29wZW5pZCBwcm9maWxlIGVtYWlsJztcblxuLyoqXG4gKiBUaGUgVGVzdCBhcHBsaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcCB7XG4gIHByaXZhdGUgbm90aWZpZXI6IEF1dGhvcml6YXRpb25Ob3RpZmllcjtcbiAgcHJpdmF0ZSBhdXRob3JpemF0aW9uSGFuZGxlcjogQXV0aG9yaXphdGlvblJlcXVlc3RIYW5kbGVyO1xuICBwcml2YXRlIHRva2VuSGFuZGxlcjogVG9rZW5SZXF1ZXN0SGFuZGxlcjtcblxuICAvLyBzdGF0ZVxuICBwcml2YXRlIGNvbmZpZ3VyYXRpb246IEF1dGhvcml6YXRpb25TZXJ2aWNlQ29uZmlndXJhdGlvbnx1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVxdWVzdDogQXV0aG9yaXphdGlvblJlcXVlc3R8dW5kZWZpbmVkO1xuICBwcml2YXRlIHJlc3BvbnNlOiBBdXRob3JpemF0aW9uUmVzcG9uc2V8dW5kZWZpbmVkO1xuICBwcml2YXRlIGNvZGU6IHN0cmluZ3x1bmRlZmluZWQ7XG4gIHByaXZhdGUgdG9rZW5SZXNwb25zZTogVG9rZW5SZXNwb25zZXx1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHNuYWNrYmFyOiBFbGVtZW50KSB7XG4gICAgdGhpcy5ub3RpZmllciA9IG5ldyBBdXRob3JpemF0aW9uTm90aWZpZXIoKTtcbiAgICB0aGlzLmF1dGhvcml6YXRpb25IYW5kbGVyID0gbmV3IFJlZGlyZWN0UmVxdWVzdEhhbmRsZXIoKTtcbiAgICB0aGlzLnRva2VuSGFuZGxlciA9IG5ldyBCYXNlVG9rZW5SZXF1ZXN0SGFuZGxlcigpO1xuICAgIC8vIHNldCBub3RpZmllciB0byBkZWxpdmVyIHJlc3BvbnNlc1xuICAgIHRoaXMuYXV0aG9yaXphdGlvbkhhbmRsZXIuc2V0QXV0aG9yaXphdGlvbk5vdGlmaWVyKHRoaXMubm90aWZpZXIpO1xuICAgIC8vIHNldCBhIGxpc3RlbmVyIHRvIGxpc3RlbiBmb3IgYXV0aG9yaXphdGlvbiByZXNwb25zZXNcbiAgICB0aGlzLm5vdGlmaWVyLnNldEF1dGhvcml6YXRpb25MaXN0ZW5lcigocmVxdWVzdCwgcmVzcG9uc2UsIGVycm9yKSA9PiB7XG4gICAgICBsb2coJ0F1dGhvcml6YXRpb24gcmVxdWVzdCBjb21wbGV0ZSAnLCByZXF1ZXN0LCByZXNwb25zZSwgZXJyb3IpO1xuICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5jb2RlID0gcmVzcG9uc2UuY29kZTtcbiAgICAgICAgdGhpcy5zaG93TWVzc2FnZShgQXV0aG9yaXphdGlvbiBDb2RlICR7cmVzcG9uc2UuY29kZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNob3dNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIGNvbnN0IHNuYWNrYmFyID0gKHRoaXMuc25hY2tiYXIgYXMgYW55KVsnTWF0ZXJpYWxTbmFja2JhciddIGFzIE1hdGVyaWFsU25hY2tCYXI7XG4gICAgc25hY2tiYXIuc2hvd1NuYWNrYmFyKHttZXNzYWdlOiBtZXNzYWdlfSk7XG4gIH1cblxuICBmZXRjaFNlcnZpY2VDb25maWd1cmF0aW9uKCkge1xuICAgIEF1dGhvcml6YXRpb25TZXJ2aWNlQ29uZmlndXJhdGlvbi5mZXRjaEZyb21Jc3N1ZXIob3BlbklkQ29ubmVjdFVybClcbiAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGxvZygnRmV0Y2hlZCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24nLCByZXNwb25zZSk7XG4gICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gcmVzcG9uc2U7XG4gICAgICAgICAgdGhpcy5zaG93TWVzc2FnZSgnQ29tcGxldGVkIGZldGNoaW5nIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBsb2coJ1NvbWV0aGluZyBiYWQgaGFwcGVuZWQnLCBlcnJvcik7XG4gICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShgU29tZXRoaW5nIGJhZCBoYXBwZW5lZCAke2Vycm9yfWApXG4gICAgICAgIH0pO1xuICB9XG5cbiAgbWFrZUF1dGhvcml6YXRpb25SZXF1ZXN0KCkge1xuICAgIC8vIGNyZWF0ZSBhIHJlcXVlc3RcbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBBdXRob3JpemF0aW9uUmVxdWVzdCh7XG4gICAgICBjbGllbnRfaWQ6IGNsaWVudElkLFxuICAgICAgcmVkaXJlY3RfdXJpOiByZWRpcmVjdFVyaSxcbiAgICAgIHNjb3BlOiBzY29wZSxcbiAgICAgIHJlc3BvbnNlX3R5cGU6IEF1dGhvcml6YXRpb25SZXF1ZXN0LlJFU1BPTlNFX1RZUEVfQ09ERSxcbiAgICAgIHN0YXRlOiB1bmRlZmluZWQsXG4gICAgICBleHRyYXM6IHsncHJvbXB0JzogJ2NvbnNlbnQnLCAnYWNjZXNzX3R5cGUnOiAnb2ZmbGluZSd9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uKSB7XG4gICAgICB0aGlzLmF1dGhvcml6YXRpb25IYW5kbGVyLnBlcmZvcm1BdXRob3JpemF0aW9uUmVxdWVzdCh0aGlzLmNvbmZpZ3VyYXRpb24sIHJlcXVlc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dNZXNzYWdlKFxuICAgICAgICAgICdGZXRjaCBBdXRob3JpemF0aW9uIFNlcnZpY2UgY29uZmlndXJhdGlvbiwgYmVmb3JlIHlvdSBtYWtlIHRoZSBhdXRob3JpemF0aW9uIHJlcXVlc3QuJyk7XG4gICAgfVxuICB9XG5cbiAgbWFrZVRva2VuUmVxdWVzdCgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbikge1xuICAgICAgdGhpcy5zaG93TWVzc2FnZSgnUGxlYXNlIGZldGNoIHNlcnZpY2UgY29uZmlndXJhdGlvbi4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdDogVG9rZW5SZXF1ZXN0fG51bGwgPSBudWxsO1xuICAgIGlmICh0aGlzLmNvZGUpIHtcbiAgICAgIGxldCBleHRyYXM6IFN0cmluZ01hcHx1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAodGhpcy5yZXF1ZXN0ICYmIHRoaXMucmVxdWVzdC5pbnRlcm5hbCkge1xuICAgICAgICBleHRyYXMgPSB7fTtcbiAgICAgICAgZXh0cmFzWydjb2RlX3ZlcmlmaWVyJ10gPSB0aGlzLnJlcXVlc3QuaW50ZXJuYWxbJ2NvZGVfdmVyaWZpZXInXTtcbiAgICAgIH1cbiAgICAgIC8vIHVzZSB0aGUgY29kZSB0byBtYWtlIHRoZSB0b2tlbiByZXF1ZXN0LlxuICAgICAgcmVxdWVzdCA9IG5ldyBUb2tlblJlcXVlc3Qoe1xuICAgICAgICBjbGllbnRfaWQ6IGNsaWVudElkLFxuICAgICAgICBjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXQsXG4gICAgICAgIHJlZGlyZWN0X3VyaTogcmVkaXJlY3RVcmksXG4gICAgICAgIGdyYW50X3R5cGU6IEdSQU5UX1RZUEVfQVVUSE9SSVpBVElPTl9DT0RFLFxuICAgICAgICBjb2RlOiB0aGlzLmNvZGUsXG4gICAgICAgIHJlZnJlc2hfdG9rZW46IHVuZGVmaW5lZCxcbiAgICAgICAgZXh0cmFzOiBleHRyYXNcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy50b2tlblJlc3BvbnNlKSB7XG4gICAgICAvLyB1c2UgdGhlIHRva2VuIHJlc3BvbnNlIHRvIG1ha2UgYSByZXF1ZXN0IGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgIHJlcXVlc3QgPSBuZXcgVG9rZW5SZXF1ZXN0KHtcbiAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgY2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0LFxuICAgICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxuICAgICAgICBncmFudF90eXBlOiBHUkFOVF9UWVBFX1JFRlJFU0hfVE9LRU4sXG4gICAgICAgIGNvZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVmcmVzaF90b2tlbjogdGhpcy50b2tlblJlc3BvbnNlLnJlZnJlc2hUb2tlbixcbiAgICAgICAgZXh0cmFzOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICB0aGlzLnRva2VuSGFuZGxlci5wZXJmb3JtVG9rZW5SZXF1ZXN0KHRoaXMuY29uZmlndXJhdGlvbiwgcmVxdWVzdClcbiAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBsZXQgaXNGaXJzdFJlcXVlc3QgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRva2VuUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgLy8gY29weSBvdmVyIG5ldyBmaWVsZHNcbiAgICAgICAgICAgICAgdGhpcy50b2tlblJlc3BvbnNlLmFjY2Vzc1Rva2VuID0gcmVzcG9uc2UuYWNjZXNzVG9rZW47XG4gICAgICAgICAgICAgIHRoaXMudG9rZW5SZXNwb25zZS5pc3N1ZWRBdCA9IHJlc3BvbnNlLmlzc3VlZEF0O1xuICAgICAgICAgICAgICB0aGlzLnRva2VuUmVzcG9uc2UuZXhwaXJlc0luID0gcmVzcG9uc2UuZXhwaXJlc0luO1xuICAgICAgICAgICAgICB0aGlzLnRva2VuUmVzcG9uc2UudG9rZW5UeXBlID0gcmVzcG9uc2UudG9rZW5UeXBlO1xuICAgICAgICAgICAgICB0aGlzLnRva2VuUmVzcG9uc2Uuc2NvcGUgPSByZXNwb25zZS5zY29wZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlzRmlyc3RSZXF1ZXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGhpcy50b2tlblJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVuc2V0IGNvZGUsIHNvIHdlIGNhbiBkbyByZWZyZXNoIHRva2VuIGV4Y2hhbmdlcyBzdWJzZXF1ZW50bHlcbiAgICAgICAgICAgIHRoaXMuY29kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChpc0ZpcnN0UmVxdWVzdCkge1xuICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKGBPYnRhaW5lZCBhIHJlZnJlc2ggdG9rZW4gJHtyZXNwb25zZS5yZWZyZXNoVG9rZW59YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKGBPYnRhaW5lZCBhbiBhY2Nlc3MgdG9rZW4gJHtyZXNwb25zZS5hY2Nlc3NUb2tlbn0uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgbG9nKCdTb21ldGhpbmcgYmFkIGhhcHBlbmVkJywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShgU29tZXRoaW5nIGJhZCBoYXBwZW5lZCAke2Vycm9yfWApXG4gICAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tGb3JBdXRob3JpemF0aW9uUmVzcG9uc2UoKSB7XG4gICAgdGhpcy5hdXRob3JpemF0aW9uSGFuZGxlci5jb21wbGV0ZUF1dGhvcml6YXRpb25SZXF1ZXN0SWZQb3NzaWJsZSgpO1xuICB9XG59XG5cbi8vIGV4cG9ydCBBcHBcbih3aW5kb3cgYXMgYW55KVsnQXBwJ10gPSBBcHA7XG4iXX0=