UNPKG

angular-auth-oidc-client

Version:
145 lines 21.1 kB
import { DOCUMENT } from '@angular/common'; import { Injectable, inject } from '@angular/core'; import { Subject } from 'rxjs'; import { LoggerService } from '../../logging/logger.service'; import { StoragePersistenceService } from '../../storage/storage-persistence.service'; import * as i0 from "@angular/core"; export class PopUpService { constructor() { this.loggerService = inject(LoggerService); this.storagePersistenceService = inject(StoragePersistenceService); this.document = inject(DOCUMENT); this.STORAGE_IDENTIFIER = 'popupauth'; this.popUp = null; this.handle = -1; this.resultInternal$ = new Subject(); } get result$() { return this.resultInternal$.asObservable(); } get windowInternal() { return this.document.defaultView; } isCurrentlyInPopup(config) { if (this.canAccessSessionStorage()) { const popup = this.storagePersistenceService.read(this.STORAGE_IDENTIFIER, config); const windowIdentifier = this.windowInternal; if (!windowIdentifier) { return false; } return (Boolean(windowIdentifier.opener) && windowIdentifier.opener !== windowIdentifier && Boolean(popup)); } return false; } openPopUp(url, popupOptions, config) { const optionsToPass = this.getOptions(popupOptions); this.storagePersistenceService.write(this.STORAGE_IDENTIFIER, 'true', config); const windowIdentifier = this.windowInternal; if (!windowIdentifier) { return; } if (!url) { this.loggerService.logError(config, 'Could not open popup, url is empty'); return; } this.popUp = windowIdentifier.open(url, '_blank', optionsToPass); if (!this.popUp) { this.storagePersistenceService.remove(this.STORAGE_IDENTIFIER, config); this.loggerService.logError(config, 'Could not open popup'); return; } this.loggerService.logDebug(config, 'Opened popup with url ' + url); const listener = (event) => { if (!event?.data || typeof event.data !== 'string') { if (config.disableCleaningPopupOnInvalidMessage) { return; } this.cleanUp(listener, config); return; } this.loggerService.logDebug(config, 'Received message from popup with url ' + event.data); this.resultInternal$.next({ userClosed: false, receivedUrl: event.data }); this.cleanUp(listener, config); }; windowIdentifier.addEventListener('message', listener, false); this.handle = windowIdentifier.setInterval(() => { if (this.popUp?.closed) { this.resultInternal$.next({ userClosed: true, receivedUrl: '' }); this.cleanUp(listener, config); } }, 200); } sendMessageToMainWindow(url, config) { const windowIdentifier = this.windowInternal; if (!windowIdentifier) { return; } if (windowIdentifier.opener) { const href = windowIdentifier.location.href; this.sendMessage(url, href, config); } } cleanUp(listener, config) { const windowIdentifier = this.windowInternal; if (!windowIdentifier) { return; } windowIdentifier.removeEventListener('message', listener, false); windowIdentifier.clearInterval(this.handle); if (this.popUp) { this.storagePersistenceService.remove(this.STORAGE_IDENTIFIER, config); this.popUp.close(); this.popUp = null; } } sendMessage(url, href, config) { const windowIdentifier = this.windowInternal; if (!windowIdentifier) { return; } if (!url) { this.loggerService.logDebug(config, `Can not send message to parent, no url: '${url}'`); return; } windowIdentifier.opener.postMessage(url, href); } getOptions(popupOptions) { const popupDefaultOptions = { width: 500, height: 500, left: 50, top: 50, }; const options = { ...popupDefaultOptions, ...(popupOptions || {}), }; const windowIdentifier = this.windowInternal; if (!windowIdentifier) { return ''; } const width = options.width || popupDefaultOptions.width; const height = options.height || popupDefaultOptions.height; const left = windowIdentifier.screenLeft + (windowIdentifier.outerWidth - width) / 2; const top = windowIdentifier.screenTop + (windowIdentifier.outerHeight - height) / 2; options.left = left; options.top = top; return Object.entries(options) .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`) .join(','); } canAccessSessionStorage() { return (typeof navigator !== 'undefined' && navigator.cookieEnabled && typeof Storage !== 'undefined'); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: PopUpService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: PopUpService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: PopUpService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wdXAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItYXV0aC1vaWRjLWNsaWVudC9zcmMvbGliL2xvZ2luL3BvcHVwL3BvcHVwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDOztBQUt0RixNQUFNLE9BQU8sWUFBWTtJQUR6QjtRQUVtQixrQkFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV0Qyw4QkFBeUIsR0FBRyxNQUFNLENBQ2pELHlCQUF5QixDQUMxQixDQUFDO1FBRWUsYUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU1Qix1QkFBa0IsR0FBRyxXQUFXLENBQUM7UUFFMUMsVUFBSyxHQUFrQixJQUFJLENBQUM7UUFFNUIsV0FBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRUgsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO0tBcU0vRDtJQW5NQyxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQVksY0FBYztRQUN4QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQ25DLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxNQUEyQjtRQUM1QyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLENBQUM7WUFDbkMs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QUFDLENBQUM7UUFDMUUsTUFBTSxHQUFHLEdBQ1AsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUzRSxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNwQixPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUVsQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2FBQzNCLEdBQUcsQ0FDRixDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FDZixHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQzVEO2FBQ0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixPQUFPLENBQ0wsT0FBTyxTQUFTLEtBQUssV0FBVztZQUNoQyxTQUFTLENBQUMsYUFBYTtZQUN2QixPQUFPLE9BQU8sS0FBSyxXQUFXLENBQy9CLENBQUM7SUFDSixDQUFDOzhHQW5OVSxZQUFZO2tIQUFaLFlBQVksY0FEQyxNQUFNOzsyRkFDbkIsWUFBWTtrQkFEeEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE9wZW5JZENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi8uLi9jb25maWcvb3BlbmlkLWNvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbG9nZ2luZy9sb2dnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zdG9yYWdlL3N0b3JhZ2UtcGVyc2lzdGVuY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IFBvcHVwT3B0aW9ucyB9IGZyb20gJy4vcG9wdXAtb3B0aW9ucyc7XHJcbmltcG9ydCB7IFBvcHVwUmVzdWx0IH0gZnJvbSAnLi9wb3B1cC1yZXN1bHQnO1xyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFBvcFVwU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXJTZXJ2aWNlID0gaW5qZWN0KExvZ2dlclNlcnZpY2UpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UgPSBpbmplY3QoXHJcbiAgICBTdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlXHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1RPUkFHRV9JREVOVElGSUVSID0gJ3BvcHVwYXV0aCc7XHJcblxyXG4gIHByaXZhdGUgcG9wVXA6IFdpbmRvdyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGhhbmRsZSA9IC0xO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHJlc3VsdEludGVybmFsJCA9IG5ldyBTdWJqZWN0PFBvcHVwUmVzdWx0PigpO1xyXG5cclxuICBnZXQgcmVzdWx0JCgpOiBPYnNlcnZhYmxlPFBvcHVwUmVzdWx0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXN1bHRJbnRlcm5hbCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCB3aW5kb3dJbnRlcm5hbCgpOiBXaW5kb3cgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3O1xyXG4gIH1cclxuXHJcbiAgaXNDdXJyZW50bHlJblBvcHVwKGNvbmZpZzogT3BlbklkQ29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuY2FuQWNjZXNzU2Vzc2lvblN0b3JhZ2UoKSkge1xyXG4gICAgICBjb25zdCBwb3B1cCA9IHRoaXMuc3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZS5yZWFkKFxyXG4gICAgICAgIHRoaXMuU1RPUkFHRV9JREVOVElGSUVSLFxyXG4gICAgICAgIGNvbmZpZ1xyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3Qgd2luZG93SWRlbnRpZmllciA9IHRoaXMud2luZG93SW50ZXJuYWw7XHJcblxyXG4gICAgICBpZiAoIXdpbmRvd0lkZW50aWZpZXIpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgQm9vbGVhbih3aW5kb3dJZGVudGlmaWVyLm9wZW5lcikgJiZcclxuICAgICAgICB3aW5kb3dJZGVudGlmaWVyLm9wZW5lciAhPT0gd2luZG93SWRlbnRpZmllciAmJlxyXG4gICAgICAgIEJvb2xlYW4ocG9wdXApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb3BlblBvcFVwKFxyXG4gICAgdXJsOiBzdHJpbmcgfCBudWxsLFxyXG4gICAgcG9wdXBPcHRpb25zOiBQb3B1cE9wdGlvbnMgfCB1bmRlZmluZWQsXHJcbiAgICBjb25maWc6IE9wZW5JZENvbmZpZ3VyYXRpb25cclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IG9wdGlvbnNUb1Bhc3MgPSB0aGlzLmdldE9wdGlvbnMocG9wdXBPcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLnN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2Uud3JpdGUoXHJcbiAgICAgIHRoaXMuU1RPUkFHRV9JREVOVElGSUVSLFxyXG4gICAgICAndHJ1ZScsXHJcbiAgICAgIGNvbmZpZ1xyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCB3aW5kb3dJZGVudGlmaWVyID0gdGhpcy53aW5kb3dJbnRlcm5hbDtcclxuXHJcbiAgICBpZiAoIXdpbmRvd0lkZW50aWZpZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdXJsKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2dFcnJvcihjb25maWcsICdDb3VsZCBub3Qgb3BlbiBwb3B1cCwgdXJsIGlzIGVtcHR5Jyk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wb3BVcCA9IHdpbmRvd0lkZW50aWZpZXIub3Blbih1cmwsICdfYmxhbmsnLCBvcHRpb25zVG9QYXNzKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucG9wVXApIHtcclxuICAgICAgdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLnJlbW92ZSh0aGlzLlNUT1JBR0VfSURFTlRJRklFUiwgY29uZmlnKTtcclxuICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZ0Vycm9yKGNvbmZpZywgJ0NvdWxkIG5vdCBvcGVuIHBvcHVwJyk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKGNvbmZpZywgJ09wZW5lZCBwb3B1cCB3aXRoIHVybCAnICsgdXJsKTtcclxuXHJcbiAgICBjb25zdCBsaXN0ZW5lciA9IChldmVudDogTWVzc2FnZUV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICghZXZlbnQ/LmRhdGEgfHwgdHlwZW9mIGV2ZW50LmRhdGEgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgaWYgKGNvbmZpZy5kaXNhYmxlQ2xlYW5pbmdQb3B1cE9uSW52YWxpZE1lc3NhZ2UpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jbGVhblVwKGxpc3RlbmVyLCBjb25maWcpO1xyXG5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2dEZWJ1ZyhcclxuICAgICAgICBjb25maWcsXHJcbiAgICAgICAgJ1JlY2VpdmVkIG1lc3NhZ2UgZnJvbSBwb3B1cCB3aXRoIHVybCAnICsgZXZlbnQuZGF0YVxyXG4gICAgICApO1xyXG5cclxuICAgICAgdGhpcy5yZXN1bHRJbnRlcm5hbCQubmV4dCh7IHVzZXJDbG9zZWQ6IGZhbHNlLCByZWNlaXZlZFVybDogZXZlbnQuZGF0YSB9KTtcclxuXHJcbiAgICAgIHRoaXMuY2xlYW5VcChsaXN0ZW5lciwgY29uZmlnKTtcclxuICAgIH07XHJcblxyXG4gICAgd2luZG93SWRlbnRpZmllci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcclxuXHJcbiAgICB0aGlzLmhhbmRsZSA9IHdpbmRvd0lkZW50aWZpZXIuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5wb3BVcD8uY2xvc2VkKSB7XHJcbiAgICAgICAgdGhpcy5yZXN1bHRJbnRlcm5hbCQubmV4dCh7IHVzZXJDbG9zZWQ6IHRydWUsIHJlY2VpdmVkVXJsOiAnJyB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jbGVhblVwKGxpc3RlbmVyLCBjb25maWcpO1xyXG4gICAgICB9XHJcbiAgICB9LCAyMDApO1xyXG4gIH1cclxuXHJcbiAgc2VuZE1lc3NhZ2VUb01haW5XaW5kb3codXJsOiBzdHJpbmcsIGNvbmZpZzogT3BlbklkQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgY29uc3Qgd2luZG93SWRlbnRpZmllciA9IHRoaXMud2luZG93SW50ZXJuYWw7XHJcblxyXG4gICAgaWYgKCF3aW5kb3dJZGVudGlmaWVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93SWRlbnRpZmllci5vcGVuZXIpIHtcclxuICAgICAgY29uc3QgaHJlZiA9IHdpbmRvd0lkZW50aWZpZXIubG9jYXRpb24uaHJlZjtcclxuXHJcbiAgICAgIHRoaXMuc2VuZE1lc3NhZ2UodXJsLCBocmVmLCBjb25maWcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhblVwKGxpc3RlbmVyOiBhbnksIGNvbmZpZzogT3BlbklkQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgY29uc3Qgd2luZG93SWRlbnRpZmllciA9IHRoaXMud2luZG93SW50ZXJuYWw7XHJcblxyXG4gICAgaWYgKCF3aW5kb3dJZGVudGlmaWVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3dJZGVudGlmaWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xyXG4gICAgd2luZG93SWRlbnRpZmllci5jbGVhckludGVydmFsKHRoaXMuaGFuZGxlKTtcclxuXHJcbiAgICBpZiAodGhpcy5wb3BVcCkge1xyXG4gICAgICB0aGlzLnN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UucmVtb3ZlKHRoaXMuU1RPUkFHRV9JREVOVElGSUVSLCBjb25maWcpO1xyXG4gICAgICB0aGlzLnBvcFVwLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMucG9wVXAgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZW5kTWVzc2FnZShcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgaHJlZjogc3RyaW5nLFxyXG4gICAgY29uZmlnOiBPcGVuSWRDb25maWd1cmF0aW9uXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCB3aW5kb3dJZGVudGlmaWVyID0gdGhpcy53aW5kb3dJbnRlcm5hbDtcclxuXHJcbiAgICBpZiAoIXdpbmRvd0lkZW50aWZpZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdXJsKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2dEZWJ1ZyhcclxuICAgICAgICBjb25maWcsXHJcbiAgICAgICAgYENhbiBub3Qgc2VuZCBtZXNzYWdlIHRvIHBhcmVudCwgbm8gdXJsOiAnJHt1cmx9J2BcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3dJZGVudGlmaWVyLm9wZW5lci5wb3N0TWVzc2FnZSh1cmwsIGhyZWYpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPcHRpb25zKHBvcHVwT3B0aW9uczogUG9wdXBPcHRpb25zIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHBvcHVwRGVmYXVsdE9wdGlvbnMgPSB7XHJcbiAgICAgIHdpZHRoOiA1MDAsXHJcbiAgICAgIGhlaWdodDogNTAwLFxyXG4gICAgICBsZWZ0OiA1MCxcclxuICAgICAgdG9wOiA1MCxcclxuICAgIH07XHJcbiAgICBjb25zdCBvcHRpb25zOiBQb3B1cE9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLnBvcHVwRGVmYXVsdE9wdGlvbnMsXHJcbiAgICAgIC4uLihwb3B1cE9wdGlvbnMgfHwge30pLFxyXG4gICAgfTtcclxuICAgIGNvbnN0IHdpbmRvd0lkZW50aWZpZXIgPSB0aGlzLndpbmRvd0ludGVybmFsO1xyXG5cclxuICAgIGlmICghd2luZG93SWRlbnRpZmllcikge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoIHx8IHBvcHVwRGVmYXVsdE9wdGlvbnMud2lkdGg7XHJcbiAgICBjb25zdCBoZWlnaHQgPSBvcHRpb25zLmhlaWdodCB8fCBwb3B1cERlZmF1bHRPcHRpb25zLmhlaWdodDtcclxuXHJcbiAgICBjb25zdCBsZWZ0OiBudW1iZXIgPVxyXG4gICAgICB3aW5kb3dJZGVudGlmaWVyLnNjcmVlbkxlZnQgKyAod2luZG93SWRlbnRpZmllci5vdXRlcldpZHRoIC0gd2lkdGgpIC8gMjtcclxuICAgIGNvbnN0IHRvcDogbnVtYmVyID1cclxuICAgICAgd2luZG93SWRlbnRpZmllci5zY3JlZW5Ub3AgKyAod2luZG93SWRlbnRpZmllci5vdXRlckhlaWdodCAtIGhlaWdodCkgLyAyO1xyXG5cclxuICAgIG9wdGlvbnMubGVmdCA9IGxlZnQ7XHJcbiAgICBvcHRpb25zLnRvcCA9IHRvcDtcclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMob3B0aW9ucylcclxuICAgICAgLm1hcChcclxuICAgICAgICAoW2tleSwgdmFsdWVdKSA9PlxyXG4gICAgICAgICAgYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKX1gXHJcbiAgICAgIClcclxuICAgICAgLmpvaW4oJywnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FuQWNjZXNzU2Vzc2lvblN0b3JhZ2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICBuYXZpZ2F0b3IuY29va2llRW5hYmxlZCAmJlxyXG4gICAgICB0eXBlb2YgU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCdcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==