UNPKG

@ariyana/appauth

Version:

A general purpose OAuth client.

161 lines 22.6 kB
"use strict"; /* * 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 = '511828570984-7nmej36h9j2tebiqmpqh835naet4vci4.apps.googleusercontent.com'; var redirectUri = 'http://localhost:8000/app/redirect.html'; var scope = 'openid'; /** * 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) { 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) { logger_1.log('Fetched service configuration', response); _this.configuration = response; _this.showMessage('Completed fetching configuration'); }) .catch(function (error) { 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, 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, 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) { 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7OztBQUVILCtEQUErRDtBQUUvRCxrRUFBOEQ7QUFDOUQsa0ZBQW9HO0FBQ3BHLDhGQUF5RjtBQUN6RixvQ0FBOEI7QUFDOUIsb0VBQWlFO0FBQ2pFLGtEQUF1RztBQUN2RyxrRUFBc0Y7QUFzQnRGLHlDQUF5QztBQUN6QyxJQUFNLGdCQUFnQixHQUFHLDZCQUE2QixDQUFDO0FBRXZELGtDQUFrQztBQUNsQyxJQUFNLFFBQVEsR0FBRywwRUFBMEUsQ0FBQztBQUM1RixJQUFNLFdBQVcsR0FBRyx5Q0FBeUMsQ0FBQztBQUM5RCxJQUFNLEtBQUssR0FBRyxRQUFRLENBQUM7QUFFdkI7O0dBRUc7QUFDSDtJQVlFLGFBQW1CLFFBQWlCO1FBQXBDLGlCQWdCQztRQWhCa0IsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUkscURBQXFCLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSwrQ0FBc0IsRUFBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSwrQ0FBdUIsRUFBRSxDQUFDO1FBQ2xELG9DQUFvQztRQUNwQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xFLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLFVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLO1lBQzlELFlBQUcsQ0FBQyxpQ0FBaUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pFLElBQUksUUFBUSxFQUFFO2dCQUNaLEtBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUN2QixL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LENBQUMsV0FBVyxDQUFDLDhCQUE0QixRQUFRLENBQUMsV0FBVyxNQUFHLENBQUMsQ0FBQztpQkFDdkU7WUFDSCxDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLFVBQUEsS0FBSztnQkFDVixZQUFHLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3JDLEtBQUksQ0FBQyxXQUFXLENBQUMsNEJBQTBCLEtBQU8sQ0FBQyxDQUFBO1lBQ3JELENBQUMsQ0FBQyxDQUFDO1NBQ1I7SUFDSCxDQUFDO0lBRUQsMkNBQTZCLEdBQTdCO1FBQ0UsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNDQUFzQyxFQUFFLENBQUM7SUFDckUsQ0FBQztJQUNILFVBQUM7QUFBRCxDQUFDLEFBdklELElBdUlDO0FBdklZLGtCQUFHO0FBeUloQixhQUFhO0FBQ1osTUFBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0XHJcbiAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZVxyXG4gKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlclxyXG4gKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5cclxuLy8gUmVwcmVzZW50cyB0aGUgdGVzdCB3ZWIgYXBwIHRoYXQgdXNlcyB0aGUgQXBwQXV0aEpTIGxpYnJhcnkuXHJcblxyXG5pbXBvcnQge0F1dGhvcml6YXRpb25SZXF1ZXN0fSBmcm9tICcuLi9hdXRob3JpemF0aW9uX3JlcXVlc3QnO1xyXG5pbXBvcnQge0F1dGhvcml6YXRpb25Ob3RpZmllciwgQXV0aG9yaXphdGlvblJlcXVlc3RIYW5kbGVyfSBmcm9tICcuLi9hdXRob3JpemF0aW9uX3JlcXVlc3RfaGFuZGxlcic7XHJcbmltcG9ydCB7QXV0aG9yaXphdGlvblNlcnZpY2VDb25maWd1cmF0aW9ufSBmcm9tICcuLi9hdXRob3JpemF0aW9uX3NlcnZpY2VfY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7bG9nfSBmcm9tICcuLi9sb2dnZXInO1xyXG5pbXBvcnQge1JlZGlyZWN0UmVxdWVzdEhhbmRsZXJ9IGZyb20gJy4uL3JlZGlyZWN0X2Jhc2VkX2hhbmRsZXInO1xyXG5pbXBvcnQge0dSQU5UX1RZUEVfQVVUSE9SSVpBVElPTl9DT0RFLCBHUkFOVF9UWVBFX1JFRlJFU0hfVE9LRU4sIFRva2VuUmVxdWVzdH0gZnJvbSAnLi4vdG9rZW5fcmVxdWVzdCc7XHJcbmltcG9ydCB7QmFzZVRva2VuUmVxdWVzdEhhbmRsZXIsIFRva2VuUmVxdWVzdEhhbmRsZXJ9IGZyb20gJy4uL3Rva2VuX3JlcXVlc3RfaGFuZGxlcic7XHJcbmltcG9ydCB7VG9rZW5SZXNwb25zZX0gZnJvbSAnLi4vdG9rZW5fcmVzcG9uc2UnO1xyXG5pbXBvcnQgeyBBdXRob3JpemF0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9hdXRob3JpemF0aW9uX3Jlc3BvbnNlJztcclxuaW1wb3J0IHsgU3RyaW5nTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xyXG5cclxuLyogU29tZSBpbnRlcmZhY2UgZGVjbGFyYXRpb25zIGZvciBNYXRlcmlhbCBkZXNpZ24gbGl0ZS4gKi9cclxuXHJcbi8qKlxyXG4gKiBTbmFja2JhciBvcHRpb25zLlxyXG4gKi9cclxuZGVjbGFyZSBpbnRlcmZhY2UgU25hY2tCYXJPcHRpb25zIHtcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgdGltZW91dD86IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEludGVyZmFjZSB0aGF0IGRlZmluZXMgdGhlIE1ETCBNYXRlcmlhbCBTbmFjayBCYXIgQVBJLlxyXG4gKi9cclxuZGVjbGFyZSBpbnRlcmZhY2UgTWF0ZXJpYWxTbmFja0JhciB7XHJcbiAgc2hvd1NuYWNrYmFyOiAob3B0aW9uczogU25hY2tCYXJPcHRpb25zKSA9PiB2b2lkO1xyXG59XHJcblxyXG4vKiBhbiBleGFtcGxlIG9wZW4gaWQgY29ubmVjdCBwcm92aWRlciAqL1xyXG5jb25zdCBvcGVuSWRDb25uZWN0VXJsID0gJ2h0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbSc7XHJcblxyXG4vKiBleGFtcGxlIGNsaWVudCBjb25maWd1cmF0aW9uICovXHJcbmNvbnN0IGNsaWVudElkID0gJzUxMTgyODU3MDk4NC03bm1lajM2aDlqMnRlYmlxbXBxaDgzNW5hZXQ0dmNpNC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSc7XHJcbmNvbnN0IHJlZGlyZWN0VXJpID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9hcHAvcmVkaXJlY3QuaHRtbCc7XHJcbmNvbnN0IHNjb3BlID0gJ29wZW5pZCc7XHJcblxyXG4vKipcclxuICogVGhlIFRlc3QgYXBwbGljYXRpb24uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQXBwIHtcclxuICBwcml2YXRlIG5vdGlmaWVyOiBBdXRob3JpemF0aW9uTm90aWZpZXI7XHJcbiAgcHJpdmF0ZSBhdXRob3JpemF0aW9uSGFuZGxlcjogQXV0aG9yaXphdGlvblJlcXVlc3RIYW5kbGVyO1xyXG4gIHByaXZhdGUgdG9rZW5IYW5kbGVyOiBUb2tlblJlcXVlc3RIYW5kbGVyO1xyXG5cclxuICAvLyBzdGF0ZVxyXG4gIHByaXZhdGUgY29uZmlndXJhdGlvbjogQXV0aG9yaXphdGlvblNlcnZpY2VDb25maWd1cmF0aW9ufHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlcXVlc3Q6IEF1dGhvcml6YXRpb25SZXF1ZXN0fHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlc3BvbnNlOiBBdXRob3JpemF0aW9uUmVzcG9uc2V8dW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgY29kZTogc3RyaW5nfHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHRva2VuUmVzcG9uc2U6IFRva2VuUmVzcG9uc2V8dW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc25hY2tiYXI6IEVsZW1lbnQpIHtcclxuICAgIHRoaXMubm90aWZpZXIgPSBuZXcgQXV0aG9yaXphdGlvbk5vdGlmaWVyKCk7XHJcbiAgICB0aGlzLmF1dGhvcml6YXRpb25IYW5kbGVyID0gbmV3IFJlZGlyZWN0UmVxdWVzdEhhbmRsZXIoKTtcclxuICAgIHRoaXMudG9rZW5IYW5kbGVyID0gbmV3IEJhc2VUb2tlblJlcXVlc3RIYW5kbGVyKCk7XHJcbiAgICAvLyBzZXQgbm90aWZpZXIgdG8gZGVsaXZlciByZXNwb25zZXNcclxuICAgIHRoaXMuYXV0aG9yaXphdGlvbkhhbmRsZXIuc2V0QXV0aG9yaXphdGlvbk5vdGlmaWVyKHRoaXMubm90aWZpZXIpO1xyXG4gICAgLy8gc2V0IGEgbGlzdGVuZXIgdG8gbGlzdGVuIGZvciBhdXRob3JpemF0aW9uIHJlc3BvbnNlc1xyXG4gICAgdGhpcy5ub3RpZmllci5zZXRBdXRob3JpemF0aW9uTGlzdGVuZXIoKHJlcXVlc3QsIHJlc3BvbnNlLCBlcnJvcikgPT4ge1xyXG4gICAgICBsb2coJ0F1dGhvcml6YXRpb24gcmVxdWVzdCBjb21wbGV0ZSAnLCByZXF1ZXN0LCByZXNwb25zZSwgZXJyb3IpO1xyXG4gICAgICBpZiAocmVzcG9uc2UpIHtcclxuICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcclxuICAgICAgICB0aGlzLmNvZGUgPSByZXNwb25zZS5jb2RlO1xyXG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoYEF1dGhvcml6YXRpb24gQ29kZSAke3Jlc3BvbnNlLmNvZGV9YCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2hvd01lc3NhZ2UobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBzbmFja2JhciA9ICh0aGlzLnNuYWNrYmFyIGFzIGFueSlbJ01hdGVyaWFsU25hY2tiYXInXSBhcyBNYXRlcmlhbFNuYWNrQmFyO1xyXG4gICAgc25hY2tiYXIuc2hvd1NuYWNrYmFyKHttZXNzYWdlOiBtZXNzYWdlfSk7XHJcbiAgfVxyXG5cclxuICBmZXRjaFNlcnZpY2VDb25maWd1cmF0aW9uKCkge1xyXG4gICAgQXV0aG9yaXphdGlvblNlcnZpY2VDb25maWd1cmF0aW9uLmZldGNoRnJvbUlzc3VlcihvcGVuSWRDb25uZWN0VXJsKVxyXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgIGxvZygnRmV0Y2hlZCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24nLCByZXNwb25zZSk7XHJcbiAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSByZXNwb25zZTtcclxuICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoJ0NvbXBsZXRlZCBmZXRjaGluZyBjb25maWd1cmF0aW9uJyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgbG9nKCdTb21ldGhpbmcgYmFkIGhhcHBlbmVkJywgZXJyb3IpO1xyXG4gICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShgU29tZXRoaW5nIGJhZCBoYXBwZW5lZCAke2Vycm9yfWApXHJcbiAgICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBtYWtlQXV0aG9yaXphdGlvblJlcXVlc3QoKSB7XHJcbiAgICAvLyBjcmVhdGUgYSByZXF1ZXN0XHJcbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBBdXRob3JpemF0aW9uUmVxdWVzdCh7XHJcbiAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXHJcbiAgICAgIHJlZGlyZWN0X3VyaTogcmVkaXJlY3RVcmksXHJcbiAgICAgIHNjb3BlOiBzY29wZSxcclxuICAgICAgcmVzcG9uc2VfdHlwZTogQXV0aG9yaXphdGlvblJlcXVlc3QuUkVTUE9OU0VfVFlQRV9DT0RFLFxyXG4gICAgICBzdGF0ZTogdW5kZWZpbmVkLFxyXG4gICAgICBleHRyYXM6IHsncHJvbXB0JzogJ2NvbnNlbnQnLCAnYWNjZXNzX3R5cGUnOiAnb2ZmbGluZSd9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuYXV0aG9yaXphdGlvbkhhbmRsZXIucGVyZm9ybUF1dGhvcml6YXRpb25SZXF1ZXN0KHRoaXMuY29uZmlndXJhdGlvbiwgcmVxdWVzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3dNZXNzYWdlKFxyXG4gICAgICAgICAgJ0ZldGNoIEF1dGhvcml6YXRpb24gU2VydmljZSBjb25maWd1cmF0aW9uLCBiZWZvcmUgeW91IG1ha2UgdGhlIGF1dGhvcml6YXRpb24gcmVxdWVzdC4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1ha2VUb2tlblJlcXVlc3QoKSB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbikge1xyXG4gICAgICB0aGlzLnNob3dNZXNzYWdlKCdQbGVhc2UgZmV0Y2ggc2VydmljZSBjb25maWd1cmF0aW9uLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlcXVlc3Q6IFRva2VuUmVxdWVzdHxudWxsID0gbnVsbDtcclxuICAgIGlmICh0aGlzLmNvZGUpIHtcclxuICAgICAgbGV0IGV4dHJhczogU3RyaW5nTWFwfHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKHRoaXMucmVxdWVzdCAmJiB0aGlzLnJlcXVlc3QuaW50ZXJuYWwpIHtcclxuICAgICAgICBleHRyYXMgPSB7fTtcclxuICAgICAgICBleHRyYXNbJ2NvZGVfdmVyaWZpZXInXSA9IHRoaXMucmVxdWVzdC5pbnRlcm5hbFsnY29kZV92ZXJpZmllciddO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHVzZSB0aGUgY29kZSB0byBtYWtlIHRoZSB0b2tlbiByZXF1ZXN0LlxyXG4gICAgICByZXF1ZXN0ID0gbmV3IFRva2VuUmVxdWVzdCh7XHJcbiAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcclxuICAgICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxyXG4gICAgICAgIGdyYW50X3R5cGU6IEdSQU5UX1RZUEVfQVVUSE9SSVpBVElPTl9DT0RFLFxyXG4gICAgICAgIGNvZGU6IHRoaXMuY29kZSxcclxuICAgICAgICByZWZyZXNoX3Rva2VuOiB1bmRlZmluZWQsXHJcbiAgICAgICAgZXh0cmFzOiBleHRyYXNcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMudG9rZW5SZXNwb25zZSkge1xyXG4gICAgICAvLyB1c2UgdGhlIHRva2VuIHJlc3BvbnNlIHRvIG1ha2UgYSByZXF1ZXN0IGZvciBhbiBhY2Nlc3MgdG9rZW5cclxuICAgICAgcmVxdWVzdCA9IG5ldyBUb2tlblJlcXVlc3Qoe1xyXG4gICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXHJcbiAgICAgICAgcmVkaXJlY3RfdXJpOiByZWRpcmVjdFVyaSxcclxuICAgICAgICBncmFudF90eXBlOiBHUkFOVF9UWVBFX1JFRlJFU0hfVE9LRU4sXHJcbiAgICAgICAgY29kZTogdW5kZWZpbmVkLFxyXG4gICAgICAgIHJlZnJlc2hfdG9rZW46IHRoaXMudG9rZW5SZXNwb25zZS5yZWZyZXNoVG9rZW4sXHJcbiAgICAgICAgZXh0cmFzOiB1bmRlZmluZWRcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcXVlc3QpIHtcclxuICAgICAgdGhpcy50b2tlbkhhbmRsZXIucGVyZm9ybVRva2VuUmVxdWVzdCh0aGlzLmNvbmZpZ3VyYXRpb24sIHJlcXVlc3QpXHJcbiAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpc0ZpcnN0UmVxdWVzdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy50b2tlblJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgLy8gY29weSBvdmVyIG5ldyBmaWVsZHNcclxuICAgICAgICAgICAgICB0aGlzLnRva2VuUmVzcG9uc2UuYWNjZXNzVG9rZW4gPSByZXNwb25zZS5hY2Nlc3NUb2tlbjtcclxuICAgICAgICAgICAgICB0aGlzLnRva2VuUmVzcG9uc2UuaXNzdWVkQXQgPSByZXNwb25zZS5pc3N1ZWRBdDtcclxuICAgICAgICAgICAgICB0aGlzLnRva2VuUmVzcG9uc2UuZXhwaXJlc0luID0gcmVzcG9uc2UuZXhwaXJlc0luO1xyXG4gICAgICAgICAgICAgIHRoaXMudG9rZW5SZXNwb25zZS50b2tlblR5cGUgPSByZXNwb25zZS50b2tlblR5cGU7XHJcbiAgICAgICAgICAgICAgdGhpcy50b2tlblJlc3BvbnNlLnNjb3BlID0gcmVzcG9uc2Uuc2NvcGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaXNGaXJzdFJlcXVlc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMudG9rZW5SZXNwb25zZSA9IHJlc3BvbnNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyB1bnNldCBjb2RlLCBzbyB3ZSBjYW4gZG8gcmVmcmVzaCB0b2tlbiBleGNoYW5nZXMgc3Vic2VxdWVudGx5XHJcbiAgICAgICAgICAgIHRoaXMuY29kZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaWYgKGlzRmlyc3RSZXF1ZXN0KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShgT2J0YWluZWQgYSByZWZyZXNoIHRva2VuICR7cmVzcG9uc2UucmVmcmVzaFRva2VufWApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoYE9idGFpbmVkIGFuIGFjY2VzcyB0b2tlbiAke3Jlc3BvbnNlLmFjY2Vzc1Rva2VufS5gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGxvZygnU29tZXRoaW5nIGJhZCBoYXBwZW5lZCcsIGVycm9yKTtcclxuICAgICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShgU29tZXRoaW5nIGJhZCBoYXBwZW5lZCAke2Vycm9yfWApXHJcbiAgICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoZWNrRm9yQXV0aG9yaXphdGlvblJlc3BvbnNlKCkge1xyXG4gICAgdGhpcy5hdXRob3JpemF0aW9uSGFuZGxlci5jb21wbGV0ZUF1dGhvcml6YXRpb25SZXF1ZXN0SWZQb3NzaWJsZSgpO1xyXG4gIH1cclxufVxyXG5cclxuLy8gZXhwb3J0IEFwcFxyXG4od2luZG93IGFzIGFueSlbJ0FwcCddID0gQXBwO1xyXG4iXX0=