ngx-firebase-cms
Version:
Angular Content Management System using Google Firebase (Authentication, Storage & Firestore)
326 lines • 21.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable, Inject } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFirestore } from '@angular/fire/firestore';
import { of } from 'rxjs';
import { switchMap, tap } from 'rxjs/operators';
import { Router } from '@angular/router';
import * as firebase from 'firebase/app';
import { NzMessageService } from 'ng-zorro-antd';
import * as i0 from "@angular/core";
import * as i1 from "@angular/fire/auth";
import * as i2 from "ng-zorro-antd";
import * as i3 from "@angular/router";
import * as i4 from "@angular/fire/firestore";
var AuthService = /** @class */ (function () {
function AuthService(config, afAuth, message, router, afs) {
var _this = this;
this.config = config;
this.afAuth = afAuth;
this.message = message;
this.router = router;
this.afs = afs;
this.user$ = this.afAuth.authState.pipe(tap((/**
* @param {?} res
* @return {?}
*/
function (res) {
if (res) {
_this.uid = res["uid"];
_this.email = res["email"];
_this.emailVerified = res["emailVerified"];
_this.lastLogin = new Date(res["metadata"]["lastSignInTime"]);
}
})), switchMap((/**
* @param {?} user
* @return {?}
*/
function (user) {
if (user) {
return _this.afs.doc("users/" + user.uid).valueChanges();
}
else {
return of(null);
}
})), tap((/**
* @param {?} user
* @return {?}
*/
function (user) {
if (user) {
_this.displayName = user["displayName"];
_this.profileURL = user["profileURL"];
_this.role = user["roles"];
}
})));
}
/**
* @param {?} username
* @param {?} password
* @return {?}
*/
AuthService.prototype.login = /**
* @param {?} username
* @param {?} password
* @return {?}
*/
function (username, password) {
var _this = this;
/** @type {?} */
var adminURL = this.config.adminURL || 'admin';
this.afAuth.auth.signInWithEmailAndPassword(username, password)
.then((/**
* @param {?} res
* @return {?}
*/
function (res) {
_this.router.navigate([adminURL + "/dashboard"]);
})).catch((/**
* @param {?} err
* @return {?}
*/
function (err) {
_this.message.error(err);
}));
};
/**
* @param {?} username
* @param {?} password
* @return {?}
*/
AuthService.prototype.signup = /**
* @param {?} username
* @param {?} password
* @return {?}
*/
function (username, password) {
var _this = this;
/** @type {?} */
var adminURL = this.config.adminURL || 'admin';
this.afAuth.auth.createUserWithEmailAndPassword(username, password).then((/**
* @param {?} res
* @return {?}
*/
function (res) {
/** @type {?} */
var data = {
uid: res['user']['uid'],
email: res['user']['email'],
displayName: res['user']['email'],
emailVerified: false,
createdTime: firebase.firestore.FieldValue.serverTimestamp(),
updatedTime: firebase.firestore.FieldValue.serverTimestamp(),
lastLoginTime: firebase.firestore.FieldValue.serverTimestamp(),
roles: ["Contributor"]
};
if (res['user']['uid']) {
_this.afs.collection("users").doc(res['user']['uid']).set(data)
.then((/**
* @param {?} res
* @return {?}
*/
function (res) {
_this.router.navigate([adminURL + "/dashboard"]);
}))
.catch((/**
* @param {?} err
* @return {?}
*/
function (err) {
_this.message.error(err);
}));
}
}));
};
/**
* @return {?}
*/
AuthService.prototype.signOut = /**
* @return {?}
*/
function () {
return this.afAuth.auth.signOut();
};
/**
* @private
* @param {?} user
* @return {?}
*/
AuthService.prototype.updateUserData = /**
* @private
* @param {?} user
* @return {?}
*/
function (user) {
/** @type {?} */
var userRef = this.afs.doc("users/" + user.uid);
/** @type {?} */
var data = {
uid: user.uid,
email: user.email,
roles: ["Contributor"]
};
return userRef.set(data, { merge: true });
};
///// Role-based Authorization //////
///// Role-based Authorization //////
/**
* @param {?} user
* @return {?}
*/
AuthService.prototype.canRead =
///// Role-based Authorization //////
/**
* @param {?} user
* @return {?}
*/
function (user) {
/** @type {?} */
var allowed = ['Administrator', 'Editor', 'Author', 'Contributor'];
return this.checkAuthorization(user, allowed);
};
/**
* @param {?} user
* @return {?}
*/
AuthService.prototype.canEdit = /**
* @param {?} user
* @return {?}
*/
function (user) {
/** @type {?} */
var allowed = ['Administrator', 'Editor'];
return this.checkAuthorization(user, allowed);
};
/**
* @param {?} user
* @return {?}
*/
AuthService.prototype.canDelete = /**
* @param {?} user
* @return {?}
*/
function (user) {
/** @type {?} */
var allowed = ['Administrator'];
return this.checkAuthorization(user, allowed);
};
// determines if user has matching role
// determines if user has matching role
/**
* @private
* @param {?} user
* @param {?} allowedRoles
* @return {?}
*/
AuthService.prototype.checkAuthorization =
// determines if user has matching role
/**
* @private
* @param {?} user
* @param {?} allowedRoles
* @return {?}
*/
function (user, allowedRoles) {
var e_1, _a;
if (!user)
return false;
try {
for (var allowedRoles_1 = tslib_1.__values(allowedRoles), allowedRoles_1_1 = allowedRoles_1.next(); !allowedRoles_1_1.done; allowedRoles_1_1 = allowedRoles_1.next()) {
var role = allowedRoles_1_1.value;
if (user.roles[role]) {
return true;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (allowedRoles_1_1 && !allowedRoles_1_1.done && (_a = allowedRoles_1.return)) _a.call(allowedRoles_1);
}
finally { if (e_1) throw e_1.error; }
}
return false;
};
/**
* @param {?} description
* @return {?}
*/
AuthService.prototype.log = /**
* @param {?} description
* @return {?}
*/
function (description) {
if (this.uid) {
this.afs.collection('log').add({
"description": description,
"uid": this.uid,
"createdTime": firebase.firestore.FieldValue.serverTimestamp()
});
}
};
AuthService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
AuthService.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: ['env',] }] },
{ type: AngularFireAuth },
{ type: NzMessageService },
{ type: Router },
{ type: AngularFirestore }
]; };
/** @nocollapse */ AuthService.ngInjectableDef = i0.defineInjectable({ factory: function AuthService_Factory() { return new AuthService(i0.inject("env"), i0.inject(i1.AngularFireAuth), i0.inject(i2.NzMessageService), i0.inject(i3.Router), i0.inject(i4.AngularFirestore)); }, token: AuthService, providedIn: "root" });
return AuthService;
}());
export { AuthService };
if (false) {
/** @type {?} */
AuthService.prototype.user$;
/** @type {?} */
AuthService.prototype.uid;
/** @type {?} */
AuthService.prototype.displayName;
/** @type {?} */
AuthService.prototype.email;
/** @type {?} */
AuthService.prototype.profileURL;
/** @type {?} */
AuthService.prototype.emailVerified;
/** @type {?} */
AuthService.prototype.lastLogin;
/** @type {?} */
AuthService.prototype.role;
/**
* @type {?}
* @private
*/
AuthService.prototype.config;
/**
* @type {?}
* @private
*/
AuthService.prototype.afAuth;
/**
* @type {?}
* @private
*/
AuthService.prototype.message;
/**
* @type {?}
* @private
*/
AuthService.prototype.router;
/**
* @type {?}
* @private
*/
AuthService.prototype.afs;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWZpcmViYXNlLWNtcy8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQTRCLE1BQU0seUJBQXlCLENBQUM7QUFDckYsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QyxPQUFPLEtBQUssUUFBUSxNQUFNLGNBQWMsQ0FBQztBQUd6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQUdqRDtJQWNFLHFCQUN5QixNQUFpQixFQUNoQyxNQUF1QixFQUN2QixPQUF5QixFQUN6QixNQUFjLEVBQ2QsR0FBcUI7UUFML0IsaUJBK0JDO1FBOUJ3QixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBQ3ZCLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQ3pCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxRQUFHLEdBQUgsR0FBRyxDQUFrQjtRQUU3QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDckMsR0FBRzs7OztRQUFDLFVBQUEsR0FBRztZQUNMLElBQUksR0FBRyxFQUFFO2dCQUNQLEtBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNyQixLQUFJLENBQUMs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TUFBTTtnQkFITixnQkFBZ0I7OztzQkFGekI7Q0FrSkMsQUFySUQsSUFxSUM7U0FsSVksV0FBVzs7O0lBRXRCLDRCQUF3Qjs7SUFDeEIsMEJBQVk7O0lBQ1osa0NBQW9COztJQUNwQiw0QkFBYzs7SUFDZCxpQ0FBbUI7O0lBQ25CLG9DQUF3Qjs7SUFDeEIsZ0NBQWdCOztJQUNoQiwyQkFBSTs7Ozs7SUFHRiw2QkFBd0M7Ozs7O0lBQ3hDLDZCQUErQjs7Ozs7SUFDL0IsOEJBQWlDOzs7OztJQUNqQyw2QkFBc0I7Ozs7O0lBQ3RCLDBCQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQW5ndWxhckZpcmVBdXRoIH0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9hdXRoJztcbmltcG9ydCB7IEFuZ3VsYXJGaXJlc3RvcmUsIEFuZ3VsYXJGaXJlc3RvcmVEb2N1bWVudCB9IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvZmlyZXN0b3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vaW50ZXJmYWNlL3VzZXInO1xuaW1wb3J0ICogYXMgZmlyZWJhc2UgZnJvbSAnZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IEZpcmViYXNlQXBwIH0gZnJvbSAnQGFuZ3VsYXIvZmlyZSc7XG5pbXBvcnQgeyBFbnZDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2UvZW52LWNvbmZpZyc7XG5pbXBvcnQgeyBOek1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZCc7XG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuLi9pbnRlcmZhY2UvbG9nJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuXG4gIHVzZXIkOiBPYnNlcnZhYmxlPFVzZXI+O1xuICB1aWQ6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgZW1haWw6IHN0cmluZztcbiAgcHJvZmlsZVVSTDogc3RyaW5nO1xuICBlbWFpbFZlcmlmaWVkIDogYm9vbGVhbjtcbiAgbGFzdExvZ2luOiBEYXRlO1xuICByb2xlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdCgnZW52JykgcHJpdmF0ZSBjb25maWc6IEVudkNvbmZpZyxcbiAgICBwcml2YXRlIGFmQXV0aDogQW5ndWxhckZpcmVBdXRoLFxuICAgIHByaXZhdGUgbWVzc2FnZTogTnpNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgYWZzOiBBbmd1bGFyRmlyZXN0b3JlXG4gICkge1xuICAgIHRoaXMudXNlciQgPSB0aGlzLmFmQXV0aC5hdXRoU3RhdGUucGlwZShcbiAgICAgIHRhcChyZXMgPT4ge1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgdGhpcy51aWQgPSByZXNbXCJ1aWRcIl1cbiAgICAgICAgICB0aGlzLmVtYWlsID0gcmVzW1wiZW1haWxcIl1cbiAgICAgICAgICB0aGlzLmVtYWlsVmVyaWZpZWQgPSByZXNbXCJlbWFpbFZlcmlmaWVkXCJdXG4gICAgICAgICAgdGhpcy5sYXN0TG9naW4gPSBuZXcgRGF0ZShyZXNbXCJtZXRhZGF0YVwiXVtcImxhc3RTaWduSW5UaW1lXCJdKVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHN3aXRjaE1hcCh1c2VyID0+IHtcbiAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hZnMuZG9jPFVzZXI+KGB1c2Vycy8ke3VzZXIudWlkfWApLnZhbHVlQ2hhbmdlcygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdGFwKHVzZXIgPT4ge1xuICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSB1c2VyW1wiZGlzcGxheU5hbWVcIl1cbiAgICAgICAgICB0aGlzLnByb2ZpbGVVUkwgPSB1c2VyW1wicHJvZmlsZVVSTFwiXVxuICAgICAgICAgIHRoaXMucm9sZSA9IHVzZXJbXCJyb2xlc1wiXVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBsb2dpbih1c2VybmFtZSwgcGFzc3dvcmQpIHtcbiAgICBsZXQgYWRtaW5VUkwgPSB0aGlzLmNvbmZpZy5hZG1pblVSTCB8fCAnYWRtaW4nXG4gICAgdGhpcy5hZkF1dGguYXV0aC5zaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZCh1c2VybmFtZSwgcGFzc3dvcmQpXG4gICAgLnRoZW4ocmVzID0+IHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHthZG1pblVSTH0vZGFzaGJvYXJkYF0pXG4gICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgIHRoaXMubWVzc2FnZS5lcnJvcihlcnIpXG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBzaWdudXAodXNlcm5hbWUsIHBhc3N3b3JkKSB7XG4gICAgbGV0IGFkbWluVVJMID0gdGhpcy5jb25maWcuYWRtaW5VUkwgfHwgJ2FkbWluJ1xuICAgIHRoaXMuYWZBdXRoLmF1dGguY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkKHVzZXJuYW1lLCBwYXNzd29yZCkudGhlbihyZXMgPT4ge1xuICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgIHVpZDogcmVzWyd1c2VyJ11bJ3VpZCddLFxuICAgICAgICBlbWFpbDogcmVzWyd1c2VyJ11bJ2VtYWlsJ10sXG4gICAgICAgIGRpc3BsYXlOYW1lOiByZXNbJ3VzZXInXVsnZW1haWwnXSxcbiAgICAgICAgZW1haWxWZXJpZmllZDogZmFsc2UsXG4gICAgICAgIGNyZWF0ZWRUaW1lOiBmaXJlYmFzZS5maXJlc3RvcmUuRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgdXBkYXRlZFRpbWU6IGZpcmViYXNlLmZpcmVzdG9yZS5GaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICBsYXN0TG9naW5UaW1lOiBmaXJlYmFzZS5maXJlc3RvcmUuRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgcm9sZXM6IFtcIkNvbnRyaWJ1dG9yXCJdXG4gICAgICB9XG4gICAgICBpZiAocmVzWyd1c2VyJ11bJ3VpZCddKSB7XG4gICAgICAgIHRoaXMuYWZzLmNvbGxlY3Rpb24oXCJ1c2Vyc1wiKS5kb2MocmVzWyd1c2VyJ11bJ3VpZCddKS5zZXQoZGF0YSlcbiAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7YWRtaW5VUkx9L2Rhc2hib2FyZGBdKVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2UuZXJyb3IoZXJyKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBzaWduT3V0KCkge1xuICAgIHJldHVybiB0aGlzLmFmQXV0aC5hdXRoLnNpZ25PdXQoKVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVVc2VyRGF0YSh1c2VyKSB7XG4gICAgY29uc3QgdXNlclJlZjogQW5ndWxhckZpcmVzdG9yZURvY3VtZW50PGFueT4gPSB0aGlzLmFmcy5kb2MoYHVzZXJzLyR7dXNlci51aWR9YCk7XG4gICAgY29uc3QgZGF0YTogVXNlciA9IHtcbiAgICAgIHVpZDogdXNlci51aWQsXG4gICAgICBlbWFpbDogdXNlci5lbWFpbCxcbiAgICAgIHJvbGVzOiBbXCJDb250cmlidXRvclwiXSBcbiAgICB9XG4gICAgcmV0dXJuIHVzZXJSZWYuc2V0KGRhdGEsIHsgbWVyZ2U6IHRydWUgfSlcbiAgfVxuXG5cbiAgLy8vLy8gUm9sZS1iYXNlZCBBdXRob3JpemF0aW9uIC8vLy8vL1xuICBjYW5SZWFkKHVzZXI6IFVzZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBhbGxvd2VkID0gWydBZG1pbmlzdHJhdG9yJywgJ0VkaXRvcicsICdBdXRob3InLCAnQ29udHJpYnV0b3InXVxuICAgIHJldHVybiB0aGlzLmNoZWNrQXV0aG9yaXphdGlvbih1c2VyLCBhbGxvd2VkKVxuICB9XG5cbiAgY2FuRWRpdCh1c2VyOiBVc2VyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYWxsb3dlZCA9IFsnQWRtaW5pc3RyYXRvcicsICdFZGl0b3InXVxuICAgIHJldHVybiB0aGlzLmNoZWNrQXV0aG9yaXphdGlvbih1c2VyLCBhbGxvd2VkKVxuICB9XG5cbiAgY2FuRGVsZXRlKHVzZXI6IFVzZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBhbGxvd2VkID0gWydBZG1pbmlzdHJhdG9yJ11cbiAgICByZXR1cm4gdGhpcy5jaGVja0F1dGhvcml6YXRpb24odXNlciwgYWxsb3dlZClcbiAgfVxuXG4gIC8vIGRldGVybWluZXMgaWYgdXNlciBoYXMgbWF0Y2hpbmcgcm9sZVxuICBwcml2YXRlIGNoZWNrQXV0aG9yaXphdGlvbih1c2VyOiBVc2VyLCBhbGxvd2VkUm9sZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgaWYgKCF1c2VyKSByZXR1cm4gZmFsc2VcbiAgICBmb3IgKGNvbnN0IHJvbGUgb2YgYWxsb3dlZFJvbGVzKSB7XG4gICAgICBpZiAodXNlci5yb2xlc1tyb2xlXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGxvZyAoZGVzY3JpcHRpb246IHN0cmluZykge1xuICAgIGlmICh0aGlzLnVpZCkge1xuICAgICAgdGhpcy5hZnMuY29sbGVjdGlvbjxMb2c+KCdsb2cnKS5hZGQoe1xuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IGRlc2NyaXB0aW9uLFxuICAgICAgICBcInVpZFwiOiB0aGlzLnVpZCxcbiAgICAgICAgXCJjcmVhdGVkVGltZVwiOiBmaXJlYmFzZS5maXJlc3RvcmUuRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==