angular-firebase-authorizator
Version:
Beta version of authorizator for angular linked to firebase, it creates a model in firestore to assign permissions to users an roles, and creates a view to update this permissions
166 lines • 30.2 kB
JavaScript
import { __decorate, __metadata, __param } from "tslib";
import { Component, OnInit, Inject, AfterViewInit, ChangeDetectorRef, Output, EventEmitter, Input } from '@angular/core';
import { AUTHORIZATOR_CONFIG } from '../../authorizator.config.token';
import { Operation } from '../../classes/permission-obj';
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
import { MatSnackBarConfig, MatSnackBar } from '@angular/material/snack-bar';
import { BehaviorSubject } from 'rxjs';
import { AuthorizatorService } from '../../services/authorizator.service';
var PermissionManagerComponent = /** @class */ (function () {
function PermissionManagerComponent(authorizatorConfig, cd, data, authorizatorservice, snackbar) {
this.authorizatorConfig = authorizatorConfig;
this.cd = cd;
this.data = data;
this.authorizatorservice = authorizatorservice;
this.snackbar = snackbar;
this.AllowedOperation = Operation;
this.resourceCols = 5;
this.permissionCols = 5;
this.change = new EventEmitter();
this.user = data.user;
this.role = data.role;
}
PermissionManagerComponent.prototype.ngOnInit = function () {
var _this = this;
if (this.authorizatorConfig && this.authorizatorConfig.permissions) {
this.permissionsConfig = this.authorizatorConfig.permissions.map(function (permission) {
return {
resource: permission.resource,
operations: permission.allowedOperations.map(function (operation) {
return {
id: operation,
value: _this.user ?
(_this.user.data.permissions ?
(_this.user.data.permissions.find(function (perm) { return perm.resource === permission.resource.id; }) ?
(_this.user.data.permissions.find(function (perm) { return perm.resource === permission.resource.id; }).operations.findIndex(function (oper) { return oper === operation; }) > -1) : false) : false) :
_this.role ?
(_this.role.data.permissions ?
(_this.role.data.permissions.find(function (perm) { return perm.resource === permission.resource.id; }) ?
(_this.role.data.permissions.find(function (perm) { return perm.resource === permission.resource.id; }).operations.findIndex(function (oper) { return oper === operation; }) > -1) : false) : false) : false
};
})
};
});
}
else {
console.error("Configuration of module missing, please add the next code in the Module declaration:\n AngularFirebaseAuthorizatorModule.forRoot({\n permissions: [\n {\n resource: {\n id: 'someid',\n data: {\n description: 'Resource description'\n }\n },\n allowedOperations: [\n Operation.Create,\n Operation.Read,\n Operation.Update,\n Operation.Delete,\n Operation.Deny\n ]\n }\n ]\n })");
}
};
PermissionManagerComponent.prototype.ngAfterViewInit = function () {
if (this.permissionsConfig) {
var permissionManagerWidth = document.getElementById('permission_manager_container').offsetWidth;
if (permissionManagerWidth <= 400) {
this.resourceCols = 5;
this.permissionCols = 5;
}
else if (permissionManagerWidth > 400 && permissionManagerWidth <= 600) {
this.resourceCols = 6;
this.permissionCols = 4;
}
else if (permissionManagerWidth > 600 && permissionManagerWidth <= 800) {
this.resourceCols = 7;
this.permissionCols = 3;
}
else {
this.resourceCols = 8;
this.permissionCols = 2;
}
}
this.cd.detectChanges();
};
PermissionManagerComponent.prototype.onPermissionChange = function (resource, operation, event) {
var _this = this;
var updatePermissionsMonitor = new BehaviorSubject(null);
var permissions = this.user ? this.user.data.permissions || [] :
this.role ? this.role.data.permissions || [] : [];
var permissionIndex = permissions.findIndex(function (permission) { return permission.resource === resource.id; });
if (event.checked) {
if (permissionIndex > -1) {
var operationIndex = permissions[permissionIndex].operations.findIndex(function (oper) { return oper === operation; });
if (operationIndex === -1) {
permissions[permissionIndex].operations.push(operation);
updatePermissionsMonitor.next(permissions);
}
}
else {
permissions.push({
resource: resource.id,
operations: [operation]
});
updatePermissionsMonitor.next(permissions);
}
}
else {
if (permissionIndex > -1) {
var operationIndex = permissions[permissionIndex].operations.findIndex(function (oper) { return oper === operation; });
if (operationIndex > -1) {
if (permissions[permissionIndex].operations.length > 1) {
permissions[permissionIndex].operations.splice(operationIndex, 1);
}
else {
permissions.splice(permissionIndex, 1);
}
updatePermissionsMonitor.next(permissions);
}
}
}
updatePermissionsMonitor.subscribe(function (permissionsToUpdate) {
if (permissionsToUpdate) {
if (_this.user) {
var userToUpdate = _this.data.user;
userToUpdate.data.permissions = permissionsToUpdate;
var config_1 = new MatSnackBarConfig();
config_1.duration = 2000;
_this.authorizatorservice.updateUserPermissions(_this.data.rootFirebasePath, userToUpdate).then(function () {
config_1.panelClass = ['success-bar'];
_this.snackbar.open('Permissions updated', null, config_1);
}).catch(function (error) {
config_1.panelClass = ['error-bar'];
_this.snackbar.open(error.message, null, config_1);
});
}
if (_this.role) {
var roleToUpdate = _this.data.role;
roleToUpdate.data.permissions = permissionsToUpdate;
var config_2 = new MatSnackBarConfig();
config_2.duration = 2000;
_this.authorizatorservice.updateRolePermissions(_this.data.rootFirebasePath, roleToUpdate).then(function () {
config_2.panelClass = ['success-bar'];
_this.snackbar.open('Permissions updated', null, config_2);
}).catch(function (error) {
console.log('ban5');
console.log(error);
config_2.panelClass = ['error-bar'];
_this.snackbar.open(error.message, null, config_2);
});
}
updatePermissionsMonitor.unsubscribe();
}
});
};
PermissionManagerComponent.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [AUTHORIZATOR_CONFIG,] }] },
{ type: ChangeDetectorRef },
{ type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] },
{ type: AuthorizatorService },
{ type: MatSnackBar }
]; };
__decorate([
Output(),
__metadata("design:type", EventEmitter)
], PermissionManagerComponent.prototype, "change", void 0);
PermissionManagerComponent = __decorate([
Component({
selector: 'lib-permission-manager',
template: "<h1 mat-dialog-title>User Permissions</h1>\n<div mat-dialog-content>\n <div *ngIf=\"permissionsConfig\" id=\"permission_manager_container\">\n <div>\n <mat-grid-list cols=\"10\" rowHeight=\"48px\" style=\"width: 100%;\">\n <mat-grid-tile [colspan]=\"resourceCols\">\n Resource\n </mat-grid-tile>\n <mat-grid-tile [colspan]=\"permissionCols\">\n Permissions\n </mat-grid-tile>\n </mat-grid-list>\n </div>\n <div *ngFor=\"let permission of permissionsConfig\">\n <mat-grid-list cols=\"10\" rowHeight=\"48px\" style=\"width: 100%;\">\n <mat-grid-tile [rowspan]=\"permission.operations.length\" class=\"permission-grid\" [colspan]=\"resourceCols\">\n {{permission.resource.data.description}}\n </mat-grid-tile>\n <mat-grid-tile *ngFor=\"let operation of permission.operations\" class=\"permission-grid\" [colspan]=\"permissionCols\">\n <mat-slide-toggle [checked]=\"operation.value\"\n (change)=\"onPermissionChange(permission.resource, operation.id, $event)\">\n {{\n operation.id === AllowedOperation.Create ? 'Create' :\n operation.id === AllowedOperation.Read ? 'Read':\n operation.id === AllowedOperation.Update ? 'Update':\n operation.id === AllowedOperation.Delete ? 'Delete':\n operation.id === AllowedOperation.Deny ? 'Deny' : ''\n }}\n </mat-slide-toggle>\n </mat-grid-tile>\n </mat-grid-list>\n </div>\n </div> \n</div>\n<div mat-dialog-actions>\n <button mat-button cdkFocusInitial [mat-dialog-close]>Close</button>\n</div>\n\n",
styles: [".permission-grid{background:#f5f5f5;border:1px solid #d3d3d3}.mat-dialog-actions{-webkit-box-pack:end;justify-content:flex-end}div#permission_manager_container{margin-bottom:5px!important}"]
}),
__param(0, Inject(AUTHORIZATOR_CONFIG)),
__param(2, Inject(MAT_DIALOG_DATA)),
__metadata("design:paramtypes", [Object, ChangeDetectorRef, Object, AuthorizatorService,
MatSnackBar])
], PermissionManagerComponent);
return PermissionManagerComponent;
}());
export { PermissionManagerComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1tYW5hZ2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItZmlyZWJhc2UtYXV0aG9yaXphdG9yLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvcGVybWlzc2lvbi1tYW5hZ2VyL3Blcm1pc3Npb24tbWFuYWdlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHdEUsT0FBTyxFQUFFLFNBQVMsRUFBaUIsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFjMUU7SUFZRSxvQ0FDdUMsa0JBQXNDLEVBQVUsRUFBcUIsRUFDMUUsSUFBb0IsRUFDNUMsbUJBQXdDLEVBQ3hDLFFBQXFCO1FBSFEsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUFVLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQzFFLFNBQUksR0FBSixJQUFJLENBQWdCO1FBQzVDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQVh4QixxQkFBZ0IsR0FBRyxTQUFTLENBQUM7UUFDN0IsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFDakIsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFJaEIsV0FBTSxHQUFnQyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQU9oRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFFRCw2Q0FBUSxHQUFSO1FBQUEsaUJBMkRDO1FBMURDLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUU7WUFDbEUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQUEsVUFBVTtnQkFDekUsT0FBTztvQkFDTCxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7b0JBQzdCLFVBQVUsRUFBRSxVQUFVLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQUEsU0FBUzt3QkFDcEQsT0FBTzs0QkFDTCxFQUFFLEVBQUUsU0FBUzs0QkFDYixLQUFLLEVBQ0gsS0FBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUNULENBQ0UsS0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0NBQzVCLENBQ0UsS0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksQ0FBQyxRQUFRLEtBQUssVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQXhDLENBQXdDLENBQUMsQ0FBQyxDQUFDO3dDQUNuRixDQUNFLEtBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQzdCLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLFFBQVEsS0FBSyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBeEMsQ0FBd0MsQ0FDakQsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxLQUFLLFNBQVMsRUFBbEIsQ0FBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUN4RCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQ1YsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUNWLENBQUMsQ0FBQztnQ0FDTCxLQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0NBQ1QsQ0FDRSxLQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzt3Q0FDNUIsQ0FDRSxLQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLFFBQVEsS0FBSyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBeEMsQ0FBd0MsQ0FBQyxDQUFDLENBQUM7NENBQ25GLENBQ0UsS0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDN0IsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsUUFBUSxLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUF4QyxDQUF3QyxDQUNqRCxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLEtBQUssU0FBUyxFQUFsQixDQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ3hELENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FDVixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQ1YsQ0FBQyxDQUFDLENBQUMsS0FBSzt5QkFDZCxDQUFDO29CQUNKLENBQUMsQ0FBQztpQkFDSCxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxva0JBbUJYLENBQUMsQ0FBQztTQUNOO0lBQ0gsQ0FBQztJQUVELG9EQUFlLEdBQWY7UUFDRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFNLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsOEJBQThCLENBQUMsQ0FBQyxXQUFXLENBQUM7WUFDbkcsSUFBSSxzQkFBc0IsSUFBSSxHQUFHLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQzthQUN6QjtpQkFBTSxJQUFJLHNCQUFzQixHQUFHLEdBQUcsSUFBSSxzQkFBc0IsSUFBSSxHQUFHLEVBQUU7Z0JBQ3hFLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQzthQUN6QjtpQkFBTSxJQUFJLHNCQUFzQixHQUFHLEdBQUcsSUFBSSxzQkFBc0IsSUFBSSxHQUFHLEVBQUU7Z0JBQ3hFLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQzthQUN6QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7YUFDekI7U0FDRjtRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELHVEQUFrQixHQUFsQixVQUFtQixRQUFxQixFQUFFLFNBQW9CLEVBQUUsS0FBMkI7UUFBM0YsaUJBa0VDO1FBakVDLElBQU0sd0JBQXdCLEdBQXFDLElBQUksZUFBZSxDQUFrQixJQUFJLENBQUMsQ0FBQztRQUM5RyxJQUFNLFdBQVcsR0FDZixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BELElBQU0sZUFBZSxHQUFXLFdBQVcsQ0FBQyxTQUFTLENBQUMsVUFBQSxVQUFVLElBQUksT0FBQSxVQUFVLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxFQUFFLEVBQW5DLENBQW1DLENBQUMsQ0FBQztRQUN6RyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDakIsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3hCLElBQU0sY0FBYyxHQUFXLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxLQUFLLFNBQVMsRUFBbEIsQ0FBa0IsQ0FBQyxDQUFDO2dCQUM3RyxJQUFJLGNBQWMsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDekIsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3hELHdCQUF3QixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDNUM7YUFDRjtpQkFBTTtnQkFDTCxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUNmLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRTtvQkFDckIsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDO2lCQUN4QixDQUFDLENBQUM7Z0JBQ0gsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzVDO1NBQ0Y7YUFBTTtZQUNMLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUN4QixJQUFNLGNBQWMsR0FBVyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksS0FBSyxTQUFTLEVBQWxCLENBQWtCLENBQUMsQ0FBQztnQkFDN0csSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ3ZCLElBQUksV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUN0RCxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQ25FO3lCQUFNO3dCQUNMLFdBQVcsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUN4QztvQkFDRCx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQzVDO2FBQ0Y7U0FDRjtRQUNELHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxVQUFBLG1CQUFtQjtZQUNwRCxJQUFJLG1CQUFtQixFQUFFO2dCQUN2QixJQUFJLEtBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ2IsSUFBTSxZQUFZLEdBQVksS0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQzdDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLG1CQUFtQixDQUFDO29CQUNwRCxJQUFNLFFBQU0sR0FBc0IsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO29CQUMxRCxRQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDdkIsS0FBSSxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLEtBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDO3dCQUM1RixRQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQ3BDLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksRUFBRSxRQUFNLENBQUMsQ0FBQztvQkFDMUQsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQUEsS0FBSzt3QkFDWixRQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQ2xDLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQU0sQ0FBQyxDQUFDO29CQUNsRCxDQUFDLENBQUMsQ0FBQztpQkFDSjtnQkFDRCxJQUFJLEtBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ2IsSUFBTSxZQUFZLEdBQVksS0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQzdDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLG1CQUFtQixDQUFDO29CQUNwRCxJQUFNLFFBQU0sR0FBc0IsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO29CQUMxRCxRQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDdkIsS0FBSSxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLEtBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDO3dCQUM1RixRQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQ3BDLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksRUFBRSxRQUFNLENBQUMsQ0FBQztvQkFDMUQsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQUEsS0FBSzt3QkFDWixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNuQixRQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQ2xDLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQU0sQ0FBQyxDQUFDO29CQUNsRCxDQUFDLENBQUMsQ0FBQztpQkFDSjtnQkFDRCx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUN4QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Z0RBNUpFLE1BQU0sU0FBQyxtQkFBbUI7Z0JBQThELGlCQUFpQjtnREFDekcsTUFBTSxTQUFDLGVBQWU7Z0JBQ00sbUJBQW1CO2dCQUM5QixXQUFXOztJQUxyQjtRQUFULE1BQU0sRUFBRTtrQ0FBUyxZQUFZOzhEQUFvRDtJQVh2RSwwQkFBMEI7UUFMdEMsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLHdCQUF3QjtZQUNsQywwcERBQWtEOztTQUVuRCxDQUFDO1FBY0csV0FBQSxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUMzQixXQUFBLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQTtpREFEaUUsaUJBQWlCLFVBRTdFLG1CQUFtQjtZQUM5QixXQUFXO09BaEJwQiwwQkFBMEIsQ0EwS3RDO0lBQUQsaUNBQUM7Q0FBQSxBQTFLRCxJQTBLQztTQTFLWSwwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5qZWN0LCBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBVVRIT1JJWkFUT1JfQ09ORklHIH0gZnJvbSAnLi4vLi4vYXV0aG9yaXphdG9yLmNvbmZpZy50b2tlbic7XG5pbXBvcnQgeyBBdXRob3JpemF0b3JDb25maWcgfSBmcm9tICcuLi8uLi9hdXRob3JpemF0b3IuY29uZmlnJztcbmltcG9ydCB7IFJlc291cmNlT2JqIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9yZXNvdXJjZS1vYmonO1xuaW1wb3J0IHsgT3BlcmF0aW9uLCBQZXJtaXNzaW9uT2JqIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9wZXJtaXNzaW9uLW9iaic7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXJDb25maWcsIE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlQ2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcbmltcG9ydCB7IFVzZXJPYmogfSBmcm9tICcuLi8uLi9jbGFzc2VzL3VzZXItb2JqJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXV0aG9yaXphdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGhvcml6YXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IFJvbGVPYmogfSBmcm9tICcuLi8uLi9jbGFzc2VzL3JvbGUtb2JqJztcblxuZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uRGF0YSB7XG4gIHJvb3RGaXJlYmFzZVBhdGg6IHN0cmluZztcbiAgdXNlcj86IFVzZXJPYmo7XG4gIHJvbGU/OiBSb2xlT2JqO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItcGVybWlzc2lvbi1tYW5hZ2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Blcm1pc3Npb24tbWFuYWdlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Blcm1pc3Npb24tbWFuYWdlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25NYW5hZ2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgcHVibGljIHBlcm1pc3Npb25zQ29uZmlnOiB7XG4gICAgcmVzb3VyY2U6IFJlc291cmNlT2JqLFxuICAgIG9wZXJhdGlvbnM6IHsgaWQ6IE9wZXJhdGlvbiwgdmFsdWU6IGJvb2xlYW59W11cbiAgfVtdO1xuICBwdWJsaWMgQWxsb3dlZE9wZXJhdGlvbiA9IE9wZXJhdGlvbjtcbiAgcHVibGljIHJlc291cmNlQ29scyA9IDU7XG4gIHB1YmxpYyBwZXJtaXNzaW9uQ29scyA9IDU7XG4gIHB1YmxpYyB1c2VyOiBVc2VyT2JqO1xuICBwdWJsaWMgcm9sZTogUm9sZU9iajtcblxuICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8UGVybWlzc2lvbk9iaj4gPSBuZXcgRXZlbnRFbWl0dGVyPFBlcm1pc3Npb25PYmo+KCk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoQVVUSE9SSVpBVE9SX0NPTkZJRykgcHJpdmF0ZSBhdXRob3JpemF0b3JDb25maWc6IEF1dGhvcml6YXRvckNvbmZpZywgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBQZXJtaXNzaW9uRGF0YSxcbiAgICBwcml2YXRlIGF1dGhvcml6YXRvcnNlcnZpY2U6IEF1dGhvcml6YXRvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzbmFja2JhcjogTWF0U25hY2tCYXJcbiAgKSB7XG4gICAgdGhpcy51c2VyID0gZGF0YS51c2VyO1xuICAgIHRoaXMucm9sZSA9IGRhdGEucm9sZTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLmF1dGhvcml6YXRvckNvbmZpZyAmJiB0aGlzLmF1dGhvcml6YXRvckNvbmZpZy5wZXJtaXNzaW9ucykge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc0NvbmZpZyA9IHRoaXMuYXV0aG9yaXphdG9yQ29uZmlnLnBlcm1pc3Npb25zLm1hcChwZXJtaXNzaW9uID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXNvdXJjZTogcGVybWlzc2lvbi5yZXNvdXJjZSxcbiAgICAgICAgICBvcGVyYXRpb25zOiBwZXJtaXNzaW9uLmFsbG93ZWRPcGVyYXRpb25zLm1hcChvcGVyYXRpb24gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaWQ6IG9wZXJhdGlvbixcbiAgICAgICAgICAgICAgdmFsdWU6XG4gICAgICAgICAgICAgICAgdGhpcy51c2VyID9cbiAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VyLmRhdGEucGVybWlzc2lvbnMgP1xuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VyLmRhdGEucGVybWlzc2lvbnMuZmluZChwZXJtID0+IHBlcm0ucmVzb3VyY2UgPT09IHBlcm1pc3Npb24ucmVzb3VyY2UuaWQpID9cbiAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXIuZGF0YS5wZXJtaXNzaW9ucy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtID0+IHBlcm0ucmVzb3VyY2UgPT09IHBlcm1pc3Npb24ucmVzb3VyY2UuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICkub3BlcmF0aW9ucy5maW5kSW5kZXgob3BlciA9PiBvcGVyID09PSBvcGVyYXRpb24pID4gLTFcbiAgICAgICAgICAgICAgICAgICAgICApIDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgKSA6IGZhbHNlXG4gICAgICAgICAgICAgICAgICApIDpcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUgP1xuICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvbGUuZGF0YS5wZXJtaXNzaW9ucyA/XG4gICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvbGUuZGF0YS5wZXJtaXNzaW9ucy5maW5kKHBlcm0gPT4gcGVybS5yZXNvdXJjZSA9PT0gcGVybWlzc2lvbi5yZXNvdXJjZS5pZCkgP1xuICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9sZS5kYXRhLnBlcm1pc3Npb25zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm0gPT4gcGVybS5yZXNvdXJjZSA9PT0gcGVybWlzc2lvbi5yZXNvdXJjZS5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgKS5vcGVyYXRpb25zLmZpbmRJbmRleChvcGVyID0+IG9wZXIgPT09IG9wZXJhdGlvbikgPiAtMVxuICAgICAgICAgICAgICAgICAgICAgICkgOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICApIDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICkgOiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYENvbmZpZ3VyYXRpb24gb2YgbW9kdWxlIG1pc3NpbmcsIHBsZWFzZSBhZGQgdGhlIG5leHQgY29kZSBpbiB0aGUgTW9kdWxlIGRlY2xhcmF0aW9uOlxuICAgICAgQW5ndWxhckZpcmViYXNlQXV0aG9yaXphdG9yTW9kdWxlLmZvclJvb3Qoe1xuICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlc291cmNlOiB7XG4gICAgICAgICAgICAgIGlkOiAnc29tZWlkJyxcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUmVzb3VyY2UgZGVzY3JpcHRpb24nXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhbGxvd2VkT3BlcmF0aW9uczogW1xuICAgICAgICAgICAgICBPcGVyYXRpb24uQ3JlYXRlLFxuICAgICAgICAgICAgICBPcGVyYXRpb24uUmVhZCxcbiAgICAgICAgICAgICAgT3BlcmF0aW9uLlVwZGF0ZSxcbiAgICAgICAgICAgICAgT3BlcmF0aW9uLkRlbGV0ZSxcbiAgICAgICAgICAgICAgT3BlcmF0aW9uLkRlbnlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pYCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICh0aGlzLnBlcm1pc3Npb25zQ29uZmlnKSB7XG4gICAgICBjb25zdCBwZXJtaXNzaW9uTWFuYWdlcldpZHRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Blcm1pc3Npb25fbWFuYWdlcl9jb250YWluZXInKS5vZmZzZXRXaWR0aDtcbiAgICAgIGlmIChwZXJtaXNzaW9uTWFuYWdlcldpZHRoIDw9IDQwMCkge1xuICAgICAgICB0aGlzLnJlc291cmNlQ29scyA9IDU7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbkNvbHMgPSA1O1xuICAgICAgfSBlbHNlIGlmIChwZXJtaXNzaW9uTWFuYWdlcldpZHRoID4gNDAwICYmIHBlcm1pc3Npb25NYW5hZ2VyV2lkdGggPD0gNjAwKSB7XG4gICAgICAgIHRoaXMucmVzb3VyY2VDb2xzID0gNjtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uQ29scyA9IDQ7XG4gICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb25NYW5hZ2VyV2lkdGggPiA2MDAgJiYgcGVybWlzc2lvbk1hbmFnZXJXaWR0aCA8PSA4MDApIHtcbiAgICAgICAgdGhpcy5yZXNvdXJjZUNvbHMgPSA3O1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25Db2xzID0gMztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVzb3VyY2VDb2xzID0gODtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uQ29scyA9IDI7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb25QZXJtaXNzaW9uQ2hhbmdlKHJlc291cmNlOiBSZXNvdXJjZU9iaiwgb3BlcmF0aW9uOiBPcGVyYXRpb24sIGV2ZW50OiBNYXRTbGlkZVRvZ2dsZUNoYW5nZSkge1xuICAgIGNvbnN0IHVwZGF0ZVBlcm1pc3Npb25zTW9uaXRvcjogQmVoYXZpb3JTdWJqZWN0PFBlcm1pc3Npb25PYmpbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBlcm1pc3Npb25PYmpbXT4obnVsbCk7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPVxuICAgICAgdGhpcy51c2VyID8gdGhpcy51c2VyLmRhdGEucGVybWlzc2lvbnMgfHwgW10gOlxuICAgICAgdGhpcy5yb2xlID8gdGhpcy5yb2xlLmRhdGEucGVybWlzc2lvbnMgfHwgW10gOiBbXTtcbiAgICBjb25zdCBwZXJtaXNzaW9uSW5kZXg6IG51bWJlciA9IHBlcm1pc3Npb25zLmZpbmRJbmRleChwZXJtaXNzaW9uID0+IHBlcm1pc3Npb24ucmVzb3VyY2UgPT09IHJlc291cmNlLmlkKTtcbiAgICBpZiAoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgaWYgKHBlcm1pc3Npb25JbmRleCA+IC0xKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkluZGV4OiBudW1iZXIgPSBwZXJtaXNzaW9uc1twZXJtaXNzaW9uSW5kZXhdLm9wZXJhdGlvbnMuZmluZEluZGV4KG9wZXIgPT4gb3BlciA9PT0gb3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKG9wZXJhdGlvbkluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHBlcm1pc3Npb25zW3Blcm1pc3Npb25JbmRleF0ub3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgICAgdXBkYXRlUGVybWlzc2lvbnNNb25pdG9yLm5leHQocGVybWlzc2lvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKHtcbiAgICAgICAgICByZXNvdXJjZTogcmVzb3VyY2UuaWQsXG4gICAgICAgICAgb3BlcmF0aW9uczogW29wZXJhdGlvbl1cbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0ZVBlcm1pc3Npb25zTW9uaXRvci5uZXh0KHBlcm1pc3Npb25zKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBlcm1pc3Npb25JbmRleCA+IC0xKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkluZGV4OiBudW1iZXIgPSBwZXJtaXNzaW9uc1twZXJtaXNzaW9uSW5kZXhdLm9wZXJhdGlvbnMuZmluZEluZGV4KG9wZXIgPT4gb3BlciA9PT0gb3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKG9wZXJhdGlvbkluZGV4ID4gLTEpIHtcbiAgICAgICAgICBpZiAocGVybWlzc2lvbnNbcGVybWlzc2lvbkluZGV4XS5vcGVyYXRpb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zW3Blcm1pc3Npb25JbmRleF0ub3BlcmF0aW9ucy5zcGxpY2Uob3BlcmF0aW9uSW5kZXgsIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5zcGxpY2UocGVybWlzc2lvbkluZGV4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdXBkYXRlUGVybWlzc2lvbnNNb25pdG9yLm5leHQocGVybWlzc2lvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZVBlcm1pc3Npb25zTW9uaXRvci5zdWJzY3JpYmUocGVybWlzc2lvbnNUb1VwZGF0ZSA9PiB7XG4gICAgICBpZiAocGVybWlzc2lvbnNUb1VwZGF0ZSkge1xuICAgICAgICBpZiAodGhpcy51c2VyKSB7XG4gICAgICAgICAgY29uc3QgdXNlclRvVXBkYXRlOiBVc2VyT2JqID0gdGhpcy5kYXRhLnVzZXI7XG4gICAgICAgICAgdXNlclRvVXBkYXRlLmRhdGEucGVybWlzc2lvbnMgPSBwZXJtaXNzaW9uc1RvVXBkYXRlO1xuICAgICAgICAgIGNvbnN0IGNvbmZpZzogTWF0U25hY2tCYXJDb25maWcgPSBuZXcgTWF0U25hY2tCYXJDb25maWcoKTtcbiAgICAgICAgICBjb25maWcuZHVyYXRpb24gPSAyMDAwO1xuICAgICAgICAgIHRoaXMuYXV0aG9yaXphdG9yc2VydmljZS51cGRhdGVVc2VyUGVybWlzc2lvbnModGhpcy5kYXRhLnJvb3RGaXJlYmFzZVBhdGgsIHVzZXJUb1VwZGF0ZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25maWcucGFuZWxDbGFzcyA9IFsnc3VjY2Vzcy1iYXInXTtcbiAgICAgICAgICAgIHRoaXMuc25hY2tiYXIub3BlbignUGVybWlzc2lvbnMgdXBkYXRlZCcsIG51bGwsIGNvbmZpZyk7XG4gICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgY29uZmlnLnBhbmVsQ2xhc3MgPSBbJ2Vycm9yLWJhciddO1xuICAgICAgICAgICAgdGhpcy5zbmFja2Jhci5vcGVuKGVycm9yLm1lc3NhZ2UsIG51bGwsIGNvbmZpZyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucm9sZSkge1xuICAgICAgICAgIGNvbnN0IHJvbGVUb1VwZGF0ZTogUm9sZU9iaiA9IHRoaXMuZGF0YS5yb2xlO1xuICAgICAgICAgIHJvbGVUb1VwZGF0ZS5kYXRhLnBlcm1pc3Npb25zID0gcGVybWlzc2lvbnNUb1VwZGF0ZTtcbiAgICAgICAgICBjb25zdCBjb25maWc6IE1hdFNuYWNrQmFyQ29uZmlnID0gbmV3IE1hdFNuYWNrQmFyQ29uZmlnKCk7XG4gICAgICAgICAgY29uZmlnLmR1cmF0aW9uID0gMjAwMDtcbiAgICAgICAgICB0aGlzLmF1dGhvcml6YXRvcnNlcnZpY2UudXBkYXRlUm9sZVBlcm1pc3Npb25zKHRoaXMuZGF0YS5yb290RmlyZWJhc2VQYXRoLCByb2xlVG9VcGRhdGUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uZmlnLnBhbmVsQ2xhc3MgPSBbJ3N1Y2Nlc3MtYmFyJ107XG4gICAgICAgICAgICB0aGlzLnNuYWNrYmFyLm9wZW4oJ1Blcm1pc3Npb25zIHVwZGF0ZWQnLCBudWxsLCBjb25maWcpO1xuICAgICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdiYW41Jyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICBjb25maWcucGFuZWxDbGFzcyA9IFsnZXJyb3ItYmFyJ107XG4gICAgICAgICAgICB0aGlzLnNuYWNrYmFyLm9wZW4oZXJyb3IubWVzc2FnZSwgbnVsbCwgY29uZmlnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVQZXJtaXNzaW9uc01vbml0b3IudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19