@smarterplan/ngx-smarterplan-admin 0.2.3 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/admin/admin.component.mjs +36 -0
- package/esm2022/lib/chevron/chevron.component.mjs +19 -0
- package/{esm2020 → esm2022}/lib/guest-link/guest-link.component.mjs +70 -62
- package/esm2022/lib/guide.guard.mjs +29 -0
- package/{esm2020 → esm2022}/lib/helpers.mjs +24 -24
- package/esm2022/lib/name-from-id.pipe.mjs +31 -0
- package/esm2022/lib/ngx-smarterplan-admin-routing.module.mjs +48 -0
- package/esm2022/lib/ngx-smarterplan-admin.module.mjs +89 -0
- package/esm2022/lib/ngx-smarterplan-admin.service.mjs +15 -0
- package/esm2022/lib/organisation/organisation.component.mjs +182 -0
- package/esm2022/lib/sp-admin.guard.mjs +29 -0
- package/esm2022/lib/user/detail-organisation/detail-organisation.component.mjs +207 -0
- package/esm2022/lib/user/form-mission/form-mission.component.mjs +290 -0
- package/esm2022/lib/user/form-organisation/form-organisation.component.mjs +139 -0
- package/esm2022/lib/user/user-mission-form/user-mission-form.component.mjs +132 -0
- package/esm2022/lib/user/user.component.mjs +353 -0
- package/esm2022/lib/visitor/create-batch/create-batch.component.mjs +112 -0
- package/esm2022/lib/visitor/template/template.component.mjs +295 -0
- package/esm2022/lib/visitor/visitor.component.mjs +318 -0
- package/{esm2020 → esm2022}/public-api.mjs +5 -5
- package/{esm2020 → esm2022}/smarterplan-ngx-smarterplan-admin.mjs +4 -4
- package/{fesm2020 → fesm2022}/smarterplan-ngx-smarterplan-admin.mjs +2205 -2065
- package/{fesm2020 → fesm2022}/smarterplan-ngx-smarterplan-admin.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/admin/admin.component.d.ts +13 -13
- package/lib/chevron/chevron.component.d.ts +9 -9
- package/lib/guest-link/guest-link.component.d.ts +20 -20
- package/lib/guide.guard.d.ts +11 -11
- package/lib/helpers.d.ts +2 -2
- package/lib/name-from-id.pipe.d.ts +11 -11
- package/lib/ngx-smarterplan-admin-routing.module.d.ts +7 -7
- package/lib/ngx-smarterplan-admin.module.d.ts +26 -26
- package/lib/ngx-smarterplan-admin.service.d.ts +6 -6
- package/lib/organisation/organisation.component.d.ts +54 -54
- package/lib/sp-admin.guard.d.ts +11 -11
- package/lib/user/detail-organisation/detail-organisation.component.d.ts +49 -49
- package/lib/user/form-mission/form-mission.component.d.ts +63 -63
- package/lib/user/form-organisation/form-organisation.component.d.ts +32 -32
- package/lib/user/user-mission-form/user-mission-form.component.d.ts +32 -32
- package/lib/user/user.component.d.ts +102 -102
- package/lib/visitor/create-batch/create-batch.component.d.ts +23 -23
- package/lib/visitor/template/template.component.d.ts +58 -58
- package/lib/visitor/visitor.component.d.ts +70 -70
- package/package.json +12 -18
- package/public-api.d.ts +2 -2
- package/esm2020/lib/admin/admin.component.mjs +0 -34
- package/esm2020/lib/chevron/chevron.component.mjs +0 -19
- package/esm2020/lib/guide.guard.mjs +0 -26
- package/esm2020/lib/name-from-id.pipe.mjs +0 -29
- package/esm2020/lib/ngx-smarterplan-admin-routing.module.mjs +0 -47
- package/esm2020/lib/ngx-smarterplan-admin.module.mjs +0 -88
- package/esm2020/lib/ngx-smarterplan-admin.service.mjs +0 -14
- package/esm2020/lib/organisation/organisation.component.mjs +0 -171
- package/esm2020/lib/sp-admin.guard.mjs +0 -26
- package/esm2020/lib/user/detail-organisation/detail-organisation.component.mjs +0 -191
- package/esm2020/lib/user/form-mission/form-mission.component.mjs +0 -265
- package/esm2020/lib/user/form-organisation/form-organisation.component.mjs +0 -125
- package/esm2020/lib/user/user-mission-form/user-mission-form.component.mjs +0 -121
- package/esm2020/lib/user/user.component.mjs +0 -336
- package/esm2020/lib/visitor/create-batch/create-batch.component.mjs +0 -106
- package/esm2020/lib/visitor/template/template.component.mjs +0 -277
- package/esm2020/lib/visitor/visitor.component.mjs +0 -299
- package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs +0 -2245
- package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs.map +0 -1
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
import { Validators } from '@angular/forms';
|
|
3
|
-
import { removeNullKeysFromObject } from '@smarterplan/ngx-smarterplan-core';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@smarterplan/ngx-smarterplan-core";
|
|
6
|
-
import * as i2 from "@angular/forms";
|
|
7
|
-
import * as i3 from "@ng-bootstrap/ng-bootstrap";
|
|
8
|
-
import * as i4 from "@angular/common";
|
|
9
|
-
import * as i5 from "../user-mission-form/user-mission-form.component";
|
|
10
|
-
import * as i6 from "@ngx-translate/core";
|
|
11
|
-
export class FormOrganisationComponent {
|
|
12
|
-
constructor(orgService, fb, userService) {
|
|
13
|
-
this.orgService = orgService;
|
|
14
|
-
this.fb = fb;
|
|
15
|
-
this.userService = userService;
|
|
16
|
-
this.working = false;
|
|
17
|
-
this.added = new EventEmitter();
|
|
18
|
-
}
|
|
19
|
-
async ngOnInit() {
|
|
20
|
-
this.isSP = this.userService.isSPAdmin();
|
|
21
|
-
this.initForm();
|
|
22
|
-
}
|
|
23
|
-
ngAfterViewInit() {
|
|
24
|
-
const handlePaste = function handlePaste(event) {
|
|
25
|
-
const pastedData = event.clipboardData.getData("Text");
|
|
26
|
-
if (pastedData.length > 10) {
|
|
27
|
-
this.findOrgByToken(pastedData);
|
|
28
|
-
}
|
|
29
|
-
}.bind(this);
|
|
30
|
-
if (this.existing) {
|
|
31
|
-
setTimeout(() => {
|
|
32
|
-
const inputElement = document.querySelector("#tokenInput");
|
|
33
|
-
inputElement.addEventListener("paste", handlePaste);
|
|
34
|
-
inputElement.addEventListener("keydown", ({ key }) => {
|
|
35
|
-
if (key === "Backspace" || key === "Delete") {
|
|
36
|
-
this.initForm();
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
inputElement.addEventListener("keydown", ({ key }) => {
|
|
40
|
-
if (key === "Enter") {
|
|
41
|
-
const { value } = inputElement;
|
|
42
|
-
this.findOrgByToken(value);
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
}, 600);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
initForm() {
|
|
49
|
-
this.form = this.fb.group({
|
|
50
|
-
name: [null, [Validators.required]],
|
|
51
|
-
address: [""],
|
|
52
|
-
city: [""],
|
|
53
|
-
postal: [null],
|
|
54
|
-
siret: [null],
|
|
55
|
-
});
|
|
56
|
-
if (this.existing) {
|
|
57
|
-
const orgControls = this.form;
|
|
58
|
-
for (const control of Object.keys(orgControls.controls)) {
|
|
59
|
-
orgControls.controls[control].disable();
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
onCancel() {
|
|
64
|
-
this.form = null;
|
|
65
|
-
this.added.emit(false);
|
|
66
|
-
}
|
|
67
|
-
get name() {
|
|
68
|
-
return this.form.get("name");
|
|
69
|
-
}
|
|
70
|
-
async onSubmit() {
|
|
71
|
-
this.working = true;
|
|
72
|
-
const formValue = this.form.value;
|
|
73
|
-
removeNullKeysFromObject(formValue);
|
|
74
|
-
try {
|
|
75
|
-
if (!this.existing) {
|
|
76
|
-
const organisation = await this.orgService.createOrganisation(formValue);
|
|
77
|
-
if (organisation) {
|
|
78
|
-
this.createdOrg = organisation;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
// orgID = this.existingOrgID;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
console.error(error);
|
|
87
|
-
this.added.emit(false);
|
|
88
|
-
}
|
|
89
|
-
this.working = false;
|
|
90
|
-
}
|
|
91
|
-
async findOrgByToken(token) {
|
|
92
|
-
const org = await this.orgService.getOrganisationByToken(token);
|
|
93
|
-
if (org) {
|
|
94
|
-
this.form.setValue({
|
|
95
|
-
name: [org.name],
|
|
96
|
-
address: [org.address],
|
|
97
|
-
city: [org.city],
|
|
98
|
-
postal: [org.postal],
|
|
99
|
-
siret: [org.siret],
|
|
100
|
-
});
|
|
101
|
-
this.existingOrgID = org.id;
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
alert("No organisation found. Maybe token is expired?");
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
userAndMissionAdded(added) {
|
|
108
|
-
this.added.emit(added);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
FormOrganisationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FormOrganisationComponent, deps: [{ token: i1.OrganisationService }, { token: i2.UntypedFormBuilder }, { token: i1.BaseUserService }], target: i0.ɵɵFactoryTarget.Component });
|
|
112
|
-
FormOrganisationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: FormOrganisationComponent, selector: "lib-form-organisation", inputs: { currentOrg: "currentOrg", currentUser: "currentUser", existing: "existing" }, outputs: { added: "added" }, ngImport: i0, template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <h4>{{ 'Organisation' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\" *ngIf=\"existing\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Organisation Token' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" id=\"tokenInput\" placeholder=\"Paste organisation token here\">\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'Name is mandatory' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal Code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"createdOrg; else noOrg\">\r\n <div class=\"alert alert-info\">\r\n {{'Organisation successfully created' | translate}}\r\n </div>\r\n <lib-user-mission-form [addToOrganisation]=\"createdOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (added)=\"userAndMissionAdded($event)\">\r\n </lib-user-mission-form>\r\n </div>\r\n <ng-template #noOrg>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"this.working || form.invalid\">{{'Create organisation' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div style='margin-top: 1rem'>\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create new organisation first' | translate}}\r\n </ngb-alert>\r\n\r\n </ng-template>\r\n\r\n\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], dependencies: [{ kind: "component", type: i3.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.UserMissionFormComponent, selector: "lib-user-mission-form", inputs: ["addToOrganisation", "isSP", "createForExistingUser", "currentOrg"], outputs: ["added"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] });
|
|
113
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FormOrganisationComponent, decorators: [{
|
|
114
|
-
type: Component,
|
|
115
|
-
args: [{ selector: 'lib-form-organisation', template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <h4>{{ 'Organisation' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\" *ngIf=\"existing\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Organisation Token' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" id=\"tokenInput\" placeholder=\"Paste organisation token here\">\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'Name is mandatory' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal Code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"createdOrg; else noOrg\">\r\n <div class=\"alert alert-info\">\r\n {{'Organisation successfully created' | translate}}\r\n </div>\r\n <lib-user-mission-form [addToOrganisation]=\"createdOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (added)=\"userAndMissionAdded($event)\">\r\n </lib-user-mission-form>\r\n </div>\r\n <ng-template #noOrg>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"this.working || form.invalid\">{{'Create organisation' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div style='margin-top: 1rem'>\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create new organisation first' | translate}}\r\n </ngb-alert>\r\n\r\n </ng-template>\r\n\r\n\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
|
|
116
|
-
}], ctorParameters: function () { return [{ type: i1.OrganisationService }, { type: i2.UntypedFormBuilder }, { type: i1.BaseUserService }]; }, propDecorators: { currentOrg: [{
|
|
117
|
-
type: Input
|
|
118
|
-
}], currentUser: [{
|
|
119
|
-
type: Input
|
|
120
|
-
}], existing: [{
|
|
121
|
-
type: Input
|
|
122
|
-
}], added: [{
|
|
123
|
-
type: Output
|
|
124
|
-
}] } });
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1vcmdhbmlzYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdXNlci9mb3JtLW9yZ2FuaXNhdGlvbi9mb3JtLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2Zvcm0tb3JnYW5pc2F0aW9uL2Zvcm0tb3JnYW5pc2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUF3QyxVQUFVLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkcsT0FBTyxFQUFxRSx3QkFBd0IsRUFBVyxNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7OztBQU96SixNQUFNLE9BQU8seUJBQXlCO0lBeUJsQyxZQUNZLFVBQStCLEVBQy9CLEVBQXNCLEVBQ3RCLFdBQTRCO1FBRjVCLGVBQVUsR0FBVixVQUFVLENBQXFCO1FBQy9CLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQ3RCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQXpCeEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQVlOLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBYzFDLENBQUM7SUFFTCxLQUFLLENBQUMsUUFBUTtRQUNWLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELGVBQWU7UUFDWCxNQUFNLFdBQVcsR0FBRyxTQUFTLFdBQVcsQ0FBQyxLQUFLO1lBQzFDLE1B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QWhCLEtBQUs7Z0JBRUksS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgT3JnYW5pc2F0aW9uLCBQcm9maWxlRW50aXR5LCBPcmdhbmlzYXRpb25TZXJ2aWNlLCBCYXNlVXNlclNlcnZpY2UsIHJlbW92ZU51bGxLZXlzRnJvbU9iamVjdCwgTWlzc2lvbiB9IGZyb20gJ0BzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbGliLWZvcm0tb3JnYW5pc2F0aW9uJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb3JtLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9mb3JtLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtT3JnYW5pc2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcblxyXG4gICAgd29ya2luZyA9IGZhbHNlO1xyXG5cclxuICAgIHN0YXJ0RGF0ZTogbnVtYmVyO1xyXG5cclxuICAgIGVuZERhdGU6IG51bWJlcjtcclxuXHJcbiAgICBASW5wdXQoKSBjdXJyZW50T3JnOiBPcmdhbmlzYXRpb247XHJcblxyXG4gICAgQElucHV0KCkgY3VycmVudFVzZXI6IFByb2ZpbGVFbnRpdHk7XHJcblxyXG4gICAgQElucHV0KCkgZXhpc3Rpbmc6IGJvb2xlYW47XHJcblxyXG4gICAgQE91dHB1dCgpIGFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG5cclxuICAgIGlzU1A6IGJvb2xlYW47XHJcblxyXG4gICAgdG9rZW46IHN0cmluZztcclxuXHJcbiAgICBleGlzdGluZ09yZ0lEOiBzdHJpbmc7XHJcblxyXG4gICAgY3JlYXRlZE9yZzogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgb3JnU2VydmljZTogT3JnYW5pc2F0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXHJcbiAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxyXG4gICAgKSB7IH1cclxuXHJcbiAgICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICB0aGlzLmlzU1AgPSB0aGlzLnVzZXJTZXJ2aWNlLmlzU1BBZG1pbigpO1xyXG4gICAgICAgIHRoaXMuaW5pdEZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgY29uc3QgaGFuZGxlUGFzdGUgPSBmdW5jdGlvbiBoYW5kbGVQYXN0ZShldmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXN0ZWREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiVGV4dFwiKTtcclxuICAgICAgICAgICAgaWYgKHBhc3RlZERhdGEubGVuZ3RoID4gMTApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmluZE9yZ0J5VG9rZW4ocGFzdGVkRGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LmJpbmQodGhpcyk7XHJcbiAgICAgICAgaWYgKHRoaXMuZXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICAgICAgICAgICAgIFwiI3Rva2VuSW5wdXRcIixcclxuICAgICAgICAgICAgICAgICkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGlucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwicGFzdGVcIiwgaGFuZGxlUGFzdGUpO1xyXG4gICAgICAgICAgICAgICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsICh7IGtleSB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJCYWNrc3BhY2VcIiB8fCBrZXkgPT09IFwiRGVsZXRlXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0Rm9ybSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsICh7IGtleSB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJFbnRlclwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGlucHV0RWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3JnQnlUb2tlbih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0sIDYwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRGb3JtKCkge1xyXG4gICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICBuYW1lOiBbbnVsbCwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgICAgICAgYWRkcmVzczogW1wiXCJdLFxyXG4gICAgICAgICAgICBjaXR5OiBbXCJcIl0sXHJcbiAgICAgICAgICAgIHBvc3RhbDogW251bGxdLFxyXG4gICAgICAgICAgICBzaXJldDogW251bGxdLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLmV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9yZ0NvbnRyb2xzID0gdGhpcy5mb3JtIGFzIFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiBPYmplY3Qua2V5cyhvcmdDb250cm9scy5jb250cm9scykpIHtcclxuICAgICAgICAgICAgICAgIG9yZ0NvbnRyb2xzLmNvbnRyb2xzW2NvbnRyb2xdLmRpc2FibGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmZvcm0gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYWRkZWQuZW1pdChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5hbWUoKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmdldChcIm5hbWVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICAgICAgdGhpcy53b3JraW5nID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvcm0udmFsdWU7XHJcbiAgICAgICAgcmVtb3ZlTnVsbEtleXNGcm9tT2JqZWN0KGZvcm1WYWx1ZSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmV4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcmdhbmlzYXRpb24gPSBhd2FpdCB0aGlzLm9yZ1NlcnZpY2UuY3JlYXRlT3JnYW5pc2F0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBpZiAob3JnYW5pc2F0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVkT3JnID0gb3JnYW5pc2F0aW9uO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gb3JnSUQgPSB0aGlzLmV4aXN0aW5nT3JnSUQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgdGhpcy5hZGRlZC5lbWl0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZmluZE9yZ0J5VG9rZW4odG9rZW46IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IG9yZyA9IGF3YWl0IHRoaXMub3JnU2VydmljZS5nZXRPcmdhbmlzYXRpb25CeVRva2VuKHRva2VuKTtcclxuICAgICAgICBpZiAob3JnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybS5zZXRWYWx1ZSh7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBbb3JnLm5hbWVdLFxyXG4gICAgICAgICAgICAgICAgYWRkcmVzczogW29yZy5hZGRyZXNzXSxcclxuICAgICAgICAgICAgICAgIGNpdHk6IFtvcmcuY2l0eV0sXHJcbiAgICAgICAgICAgICAgICBwb3N0YWw6IFtvcmcucG9zdGFsXSxcclxuICAgICAgICAgICAgICAgIHNpcmV0OiBbb3JnLnNpcmV0XSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZXhpc3RpbmdPcmdJRCA9IG9yZy5pZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhbGVydChcIk5vIG9yZ2FuaXNhdGlvbiBmb3VuZC4gTWF5YmUgdG9rZW4gaXMgZXhwaXJlZD9cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVzZXJBbmRNaXNzaW9uQWRkZWQoYWRkZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmFkZGVkLmVtaXQoYWRkZWQpO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgKm5nSWY9XCJmb3JtXCI+XHJcbiAgICA8Zm9ybSAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxoND57eyAnT3JnYW5pc2F0aW9uJyB8IHRyYW5zbGF0ZSB9fTwvaDQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgKm5nSWY9XCJleGlzdGluZ1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J09yZ2FuaXNhdGlvbiBUb2tlbicgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInRva2VuSW5wdXRcIiBwbGFjZWhvbGRlcj1cIlBhc3RlIG9yZ2FuaXNhdGlvbiB0b2tlbiBoZXJlXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J05hbWUnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbY2xhc3MuaXMtaW52YWxpZF09XCJuYW1lLmludmFsaWQgJiYgbmFtZS50b3VjaGVkXCIgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J05hbWUgaXMgbWFuZGF0b3J5JyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0FkZHJlc3MnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc1wiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snQ2l0eScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjaXR5XCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydQb3N0YWwgQ29kZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJwb3N0YWxcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J1NJUkVUJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInNpcmV0XCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImNyZWF0ZWRPcmc7IGVsc2Ugbm9PcmdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgIHt7J09yZ2FuaXNhdGlvbiBzdWNjZXNzZnVsbHkgY3JlYXRlZCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGxpYi11c2VyLW1pc3Npb24tZm9ybSBbYWRkVG9PcmdhbmlzYXRpb25dPVwiY3JlYXRlZE9yZ1wiIFtjdXJyZW50T3JnXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcclxuICAgICAgICAgICAgICAgIChhZGRlZCk9XCJ1c2VyQW5kTWlzc2lvbkFkZGVkKCRldmVudClcIj5cclxuICAgICAgICAgICAgPC9saWItdXNlci1taXNzaW9uLWZvcm0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub09yZz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtci0zIGFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0aGlzLndvcmtpbmcgfHwgZm9ybS5pbnZhbGlkXCI+e3snQ3JlYXRlIG9yZ2FuaXNhdGlvbicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBbZGlzYWJsZWRdPVwidGhpcy53b3JraW5nXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhY3Rpb24tYnV0dG9uXCI+e3snQ2FuY2VsJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPSdtYXJnaW4tdG9wOiAxcmVtJz5cclxuICAgICAgICAgICAgICAgIDxoND57eyAnVXNlciBQZXJzb25hbCBJbmZvcm1hdGlvbicgfCB0cmFuc2xhdGUgfX08L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG5nYi1hbGVydCB0eXBlPVwid2FybmluZ1wiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiPnt7J1BsZWFzZSBjcmVhdGUgbmV3IG9yZ2FuaXNhdGlvbiBmaXJzdCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG4gICAgPC9mb3JtPlxyXG48L2Rpdj4iXX0=
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
import { Validators } from '@angular/forms';
|
|
3
|
-
import { textValidator, noEmptyValidator, emailValidator } from '@smarterplan/ngx-smarterplan-core';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/forms";
|
|
6
|
-
import * as i2 from "@smarterplan/ngx-smarterplan-core";
|
|
7
|
-
import * as i3 from "@ngx-translate/core";
|
|
8
|
-
import * as i4 from "@ng-bootstrap/ng-bootstrap";
|
|
9
|
-
import * as i5 from "@angular/common";
|
|
10
|
-
import * as i6 from "../form-mission/form-mission.component";
|
|
11
|
-
export class UserMissionFormComponent {
|
|
12
|
-
constructor(fb, userService, translate, validatorsService) {
|
|
13
|
-
this.fb = fb;
|
|
14
|
-
this.userService = userService;
|
|
15
|
-
this.translate = translate;
|
|
16
|
-
this.validatorsService = validatorsService;
|
|
17
|
-
this.createForExistingUser = false;
|
|
18
|
-
this.added = new EventEmitter();
|
|
19
|
-
this.working = false;
|
|
20
|
-
this.errorForm = false;
|
|
21
|
-
}
|
|
22
|
-
ngOnInit() {
|
|
23
|
-
this.onAddNewUserMissionToOrg();
|
|
24
|
-
}
|
|
25
|
-
async onAddNewUserMissionToOrg() {
|
|
26
|
-
this.form = this.fb.group({
|
|
27
|
-
email: [null, [Validators.required, emailValidator()]],
|
|
28
|
-
lastName: ["", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
29
|
-
firstName: ["", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
onCancel() {
|
|
33
|
-
this.added.emit(false);
|
|
34
|
-
}
|
|
35
|
-
get email() {
|
|
36
|
-
return this.form.get("email");
|
|
37
|
-
}
|
|
38
|
-
async onSubmit() {
|
|
39
|
-
if (!this.form.valid) {
|
|
40
|
-
this.errorForm = true;
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
this.working = true;
|
|
44
|
-
let p;
|
|
45
|
-
try {
|
|
46
|
-
const formValue = this.form.value;
|
|
47
|
-
p = await this.userService.profileForMail(formValue.email);
|
|
48
|
-
if (p) {
|
|
49
|
-
alert("User with this email exists already!");
|
|
50
|
-
this.working = false;
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
try {
|
|
54
|
-
const profile = await this.userService.createUserAWSandProfile(formValue, true);
|
|
55
|
-
console.log("User created!", profile.metadata);
|
|
56
|
-
this.createdUser = profile;
|
|
57
|
-
}
|
|
58
|
-
catch (error) {
|
|
59
|
-
this.working = false;
|
|
60
|
-
alert(this.translate.instant(JSON.stringify(error)));
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
console.error(error);
|
|
66
|
-
}
|
|
67
|
-
this.working = false;
|
|
68
|
-
}
|
|
69
|
-
// async updateAllMissionsFromTemplate(missionInput: UpdateMissionInput) {
|
|
70
|
-
// // all missions of this organisation
|
|
71
|
-
// const missionsFromTemplate =
|
|
72
|
-
// await this.missionService.getMissionsByTemplate(
|
|
73
|
-
// this.missionToEdit.id,
|
|
74
|
-
// );
|
|
75
|
-
// await Promise.all(
|
|
76
|
-
// missionsFromTemplate.map(async (mission) => {
|
|
77
|
-
// const missionTemplate = { ...missionInput };
|
|
78
|
-
// if (this.sendUpdate) {
|
|
79
|
-
// missionTemplate.emailStatus = EmailStatus.UPDATE_TO_DELIVER;
|
|
80
|
-
// }
|
|
81
|
-
// missionTemplate.id = mission.id;
|
|
82
|
-
// await this.missionService.update(missionTemplate);
|
|
83
|
-
// }),
|
|
84
|
-
// );
|
|
85
|
-
// }
|
|
86
|
-
async onMissionInput(mission) {
|
|
87
|
-
if (mission) {
|
|
88
|
-
this.missionInput = mission;
|
|
89
|
-
await this.userService.createOrUpdateMissionForOrgWithProperty(this.missionInput, this.missionInput.organisationID);
|
|
90
|
-
this.added.emit(true);
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
this.added.emit(false);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
isFormError(control) {
|
|
97
|
-
return control && control.invalid && this.errorForm;
|
|
98
|
-
}
|
|
99
|
-
onFormChange() {
|
|
100
|
-
if (this.errorForm && this.form.valid) {
|
|
101
|
-
this.errorForm = false;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
UserMissionFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserMissionFormComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.BaseUserService }, { token: i3.TranslateService }, { token: i2.ValidatorsService }], target: i0.ɵɵFactoryTarget.Component });
|
|
106
|
-
UserMissionFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UserMissionFormComponent, selector: "lib-user-mission-form", inputs: { addToOrganisation: "addToOrganisation", isSP: "isSP", createForExistingUser: "createForExistingUser", currentOrg: "currentOrg" }, outputs: { added: "added" }, ngImport: i0, template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div id=\"personalInfo\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" data-testid=\"new-user-email\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['email'])|| isFormError(form.controls['email'])}\"\r\n required formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-email-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['email']) \r\n || isFormError(form.controls['email'])\">\r\n {{validatorsService.getError(form.controls['email']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\" data-testid=\"new-user-lastName\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['lastName'])|| isFormError(form.controls['lastName'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-lastName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['lastName']) \r\n || isFormError(form.controls['lastName'])\">\r\n {{validatorsService.getError(form.controls['lastName']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\" data-testid=\"new-user-firstName\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['firstName'])|| isFormError(form.controls['firstName'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-firstName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['firstName']) \r\n || isFormError(form.controls['firstName'])\">\r\n {{validatorsService.getError(form.controls['firstName']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <div *ngIf=\"createdUser; else waitingForUser\">\r\n <div class=\"alert alert-info\">\r\n {{'User successfully created' | translate}}\r\n </div>\r\n <lib-form-mission [organisationForMission]=\"addToOrganisation\" [userForMissionID]=\"createdUser.id\"\r\n [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\" (addedMissionInput)=\"onMissionInput($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <ng-template #waitingForUser>\r\n <div class=\"action-button-container\">\r\n <button data-testid=\"new-user-submit-btn\" type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"working\">{{'Create user' | translate}}</button>\r\n <button data-testid=\"new-user-cancel-btn\" type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"new-user-form-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n </ngb-alert>\r\n </div>\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create a user first' | translate}}.</ngb-alert>\r\n\r\n </ng-template>\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], dependencies: [{ kind: "component", type: i4.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { kind: "component", type: i6.FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
|
|
107
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserMissionFormComponent, decorators: [{
|
|
108
|
-
type: Component,
|
|
109
|
-
args: [{ selector: 'lib-user-mission-form', template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div id=\"personalInfo\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" data-testid=\"new-user-email\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['email'])|| isFormError(form.controls['email'])}\"\r\n required formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-email-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['email']) \r\n || isFormError(form.controls['email'])\">\r\n {{validatorsService.getError(form.controls['email']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\" data-testid=\"new-user-lastName\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['lastName'])|| isFormError(form.controls['lastName'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-lastName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['lastName']) \r\n || isFormError(form.controls['lastName'])\">\r\n {{validatorsService.getError(form.controls['lastName']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\" data-testid=\"new-user-firstName\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['firstName'])|| isFormError(form.controls['firstName'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-firstName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['firstName']) \r\n || isFormError(form.controls['firstName'])\">\r\n {{validatorsService.getError(form.controls['firstName']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <div *ngIf=\"createdUser; else waitingForUser\">\r\n <div class=\"alert alert-info\">\r\n {{'User successfully created' | translate}}\r\n </div>\r\n <lib-form-mission [organisationForMission]=\"addToOrganisation\" [userForMissionID]=\"createdUser.id\"\r\n [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\" (addedMissionInput)=\"onMissionInput($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <ng-template #waitingForUser>\r\n <div class=\"action-button-container\">\r\n <button data-testid=\"new-user-submit-btn\" type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"working\">{{'Create user' | translate}}</button>\r\n <button data-testid=\"new-user-cancel-btn\" type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"new-user-form-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n </ngb-alert>\r\n </div>\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create a user first' | translate}}.</ngb-alert>\r\n\r\n </ng-template>\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
|
|
110
|
-
}], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i2.BaseUserService }, { type: i3.TranslateService }, { type: i2.ValidatorsService }]; }, propDecorators: { addToOrganisation: [{
|
|
111
|
-
type: Input
|
|
112
|
-
}], isSP: [{
|
|
113
|
-
type: Input
|
|
114
|
-
}], createForExistingUser: [{
|
|
115
|
-
type: Input
|
|
116
|
-
}], currentOrg: [{
|
|
117
|
-
type: Input
|
|
118
|
-
}], added: [{
|
|
119
|
-
type: Output
|
|
120
|
-
}] } });
|
|
121
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1taXNzaW9uLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdXNlci91c2VyLW1pc3Npb24tZm9ybS91c2VyLW1pc3Npb24tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL3VzZXItbWlzc2lvbi1mb3JtL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUF3QyxVQUFVLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkcsT0FBTyxFQUFzRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7O0FBT3hLLE1BQU0sT0FBTyx3QkFBd0I7SUFzQmpDLFlBQ1ksRUFBc0IsRUFDdEIsV0FBNEIsRUFDNUIsU0FBMkIsRUFDNUIsaUJBQW9DO1FBSG5DLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQ3RCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUM1QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBcEJ0QywwQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFNN0IsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFOUMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQU1oQixjQUFTLEdBQVksS0FBSyxDQUFDO0lBT3ZCLENBQUM7SUFFTCxRQUFRO1FBQ0osSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELEtB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SUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQ25DLENBQUM7WUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QjthQUFNO1lBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUI7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQU87UUFDZixPQUFPLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEQsQ0FBQztJQUdELFlBQVk7UUFDUixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDMUI7SUFFTCxDQUFDOztzSEE1SFEsd0JBQXdCOzBHQUF4Qix3QkFBd0Isc09DVnJDLGlsS0FtRk07NEZEekVPLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDSSx1QkFBdUI7c01BTXhCLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUksS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBPcmdhbmlzYXRpb24sIE1pc3Npb24sIFByb2ZpbGUsIEJhc2VVc2VyU2VydmljZSwgVmFsaWRhdG9yc1NlcnZpY2UsIHRleHRWYWxpZGF0b3IsIG5vRW1wdHlWYWxpZGF0b3IsIGVtYWlsVmFsaWRhdG9yIH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItdXNlci1taXNzaW9uLWZvcm0nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJNaXNzaW9uRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgQElucHV0KCkgYWRkVG9PcmdhbmlzYXRpb246IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBASW5wdXQoKSBpc1NQOiBib29sZWFuO1xyXG5cclxuICAgIEBJbnB1dCgpIGNyZWF0ZUZvckV4aXN0aW5nVXNlciA9IGZhbHNlO1xyXG5cclxuICAgIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcblxyXG4gICAgQElucHV0KCkgY3VycmVudE9yZzogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIEBPdXRwdXQoKSBhZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICB3b3JraW5nID0gZmFsc2U7XHJcblxyXG4gICAgbWlzc2lvbklucHV0OiBNaXNzaW9uO1xyXG5cclxuICAgIGNyZWF0ZWRVc2VyOiBQcm9maWxlO1xyXG5cclxuICAgIGVycm9yRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcclxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIHZhbGlkYXRvcnNTZXJ2aWNlOiBWYWxpZGF0b3JzU2VydmljZVxyXG4gICAgKSB7IH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLm9uQWRkTmV3VXNlck1pc3Npb25Ub09yZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQWRkTmV3VXNlck1pc3Npb25Ub09yZygpIHtcclxuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgZW1haWw6IFtudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgZW1haWxWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICBsYXN0TmFtZTogW1wiXCIsIFtWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpLCB0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICBmaXJzdE5hbWU6IFtcIlwiLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmFkZGVkLmVtaXQoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbWFpbCgpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFwiZW1haWxcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0udmFsaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvckZvcm0gPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLndvcmtpbmcgPSB0cnVlO1xyXG4gICAgICAgIGxldCBwOiBQcm9maWxlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZm9ybS52YWx1ZTtcclxuICAgICAgICAgICAgcCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UucHJvZmlsZUZvck1haWwoZm9ybVZhbHVlLmVtYWlsKTtcclxuICAgICAgICAgICAgaWYgKHApIHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KFwiVXNlciB3aXRoIHRoaXMgZW1haWwgZXhpc3RzIGFscmVhZHkhXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZVVzZXJBV1NhbmRQcm9maWxlKFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVXNlciBjcmVhdGVkIVwiLCBwcm9maWxlLm1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlZFVzZXIgPSBwcm9maWxlO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBhbGVydCh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KEpTT04uc3RyaW5naWZ5KGVycm9yKSkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFzeW5jIHVwZGF0ZUFsbE1pc3Npb25zRnJvbVRlbXBsYXRlKG1pc3Npb25JbnB1dDogVXBkYXRlTWlzc2lvbklucHV0KSB7XHJcbiAgICAvLyAgICAgLy8gYWxsIG1pc3Npb25zIG9mIHRoaXMgb3JnYW5pc2F0aW9uXHJcbiAgICAvLyAgICAgY29uc3QgbWlzc2lvbnNGcm9tVGVtcGxhdGUgPVxyXG4gICAgLy8gICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zQnlUZW1wbGF0ZShcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMubWlzc2lvblRvRWRpdC5pZCxcclxuICAgIC8vICAgICAgICAgKTtcclxuICAgIC8vICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgIC8vICAgICAgICAgbWlzc2lvbnNGcm9tVGVtcGxhdGUubWFwKGFzeW5jIChtaXNzaW9uKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBtaXNzaW9uVGVtcGxhdGUgPSB7IC4uLm1pc3Npb25JbnB1dCB9O1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2VuZFVwZGF0ZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIG1pc3Npb25UZW1wbGF0ZS5lbWFpbFN0YXR1cyA9IEVtYWlsU3RhdHVzLlVQREFURV9UT19ERUxJVkVSO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgbWlzc2lvblRlbXBsYXRlLmlkID0gbWlzc2lvbi5pZDtcclxuICAgIC8vICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UudXBkYXRlKG1pc3Npb25UZW1wbGF0ZSk7XHJcbiAgICAvLyAgICAgICAgIH0pLFxyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgYXN5bmMgb25NaXNzaW9uSW5wdXQobWlzc2lvbjogTWlzc2lvbikge1xyXG4gICAgICAgIGlmIChtaXNzaW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWlzc2lvbklucHV0ID0gbWlzc2lvbjtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVPclVwZGF0ZU1pc3Npb25Gb3JPcmdXaXRoUHJvcGVydHkoXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1pc3Npb25JbnB1dCBhcyBNaXNzaW9uLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5taXNzaW9uSW5wdXQub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWQuZW1pdCh0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpc0Zvcm1FcnJvcihjb250cm9sKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRyb2wgJiYgY29udHJvbC5pbnZhbGlkICYmIHRoaXMuZXJyb3JGb3JtO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBvbkZvcm1DaGFuZ2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JGb3JtICYmIHRoaXMuZm9ybS52YWxpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yRm9ybSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAqbmdJZj1cImZvcm1cIj5cclxuICAgIDxmb3JtIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgPGRpdiBpZD1cInBlcnNvbmFsSW5mb1wiPlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cclxuICAgICAgICAgICAgICAgIDxoND57eyAnVXNlciBQZXJzb25hbCBJbmZvcm1hdGlvbicgfCB0cmFuc2xhdGUgfX08L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0VtYWlsJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWVtYWlsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJyA6IHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2VtYWlsJ10pfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2VtYWlsJ10pfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWVtYWlsLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydlbWFpbCddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snZW1haWwnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snZW1haWwnXSkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTGFzdCBuYW1lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibGFzdE5hbWVcIiBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWxhc3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSl8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWxhc3ROYW1lLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydsYXN0TmFtZSddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRmlyc3QgbmFtZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImZpcnN0TmFtZVwiIGRhdGEtdGVzdGlkPVwibmV3LXVzZXItZmlyc3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snZmlyc3ROYW1lJ10pfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwibmV3LXVzZXItZmlyc3ROYW1lLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydmaXJzdE5hbWUnXSkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWydmaXJzdE5hbWUnXSkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJ3b3JraW5nXCI+XHJcbiAgICAgICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImNyZWF0ZWRVc2VyOyBlbHNlIHdhaXRpbmdGb3JVc2VyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICB7eydVc2VyIHN1Y2Nlc3NmdWxseSBjcmVhdGVkJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bGliLWZvcm0tbWlzc2lvbiBbb3JnYW5pc2F0aW9uRm9yTWlzc2lvbl09XCJhZGRUb09yZ2FuaXNhdGlvblwiIFt1c2VyRm9yTWlzc2lvbklEXT1cImNyZWF0ZWRVc2VyLmlkXCJcclxuICAgICAgICAgICAgICAgIFtjdXJyZW50VXNlck9yZ2FuaXNhdGlvbl09XCJjdXJyZW50T3JnXCIgW2lzU1BdPVwiaXNTUFwiIChhZGRlZE1pc3Npb25JbnB1dCk9XCJvbk1pc3Npb25JbnB1dCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDwvbGliLWZvcm0tbWlzc2lvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI3dhaXRpbmdGb3JVc2VyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS10ZXN0aWQ9XCJuZXctdXNlci1zdWJtaXQtYnRuXCIgdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1yLTMgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndvcmtpbmdcIj57eydDcmVhdGUgdXNlcicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWNhbmNlbC1idG5cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBbZGlzYWJsZWRdPVwid29ya2luZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiPnt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIiAqbmdJZj1cImVycm9yRm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWZvcm0taW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eydlcnJvckZvcm0uaW5mb0J0bicgfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtO1wiPlxyXG4gICAgICAgICAgICAgICAgPGg0Pnt7ICdNaXNzaW9uIGRldGFpbHMnIHwgdHJhbnNsYXRlIH19PC9oND5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZ2ItYWxlcnQgdHlwZT1cIndhcm5pbmdcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIj57eydQbGVhc2UgY3JlYXRlIGEgdXNlciBmaXJzdCcgfCB0cmFuc2xhdGV9fS48L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZm9ybT5cclxuPC9kaXY+Il19
|