@nowzoo/ngx-firebase-auth
Version:
Angular components for Firebase email-first sign in and out-of-band (oob) actions (reset password, etc).
126 lines (125 loc) • 14.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewChild, ElementRef } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { AngularFireAuth } from 'angularfire2/auth';
import { NgxFirebaseAuthFormHelper } from '../../form-helper';
import { fadeInOutAnimation } from '../../shared';
var ResetPasswordSendFormComponent = /** @class */ (function () {
function ResetPasswordSendFormComponent(_afAuth) {
this._afAuth = _afAuth;
this.emailChange = new EventEmitter();
this.error = new EventEmitter();
this.formId = 'ngx-firebase-auth-reset-password-send-form-';
this.submitting = false;
this.sent = null;
}
Object.defineProperty(ResetPasswordSendFormComponent.prototype, "auth", {
get: /**
* @return {?}
*/
function () {
return this._afAuth.auth;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
ResetPasswordSendFormComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.emailFc = new FormControl(this.email, { validators: [Validators.required, Validators.email] });
this.emailFc.valueChanges.subscribe(function () { return _this.emailChange.emit(_this.emailFc.value.trim()); });
this.fg = new FormGroup({ email: this.emailFc });
};
/**
* @return {?}
*/
ResetPasswordSendFormComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.emailInput.nativeElement.focus();
};
/**
* @return {?}
*/
ResetPasswordSendFormComponent.prototype.submit = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var email = this.emailFc.value.trim();
this.submitting = true;
this.sent = null;
this.auth.sendPasswordResetEmail(email)
.then(function () {
_this.submitting = false;
_this.sent = email;
})
.catch(function (error) {
_this.submitting = false;
_this.emailFc.markAsTouched();
_this.emailFc.markAsDirty();
switch (error.code) {
case 'auth/invalid-email':
case 'auth/user-not-found':
NgxFirebaseAuthFormHelper.setErrorUntilChanged(_this.emailFc, error.code);
break;
default:
_this.error.emit(error);
break;
}
});
};
ResetPasswordSendFormComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-firebase-auth-reset-password-send-form',
template: "<form [formGroup]=\"fg\" (ngSubmit)=\"submit()\">\n <div *ngIf=\"sent\" [@fadeInOut]=\"'in'\">\n <div class=\"alert alert-success\">\n <i class=\"fas fa-check fa-fw\" aria-hidden=\"true\"></i>\n We\u2019ve sent a reset password link to {{sent}}.\n Please allow a few moments for the email to arrive.\n </div>\n </div>\n\n <div class=\"form-group\">\n <label [attr.for]=\"formId + 'email'\">Email Address</label>\n <input\n #emailInput\n [attr.id]=\"formId + 'email'\"\n [attr.aria-describedby]=\"formId + 'email-help'\"\n type=\"email\"\n formControlName=\"email\"\n class=\"form-control\"\n [class.is-invalid]=\"emailFc.touched && emailFc.invalid\">\n <div class=\"invalid-feedback\" [@fadeInOut]=\"'in'\"\n *ngIf=\"emailFc.touched && emailFc.hasError('required')\">\n Required.\n </div>\n <div class=\"invalid-feedback\" [@fadeInOut]=\"'in'\"\n *ngIf=\"emailFc.touched && emailFc.hasError('auth/user-not-found')\">\n We could not find an account with that email address.\n Please <a routerLink=\".\" [queryParams]=\"{action: 'signIUpPassword'}\">sign up</a>.\n </div>\n <div class=\"invalid-feedback\" [@fadeInOut]=\"'in'\"\n *ngIf=\"emailFc.touched && emailFc.hasError('email')\">\n Invalid email.\n </div>\n <div class=\"invalid-feedback\" [@fadeInOut]=\"'in'\"\n *ngIf=\"emailFc.touched && emailFc.hasError('auth/invalid-email')\">\n Invalid email.\n </div>\n <small [attr.id]=\"formId + 'email-help'\" class=\"form-text text-muted\">\n Enter the email address you used to sign up. We\u2019ll\n send a reset password link to that address.\n </small>\n </div>\n <div class=\"form-group\">\n <button type=\"submit\"\n class=\"btn btn-block btn-success\"\n [disabled]=\"fg.invalid || submitting\">\n <i class=\"fas fa-fw fa-envelope\" aria-hidden=\"true\"></i>\n Send Link\n </button>\n </div>\n</form>\n",
styles: [""],
animations: [fadeInOutAnimation]
},] },
];
/** @nocollapse */
ResetPasswordSendFormComponent.ctorParameters = function () { return [
{ type: AngularFireAuth }
]; };
ResetPasswordSendFormComponent.propDecorators = {
emailInput: [{ type: ViewChild, args: ['emailInput',] }],
email: [{ type: Input }],
emailChange: [{ type: Output }],
error: [{ type: Output }]
};
return ResetPasswordSendFormComponent;
}());
export { ResetPasswordSendFormComponent };
if (false) {
/** @type {?} */
ResetPasswordSendFormComponent.prototype.emailInput;
/** @type {?} */
ResetPasswordSendFormComponent.prototype.email;
/** @type {?} */
ResetPasswordSendFormComponent.prototype.emailChange;
/** @type {?} */
ResetPasswordSendFormComponent.prototype.error;
/** @type {?} */
ResetPasswordSendFormComponent.prototype.formId;
/** @type {?} */
ResetPasswordSendFormComponent.prototype.fg;
/** @type {?} */
ResetPasswordSendFormComponent.prototype.emailFc;
/** @type {?} */
ResetPasswordSendFormComponent.prototype.submitting;
/** @type {?} */
ResetPasswordSendFormComponent.prototype.sent;
/** @type {?} */
ResetPasswordSendFormComponent.prototype._afAuth;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZXQtcGFzc3dvcmQtc2VuZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bub3d6b28vbmd4LWZpcmViYXNlLWF1dGgvIiwic291cmNlcyI6WyJsaWIvc2lnbi1pbi9yZXNldC1wYXNzd29yZC1zZW5kLWZvcm0vcmVzZXQtcGFzc3dvcmQtc2VuZC1mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDOztJQXNFaEQsd0NBQ1U7UUFBQSxZQUFPLEdBQVAsT0FBTzsyQkFUNkIsSUFBSSxZQUFZLEVBQUU7cUJBQ3BCLElBQUksWUFBWSxFQUFFO3NCQUVyRCw2Q0FBNkM7MEJBR3pDLEtBQUs7b0JBQ0gsSUFBSTtLQUdkO0lBRUwsc0JBQUksZ0RBQUk7Ozs7UUFBUjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztTQUMxQjs7O09BQUE7Ozs7SUFNRCxpREFBUTs7O0lBQVI7UUFBQSxpQkFPQztRQU5DLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQzVCLElBQUksQ0FBQyxLQUFLLEVBQ1YsRUFBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUN0RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFoRCxDQUFnRCxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQztLQUNoRDs7OztJQUVELHdEQUFlOzs7SUFBZjtRQUNFLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0tBQ3ZDOzs7O0lBR0QsK0NBQU07OztJQUFOO1FBQUEsaUJBeUJDOztRQXhCQyxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQzthQUNwQyxJQUFJLENBQUM7WUFDSixLQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixLQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztTQUNuQixDQUFDO2FBQ0QsS0FBSyxDQUFDLFVBQUMsS0FBaUI7WUFDdkIsS0FBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIsS0FBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM3QixLQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixLQUFLLG9CQUFvQixDQUFDO2dCQUMxQixLQUFLLHFCQUFxQjtvQkFDeEIseUJBQXlCLENBQUMsb0JBQW9CLENBQUMsS0FBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3pFLEtBQUssQ0FBQztnQkFDUjtvQkFDRSxLQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdkIsS0FBSyxDQUFDO2FBQ1Q7U0FDRixDQUFDLENBQUM7S0FHTjs7Z0JBdkhGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsNENBQTRDO29CQUN0RCxRQUFRLEVBQUUsbThEQWtEWDtvQkFDQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQ1osVUFBVSxFQUFFLENBQUMsa0JBQWtCLENBQUM7aUJBQ2pDOzs7O2dCQTVEUSxlQUFlOzs7NkJBK0RyQixTQUFTLFNBQUMsWUFBWTt3QkFDdEIsS0FBSzs4QkFDTCxNQUFNO3dCQUNOLE1BQU07O3lDQXBFVDs7U0ErRGEsOEJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEFmdGVyVmlld0luaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQW5ndWxhckZpcmVBdXRoIH0gZnJvbSAnYW5ndWxhcmZpcmUyL2F1dGgnO1xuaW1wb3J0IHsgYXV0aCB9IGZyb20gJ2ZpcmViYXNlL2FwcCc7XG5pbXBvcnQgeyBOZ3hGaXJlYmFzZUF1dGhGb3JtSGVscGVyIH0gZnJvbSAnLi4vLi4vZm9ybS1oZWxwZXInO1xuaW1wb3J0IHsgZmFkZUluT3V0QW5pbWF0aW9uIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWZpcmViYXNlLWF1dGgtcmVzZXQtcGFzc3dvcmQtc2VuZC1mb3JtJyxcbiAgdGVtcGxhdGU6IGA8Zm9ybSBbZm9ybUdyb3VwXT1cImZnXCIgKG5nU3VibWl0KT1cInN1Ym1pdCgpXCI+XG4gIDxkaXYgKm5nSWY9XCJzZW50XCIgW0BmYWRlSW5PdXRdPVwiJ2luJ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1zdWNjZXNzXCI+XG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGVjayBmYS1md1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgIFdl4oCZdmUgc2VudCBhIHJlc2V0IHBhc3N3b3JkIGxpbmsgdG8ge3tzZW50fX0uXG4gICAgICBQbGVhc2UgYWxsb3cgYSBmZXcgbW9tZW50cyBmb3IgdGhlIGVtYWlsIHRvIGFycml2ZS5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICA8bGFiZWwgW2F0dHIuZm9yXT1cImZvcm1JZCArICdlbWFpbCdcIj5FbWFpbCBBZGRyZXNzPC9sYWJlbD5cbiAgICA8aW5wdXRcbiAgICAgICNlbWFpbElucHV0XG4gICAgICBbYXR0ci5pZF09XCJmb3JtSWQgKyAnZW1haWwnXCJcbiAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiZm9ybUlkICsgJ2VtYWlsLWhlbHAnXCJcbiAgICAgIHR5cGU9XCJlbWFpbFwiXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJlbWFpbEZjLnRvdWNoZWQgJiYgZW1haWxGYy5pbnZhbGlkXCI+XG4gICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIiBbQGZhZGVJbk91dF09XCInaW4nXCJcbiAgICAgICpuZ0lmPVwiZW1haWxGYy50b3VjaGVkICYmIGVtYWlsRmMuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgIFJlcXVpcmVkLlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCIgW0BmYWRlSW5PdXRdPVwiJ2luJ1wiXG4gICAgICAqbmdJZj1cImVtYWlsRmMudG91Y2hlZCAmJiBlbWFpbEZjLmhhc0Vycm9yKCdhdXRoL3VzZXItbm90LWZvdW5kJylcIj5cbiAgICAgIFdlIGNvdWxkIG5vdCBmaW5kIGFuIGFjY291bnQgd2l0aCB0aGF0IGVtYWlsIGFkZHJlc3MuXG4gICAgICBQbGVhc2UgPGEgcm91dGVyTGluaz1cIi5cIiBbcXVlcnlQYXJhbXNdPVwie2FjdGlvbjogJ3NpZ25JVXBQYXNzd29yZCd9XCI+c2lnbiB1cDwvYT4uXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIiBbQGZhZGVJbk91dF09XCInaW4nXCJcbiAgICAgICpuZ0lmPVwiZW1haWxGYy50b3VjaGVkICYmIGVtYWlsRmMuaGFzRXJyb3IoJ2VtYWlsJylcIj5cbiAgICAgIEludmFsaWQgZW1haWwuXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIiBbQGZhZGVJbk91dF09XCInaW4nXCJcbiAgICAgICpuZ0lmPVwiZW1haWxGYy50b3VjaGVkICYmIGVtYWlsRmMuaGFzRXJyb3IoJ2F1dGgvaW52YWxpZC1lbWFpbCcpXCI+XG4gICAgICBJbnZhbGlkIGVtYWlsLlxuICAgIDwvZGl2PlxuICAgIDxzbWFsbCBbYXR0ci5pZF09XCJmb3JtSWQgKyAnZW1haWwtaGVscCdcIiBjbGFzcz1cImZvcm0tdGV4dCB0ZXh0LW11dGVkXCI+XG4gICAgICBFbnRlciB0aGUgZW1haWwgYWRkcmVzcyB5b3UgdXNlZCB0byBzaWduIHVwLiBXZeKAmWxsXG4gICAgICBzZW5kIGEgcmVzZXQgcGFzc3dvcmQgbGluayB0byB0aGF0IGFkZHJlc3MuXG4gICAgPC9zbWFsbD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCJcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1ibG9jayBidG4tc3VjY2Vzc1wiXG4gICAgICBbZGlzYWJsZWRdPVwiZmcuaW52YWxpZCB8fCBzdWJtaXR0aW5nXCI+XG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1mdyBmYS1lbnZlbG9wZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgIFNlbmQgTGlua1xuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZm9ybT5cbmAsXG4gIHN0eWxlczogW2BgXSxcbiAgYW5pbWF0aW9uczogW2ZhZGVJbk91dEFuaW1hdGlvbl1cbn0pXG5leHBvcnQgY2xhc3MgUmVzZXRQYXNzd29yZFNlbmRGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcblxuICBAVmlld0NoaWxkKCdlbWFpbElucHV0JykgZW1haWxJbnB1dDogRWxlbWVudFJlZjtcbiAgQElucHV0KCkgZW1haWw6IHN0cmluZztcbiAgQE91dHB1dCgpIGVtYWlsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGVycm9yOiBFdmVudEVtaXR0ZXI8YXV0aC5FcnJvcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZm9ybUlkID0gJ25neC1maXJlYmFzZS1hdXRoLXJlc2V0LXBhc3N3b3JkLXNlbmQtZm9ybS0nO1xuICBmZzogRm9ybUdyb3VwO1xuICBlbWFpbEZjOiBGb3JtQ29udHJvbDtcbiAgc3VibWl0dGluZyA9IGZhbHNlO1xuICBzZW50OiBzdHJpbmcgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9hZkF1dGg6IEFuZ3VsYXJGaXJlQXV0aCxcbiAgKSB7IH1cblxuICBnZXQgYXV0aCgpOiBhdXRoLkF1dGgge1xuICAgIHJldHVybiB0aGlzLl9hZkF1dGguYXV0aDtcbiAgfVxuXG5cblxuXG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5lbWFpbEZjID0gbmV3IEZvcm1Db250cm9sKFxuICAgICAgdGhpcy5lbWFpbCxcbiAgICAgIHt2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5lbWFpbF19XG4gICAgKTtcbiAgICB0aGlzLmVtYWlsRmMudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLmVtYWlsQ2hhbmdlLmVtaXQodGhpcy5lbWFpbEZjLnZhbHVlLnRyaW0oKSkpO1xuICAgIHRoaXMuZmcgPSBuZXcgRm9ybUdyb3VwKHtlbWFpbDogdGhpcy5lbWFpbEZjfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5lbWFpbElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG5cbiAgc3VibWl0KCkge1xuICAgIGNvbnN0IGVtYWlsID0gdGhpcy5lbWFpbEZjLnZhbHVlLnRyaW0oKTtcbiAgICB0aGlzLnN1Ym1pdHRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc2VudCA9IG51bGw7XG4gICAgdGhpcy5hdXRoLnNlbmRQYXNzd29yZFJlc2V0RW1haWwoZW1haWwpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuc3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbnQgPSBlbWFpbDtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yOiBhdXRoLkVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuc3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVtYWlsRmMubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmVtYWlsRmMubWFya0FzRGlydHkoKTtcbiAgICAgICAgc3dpdGNoIChlcnJvci5jb2RlKSB7XG4gICAgICAgICAgY2FzZSAnYXV0aC9pbnZhbGlkLWVtYWlsJzpcbiAgICAgICAgICBjYXNlICdhdXRoL3VzZXItbm90LWZvdW5kJzpcbiAgICAgICAgICAgIE5neEZpcmViYXNlQXV0aEZvcm1IZWxwZXIuc2V0RXJyb3JVbnRpbENoYW5nZWQodGhpcy5lbWFpbEZjLCBlcnJvci5jb2RlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aGlzLmVycm9yLmVtaXQoZXJyb3IpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG5cbiAgfVxufVxuIl19