@nowzoo/ngx-firebase-auth
Version:
Angular components for Firebase email-first sign in and out-of-band (oob) actions (reset password, etc).
397 lines (383 loc) • 30.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, TemplateRef } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { AngularFireAuth } from 'angularfire2/auth';
import { screenAnimation } from '../shared';
import { NgxFirebaseAuthService } from '../ngx-firebase-auth.service';
export class SignInComponent {
/**
* @param {?} _afAuth
* @param {?} _svc
* @param {?} _route
* @param {?} _router
*/
constructor(_afAuth, _svc, _route, _router) {
this._afAuth = _afAuth;
this._svc = _svc;
this._route = _route;
this._router = _router;
this.ngUnsubscribe = new Subject();
this.tosTemplate = null;
this.success = new EventEmitter();
this.mode = new EventEmitter();
this.initialOAuthError = null;
this.signedOut = false;
this.oAuthProviderId = null;
this.cred = null;
this.unhandledError = null;
this.screen = 'wait';
}
/**
* @return {?}
*/
get auth() {
return this._afAuth.auth;
}
/**
* @return {?}
*/
get authService() {
return this._svc;
}
/**
* @return {?}
*/
get router() {
return this._router;
}
/**
* @return {?}
*/
get route() {
return this._route;
}
/**
* @return {?}
*/
get queryParams() {
return this.route.queryParams;
}
/**
* @return {?}
*/
get snapshotQueryParams() {
return this.route.snapshot.queryParams;
}
/**
* @return {?}
*/
ngOnInit() {
this.init();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.ngUnsubscribe.next();
this.ngUnsubscribe.complete();
}
/**
* @return {?}
*/
init() {
/** @type {?} */
const rememberRecord = this.authService.getRemembered();
this.remember = rememberRecord.remember;
this.email = rememberRecord.email;
return this.onInitHandleSignOut()
.then((handled) => {
if (handled) {
return handled;
}
return this.onInitHandleOAuthRedirect();
})
.then((handled) => {
if (!handled) {
this.showSignIn();
}
this.queryParams.pipe(takeUntil(this.ngUnsubscribe)).subscribe(params => {
/** @type {?} */
const action = params["action"] || null;
switch (action) {
case 'signOut':
this.showSignOut();
break;
case 'resetPassword':
this.showResetPassword();
break;
case 'signIn':
this.showSignIn();
break;
case 'signInPassword':
this.showSignInPassword();
break;
case 'signUpPassword':
this.showSignUpPassword();
break;
case 'signInOAuth':
this.showSignInOAuth(params["providerId"], null);
break;
}
});
});
}
/**
* @return {?}
*/
onInitHandleSignOut() {
if (this.snapshotQueryParams["action"] !== 'signOut') {
return Promise.resolve(false);
}
return this.showSignOut().then(() => true);
}
/**
* @return {?}
*/
onInitHandleOAuthRedirect() {
return new Promise(resolve => {
/** @type {?} */
const remember = this.route.snapshot.queryParams["remember"] === 'true';
return this.auth.getRedirectResult()
.then((cred) => {
if (this.auth.currentUser && cred.user) {
this.authService.setRemembered(remember, cred.user.email)
.then(() => {
this.showSignInSuccess(cred);
resolve(true);
});
}
else {
resolve(false);
}
})
.catch((error) => {
this.showSignInOAuth(null, error);
resolve(true);
});
});
}
/**
* @return {?}
*/
showSignOut() {
this.signedOut = false;
this.screen = 'wait';
return this.auth.signOut()
.then(() => {
this.showSignIn(true);
});
}
/**
* @param {?=} signedOut
* @return {?}
*/
showSignIn(signedOut) {
this.mode.emit('signIn');
this.signedOut = signedOut === true;
this.screen = 'signIn';
}
/**
* @return {?}
*/
showSignInPassword() {
this.mode.emit('signIn');
this.signedOut = false;
this.screen = 'signInPassword';
}
/**
* @return {?}
*/
showSignUpPassword() {
this.mode.emit('signIn');
this.signedOut = false;
this.screen = 'signUpPassword';
}
/**
* @param {?} oAuthProviderId
* @param {?} error
* @return {?}
*/
showSignInOAuth(oAuthProviderId, error) {
this.mode.emit('signIn');
this.signedOut = false;
this.oAuthProviderId = oAuthProviderId;
this.initialOAuthError = error;
this.screen = 'signInOAuth';
}
/**
* @param {?} cred
* @return {?}
*/
showSignInSuccess(cred) {
this.mode.emit('signIn');
this.signedOut = false;
this.cred = cred;
this.screen = 'signInSuccess';
this.success.emit(cred);
}
/**
* @return {?}
*/
showResetPassword() {
this.mode.emit('resetPassword');
this.signedOut = false;
this.screen = 'resetPassword';
}
/**
* @param {?} error
* @return {?}
*/
showUnhandledError(error) {
this.signedOut = false;
this.unhandledError = error;
this.screen = 'unhandledError';
}
}
SignInComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-firebase-auth-sign-in',
template: `<div *ngIf="'wait' === screen" []="'in'">
<div class="alert alert-secondary">
<i class="fas fa-spin fa-spinner fa-fw" aria-hidden="true"></i>
Please wait...
</div>
</div>
<div *ngIf="'unhandledError' === screen" []="'in'">
<div class="alert alert-danger">
<i class="fas fa-exclamation-triangle fa-fw text-danger" aria-hidden="true"></i>
<strong>Woops!</strong> An unexpected error occurred.
</div>
<p class="text-muted">
Code: {{unhandledError.code}}. Message: {{unhandledError.message}}
</p>
<p>
<a routerLink="." [queryParams]="{action: 'signIn'}">Start Over</a>
</p>
</div>
<div *ngIf="'signInSuccess' === screen" []="'in'">
<div class="alert alert-success">
<i class="fas fa-check fa-fw" aria-hidden="true"></i>
Welcome, {{cred.user.displayName}}!
</div>
</div>
<div *ngIf="'signIn' === screen" []="'in'">
<div class="alert alert-success" *ngIf="signedOut">
<i class="fas fa-check fa-fw" aria-hidden="true"></i>
You’re signed out.
</div>
<ngx-firebase-auth-sign-in-methods-form
[(email)]="email"
[(remember)]="remember"
[oAuthProviderIds]="oAuthProviderIds"
(error)="showUnhandledError($event)"
(success)="showSignInSuccess($event)"></ngx-firebase-auth-sign-in-methods-form>
<small class="text-center text-muted my-2 form-text">
<ng-container *ngTemplateOutlet="tosTemplate"></ng-container>
</small>
</div>
<div *ngIf="'signInPassword' === screen" []="'in'">
<ngx-firebase-auth-sign-in-form
[email]="email"
[(remember)]="remember"
(error)="showUnhandledError($event)"
(success)="showSignInSuccess($event)"></ngx-firebase-auth-sign-in-form>
<small class="text-center text-muted my-2 form-text">
<ng-container *ngTemplateOutlet="tosTemplate"></ng-container>
</small>
</div>
<div *ngIf="'signUpPassword' === screen" []="'in'">
<ngx-firebase-auth-sign-up-form
[email]="email"
[(remember)]="remember"
(error)="showUnhandledError($event)"
(success)="showSignInSuccess($event)"></ngx-firebase-auth-sign-up-form>
<small class="text-center text-muted my-2 form-text">
<ng-container *ngTemplateOutlet="tosTemplate"></ng-container>
</small>
</div>
<div *ngIf="'signInOAuth' === screen" []="'in'">
<ngx-firebase-auth-sign-in-oauth
[providerId]="oAuthProviderId"
[initialError]="initialOAuthError"
[useOAuthPopup]="useOAuthPopup"
[oAuthProviderFactory]="oAuthProviderFactory"
[(email)]="email"
[(remember)]="remember"
(error)="showUnhandledError($event)"
(success)="showSignInSuccess($event)"></ngx-firebase-auth-sign-in-oauth>
<small class="text-center text-muted my-2 form-text">
<ng-container *ngTemplateOutlet="tosTemplate"></ng-container>
</small>
</div>
<div *ngIf="'resetPassword' === screen" []="'in'">
<h6>Reset Password</h6>
<ngx-firebase-auth-reset-password-send-form
[(email)]="email"
(error)="showUnhandledError($event)"></ngx-firebase-auth-reset-password-send-form>
</div>
`,
styles: [``],
animations: [screenAnimation]
},] },
];
/** @nocollapse */
SignInComponent.ctorParameters = () => [
{ type: AngularFireAuth },
{ type: NgxFirebaseAuthService },
{ type: ActivatedRoute },
{ type: Router }
];
SignInComponent.propDecorators = {
oAuthProviderIds: [{ type: Input }],
useOAuthPopup: [{ type: Input }],
oAuthProviderFactory: [{ type: Input }],
tosTemplate: [{ type: Input }],
success: [{ type: Output }],
mode: [{ type: Output }]
};
if (false) {
/** @type {?} */
SignInComponent.prototype.ngUnsubscribe;
/** @type {?} */
SignInComponent.prototype.oAuthProviderIds;
/** @type {?} */
SignInComponent.prototype.useOAuthPopup;
/** @type {?} */
SignInComponent.prototype.oAuthProviderFactory;
/** @type {?} */
SignInComponent.prototype.tosTemplate;
/** @type {?} */
SignInComponent.prototype.success;
/** @type {?} */
SignInComponent.prototype.mode;
/** @type {?} */
SignInComponent.prototype.remember;
/** @type {?} */
SignInComponent.prototype.email;
/** @type {?} */
SignInComponent.prototype.initialOAuthError;
/** @type {?} */
SignInComponent.prototype.signedOut;
/** @type {?} */
SignInComponent.prototype.oAuthProviderId;
/** @type {?} */
SignInComponent.prototype.cred;
/** @type {?} */
SignInComponent.prototype.unhandledError;
/** @type {?} */
SignInComponent.prototype.screen;
/** @type {?} */
SignInComponent.prototype._afAuth;
/** @type {?} */
SignInComponent.prototype._svc;
/** @type {?} */
SignInComponent.prototype._route;
/** @type {?} */
SignInComponent.prototype._router;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1pbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abm93em9vL25neC1maXJlYmFzZS1hdXRoLyIsInNvdXJjZXMiOlsibGliL3NpZ24taW4vc2lnbi1pbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpELE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBc0d0RSxNQUFNOzs7Ozs7O0lBcUJKLFlBQ1UsU0FDQSxNQUNBLFFBQ0E7UUFIQSxZQUFPLEdBQVAsT0FBTztRQUNQLFNBQUksR0FBSixJQUFJO1FBQ0osV0FBTSxHQUFOLE1BQU07UUFDTixZQUFPLEdBQVAsT0FBTzs2QkF4QnNCLElBQUksT0FBTyxFQUFROzJCQUlqQixJQUFJO3VCQUNVLElBQUksWUFBWSxFQUFFO29CQUNkLElBQUksWUFBWSxFQUFFO2lDQUk3QyxJQUFJO3lCQUN4QixLQUFLOytCQUNTLElBQUk7b0JBQ0YsSUFBSTs4QkFDSCxJQUFJO3NCQUlNLE1BQU07S0FPekM7Ozs7SUFFSixJQUFJLElBQUk7UUFDTixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7S0FDMUI7Ozs7SUFFRCxJQUFJLFdBQVc7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLElB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Q0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN6Qjs7OztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDO0tBQy9COzs7OztJQUVELGtCQUFrQixDQUFDLEtBQWlCO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLENBQUM7S0FDaEM7OztZQTdSRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDJCQUEyQjtnQkFDckMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTRGWDtnQkFDQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ1osVUFBVSxFQUFFLENBQUMsZUFBZSxDQUFDO2FBQzlCOzs7O1lBekdRLGVBQWU7WUFJZixzQkFBc0I7WUFSZCxjQUFjO1lBQXRCLE1BQU07OzsrQkFnSFosS0FBSzs0QkFDTCxLQUFLO21DQUNMLEtBQUs7MEJBQ0wsS0FBSztzQkFDTCxNQUFNO21CQUNOLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIsIEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBbmd1bGFyRmlyZUF1dGggfSBmcm9tICdhbmd1bGFyZmlyZTIvYXV0aCc7XG5pbXBvcnQgeyBhdXRoLCBVc2VyIH0gZnJvbSAnZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IHNjcmVlbkFuaW1hdGlvbiB9IGZyb20gJy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBOZ3hGaXJlYmFzZUF1dGhGb3JtSGVscGVyIH0gZnJvbSAnLi4vZm9ybS1oZWxwZXInO1xuaW1wb3J0IHsgTmd4RmlyZWJhc2VBdXRoU2VydmljZSB9IGZyb20gJy4uL25neC1maXJlYmFzZS1hdXRoLnNlcnZpY2UnO1xuXG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWZpcmViYXNlLWF1dGgtc2lnbi1pbicsXG4gIHRlbXBsYXRlOiBgPGRpdiAqbmdJZj1cIid3YWl0JyA9PT0gc2NyZWVuXCIgW0BzY3JlZW5dPVwiJ2luJ1wiPlxuICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtc2Vjb25kYXJ5XCI+XG4gICAgPGkgY2xhc3M9XCJmYXMgZmEtc3BpbiBmYS1zcGlubmVyIGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIFBsZWFzZSB3YWl0Li4uXG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCIndW5oYW5kbGVkRXJyb3InID09PSBzY3JlZW5cIiBbQHNjcmVlbl09XCInaW4nXCI+XG4gIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj5cbiAgICA8aSBjbGFzcz1cImZhcyBmYS1leGNsYW1hdGlvbi10cmlhbmdsZSBmYS1mdyB0ZXh0LWRhbmdlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICA8c3Ryb25nPldvb3BzITwvc3Ryb25nPiBBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLlxuICA8L2Rpdj5cbiAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG4gICAgQ29kZToge3t1bmhhbmRsZWRFcnJvci5jb2RlfX0uIE1lc3NhZ2U6IHt7dW5oYW5kbGVkRXJyb3IubWVzc2FnZX19XG4gIDwvcD5cbiAgPHA+XG4gICAgPGEgcm91dGVyTGluaz1cIi5cIiBbcXVlcnlQYXJhbXNdPVwie2FjdGlvbjogJ3NpZ25Jbid9XCI+U3RhcnQgT3ZlcjwvYT5cbiAgPC9wPlxuPC9kaXY+XG5cblxuPGRpdiAqbmdJZj1cIidzaWduSW5TdWNjZXNzJyA9PT0gc2NyZWVuXCIgW0BzY3JlZW5dPVwiJ2luJ1wiPlxuICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiPlxuICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZWNrIGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIFdlbGNvbWUsIHt7Y3JlZC51c2VyLmRpc3BsYXlOYW1lfX0hXG4gIDwvZGl2PlxuPC9kaXY+XG5cblxuXG5cbjxkaXYgKm5nSWY9XCInc2lnbkluJyA9PT0gc2NyZWVuXCIgW0BzY3JlZW5dPVwiJ2luJ1wiPlxuICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiICpuZ0lmPVwic2lnbmVkT3V0XCI+XG4gICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hlY2sgZmEtZndcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgWW914oCZcmUgc2lnbmVkIG91dC5cbiAgPC9kaXY+XG4gIDxuZ3gtZmlyZWJhc2UtYXV0aC1zaWduLWluLW1ldGhvZHMtZm9ybVxuICAgIFsoZW1haWwpXT1cImVtYWlsXCJcbiAgICBbKHJlbWVtYmVyKV09XCJyZW1lbWJlclwiXG4gICAgW29BdXRoUHJvdmlkZXJJZHNdPVwib0F1dGhQcm92aWRlcklkc1wiXG4gICAgKGVycm9yKT1cInNob3dVbmhhbmRsZWRFcnJvcigkZXZlbnQpXCJcbiAgICAoc3VjY2Vzcyk9XCJzaG93U2lnbkluU3VjY2VzcygkZXZlbnQpXCI+PC9uZ3gtZmlyZWJhc2UtYXV0aC1zaWduLWluLW1ldGhvZHMtZm9ybT5cbiAgPHNtYWxsIGNsYXNzPVwidGV4dC1jZW50ZXIgdGV4dC1tdXRlZCBteS0yIGZvcm0tdGV4dFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0b3NUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L3NtYWxsPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCInc2lnbkluUGFzc3dvcmQnID09PSBzY3JlZW5cIiBbQHNjcmVlbl09XCInaW4nXCI+XG4gIDxuZ3gtZmlyZWJhc2UtYXV0aC1zaWduLWluLWZvcm1cbiAgICBbZW1haWxdPVwiZW1haWxcIlxuICAgIFsocmVtZW1iZXIpXT1cInJlbWVtYmVyXCJcbiAgICAoZXJyb3IpPVwic2hvd1VuaGFuZGxlZEVycm9yKCRldmVudClcIlxuICAgIChzdWNjZXNzKT1cInNob3dTaWduSW5TdWNjZXNzKCRldmVudClcIj48L25neC1maXJlYmFzZS1hdXRoLXNpZ24taW4tZm9ybT5cbiAgPHNtYWxsIGNsYXNzPVwidGV4dC1jZW50ZXIgdGV4dC1tdXRlZCBteS0yIGZvcm0tdGV4dFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0b3NUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L3NtYWxsPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCInc2lnblVwUGFzc3dvcmQnID09PSBzY3JlZW5cIiBbQHNjcmVlbl09XCInaW4nXCI+XG4gIDxuZ3gtZmlyZWJhc2UtYXV0aC1zaWduLXVwLWZvcm1cbiAgICBbZW1haWxdPVwiZW1haWxcIlxuICAgIFsocmVtZW1iZXIpXT1cInJlbWVtYmVyXCJcbiAgICAoZXJyb3IpPVwic2hvd1VuaGFuZGxlZEVycm9yKCRldmVudClcIlxuICAgIChzdWNjZXNzKT1cInNob3dTaWduSW5TdWNjZXNzKCRldmVudClcIj48L25neC1maXJlYmFzZS1hdXRoLXNpZ24tdXAtZm9ybT5cbiAgPHNtYWxsIGNsYXNzPVwidGV4dC1jZW50ZXIgdGV4dC1tdXRlZCBteS0yIGZvcm0tdGV4dFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0b3NUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L3NtYWxsPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCInc2lnbkluT0F1dGgnID09PSBzY3JlZW5cIiBbQHNjcmVlbl09XCInaW4nXCI+XG4gIDxuZ3gtZmlyZWJhc2UtYXV0aC1zaWduLWluLW9hdXRoXG4gICAgW3Byb3ZpZGVySWRdPVwib0F1dGhQcm92aWRlcklkXCJcbiAgICBbaW5pdGlhbEVycm9yXT1cImluaXRpYWxPQXV0aEVycm9yXCJcbiAgICBbdXNlT0F1dGhQb3B1cF09XCJ1c2VPQXV0aFBvcHVwXCJcbiAgICBbb0F1dGhQcm92aWRlckZhY3RvcnldPVwib0F1dGhQcm92aWRlckZhY3RvcnlcIlxuICAgIFsoZW1haWwpXT1cImVtYWlsXCJcbiAgICBbKHJlbWVtYmVyKV09XCJyZW1lbWJlclwiXG4gICAgKGVycm9yKT1cInNob3dVbmhhbmRsZWRFcnJvcigkZXZlbnQpXCJcbiAgICAoc3VjY2Vzcyk9XCJzaG93U2lnbkluU3VjY2VzcygkZXZlbnQpXCI+PC9uZ3gtZmlyZWJhc2UtYXV0aC1zaWduLWluLW9hdXRoPlxuICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW11dGVkIG15LTIgZm9ybS10ZXh0XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRvc1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvc21hbGw+XG48L2Rpdj5cblxuXG5cbjxkaXYgKm5nSWY9XCIncmVzZXRQYXNzd29yZCcgPT09IHNjcmVlblwiIFtAc2NyZWVuXT1cIidpbidcIj5cbiAgPGg2PlJlc2V0IFBhc3N3b3JkPC9oNj5cbiAgPG5neC1maXJlYmFzZS1hdXRoLXJlc2V0LXBhc3N3b3JkLXNlbmQtZm9ybVxuICAgIFsoZW1haWwpXT1cImVtYWlsXCJcbiAgICAoZXJyb3IpPVwic2hvd1VuaGFuZGxlZEVycm9yKCRldmVudClcIj48L25neC1maXJlYmFzZS1hdXRoLXJlc2V0LXBhc3N3b3JkLXNlbmQtZm9ybT5cbjwvZGl2PlxuYCxcbiAgc3R5bGVzOiBbYGBdLFxuICBhbmltYXRpb25zOiBbc2NyZWVuQW5pbWF0aW9uXVxufSlcbmV4cG9ydCBjbGFzcyBTaWduSW5Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgbmdVbnN1YnNjcmliZTogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIEBJbnB1dCgpIG9BdXRoUHJvdmlkZXJJZHM6IHN0cmluZ1tdO1xuICBASW5wdXQoKSB1c2VPQXV0aFBvcHVwOiBib29sZWFuO1xuICBASW5wdXQoKSBvQXV0aFByb3ZpZGVyRmFjdG9yeTogKHByb3ZpZGVySWQ6IHN0cmluZykgPT4gYXV0aC5BdXRoUHJvdmlkZXI7XG4gIEBJbnB1dCgpIHRvc1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcbiAgQE91dHB1dCgpIHN1Y2Nlc3M6IEV2ZW50RW1pdHRlcjxhdXRoLlVzZXJDcmVkZW50aWFsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG1vZGU6IEV2ZW50RW1pdHRlcjwnc2lnbkluJyB8ICdyZXNldFBhc3N3b3JkJz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcmVtZW1iZXI6IGJvb2xlYW47XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGluaXRpYWxPQXV0aEVycm9yOiBhdXRoLkVycm9yID0gbnVsbDtcbiAgc2lnbmVkT3V0ID0gZmFsc2U7XG4gIG9BdXRoUHJvdmlkZXJJZDogc3RyaW5nID0gbnVsbDtcbiAgY3JlZDogYXV0aC5Vc2VyQ3JlZGVudGlhbCA9IG51bGw7XG4gIHVuaGFuZGxlZEVycm9yOiBhdXRoLkVycm9yID0gbnVsbDtcblxuICBzY3JlZW46ICd3YWl0JyB8XG4gICAgJ3NpZ25JbicgfCAnc2lnbkluUGFzc3dvcmQnIHwgJ3NpZ25VcFBhc3N3b3JkJyB8ICdzaWduSW5PQXV0aCcgfCAnc2lnbkluU3VjY2VzcycgfFxuICAgICdyZXNldFBhc3N3b3JkJyB8ICd1bmhhbmRsZWRFcnJvcicgPSAnd2FpdCc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfYWZBdXRoOiBBbmd1bGFyRmlyZUF1dGgsXG4gICAgcHJpdmF0ZSBfc3ZjOiBOZ3hGaXJlYmFzZUF1dGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgX3JvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgKSB7fVxuXG4gIGdldCBhdXRoKCk6IGF1dGguQXV0aCB7XG4gICAgcmV0dXJuIHRoaXMuX2FmQXV0aC5hdXRoO1xuICB9XG5cbiAgZ2V0IGF1dGhTZXJ2aWNlKCk6IE5neEZpcmViYXNlQXV0aFNlcnZpY2Uge1xuICAgIHJldHVybiB0aGlzLl9zdmM7XG4gIH1cblxuICBnZXQgcm91dGVyKCk6IFJvdXRlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JvdXRlcjtcbiAgfVxuXG4gIGdldCByb3V0ZSgpOiBBY3RpdmF0ZWRSb3V0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3JvdXRlO1xuICB9XG5cbiAgZ2V0IHF1ZXJ5UGFyYW1zKCk6IE9ic2VydmFibGU8e1trZXk6IHN0cmluZ106IGFueX0+IHtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcztcbiAgfVxuXG4gIGdldCBzbmFwc2hvdFF1ZXJ5UGFyYW1zKCk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcztcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgY29uc3QgcmVtZW1iZXJSZWNvcmQgPSB0aGlzLmF1dGhTZXJ2aWNlLmdldFJlbWVtYmVyZWQoKTtcbiAgICB0aGlzLnJlbWVtYmVyID0gcmVtZW1iZXJSZWNvcmQucmVtZW1iZXI7XG4gICAgdGhpcy5lbWFpbCA9IHJlbWVtYmVyUmVjb3JkLmVtYWlsO1xuICAgIHJldHVybiB0aGlzLm9uSW5pdEhhbmRsZVNpZ25PdXQoKVxuICAgICAgLnRoZW4oKGhhbmRsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5vbkluaXRIYW5kbGVPQXV0aFJlZGlyZWN0KCk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKGhhbmRsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCEgaGFuZGxlZCkge1xuICAgICAgICAgIHRoaXMuc2hvd1NpZ25JbigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlcnlQYXJhbXMucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICAgICAgY29uc3QgYWN0aW9uID0gcGFyYW1zLmFjdGlvbiB8fCBudWxsO1xuICAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdzaWduT3V0JzpcbiAgICAgICAgICAgICAgdGhpcy5zaG93U2lnbk91dCgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3Jlc2V0UGFzc3dvcmQnOlxuICAgICAgICAgICAgICB0aGlzLnNob3dSZXNldFBhc3N3b3JkKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2lnbkluJzpcbiAgICAgICAgICAgICAgdGhpcy5zaG93U2lnbkluKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2lnbkluUGFzc3dvcmQnOlxuICAgICAgICAgICAgICB0aGlzLnNob3dTaWduSW5QYXNzd29yZCgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NpZ25VcFBhc3N3b3JkJzpcbiAgICAgICAgICAgICAgdGhpcy5zaG93U2lnblVwUGFzc3dvcmQoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzaWduSW5PQXV0aCc6XG4gICAgICAgICAgICAgIHRoaXMuc2hvd1NpZ25Jbk9BdXRoKHBhcmFtcy5wcm92aWRlcklkLCBudWxsKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgb25Jbml0SGFuZGxlU2lnbk91dCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5zbmFwc2hvdFF1ZXJ5UGFyYW1zLmFjdGlvbiAhPT0gJ3NpZ25PdXQnKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hvd1NpZ25PdXQoKS50aGVuKCgpID0+IHRydWUpO1xuICB9XG4gIG9uSW5pdEhhbmRsZU9BdXRoUmVkaXJlY3QoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgY29uc3QgcmVtZW1iZXI6IGJvb2xlYW4gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLnJlbWVtYmVyID09PSAndHJ1ZSc7XG4gICAgICByZXR1cm4gdGhpcy5hdXRoLmdldFJlZGlyZWN0UmVzdWx0KClcbiAgICAgICAgLnRoZW4oKGNyZWQ6IGF1dGguVXNlckNyZWRlbnRpYWwpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5hdXRoLmN1cnJlbnRVc2VyICYmIGNyZWQudXNlcikge1xuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5zZXRSZW1lbWJlcmVkKHJlbWVtYmVyLCBjcmVkLnVzZXIuZW1haWwpXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dTaWduSW5TdWNjZXNzKGNyZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IGF1dGguRXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLnNob3dTaWduSW5PQXV0aChudWxsLCBlcnJvciApO1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cblxuXG5cbiAgc2hvd1NpZ25PdXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLnNpZ25lZE91dCA9IGZhbHNlO1xuICAgIHRoaXMuc2NyZWVuID0gJ3dhaXQnO1xuICAgIHJldHVybiB0aGlzLmF1dGguc2lnbk91dCgpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd1NpZ25Jbih0cnVlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc2hvd1NpZ25JbihzaWduZWRPdXQ/OiBib29sZWFuKSB7XG4gICAgdGhpcy5tb2RlLmVtaXQoJ3NpZ25JbicpO1xuICAgIHRoaXMuc2lnbmVkT3V0ID0gc2lnbmVkT3V0ID09PSB0cnVlO1xuICAgIHRoaXMuc2NyZWVuID0gJ3NpZ25Jbic7XG4gIH1cblxuICBzaG93U2lnbkluUGFzc3dvcmQoKSB7XG4gICAgdGhpcy5tb2RlLmVtaXQoJ3NpZ25JbicpO1xuICAgIHRoaXMuc2lnbmVkT3V0ID0gZmFsc2U7XG4gICAgdGhpcy5zY3JlZW4gPSAnc2lnbkluUGFzc3dvcmQnO1xuICB9XG5cbiAgc2hvd1NpZ25VcFBhc3N3b3JkKCkge1xuICAgIHRoaXMubW9kZS5lbWl0KCdzaWduSW4nKTtcbiAgICB0aGlzLnNpZ25lZE91dCA9IGZhbHNlO1xuICAgIHRoaXMuc2NyZWVuID0gJ3NpZ25VcFBhc3N3b3JkJztcblxuICB9XG5cbiAgc2hvd1NpZ25Jbk9BdXRoKG9BdXRoUHJvdmlkZXJJZDogc3RyaW5nLCBlcnJvcjogYXV0aC5FcnJvcikge1xuICAgIHRoaXMubW9kZS5lbWl0KCdzaWduSW4nKTtcbiAgICB0aGlzLnNpZ25lZE91dCA9IGZhbHNlO1xuICAgIHRoaXMub0F1dGhQcm92aWRlcklkID0gb0F1dGhQcm92aWRlcklkO1xuICAgIHRoaXMuaW5pdGlhbE9BdXRoRXJyb3IgPSBlcnJvcjtcbiAgICB0aGlzLnNjcmVlbiA9ICdzaWduSW5PQXV0aCc7XG4gIH1cblxuICBzaG93U2lnbkluU3VjY2VzcyhjcmVkOiBhdXRoLlVzZXJDcmVkZW50aWFsKSB7XG4gICAgdGhpcy5tb2RlLmVtaXQoJ3NpZ25JbicpO1xuICAgIHRoaXMuc2lnbmVkT3V0ID0gZmFsc2U7XG4gICAgdGhpcy5jcmVkID0gY3JlZDtcbiAgICB0aGlzLnNjcmVlbiA9ICdzaWduSW5TdWNjZXNzJztcbiAgICB0aGlzLnN1Y2Nlc3MuZW1pdChjcmVkKTtcbiAgfVxuXG4gIHNob3dSZXNldFBhc3N3b3JkKCkge1xuICAgIHRoaXMubW9kZS5lbWl0KCdyZXNldFBhc3N3b3JkJyk7XG4gICAgdGhpcy5zaWduZWRPdXQgPSBmYWxzZTtcbiAgICB0aGlzLnNjcmVlbiA9ICdyZXNldFBhc3N3b3JkJztcbiAgfVxuXG4gIHNob3dVbmhhbmRsZWRFcnJvcihlcnJvcjogYXV0aC5FcnJvcikge1xuICAgIHRoaXMuc2lnbmVkT3V0ID0gZmFsc2U7XG4gICAgdGhpcy51bmhhbmRsZWRFcnJvciA9IGVycm9yO1xuICAgIHRoaXMuc2NyZWVuID0gJ3VuaGFuZGxlZEVycm9yJztcbiAgfVxufVxuIl19