UNPKG

formioangular-colfuturo

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.1.4.

203 lines 26.5 kB
import { EventEmitter, Injectable } from "@angular/core"; import { get, each } from "lodash"; import { Formio } from "formiojs-colfuturo"; import * as i0 from "@angular/core"; import * as i1 from "formioangular-colfuturo"; import * as i2 from "./auth.config"; export class FormioAuthService { appConfig; config; user; authenticated = false; loginForm; onLogin; onLogout; registerForm; onRegister; onUser; onError; resetPassForm; onResetPass; ready; readyResolve; readyReject; projectReady; accessReady; userReady; formAccess = {}; submissionAccess = {}; roles; is = {}; constructor(appConfig, config) { this.appConfig = appConfig; this.config = config; this.user = null; if (this.appConfig && this.appConfig.appUrl) { Formio.setBaseUrl(this.appConfig.apiUrl); Formio.setProjectUrl(this.appConfig.appUrl); Formio.formOnly = !!this.appConfig.formOnly; } else { console.error("You must provide an AppConfig within your application!"); } this.loginForm = this.appConfig.appUrl + "/" + get(this.config, "login.form", "user/login"); this.registerForm = this.appConfig.appUrl + "/" + get(this.config, "register.form", "user/register"); this.resetPassForm = this.appConfig.appUrl + "/" + get(this.config, "resetpass.form", "resetpass"); this.onLogin = new EventEmitter(); this.onLogout = new EventEmitter(); this.onRegister = new EventEmitter(); this.onUser = new EventEmitter(); this.onError = new EventEmitter(); this.ready = new Promise((resolve, reject) => { this.readyResolve = resolve; this.readyReject = reject; }); // Register for the core events. Formio.events.on("formio.badToken", () => this.logoutError()); Formio.events.on("formio.sessionExpired", () => this.logoutError()); if (!this.config.delayAuth) { this.init(); } } onLoginSubmit(submission) { this.setUser(submission); this.onLogin.emit(submission); } onRegisterSubmit(submission) { this.setUser(submission); this.onRegister.emit(submission); } onResetPassSubmit(submission) { this.onResetPass.emit(submission); } init() { this.projectReady = Formio.makeStaticRequest(this.appConfig.appUrl).then((project) => { each(project.access, (access) => { this.formAccess[access.type] = access.roles; }); }, () => { this.formAccess = {}; return null; }); // Get the access for this project. this.accessReady = Formio.makeStaticRequest(this.appConfig.appUrl + "/access") .then((access) => { each(access.forms, (form) => { this.submissionAccess[form.name] = {}; form.submissionAccess.forEach((subAccess) => { this.submissionAccess[form.name][subAccess.type] = subAccess.roles; }); }); this.roles = access.roles; return access; }) .catch((err) => { if (err === "Token Expired" || err === "Bad Token") { this.setUser(null); } this.roles = {}; return null; }); let currentUserPromise; if (this.config.oauth) { // Make a fix to the hash to remove starting "/" that angular might put there. if (window.location.hash && window.location.hash.match(/^#\/access_token/)) { history.pushState(null, null, window.location.hash.replace(/^#\/access_token/, "#access_token")); } // Initiate the SSO if they provide oauth settings. currentUserPromise = Formio.ssoInit(this.config.oauth.type, this.config.oauth.options); } else { currentUserPromise = Formio.currentUser(null, { ignoreCache: true, }); } this.userReady = currentUserPromise .then((user) => { this.setUser(user); return user; }) .catch((err) => { this.setUser(null); throw err; }); // Trigger we are redy when all promises have resolved. if (this.accessReady) { this.accessReady .then(() => this.projectReady) .then(() => this.userReady) .then(() => this.readyResolve(true)) .catch((err) => this.readyReject(err)); } } setUser(user) { const namespace = Formio.namespace || "formio"; if (user) { this.user = user; localStorage.setItem(`${namespace}AppUser`, JSON.stringify(user)); this.setUserRoles(); Formio.setUser(user); } else { this.user = null; this.is = {}; localStorage.removeItem(`${namespace}AppUser`); Formio.clearCache(); Formio.setUser(null); } this.authenticated = !!Formio.getToken(); this.onUser.emit(this.user); } setUserRoles() { if (this.accessReady) { this.accessReady.then(() => { each(this.roles, (role, roleName) => { if (this.user.roles.indexOf(role._id) !== -1) { this.is[roleName] = true; } }); }); } } logoutError() { this.setUser(null); const namespace = Formio.namespace || "formio"; localStorage.removeItem(`${namespace}Token`); this.onError.emit(); } logout() { const namespace = Formio.namespace || "formio"; const tokenName = `${namespace}Token`; localStorage.removeItem(tokenName); if (Formio.tokens && Formio.tokens.hasOwnProperty(tokenName)) { delete Formio.tokens[tokenName]; } Formio.logout() .then(() => { this.setUser(null); if (localStorage.getItem(`${namespace}LogoutAuthUrl`)) { window.open(localStorage.getItem(`${namespace}LogoutAuthUrl`), null, "width=1020,height=618"); localStorage.removeItem(`${namespace}LogoutAuthUrl`); } this.onLogout.emit(); }) .catch(() => this.logoutError()); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormioAuthService, deps: [{ token: i1.FormioAppConfig }, { token: i2.FormioAuthConfig }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormioAuthService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormioAuthService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.FormioAppConfig }, { type: i2.FormioAuthConfig }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1mb3JtaW8vYXV0aC9zcmMvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBR2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7OztBQUc1QyxNQUFNLE9BQU8saUJBQWlCO0lBNkJuQjtJQUNBO0lBN0JGLElBQUksQ0FBTTtJQUNWLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFFdEIsU0FBUyxDQUFTO0lBQ2xCLE9BQU8sQ0FBdUI7SUFDOUIsUUFBUSxDQUF1QjtJQUUvQixZQUFZLENBQVM7SUFDckIsVUFBVSxDQUF1QjtJQUNqQyxNQUFNLENBQXVCO0lBQzdCLE9BQU8sQ0FBb0I7SUFFM0IsYUFBYSxDQUFTO0lBQ3RCLFdBQVcsQ0FBdUI7SUFFbEMsS0FBSyxDQUFtQjtJQUN4QixZQUFZLENBQU07SUFDbEIsV0FBVyxDQUFNO0lBRWpCLFlBQVksQ0FBZ0I7SUFDNUIsV0FBVyxDQUFnQjtJQUMzQixTQUFTLENBQWdCO0lBQ3pCLFVBQVUsR0FBUSxFQUFFLENBQUM7SUFDckIsZ0JBQWdCLEdBQVEsRUFBRSxDQUFDO0lBQzNCLEtBQUssQ0FBTTtJQUNYLEVBQUUsR0FBUSxFQUFFLENBQUM7SUFFcEIsWUFDUyxTQUEwQixFQUMxQixNQUF3QjtRQUR4QixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUMxQixXQUFNLEdBQU4sTUFBTSxDQUFrQjtRQUUvQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUVqQixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUs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QWMsQ0FBQyxTQUFTLENBQUMsRUFDaEQsQ0FBQztZQUNELE9BQVEsTUFBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRTthQUNaLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFNBQVMsZUFBZSxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsTUFBTSxDQUFDLElBQUksQ0FDVCxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsU0FBUyxlQUFlLENBQUMsRUFDakQsSUFBSSxFQUNKLHVCQUF1QixDQUN4QixDQUFDO2dCQUNGLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxTQUFTLGVBQWUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNyQyxDQUFDO3dHQXZPVSxpQkFBaUI7NEdBQWpCLGlCQUFpQjs7NEZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybWlvQXV0aENvbmZpZyB9IGZyb20gXCIuL2F1dGguY29uZmlnXCI7XHJcbmltcG9ydCB7IEZvcm1pb0FwcENvbmZpZyB9IGZyb20gXCJmb3JtaW9hbmd1bGFyLWNvbGZ1dHVyb1wiO1xyXG5pbXBvcnQgeyBnZXQsIGVhY2ggfSBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCB7IEZvcm1pbyB9IGZyb20gXCJmb3JtaW9qcy1jb2xmdXR1cm9cIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEZvcm1pb0F1dGhTZXJ2aWNlIHtcclxuICBwdWJsaWMgdXNlcjogYW55O1xyXG4gIHB1YmxpYyBhdXRoZW50aWNhdGVkID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBsb2dpbkZvcm06IHN0cmluZztcclxuICBwdWJsaWMgb25Mb2dpbjogRXZlbnRFbWl0dGVyPG9iamVjdD47XHJcbiAgcHVibGljIG9uTG9nb3V0OiBFdmVudEVtaXR0ZXI8b2JqZWN0PjtcclxuXHJcbiAgcHVibGljIHJlZ2lzdGVyRm9ybTogc3RyaW5nO1xyXG4gIHB1YmxpYyBvblJlZ2lzdGVyOiBFdmVudEVtaXR0ZXI8b2JqZWN0PjtcclxuICBwdWJsaWMgb25Vc2VyOiBFdmVudEVtaXR0ZXI8b2JqZWN0PjtcclxuICBwdWJsaWMgb25FcnJvcjogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIHB1YmxpYyByZXNldFBhc3NGb3JtOiBzdHJpbmc7XHJcbiAgcHVibGljIG9uUmVzZXRQYXNzOiBFdmVudEVtaXR0ZXI8b2JqZWN0PjtcclxuXHJcbiAgcHVibGljIHJlYWR5OiBQcm9taXNlPGJvb2xlYW4+O1xyXG4gIHB1YmxpYyByZWFkeVJlc29sdmU6IGFueTtcclxuICBwdWJsaWMgcmVhZHlSZWplY3Q6IGFueTtcclxuXHJcbiAgcHVibGljIHByb2plY3RSZWFkeT86IFByb21pc2U8YW55PjtcclxuICBwdWJsaWMgYWNjZXNzUmVhZHk/OiBQcm9taXNlPGFueT47XHJcbiAgcHVibGljIHVzZXJSZWFkeT86IFByb21pc2U8YW55PjtcclxuICBwdWJsaWMgZm9ybUFjY2VzczogYW55ID0ge307XHJcbiAgcHVibGljIHN1Ym1pc3Npb25BY2Nlc3M6IGFueSA9IHt9O1xyXG4gIHB1YmxpYyByb2xlczogYW55O1xyXG4gIHB1YmxpYyBpczogYW55ID0ge307XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGFwcENvbmZpZzogRm9ybWlvQXBwQ29uZmlnLFxyXG4gICAgcHVibGljIGNvbmZpZzogRm9ybWlvQXV0aENvbmZpZ1xyXG4gICkge1xyXG4gICAgdGhpcy51c2VyID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5hcHBDb25maWcgJiYgdGhpcy5hcHBDb25maWcuYXBwVXJsKSB7XHJcbiAgICAgIEZvcm1pby5zZXRCYXNlVXJsKHRoaXMuYXBwQ29uZmlnLmFwaVVybCk7XHJcbiAgICAgIEZvcm1pby5zZXRQcm9qZWN0VXJsKHRoaXMuYXBwQ29uZmlnLmFwcFVybCk7XHJcbiAgICAgIEZvcm1pby5mb3JtT25seSA9ICEhdGhpcy5hcHBDb25maWcuZm9ybU9ubHk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiWW91IG11c3QgcHJvdmlkZSBhbiBBcHBDb25maWcgd2l0aGluIHlvdXIgYXBwbGljYXRpb24hXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubG9naW5Gb3JtID1cclxuICAgICAgdGhpcy5hcHBDb25maWcuYXBwVXJsICtcclxuICAgICAgXCIvXCIgK1xyXG4gICAgICBnZXQodGhpcy5jb25maWcsIFwibG9naW4uZm9ybVwiLCBcInVzZXIvbG9naW5cIik7XHJcbiAgICB0aGlzLnJlZ2lzdGVyRm9ybSA9XHJcbiAgICAgIHRoaXMuYXBwQ29uZmlnLmFwcFVybCArXHJcbiAgICAgIFwiL1wiICtcclxuICAgICAgZ2V0KHRoaXMuY29uZmlnLCBcInJlZ2lzdGVyLmZvcm1cIiwgXCJ1c2VyL3JlZ2lzdGVyXCIpO1xyXG4gICAgdGhpcy5yZXNldFBhc3NGb3JtID1cclxuICAgICAgdGhpcy5hcHBDb25maWcuYXBwVXJsICtcclxuICAgICAgXCIvXCIgK1xyXG4gICAgICBnZXQodGhpcy5jb25maWcsIFwicmVzZXRwYXNzLmZvcm1cIiwgXCJyZXNldHBhc3NcIik7XHJcbiAgICB0aGlzLm9uTG9naW4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLm9uTG9nb3V0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5vblJlZ2lzdGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5vblVzZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLm9uRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgdGhpcy5yZWFkeSA9IG5ldyBQcm9taXNlKChyZXNvbHZlOiBhbnksIHJlamVjdDogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMucmVhZHlSZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgdGhpcy5yZWFkeVJlamVjdCA9IHJlamVjdDtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFJlZ2lzdGVyIGZvciB0aGUgY29yZSBldmVudHMuXHJcbiAgICBGb3JtaW8uZXZlbnRzLm9uKFwiZm9ybWlvLmJhZFRva2VuXCIsICgpID0+IHRoaXMubG9nb3V0RXJyb3IoKSk7XHJcbiAgICBGb3JtaW8uZXZlbnRzLm9uKFwiZm9ybWlvLnNlc3Npb25FeHBpcmVkXCIsICgpID0+IHRoaXMubG9nb3V0RXJyb3IoKSk7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmRlbGF5QXV0aCkge1xyXG4gICAgICB0aGlzLmluaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uTG9naW5TdWJtaXQoc3VibWlzc2lvbjogb2JqZWN0KSB7XHJcbiAgICB0aGlzLnNldFVzZXIoc3VibWlzc2lvbik7XHJcbiAgICB0aGlzLm9uTG9naW4uZW1pdChzdWJtaXNzaW9uKTtcclxuICB9XHJcblxyXG4gIG9uUmVnaXN0ZXJTdWJtaXQoc3VibWlzc2lvbjogb2JqZWN0KSB7XHJcbiAgICB0aGlzLnNldFVzZXIoc3VibWlzc2lvbik7XHJcbiAgICB0aGlzLm9uUmVnaXN0ZXIuZW1pdChzdWJtaXNzaW9uKTtcclxuICB9XHJcblxyXG4gIG9uUmVzZXRQYXNzU3VibWl0KHN1Ym1pc3Npb246IG9iamVjdCkge1xyXG4gICAgdGhpcy5vblJlc2V0UGFzcy5lbWl0KHN1Ym1pc3Npb24pO1xyXG4gIH1cclxuXHJcbiAgaW5pdCgpIHtcclxuICAgIHRoaXMucHJvamVjdFJlYWR5ID0gRm9ybWlvLm1ha2VTdGF0aWNSZXF1ZXN0KHRoaXMuYXBwQ29uZmlnLmFwcFVybCkudGhlbihcclxuICAgICAgKHByb2plY3Q6IGFueSkgPT4ge1xyXG4gICAgICAgIGVhY2gocHJvamVjdC5hY2Nlc3MsIChhY2Nlc3M6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5mb3JtQWNjZXNzW2FjY2Vzcy50eXBlXSA9IGFjY2Vzcy5yb2xlcztcclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgKCk6IGFueSA9PiB7XHJcbiAgICAgICAgdGhpcy5mb3JtQWNjZXNzID0ge307XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgLy8gR2V0IHRoZSBhY2Nlc3MgZm9yIHRoaXMgcHJvamVjdC5cclxuICAgIHRoaXMuYWNjZXNzUmVhZHkgPSBGb3JtaW8ubWFrZVN0YXRpY1JlcXVlc3QoXHJcbiAgICAgIHRoaXMuYXBwQ29uZmlnLmFwcFVybCArIFwiL2FjY2Vzc1wiXHJcbiAgICApXHJcbiAgICAgIC50aGVuKChhY2Nlc3M6IGFueSkgPT4ge1xyXG4gICAgICAgIGVhY2goYWNjZXNzLmZvcm1zLCAoZm9ybTogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnN1Ym1pc3Npb25BY2Nlc3NbZm9ybS5uYW1lXSA9IHt9O1xyXG4gICAgICAgICAgZm9ybS5zdWJtaXNzaW9uQWNjZXNzLmZvckVhY2goKHN1YkFjY2VzczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3VibWlzc2lvbkFjY2Vzc1tmb3JtLm5hbWVdW3N1YkFjY2Vzcy50eXBlXSA9IHN1YkFjY2Vzcy5yb2xlcztcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucm9sZXMgPSBhY2Nlc3Mucm9sZXM7XHJcbiAgICAgICAgcmV0dXJuIGFjY2VzcztcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnIpOiBhbnkgPT4ge1xyXG4gICAgICAgIGlmIChlcnIgPT09IFwiVG9rZW4gRXhwaXJlZFwiIHx8IGVyciA9PT0gXCJCYWQgVG9rZW5cIikge1xyXG4gICAgICAgICAgdGhpcy5zZXRVc2VyKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJvbGVzID0ge307XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGxldCBjdXJyZW50VXNlclByb21pc2U6IFByb21pc2U8YW55PjtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5vYXV0aCkge1xyXG4gICAgICAvLyBNYWtlIGEgZml4IHRvIHRoZSBoYXNoIHRvIHJlbW92ZSBzdGFydGluZyBcIi9cIiB0aGF0IGFuZ3VsYXIgbWlnaHQgcHV0IHRoZXJlLlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggJiZcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaC5tYXRjaCgvXiNcXC9hY2Nlc3NfdG9rZW4vKVxyXG4gICAgICApIHtcclxuICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZShcclxuICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2gucmVwbGFjZSgvXiNcXC9hY2Nlc3NfdG9rZW4vLCBcIiNhY2Nlc3NfdG9rZW5cIilcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBJbml0aWF0ZSB0aGUgU1NPIGlmIHRoZXkgcHJvdmlkZSBvYXV0aCBzZXR0aW5ncy5cclxuICAgICAgY3VycmVudFVzZXJQcm9taXNlID0gRm9ybWlvLnNzb0luaXQoXHJcbiAgICAgICAgdGhpcy5jb25maWcub2F1dGgudHlwZSxcclxuICAgICAgICB0aGlzLmNvbmZpZy5vYXV0aC5vcHRpb25zXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjdXJyZW50VXNlclByb21pc2UgPSBGb3JtaW8uY3VycmVudFVzZXIobnVsbCwge1xyXG4gICAgICAgIGlnbm9yZUNhY2hlOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVzZXJSZWFkeSA9IGN1cnJlbnRVc2VyUHJvbWlzZVxyXG4gICAgICAudGhlbigodXNlcjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRVc2VyKHVzZXIpO1xyXG4gICAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0VXNlcihudWxsKTtcclxuICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIFRyaWdnZXIgd2UgYXJlIHJlZHkgd2hlbiBhbGwgcHJvbWlzZXMgaGF2ZSByZXNvbHZlZC5cclxuICAgIGlmICh0aGlzLmFjY2Vzc1JlYWR5KSB7XHJcbiAgICAgIHRoaXMuYWNjZXNzUmVhZHlcclxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnByb2plY3RSZWFkeSlcclxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnVzZXJSZWFkeSlcclxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlYWR5UmVzb2x2ZSh0cnVlKSlcclxuICAgICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB0aGlzLnJlYWR5UmVqZWN0KGVycikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0VXNlcih1c2VyOiBhbnkpIHtcclxuICAgIGNvbnN0IG5hbWVzcGFjZSA9IEZvcm1pby5uYW1lc3BhY2UgfHwgXCJmb3JtaW9cIjtcclxuICAgIGlmICh1c2VyKSB7XHJcbiAgICAgIHRoaXMudXNlciA9IHVzZXI7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGAke25hbWVzcGFjZX1BcHBVc2VyYCwgSlNPTi5zdHJpbmdpZnkodXNlcikpO1xyXG4gICAgICB0aGlzLnNldFVzZXJSb2xlcygpO1xyXG4gICAgICBGb3JtaW8uc2V0VXNlcih1c2VyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudXNlciA9IG51bGw7XHJcbiAgICAgIHRoaXMuaXMgPSB7fTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYCR7bmFtZXNwYWNlfUFwcFVzZXJgKTtcclxuICAgICAgRm9ybWlvLmNsZWFyQ2FjaGUoKTtcclxuICAgICAgRm9ybWlvLnNldFVzZXIobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hdXRoZW50aWNhdGVkID0gISFGb3JtaW8uZ2V0VG9rZW4oKTtcclxuICAgIHRoaXMub25Vc2VyLmVtaXQodGhpcy51c2VyKTtcclxuICB9XHJcblxyXG4gIHNldFVzZXJSb2xlcygpIHtcclxuICAgIGlmICh0aGlzLmFjY2Vzc1JlYWR5KSB7XHJcbiAgICAgIHRoaXMuYWNjZXNzUmVhZHkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgZWFjaCh0aGlzLnJvbGVzLCAocm9sZTogYW55LCByb2xlTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy51c2VyLnJvbGVzLmluZGV4T2Yocm9sZS5faWQpICE9PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzW3JvbGVOYW1lXSA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9nb3V0RXJyb3IoKSB7XHJcbiAgICB0aGlzLnNldFVzZXIobnVsbCk7XHJcbiAgICBjb25zdCBuYW1lc3BhY2UgPSBGb3JtaW8ubmFtZXNwYWNlIHx8IFwiZm9ybWlvXCI7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgJHtuYW1lc3BhY2V9VG9rZW5gKTtcclxuICAgIHRoaXMub25FcnJvci5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBsb2dvdXQoKSB7XHJcbiAgICBjb25zdCBuYW1lc3BhY2UgPSBGb3JtaW8ubmFtZXNwYWNlIHx8IFwiZm9ybWlvXCI7XHJcbiAgICBjb25zdCB0b2tlbk5hbWUgPSBgJHtuYW1lc3BhY2V9VG9rZW5gO1xyXG5cclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRva2VuTmFtZSk7XHJcbiAgICBpZiAoXHJcbiAgICAgIChGb3JtaW8gYXMgYW55KS50b2tlbnMgJiZcclxuICAgICAgKEZvcm1pbyBhcyBhbnkpLnRva2Vucy5oYXNPd25Qcm9wZXJ0eSh0b2tlbk5hbWUpXHJcbiAgICApIHtcclxuICAgICAgZGVsZXRlIChGb3JtaW8gYXMgYW55KS50b2tlbnNbdG9rZW5OYW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBGb3JtaW8ubG9nb3V0KClcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0VXNlcihudWxsKTtcclxuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oYCR7bmFtZXNwYWNlfUxvZ291dEF1dGhVcmxgKSkge1xyXG4gICAgICAgICAgd2luZG93Lm9wZW4oXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGAke25hbWVzcGFjZX1Mb2dvdXRBdXRoVXJsYCksXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIFwid2lkdGg9MTAyMCxoZWlnaHQ9NjE4XCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgJHtuYW1lc3BhY2V9TG9nb3V0QXV0aFVybGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uTG9nb3V0LmVtaXQoKTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKCgpID0+IHRoaXMubG9nb3V0RXJyb3IoKSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==