UNPKG

@ebondu/angular2-keycloak

Version:
182 lines 23.8 kB
/* * Copyright 2018 ebondu and/or its affiliates * and other contributors as indicated by the @author tags. * * 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. */ /** * Cordova adapter for hybrid apps. */ export class CordovaAdapter { keycloak; constructor(keycloak) { this.keycloak = keycloak; } login(options) { // let promise = Keycloak.createPromise(); let o = 'location=no'; if (options && options.prompt === 'none') { o += ',hidden=yes'; } const loginUrl = this.keycloak.createLoginUrl(options); // console.log('opening login frame from cordova: ' + loginUrl); if (!window.cordova) { throw new Error('Cannot authenticate via a web browser'); } if (!window.cordova.InAppBrowser || !window.cordova.plugins.browsertab) { throw new Error('The Apache Cordova InAppBrowser/BrowserTab plugins was not found and are required'); } let ref; // let ref = window.cordova.InAppBrowser.open(loginUrl, '_blank', o); // let ref = window.cordova.InAppBrowser.open(loginUrl, '_system', o); let completed = false; window.cordova.plugins.browsertab.themeable.isAvailable(function (result) { if (!result) { ref = window.cordova.InAppBrowser.open(loginUrl, '_system'); ref.addEventListener('loadstart', function (event) { if (event.url.indexOf('http://localhost') === 0) { const callback = this.keycloak.parseCallback(event.url); this.keycloak.processCallback(callback).subscribe(processed => { ref.close(); completed = true; }); } }); ref.addEventListener('loaderror', function (event) { if (!completed) { if (event.url.indexOf('http://localhost') === 0) { const callback = this.keycloak.parseCallback(event.url); this.keycloak.processCallback(callback).subscribe(processed => { this.closeBrowserTab(); // ref.close(); // completed = true; }); } else { this.closeBrowserTab(); // ref.close(); } } }); } else { this.openBrowserTab(loginUrl, options); } }, function (isAvailableError) { console.error('failed to query availability of in-app browser tab'); }); } closeBrowserTab() { const cordova = window.cordova; cordova.plugins.browsertab.themeable.close(); // completed = true; } logout(options) { const cordova = window.cordova; const logoutUrl = this.keycloak.createLogoutUrl(options); let ref; let error; cordova.plugins.browsertab.themeable.isAvailable(function (result) { if (!result) { ref = cordova.InAppBrowser.open(logoutUrl, '_system'); ref.addEventListener('loadstart', function (event) { if (event.url.indexOf('http://localhost') === 0) { this.ref.close(); this.closeBrowserTab(); } }); ref.addEventListener('loaderror', function (event) { if (event.url.indexOf('http://localhost') === 0) { this.ref.close(); this.closeBrowserTab(); } else { error = true; this.ref.close(); this.closeBrowserTab(); } }); ref.addEventListener('exit', function (event) { if (error) { console.error('listener of in-app browser tab exited due to error', error); } else { this.keycloak.clearToken({}); } }); } else { this.openBrowserTab(logoutUrl, options); } }, function (isAvailableError) { console.error('failed to query availability of in-app browser tab', isAvailableError); }); } register(options) { const registerUrl = this.keycloak.createRegisterUrl({}); window.cordova.plugins.browsertab.themeable.isAvailable(function (result) { if (!result) { window.cordova.InAppBrowser.open(registerUrl, '_system'); } else { this.openBrowserTab(registerUrl, options); } }, function (isAvailableError) { console.error('failed to query availability of in-app browser tab', isAvailableError); }); } accountManagement(options) { const accountUrl = this.keycloak.createAccountUrl({}); window.cordova.plugins.browsertab.themeable.isAvailable(function (result) { if (!result) { window.cordova.InAppBrowser.open(accountUrl, '_system'); } else { this.openBrowserTab(accountUrl, options); } }, function (isAvailableError) { console.error('failed to query availability of in-app browser tab', isAvailableError); }); } passwordManagement(options) { const accountUrl = this.keycloak.createChangePasswordUrl({}); window.cordova.plugins.browsertab.themeable.isAvailable(function (result) { if (!result) { window.cordova.InAppBrowser.open(accountUrl, '_system'); } else { this.openBrowserTab(accountUrl, options); } }, function (isAvailableError) { console.error('failed to query availability of in-app browser tab', isAvailableError); }); } redirectUri(options) { if (options.redirectUri) { return options.redirectUri; } else { return 'http://localhost'; } } openBrowserTab(url, options) { const cordova = window.cordova; if (options.toolbarColor) { cordova.plugins.browsertab.themeable.openUrl(url, options); } else { cordova.plugins.browsertab.themeable.openUrl(url); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2xvYWsuYWRhcHRlci5jb3Jkb3ZhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWJvbmR1L2FuZ3VsYXIta2V5Y2xvYWsvc3JjL2xpYi9hZGFwdGVyL2tleWNsb2FrLmFkYXB0ZXIuY29yZG92YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFNSDs7R0FFRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBRUw7SUFBcEIsWUFBb0IsUUFBeUI7UUFBekIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7SUFFN0MsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFZO1FBQ3ZCLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUM7UUFDdEIsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN6QyxDQUFDLElBQUksYUFBYSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV2RCxnRUFBZ0U7UUFDaEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUZBQW1GLENBQUMsQ0FBQztRQUN2RyxDQUFDO1FBRUQsSUFBSSxHQUFRLENBQUM7UUFDYixxRUFBcUU7UUFDckUsc0VBQXNFO1FBQ3RFLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztRQUV0QixNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8s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LFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxOCBlYm9uZHUgYW5kL29yIGl0cyBhZmZpbGlhdGVzXG4gKiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIGFzIGluZGljYXRlZCBieSB0aGUgQGF1dGhvciB0YWdzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEtleWNsb2FrU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2Uva2V5Y2xvYWsuc2VydmljZSc7XG5cbmRlY2xhcmUgdmFyIHdpbmRvdzogYW55O1xuXG4vKipcbiAqIENvcmRvdmEgYWRhcHRlciBmb3IgaHlicmlkIGFwcHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb3Jkb3ZhQWRhcHRlciB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBrZXljbG9hazogS2V5Y2xvYWtTZXJ2aWNlKSB7XG5cbiAgfVxuXG4gIHB1YmxpYyBsb2dpbihvcHRpb25zOiBhbnkpIHtcbiAgICAvLyBsZXQgcHJvbWlzZSA9IEtleWNsb2FrLmNyZWF0ZVByb21pc2UoKTtcbiAgICBsZXQgbyA9ICdsb2NhdGlvbj1ubyc7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5wcm9tcHQgPT09ICdub25lJykge1xuICAgICAgbyArPSAnLGhpZGRlbj15ZXMnO1xuICAgIH1cbiAgICBjb25zdCBsb2dpblVybCA9IHRoaXMua2V5Y2xvYWsuY3JlYXRlTG9naW5Vcmwob3B0aW9ucyk7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnb3BlbmluZyBsb2dpbiBmcmFtZSBmcm9tIGNvcmRvdmE6ICcgKyBsb2dpblVybCk7XG4gICAgaWYgKCF3aW5kb3cuY29yZG92YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYXV0aGVudGljYXRlIHZpYSBhIHdlYiBicm93c2VyJyk7XG4gICAgfVxuXG4gICAgaWYgKCF3aW5kb3cuY29yZG92YS5JbkFwcEJyb3dzZXIgfHwgIXdpbmRvdy5jb3Jkb3ZhLnBsdWdpbnMuYnJvd3NlcnRhYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQXBhY2hlIENvcmRvdmEgSW5BcHBCcm93c2VyL0Jyb3dzZXJUYWIgcGx1Z2lucyB3YXMgbm90IGZvdW5kIGFuZCBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBsZXQgcmVmOiBhbnk7XG4gICAgLy8gbGV0IHJlZiA9IHdpbmRvdy5jb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKGxvZ2luVXJsLCAnX2JsYW5rJywgbyk7XG4gICAgLy8gbGV0IHJlZiA9IHdpbmRvdy5jb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKGxvZ2luVXJsLCAnX3N5c3RlbScsIG8pO1xuICAgIGxldCBjb21wbGV0ZWQgPSBmYWxzZTtcblxuICAgIHdpbmRvdy5jb3Jkb3ZhLnBsdWdpbnMuYnJvd3NlcnRhYi50aGVtZWFibGUuaXNBdmFpbGFibGUoXG4gICAgICBmdW5jdGlvbiAocmVzdWx0OiBhbnkpIHtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICByZWYgPSB3aW5kb3cuY29yZG92YS5JbkFwcEJyb3dzZXIub3Blbihsb2dpblVybCwgJ19zeXN0ZW0nKTtcbiAgICAgICAgICByZWYuYWRkRXZlbnRMaXN0ZW5lcignbG9hZHN0YXJ0JywgZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChldmVudC51cmwuaW5kZXhPZignaHR0cDovL2xvY2FsaG9zdCcpID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5rZXljbG9hay5wYXJzZUNhbGxiYWNrKGV2ZW50LnVybCk7XG4gICAgICAgICAgICAgIHRoaXMua2V5Y2xvYWsucHJvY2Vzc0NhbGxiYWNrKGNhbGxiYWNrKS5zdWJzY3JpYmUocHJvY2Vzc2VkID0+IHtcbiAgICAgICAgICAgICAgICByZWYuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlZi5hZGRFdmVudExpc3RlbmVyKCdsb2FkZXJyb3InLCBmdW5jdGlvbiAoZXZlbnQ6IGFueSkge1xuICAgICAgICAgICAgaWYgKCFjb21wbGV0ZWQpIHtcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LnVybC5pbmRleE9mKCdodHRwOi8vbG9jYWxob3N0JykgPT09IDApIHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5rZXljbG9hay5wYXJzZUNhbGxiYWNrKGV2ZW50LnVybCk7XG4gICAgICAgICAgICAgICAgdGhpcy5rZXljbG9hay5wcm9jZXNzQ2FsbGJhY2soY2FsbGJhY2spLnN1YnNjcmliZShwcm9jZXNzZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZUJyb3dzZXJUYWIoKTtcbiAgICAgICAgICAgICAgICAgIC8vIHJlZi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQnJvd3NlclRhYigpO1xuICAgICAgICAgICAgICAgIC8vIHJlZi5jbG9zZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuQnJvd3NlclRhYihsb2dpblVybCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbiAoaXNBdmFpbGFibGVFcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZhaWxlZCB0byBxdWVyeSBhdmFpbGFiaWxpdHkgb2YgaW4tYXBwIGJyb3dzZXIgdGFiJyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZUJyb3dzZXJUYWIoKSB7XG4gICAgY29uc3QgY29yZG92YSA9IHdpbmRvdy5jb3Jkb3ZhO1xuICAgIGNvcmRvdmEucGx1Z2lucy5icm93c2VydGFiLnRoZW1lYWJsZS5jbG9zZSgpO1xuICAgIC8vIGNvbXBsZXRlZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgbG9nb3V0KG9wdGlvbnM6IGFueSkge1xuICAgIGNvbnN0IGNvcmRvdmEgPSB3aW5kb3cuY29yZG92YTtcbiAgICBjb25zdCBsb2dvdXRVcmwgPSB0aGlzLmtleWNsb2FrLmNyZWF0ZUxvZ291dFVybChvcHRpb25zKTtcbiAgICBsZXQgcmVmOiBhbnk7XG4gICAgbGV0IGVycm9yOiBhbnk7XG5cbiAgICBjb3Jkb3ZhLnBsdWdpbnMuYnJvd3NlcnRhYi50aGVtZWFibGUuaXNBdmFpbGFibGUoXG4gICAgICBmdW5jdGlvbiAocmVzdWx0OiBhbnkpIHtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICByZWYgPSBjb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKGxvZ291dFVybCwgJ19zeXN0ZW0nKTtcbiAgICAgICAgICByZWYuYWRkRXZlbnRMaXN0ZW5lcignbG9hZHN0YXJ0JywgZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChldmVudC51cmwuaW5kZXhPZignaHR0cDovL2xvY2FsaG9zdCcpID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVmLmNsb3NlKCk7XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VCcm93c2VyVGFiKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZWYuYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVycm9yJywgZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChldmVudC51cmwuaW5kZXhPZignaHR0cDovL2xvY2FsaG9zdCcpID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVmLmNsb3NlKCk7XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VCcm93c2VyVGFiKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMucmVmLmNsb3NlKCk7XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VCcm93c2VyVGFiKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZWYuYWRkRXZlbnRMaXN0ZW5lcignZXhpdCcsIGZ1bmN0aW9uIChldmVudDogYW55KSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignbGlzdGVuZXIgb2YgaW4tYXBwIGJyb3dzZXIgdGFiIGV4aXRlZCBkdWUgdG8gZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmtleWNsb2FrLmNsZWFyVG9rZW4oe30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3BlbkJyb3dzZXJUYWIobG9nb3V0VXJsLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uIChpc0F2YWlsYWJsZUVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignZmFpbGVkIHRvIHF1ZXJ5IGF2YWlsYWJpbGl0eSBvZiBpbi1hcHAgYnJvd3NlciB0YWInLCBpc0F2YWlsYWJsZUVycm9yKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyKG9wdGlvbnM6IGFueSkge1xuICAgIGNvbnN0IHJlZ2lzdGVyVXJsID0gdGhpcy5rZXljbG9hay5jcmVhdGVSZWdpc3RlclVybCh7fSk7XG4gICAgd2luZG93LmNvcmRvdmEucGx1Z2lucy5icm93c2VydGFiLnRoZW1lYWJsZS5pc0F2YWlsYWJsZShcbiAgICAgIGZ1bmN0aW9uIChyZXN1bHQ6IGFueSkge1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgIHdpbmRvdy5jb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKHJlZ2lzdGVyVXJsLCAnX3N5c3RlbScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3BlbkJyb3dzZXJUYWIocmVnaXN0ZXJVcmwsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZnVuY3Rpb24gKGlzQXZhaWxhYmxlRXJyb3I6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gcXVlcnkgYXZhaWxhYmlsaXR5IG9mIGluLWFwcCBicm93c2VyIHRhYicsIGlzQXZhaWxhYmxlRXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYWNjb3VudE1hbmFnZW1lbnQob3B0aW9uczogYW55KSB7XG4gICAgY29uc3QgYWNjb3VudFVybCA9IHRoaXMua2V5Y2xvYWsuY3JlYXRlQWNjb3VudFVybCh7fSk7XG4gICAgd2luZG93LmNvcmRvdmEucGx1Z2lucy5icm93c2VydGFiLnRoZW1lYWJsZS5pc0F2YWlsYWJsZShcbiAgICAgIGZ1bmN0aW9uIChyZXN1bHQ6IGFueSkge1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgIHdpbmRvdy5jb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKGFjY291bnRVcmwsICdfc3lzdGVtJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuQnJvd3NlclRhYihhY2NvdW50VXJsLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uIChpc0F2YWlsYWJsZUVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignZmFpbGVkIHRvIHF1ZXJ5IGF2YWlsYWJpbGl0eSBvZiBpbi1hcHAgYnJvd3NlciB0YWInLCBpc0F2YWlsYWJsZUVycm9yKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cblxuICBwdWJsaWMgcGFzc3dvcmRNYW5hZ2VtZW50KG9wdGlvbnM6IGFueSkge1xuICAgIGNvbnN0IGFjY291bnRVcmwgPSB0aGlzLmtleWNsb2FrLmNyZWF0ZUNoYW5nZVBhc3N3b3JkVXJsKHt9KTtcbiAgICB3aW5kb3cuY29yZG92YS5wbHVnaW5zLmJyb3dzZXJ0YWIudGhlbWVhYmxlLmlzQXZhaWxhYmxlKFxuICAgICAgZnVuY3Rpb24gKHJlc3VsdDogYW55KSB7XG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgd2luZG93LmNvcmRvdmEuSW5BcHBCcm93c2VyLm9wZW4oYWNjb3VudFVybCwgJ19zeXN0ZW0nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9wZW5Ccm93c2VyVGFiKGFjY291bnRVcmwsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZnVuY3Rpb24gKGlzQXZhaWxhYmxlRXJyb3I6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gcXVlcnkgYXZhaWxhYmlsaXR5IG9mIGluLWFwcCBicm93c2VyIHRhYicsIGlzQXZhaWxhYmxlRXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVkaXJlY3RVcmkob3B0aW9uczogYW55KTogYW55IHtcbiAgICBpZiAob3B0aW9ucy5yZWRpcmVjdFVyaSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMucmVkaXJlY3RVcmk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnaHR0cDovL2xvY2FsaG9zdCc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuQnJvd3NlclRhYih1cmw6IFN0cmluZywgb3B0aW9uczogYW55KSB7XG4gICAgY29uc3QgY29yZG92YSA9IHdpbmRvdy5jb3Jkb3ZhO1xuICAgIGlmIChvcHRpb25zLnRvb2xiYXJDb2xvcikge1xuICAgICAgY29yZG92YS5wbHVnaW5zLmJyb3dzZXJ0YWIudGhlbWVhYmxlLm9wZW5VcmwodXJsLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29yZG92YS5wbHVnaW5zLmJyb3dzZXJ0YWIudGhlbWVhYmxlLm9wZW5VcmwodXJsKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==