@smarterplan/ngx-smarterplan-admin 0.1.27

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.
Files changed (46) hide show
  1. package/README.md +24 -0
  2. package/esm2020/lib/admin/admin.component.mjs +33 -0
  3. package/esm2020/lib/chevron/chevron.component.mjs +19 -0
  4. package/esm2020/lib/guest-link/guest-link.component.mjs +62 -0
  5. package/esm2020/lib/guide.guard.mjs +25 -0
  6. package/esm2020/lib/name-from-id.pipe.mjs +29 -0
  7. package/esm2020/lib/ngx-smarterplan-admin-routing.module.mjs +47 -0
  8. package/esm2020/lib/ngx-smarterplan-admin.module.mjs +90 -0
  9. package/esm2020/lib/ngx-smarterplan-admin.service.mjs +14 -0
  10. package/esm2020/lib/organisation/organisation.component.mjs +166 -0
  11. package/esm2020/lib/sp-admin.guard.mjs +31 -0
  12. package/esm2020/lib/user/detail-organisation/detail-organisation.component.mjs +160 -0
  13. package/esm2020/lib/user/form-mission/form-mission.component.mjs +205 -0
  14. package/esm2020/lib/user/form-organisation/form-organisation.component.mjs +125 -0
  15. package/esm2020/lib/user/user-mission-form/user-mission-form.component.mjs +106 -0
  16. package/esm2020/lib/user/user.component.mjs +325 -0
  17. package/esm2020/lib/visitor/create-batch/create-batch.component.mjs +108 -0
  18. package/esm2020/lib/visitor/template/template.component.mjs +219 -0
  19. package/esm2020/lib/visitor/visitor.component.mjs +284 -0
  20. package/esm2020/public-api.mjs +6 -0
  21. package/esm2020/smarterplan-ngx-smarterplan-admin.mjs +5 -0
  22. package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs +2026 -0
  23. package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs.map +1 -0
  24. package/fesm2020/smarterplan-ngx-smarterplan-admin.mjs +1921 -0
  25. package/fesm2020/smarterplan-ngx-smarterplan-admin.mjs.map +1 -0
  26. package/lib/admin/admin.component.d.ts +13 -0
  27. package/lib/chevron/chevron.component.d.ts +9 -0
  28. package/lib/guest-link/guest-link.component.d.ts +20 -0
  29. package/lib/guide.guard.d.ts +11 -0
  30. package/lib/name-from-id.pipe.d.ts +11 -0
  31. package/lib/ngx-smarterplan-admin-routing.module.d.ts +7 -0
  32. package/lib/ngx-smarterplan-admin.module.d.ts +26 -0
  33. package/lib/ngx-smarterplan-admin.service.d.ts +6 -0
  34. package/lib/organisation/organisation.component.d.ts +53 -0
  35. package/lib/sp-admin.guard.d.ts +12 -0
  36. package/lib/user/detail-organisation/detail-organisation.component.d.ts +39 -0
  37. package/lib/user/form-mission/form-mission.component.d.ts +54 -0
  38. package/lib/user/form-organisation/form-organisation.component.d.ts +32 -0
  39. package/lib/user/user-mission-form/user-mission-form.component.d.ts +28 -0
  40. package/lib/user/user.component.d.ts +100 -0
  41. package/lib/visitor/create-batch/create-batch.component.d.ts +23 -0
  42. package/lib/visitor/template/template.component.d.ts +52 -0
  43. package/lib/visitor/visitor.component.d.ts +65 -0
  44. package/package.json +39 -0
  45. package/public-api.d.ts +2 -0
  46. package/smarterplan-ngx-smarterplan-admin.d.ts +5 -0
@@ -0,0 +1,166 @@
1
+ import { Component } from "@angular/core";
2
+ import { Validators, } from "@angular/forms";
3
+ import { ProfileEntity, removeNullKeysFromObject, RoleStatus } from "ngx-smarterplan-core";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "ngx-smarterplan-core";
6
+ import * as i2 from "@angular/forms";
7
+ import * as i3 from "@ngx-translate/core";
8
+ import * as i4 from "../chevron/chevron.component";
9
+ import * as i5 from "@angular/common";
10
+ export class OrganisationComponent {
11
+ constructor(orgService, fb, userService, missionService, translate, propertyService) {
12
+ this.orgService = orgService;
13
+ this.fb = fb;
14
+ this.userService = userService;
15
+ this.missionService = missionService;
16
+ this.translate = translate;
17
+ this.propertyService = propertyService;
18
+ this.admins = [];
19
+ this.clients = [];
20
+ this.details = -1;
21
+ this.query = "";
22
+ this.error = null;
23
+ this.create = false;
24
+ this.working = false;
25
+ this.isAddingAdmin = false;
26
+ this.loading = false;
27
+ this.editing = false;
28
+ // fullAccess true gives access to all orgs
29
+ // this is reserved to Smarterplan ADMINs
30
+ this.fullAccess = false;
31
+ }
32
+ async ngOnInit() {
33
+ this.resetList();
34
+ }
35
+ /**
36
+ * resetList fetches a fresh organisation list from server
37
+ */
38
+ async resetList() {
39
+ this.loading = true;
40
+ await this.missionService
41
+ .getMissionsByOrderedOrganisation("6e28201f-4679-4c29-9d2d-8a325f57cee9")
42
+ .then(async (missions) => {
43
+ if (missions) {
44
+ const client = {};
45
+ await Promise.all(missions.map(async (m) => {
46
+ if (!client.hasOwnProperty(m.organisationID)) {
47
+ client[m.organisationID] = {
48
+ name: m.organisation.name,
49
+ organisation: m.organisation,
50
+ adminMissions: [],
51
+ properties: [],
52
+ };
53
+ }
54
+ if (m.role === RoleStatus.ADMIN && !m.deletedAt) {
55
+ const alreadyAdmin = client[m.organisationID].adminMissions.filter((mis) => mis.user.id === m.userID);
56
+ if (alreadyAdmin.length === 0) {
57
+ client[m.organisationID].adminMissions.push({
58
+ user: new ProfileEntity(m.user),
59
+ mission: m,
60
+ });
61
+ }
62
+ }
63
+ // get properties
64
+ const properties = await this.propertyService.getPropertiesForOrganisation(m.organisationID);
65
+ client[m.organisationID].properties = properties
66
+ .filter((property) => !property.deletedAt && property.space)
67
+ .map((property) => property.space.name);
68
+ }));
69
+ this.clients = Object.values(client);
70
+ }
71
+ this.loading = false;
72
+ });
73
+ }
74
+ /**
75
+ * onToggleDetail folds/unfolds details for a given organisation
76
+ * @param i index of the organisation to be toggled
77
+ */
78
+ onToggleDetail(index) {
79
+ this.details = index === this.details ? -1 : index;
80
+ }
81
+ onAdd() {
82
+ this.create = true;
83
+ this.form = this.fb.group({
84
+ name: [null, [Validators.required]],
85
+ address: [""],
86
+ city: [""],
87
+ postal: [null],
88
+ siret: [null],
89
+ });
90
+ }
91
+ onEdit(org) {
92
+ this.create = false;
93
+ this.editing = true;
94
+ this.form = this.fb.group({
95
+ id: [org.id],
96
+ name: [org.name, [Validators.required]],
97
+ address: [org.address],
98
+ city: [org.city],
99
+ postal: [org.postal],
100
+ siret: [org.siret],
101
+ });
102
+ }
103
+ onCancel() {
104
+ // this.form = null;
105
+ this.form.reset();
106
+ this.create = false;
107
+ this.editing = false;
108
+ }
109
+ get name() {
110
+ return this.form.get("name");
111
+ }
112
+ get email() {
113
+ return this.form.get("user").get("email");
114
+ }
115
+ /**
116
+ * Handle creation or update of organisation
117
+ * @see 174
118
+ */
119
+ async onSubmitOrg() {
120
+ this.working = true;
121
+ const formValue = this.form.value;
122
+ removeNullKeysFromObject(formValue);
123
+ try {
124
+ if (this.create) {
125
+ const organisation = await this.orgService.createOrganisation(formValue);
126
+ }
127
+ else {
128
+ await this.orgService.updateOrganisation(formValue);
129
+ }
130
+ }
131
+ catch (error) {
132
+ this.error = true;
133
+ console.error(error);
134
+ }
135
+ await this.resetList();
136
+ this.working = false;
137
+ this.create = false;
138
+ this.editing = false;
139
+ this.form.reset();
140
+ }
141
+ onArchive(_) {
142
+ console.log("Unimplemented");
143
+ }
144
+ onDismiss() {
145
+ this.error = null;
146
+ }
147
+ async onDeleteOrg(org) {
148
+ const message = this.translate.instant("confirm.deleteOrganisation");
149
+ if (window.confirm(message) &&
150
+ org.id !== "6e28201f-4679-4c29-9d2d-8a325f57cee9") {
151
+ const propertiesToDelete = await this.propertyService.getPropertiesForOrganisation(org.id);
152
+ await this.orgService.deleteOrganisation(org.id);
153
+ (await this.missionService.getMissionsByOrganisation(org.id)).map((m) => this.missionService.softDeleteMission(m.id));
154
+ await Promise.all(propertiesToDelete.map(async (property) => {
155
+ await this.propertyService.deleteProperty(property.id);
156
+ }));
157
+ }
158
+ }
159
+ }
160
+ OrganisationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: OrganisationComponent, deps: [{ token: i1.OrganisationService }, { token: i2.FormBuilder }, { token: i1.BaseUserService }, { token: i1.MissionService }, { token: i3.TranslateService }, { token: i1.PropertyService }], target: i0.ɵɵFactoryTarget.Component });
161
+ OrganisationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: OrganisationComponent, selector: "lib-organisation", ngImport: i0, template: "<div class=\"container-fluid\" class=\"dashboard-tab\">\r\n <h3>{{'SmarterPlan Client Organisations' | translate}}</h3>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n\r\n <div *ngIf=\"error\" class=\"alert alert-danger alert-dismissible fade show\" role=\"alert\">\r\n <strong>{{'Error' | translate}}!</strong> We haven't been able to fulfil your request.\r\n <button type=\"button\" class=\"close\" data-dismiss=\"alert\" (click)=\"onDismiss()\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"!create && !editing\">\r\n <div class=\"d-flex justify-content-between align-items-center p-1\">\r\n <input class=\"form-control search-button\" [(ngModel)]=\"query\" i18n-placeholder placeholder=\"Search\"\r\n type=\"text\">&nbsp;\r\n </div>\r\n <!-- <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onAdd()\">{{'Add new client organisation' |\r\n translate}}</button> -->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of clients; index as index\"\r\n (click)=\"onToggleDetail(index)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.name}}\r\n <lib-chevron [conditionShowing]=\"index==details\"></lib-chevron>\r\n <!-- <ic-icon [icon]=\"index==details ? chevronDown : chevronRight\"></ic-icon> -->\r\n </div>\r\n\r\n <div *ngIf=\"index==details\">\r\n <ul class=\"list-group list-group-flush\">\r\n <!-- <li class=\"list-group-item bg-transparent\">{{'Activit\u00E9' | translate}}</li> -->\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{ a.organisation.address }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{ 'Postal Code' | translate}}: {{ a.organisation.postal }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate}}: {{ a.organisation.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate}}: {{ a.organisation.siret ?\r\n a.organisation.siret : 'Not provided' | translate }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Created' | translate}}: {{ a.organisation.createdAt }}\r\n </li>\r\n <ng-container *ngIf=\"a.adminMissions.length > 0\">\r\n <li *ngIf=\"a.adminMissions.length <= 1\" class=\"list-group-item bg-transparent\">\r\n {{'Administrator User' | translate}} :</li>\r\n <li *ngIf=\"a.adminMissions.length > 1\" class=\"list-group-item bg-transparent\">\r\n {{'Administrator User(s)' | translate}} :</li>\r\n <li class=\"list-group-item list-group-item-action\"\r\n *ngFor=\"let admin of a.adminMissions; index as index\" (click)=\"onToggleDetail(index)\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"ml-4\"> {{admin.user.displayName}} ({{admin.user.email}})\r\n <!-- <button type=\"button\" class=\"btn btn-primary rounded-pill\" style=\"float: right;\"\r\n (click)=\"onRemoveAdmin(admin)\">\r\n {{'Remove'|translate}}</button> \r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Phone'}}: {{admin.user.phone}}</li> -->\r\n </ul>\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"a.adminMissions.length == 0\">\r\n <li class=\"list-group-item bg-warning\"><span class=\"badge badge-warning\">\r\n {{'Warning' | translate}}</span> {{'No Administrator User'| translate}} </li>\r\n </ng-container>\r\n <ng-container *ngIf=\"a.properties.length > 0\">\r\n <li class=\"list-group-item bg-transparent\">{{'Locations' | translate}}: </li>\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let property of a.properties\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"ml-4\">{{property}}</li>\r\n </ul>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onEdit(a.organisation)\">\r\n {{'Edit' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onArchive(a.organisation)\" disabled>\r\n {{'Archive' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onDeleteOrg(a.organisation)\">\r\n {{'Delete' | translate}}</button>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"form && (create || editing)\">\r\n <form (ngSubmit)=\"onSubmitOrg()\" [formGroup]=\"form\">\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 {{'A name is required' | 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 <div *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"working || form.invalid\">{{'Save' | translate}}</button>\r\n <button 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 </form>\r\n </div>\r\n <!--<spOrganisationForm [model]=\" editingOrganisation\" (submit)=\"onSave($event)\" (cancel)=\"onCancel()\">\r\n </spOrganisationForm>-->\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- <div>{{'Administrator User' | translate}}</div>\r\n <div formGroupName=\"user\" *ngIf=\"create || isAddingAdmin\">\r\n <div *ngIf=\"form\" class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"email.invalid && email.touched\" required\r\n formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n {{'An email is required' | 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\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\">\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\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\">\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\">{{'Phone' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"phone\">\r\n </div>\r\n </div>\r\n </div> -->", styles: [".form-group{margin:1.5rem 0}.search-button{width:-moz-fit-content;width:fit-content}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], components: [{ type: i1.LoaderComponent, selector: "lib-loader" }, { type: i4.ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], pipes: { "translate": i3.TranslatePipe } });
162
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: OrganisationComponent, decorators: [{
163
+ type: Component,
164
+ args: [{ selector: 'lib-organisation', template: "<div class=\"container-fluid\" class=\"dashboard-tab\">\r\n <h3>{{'SmarterPlan Client Organisations' | translate}}</h3>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n\r\n <div *ngIf=\"error\" class=\"alert alert-danger alert-dismissible fade show\" role=\"alert\">\r\n <strong>{{'Error' | translate}}!</strong> We haven't been able to fulfil your request.\r\n <button type=\"button\" class=\"close\" data-dismiss=\"alert\" (click)=\"onDismiss()\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"!create && !editing\">\r\n <div class=\"d-flex justify-content-between align-items-center p-1\">\r\n <input class=\"form-control search-button\" [(ngModel)]=\"query\" i18n-placeholder placeholder=\"Search\"\r\n type=\"text\">&nbsp;\r\n </div>\r\n <!-- <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onAdd()\">{{'Add new client organisation' |\r\n translate}}</button> -->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of clients; index as index\"\r\n (click)=\"onToggleDetail(index)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.name}}\r\n <lib-chevron [conditionShowing]=\"index==details\"></lib-chevron>\r\n <!-- <ic-icon [icon]=\"index==details ? chevronDown : chevronRight\"></ic-icon> -->\r\n </div>\r\n\r\n <div *ngIf=\"index==details\">\r\n <ul class=\"list-group list-group-flush\">\r\n <!-- <li class=\"list-group-item bg-transparent\">{{'Activit\u00E9' | translate}}</li> -->\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{ a.organisation.address }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{ 'Postal Code' | translate}}: {{ a.organisation.postal }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate}}: {{ a.organisation.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate}}: {{ a.organisation.siret ?\r\n a.organisation.siret : 'Not provided' | translate }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Created' | translate}}: {{ a.organisation.createdAt }}\r\n </li>\r\n <ng-container *ngIf=\"a.adminMissions.length > 0\">\r\n <li *ngIf=\"a.adminMissions.length <= 1\" class=\"list-group-item bg-transparent\">\r\n {{'Administrator User' | translate}} :</li>\r\n <li *ngIf=\"a.adminMissions.length > 1\" class=\"list-group-item bg-transparent\">\r\n {{'Administrator User(s)' | translate}} :</li>\r\n <li class=\"list-group-item list-group-item-action\"\r\n *ngFor=\"let admin of a.adminMissions; index as index\" (click)=\"onToggleDetail(index)\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"ml-4\"> {{admin.user.displayName}} ({{admin.user.email}})\r\n <!-- <button type=\"button\" class=\"btn btn-primary rounded-pill\" style=\"float: right;\"\r\n (click)=\"onRemoveAdmin(admin)\">\r\n {{'Remove'|translate}}</button> \r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Phone'}}: {{admin.user.phone}}</li> -->\r\n </ul>\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"a.adminMissions.length == 0\">\r\n <li class=\"list-group-item bg-warning\"><span class=\"badge badge-warning\">\r\n {{'Warning' | translate}}</span> {{'No Administrator User'| translate}} </li>\r\n </ng-container>\r\n <ng-container *ngIf=\"a.properties.length > 0\">\r\n <li class=\"list-group-item bg-transparent\">{{'Locations' | translate}}: </li>\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let property of a.properties\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"ml-4\">{{property}}</li>\r\n </ul>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onEdit(a.organisation)\">\r\n {{'Edit' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onArchive(a.organisation)\" disabled>\r\n {{'Archive' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onDeleteOrg(a.organisation)\">\r\n {{'Delete' | translate}}</button>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"form && (create || editing)\">\r\n <form (ngSubmit)=\"onSubmitOrg()\" [formGroup]=\"form\">\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 {{'A name is required' | 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 <div *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"working || form.invalid\">{{'Save' | translate}}</button>\r\n <button 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 </form>\r\n </div>\r\n <!--<spOrganisationForm [model]=\" editingOrganisation\" (submit)=\"onSave($event)\" (cancel)=\"onCancel()\">\r\n </spOrganisationForm>-->\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- <div>{{'Administrator User' | translate}}</div>\r\n <div formGroupName=\"user\" *ngIf=\"create || isAddingAdmin\">\r\n <div *ngIf=\"form\" class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"email.invalid && email.touched\" required\r\n formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n {{'An email is required' | 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\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\">\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\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\">\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\">{{'Phone' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"phone\">\r\n </div>\r\n </div>\r\n </div> -->", styles: [".form-group{margin:1.5rem 0}.search-button{width:-moz-fit-content;width:fit-content}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
165
+ }], ctorParameters: function () { return [{ type: i1.OrganisationService }, { type: i2.FormBuilder }, { type: i1.BaseUserService }, { type: i1.MissionService }, { type: i3.TranslateService }, { type: i1.PropertyService }]; } });
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pc2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1hZG1pbi9zcmMvbGliL29yZ2FuaXNhdGlvbi9vcmdhbmlzYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvb3JnYW5pc2F0aW9uL29yZ2FuaXNhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFJSCxVQUFVLEdBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQWtILGFBQWEsRUFBbUIsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7QUFRNU4sTUFBTSxPQUFPLHFCQUFxQjtJQWdDOUIsWUFDWSxVQUErQixFQUMvQixFQUFlLEVBQ2YsV0FBNEIsRUFDNUIsY0FBOEIsRUFDOUIsU0FBMkIsRUFDM0IsZUFBZ0M7UUFMaEMsZUFBVSxHQUFWLFVBQVUsQ0FBcUI7UUFDL0IsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0Isb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBcEM5QyxXQUFNLEdBQUcsRUFBRSxDQUFDO1FBRVYsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUViLFlBQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUViLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFWCxVQUFLLEdBQUcsSUFBSSxDQUFDO1FBSWIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUVmLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFaEIsa0JB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QUVELFNBQVM7UUFDTCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFpQjtRQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ3JFLElBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDdkIsR0FBRyxDQUFDLEVBQUUsS0FBSyxzQ0FBc0MsRUFDbkQ7WUFDRSxNQUFNLGtCQUFrQixHQUNwQixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakQsQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUM3RCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ3JELENBQUM7WUFDRixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2Isa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTtnQkFDdEMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0QsQ0FBQyxDQUFDLENBQ0wsQ0FBQztTQUNMO0lBQ0wsQ0FBQzs7a0hBek1RLHFCQUFxQjtzR0FBckIscUJBQXFCLHdEQ2ZsQyx1dVRBbUxzQjsyRkRwS1QscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gICAgRm9ybUJ1aWxkZXIsXG4gICAgRm9ybUdyb3VwLFxuICAgIEFic3RyYWN0Q29udHJvbCxcbiAgICBWYWxpZGF0b3JzLFxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IEJhc2VVc2VyU2VydmljZSwgRW1haWxTdGF0dXMsIExldmVsU3RhdHVzLCBNaXNzaW9uLCBNaXNzaW9uU2VydmljZSwgT3JnYW5pc2F0aW9uLCBPcmdhbmlzYXRpb25TZXJ2aWNlLCBQcm9maWxlLCBQcm9maWxlRW50aXR5LCBQcm9wZXJ0eVNlcnZpY2UsIHJlbW92ZU51bGxLZXlzRnJvbU9iamVjdCwgUm9sZVN0YXR1cyB9IGZyb20gXCJuZ3gtc21hcnRlcnBsYW4tY29yZVwiO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1vcmdhbmlzYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vb3JnYW5pc2F0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vb3JnYW5pc2F0aW9uLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgT3JnYW5pc2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBhZG1pbnMgPSBbXTtcblxuICAgIGNsaWVudHMgPSBbXTtcblxuICAgIGRldGFpbHMgPSAtMTtcblxuICAgIHF1ZXJ5ID0gXCJcIjtcblxuICAgIGVycm9yID0gbnVsbDtcblxuICAgIGZvcm06IEZvcm1Hcm91cDtcblxuICAgIGNyZWF0ZSA9IGZhbHNlO1xuXG4gICAgd29ya2luZyA9IGZhbHNlO1xuXG4gICAgaXNBZGRpbmdBZG1pbiA9IGZhbHNlO1xuXG4gICAgbWU6IFByb2ZpbGU7XG5cbiAgICBvcmc6IE9yZ2FuaXNhdGlvbjtcblxuICAgIGxvYWRpbmcgPSBmYWxzZTtcblxuICAgIGVkaXRpbmcgPSBmYWxzZTtcblxuICAgIC8vIGZ1bGxBY2Nlc3MgdHJ1ZSBnaXZlcyBhY2Nlc3MgdG8gYWxsIG9yZ3NcbiAgICAvLyB0aGlzIGlzIHJlc2VydmVkIHRvIFNtYXJ0ZXJwbGFuIEFETUlOc1xuICAgIGZ1bGxBY2Nlc3M6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIG9yZ1NlcnZpY2U6IE9yZ2FuaXNhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbWlzc2lvblNlcnZpY2U6IE1pc3Npb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwcm9wZXJ0eVNlcnZpY2U6IFByb3BlcnR5U2VydmljZSxcbiAgICApIHt9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5yZXNldExpc3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXNldExpc3QgZmV0Y2hlcyBhIGZyZXNoIG9yZ2FuaXNhdGlvbiBsaXN0IGZyb20gc2VydmVyXG4gICAgICovXG4gICAgYXN5bmMgcmVzZXRMaXN0KCkge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0TWlzc2lvbnNCeU9yZGVyZWRPcmdhbmlzYXRpb24oXG4gICAgICAgICAgICAgICAgXCI2ZTI4MjAxZi00Njc5LTRjMjktOWQyZC04YTMyNWY1N2NlZTlcIixcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC50aGVuKGFzeW5jIChtaXNzaW9ucykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtaXNzaW9ucykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGllbnQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW9ucy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsaWVudC5oYXNPd25Qcm9wZXJ0eShtLm9yZ2FuaXNhdGlvbklEKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRbbS5vcmdhbmlzYXRpb25JRF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBtLm9yZ2FuaXNhdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnYW5pc2F0aW9uOiBtLm9yZ2FuaXNhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkbWluTWlzc2lvbnM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtLnJvbGUgPT09IFJvbGVTdGF0dXMuQURNSU4gJiYgIW0uZGVsZXRlZEF0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFscmVhZHlBZG1pbiA9IGNsaWVudFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ub3JnYW5pc2F0aW9uSURcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5hZG1pbk1pc3Npb25zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtaXMpID0+IG1pcy51c2VyLmlkID09PSBtLnVzZXJJRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscmVhZHlBZG1pbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFttLm9yZ2FuaXNhdGlvbklEXS5hZG1pbk1pc3Npb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyOiBuZXcgUHJvZmlsZUVudGl0eShtLnVzZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW9uOiBtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvcGVydHlTZXJ2aWNlLmdldFByb3BlcnRpZXNGb3JPcmdhbmlzYXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLm9yZ2FuaXNhdGlvbklELFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFttLm9yZ2FuaXNhdGlvbklEXS5wcm9wZXJ0aWVzID0gcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BlcnR5KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFwcm9wZXJ0eS5kZWxldGVkQXQgJiYgcHJvcGVydHkuc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LnNwYWNlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50cyA9IE9iamVjdC52YWx1ZXMoY2xpZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBvblRvZ2dsZURldGFpbCBmb2xkcy91bmZvbGRzIGRldGFpbHMgZm9yIGEgZ2l2ZW4gb3JnYW5pc2F0aW9uXG4gICAgICogQHBhcmFtIGkgaW5kZXggb2YgdGhlIG9yZ2FuaXNhdGlvbiB0byBiZSB0b2dnbGVkXG4gICAgICovXG4gICAgb25Ub2dnbGVEZXRhaWwoaW5kZXgpIHtcbiAgICAgICAgdGhpcy5kZXRhaWxzID0gaW5kZXggPT09IHRoaXMuZGV0YWlscyA/IC0xIDogaW5kZXg7XG4gICAgfVxuXG4gICAgb25BZGQoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgbmFtZTogW251bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICAgICAgICAgICAgYWRkcmVzczogW1wiXCJdLFxuICAgICAgICAgICAgICAgIGNpdHk6IFtcIlwiXSxcbiAgICAgICAgICAgICAgICBwb3N0YWw6IFtudWxsXSxcbiAgICAgICAgICAgICAgICBzaXJldDogW251bGxdLFxuICAgICAgICAgICAgXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRWRpdChvcmc6IE9yZ2FuaXNhdGlvbikge1xuICAgICAgICB0aGlzLmNyZWF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVkaXRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgICAgICBpZDogW29yZy5pZF0sXG4gICAgICAgICAgICAgICAgbmFtZTogW29yZy5uYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgICAgICAgICAgIGFkZHJlc3M6IFtvcmcuYWRkcmVzc10sXG4gICAgICAgICAgICAgICAgY2l0eTogW29yZy5jaXR5XSxcbiAgICAgICAgICAgICAgICBwb3N0YWw6IFtvcmcucG9zdGFsXSxcbiAgICAgICAgICAgICAgICBzaXJldDogW29yZy5zaXJldF0sXG4gICAgICAgICAgIFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkNhbmNlbCgpIHtcbiAgICAgICAgLy8gdGhpcy5mb3JtID0gbnVsbDtcbiAgICAgICAgdGhpcy5mb3JtLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuY3JlYXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBuYW1lKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFwibmFtZVwiKTtcbiAgICB9XG5cbiAgICBnZXQgZW1haWwoKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoXCJ1c2VyXCIpLmdldChcImVtYWlsXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBjcmVhdGlvbiBvciB1cGRhdGUgb2Ygb3JnYW5pc2F0aW9uXG4gICAgICogQHNlZSAxNzRcbiAgICAgKi9cbiAgICBhc3luYyBvblN1Ym1pdE9yZygpIHtcbiAgICAgICAgdGhpcy53b3JraW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5mb3JtLnZhbHVlO1xuICAgICAgICByZW1vdmVOdWxsS2V5c0Zyb21PYmplY3QoZm9ybVZhbHVlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9yZ2FuaXNhdGlvbiA9IGF3YWl0IHRoaXMub3JnU2VydmljZS5jcmVhdGVPcmdhbmlzYXRpb24oZm9ybVZhbHVlIGFzIE9yZ2FuaXNhdGlvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub3JnU2VydmljZS51cGRhdGVPcmdhbmlzYXRpb24oZm9ybVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNldExpc3QoKTtcbiAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3JlYXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcbiAgICB9XG5cbiAgICBvbkFyY2hpdmUoXykge1xuICAgICAgICBjb25zb2xlLmxvZyhcIlVuaW1wbGVtZW50ZWRcIik7XG4gICAgfVxuXG4gICAgb25EaXNtaXNzKCkge1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB9XG5cbiAgICBhc3luYyBvbkRlbGV0ZU9yZyhvcmc6IE9yZ2FuaXNhdGlvbikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChcImNvbmZpcm0uZGVsZXRlT3JnYW5pc2F0aW9uXCIpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB3aW5kb3cuY29uZmlybShtZXNzYWdlKSAmJlxuICAgICAgICAgICAgb3JnLmlkICE9PSBcIjZlMjgyMDFmLTQ2NzktNGMyOS05ZDJkLThhMzI1ZjU3Y2VlOVwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllc1RvRGVsZXRlID1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb3BlcnR5U2VydmljZS5nZXRQcm9wZXJ0aWVzRm9yT3JnYW5pc2F0aW9uKG9yZy5pZCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9yZ1NlcnZpY2UuZGVsZXRlT3JnYW5pc2F0aW9uKG9yZy5pZCk7XG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5nZXRNaXNzaW9uc0J5T3JnYW5pc2F0aW9uKG9yZy5pZCkpLm1hcChcbiAgICAgICAgICAgICAgICAobSkgPT4gdGhpcy5taXNzaW9uU2VydmljZS5zb2Z0RGVsZXRlTWlzc2lvbihtLmlkKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVG9EZWxldGUubWFwKGFzeW5jIChwcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb3BlcnR5U2VydmljZS5kZWxldGVQcm9wZXJ0eShwcm9wZXJ0eS5pZCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCIgY2xhc3M9XCJkYXNoYm9hcmQtdGFiXCI+XHJcbiAgPGgzPnt7J1NtYXJ0ZXJQbGFuIENsaWVudCBPcmdhbmlzYXRpb25zJyB8IHRyYW5zbGF0ZX19PC9oMz5cclxuICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTggY29sLWxnLTZcIj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJlcnJvclwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGFsZXJ0LWRpc21pc3NpYmxlIGZhZGUgc2hvd1wiIHJvbGU9XCJhbGVydFwiPlxyXG4gICAgICAgIDxzdHJvbmc+e3snRXJyb3InIHwgdHJhbnNsYXRlfX0hPC9zdHJvbmc+IFdlIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIGZ1bGZpbCB5b3VyIHJlcXVlc3QuXHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cImFsZXJ0XCIgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHJcbiAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhY3JlYXRlICYmICFlZGl0aW5nXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgcC0xXCI+XHJcbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWJ1dHRvblwiIFsobmdNb2RlbCldPVwicXVlcnlcIiBpMThuLXBsYWNlaG9sZGVyIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCJcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIj4mbmJzcDtcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25BZGQoKVwiPnt7J0FkZCBuZXcgY2xpZW50IG9yZ2FuaXNhdGlvbicgfFxyXG4gICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cclxuICAgICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cclxuICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBsaXN0LWdyb3VwLWl0ZW0tYWN0aW9uXCIgKm5nRm9yPVwibGV0IGEgb2YgY2xpZW50czsgaW5kZXggYXMgaW5kZXhcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25Ub2dnbGVEZXRhaWwoaW5kZXgpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAge3thLm5hbWV9fVxyXG4gICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJpbmRleD09ZGV0YWlsc1wiPjwvbGliLWNoZXZyb24+XHJcbiAgICAgICAgICAgICAgPCEtLSA8aWMtaWNvbiBbaWNvbl09XCJpbmRleD09ZGV0YWlscyA/IGNoZXZyb25Eb3duIDogY2hldnJvblJpZ2h0XCI+PC9pYy1pY29uPiAtLT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaW5kZXg9PWRldGFpbHNcIj5cclxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQWN0aXZpdMOpJyB8IHRyYW5zbGF0ZX19PC9saT4gLS0+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBZGRyZXNzJyB8IHRyYW5zbGF0ZX19OiB7eyBhLm9yZ2FuaXNhdGlvbi5hZGRyZXNzIH19PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7ICdQb3N0YWwgQ29kZScgfCB0cmFuc2xhdGV9fToge3sgYS5vcmdhbmlzYXRpb24ucG9zdGFsIH19XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQ2l0eScgfCB0cmFuc2xhdGV9fToge3sgYS5vcmdhbmlzYXRpb24uY2l0eSB9fTwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydTSVJFVCcgfCB0cmFuc2xhdGV9fToge3sgYS5vcmdhbmlzYXRpb24uc2lyZXQgP1xyXG4gICAgICAgICAgICAgICAgICBhLm9yZ2FuaXNhdGlvbi5zaXJldCA6ICdOb3QgcHJvdmlkZWQnIHwgdHJhbnNsYXRlIH19PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0NyZWF0ZWQnIHwgdHJhbnNsYXRlfX06IHt7IGEub3JnYW5pc2F0aW9uLmNyZWF0ZWRBdCB9fVxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhLmFkbWluTWlzc2lvbnMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJhLmFkbWluTWlzc2lvbnMubGVuZ3RoIDw9IDFcIiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J0FkbWluaXN0cmF0b3IgVXNlcicgfCB0cmFuc2xhdGV9fSA6PC9saT5cclxuICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiYS5hZG1pbk1pc3Npb25zLmxlbmd0aCA+IDFcIiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J0FkbWluaXN0cmF0b3IgVXNlcihzKScgfCB0cmFuc2xhdGV9fSA6PC9saT5cclxuICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGxpc3QtZ3JvdXAtaXRlbS1hY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhZG1pbiBvZiBhLmFkbWluTWlzc2lvbnM7IGluZGV4IGFzIGluZGV4XCIgKGNsaWNrKT1cIm9uVG9nZ2xlRGV0YWlsKGluZGV4KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWwtNFwiPiB7e2FkbWluLnVzZXIuZGlzcGxheU5hbWV9fSAoe3thZG1pbi51c2VyLmVtYWlsfX0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcm91bmRlZC1waWxsXCIgc3R5bGU9XCJmbG9hdDogcmlnaHQ7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblJlbW92ZUFkbWluKGFkbWluKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3snUmVtb3ZlJ3x0cmFuc2xhdGV9fTwvYnV0dG9uPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snUGhvbmUnfX06IHt7YWRtaW4udXNlci5waG9uZX19PC9saT4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuXHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhLmFkbWluTWlzc2lvbnMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXdhcm5pbmdcIj48c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLXdhcm5pbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7J1dhcm5pbmcnIHwgdHJhbnNsYXRlfX08L3NwYW4+IHt7J05vIEFkbWluaXN0cmF0b3IgVXNlcid8IHRyYW5zbGF0ZX19IDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhLnByb3BlcnRpZXMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydMb2NhdGlvbnMnIHwgdHJhbnNsYXRlfX06IDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBsaXN0LWdyb3VwLWl0ZW0tYWN0aW9uXCIgKm5nRm9yPVwibGV0IHByb3BlcnR5IG9mIGEucHJvcGVydGllc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWwtNFwiPnt7cHJvcGVydHl9fTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXQoYS5vcmdhbmlzYXRpb24pXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7J0VkaXQnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhY3Rpb24tYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQXJjaGl2ZShhLm9yZ2FuaXNhdGlvbilcIiBkaXNhYmxlZD5cclxuICAgICAgICAgICAgICAgICAge3snQXJjaGl2ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVPcmcoYS5vcmdhbmlzYXRpb24pXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7J0RlbGV0ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgPC91bD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiZm9ybSAmJiAoY3JlYXRlIHx8IGVkaXRpbmcpXCI+XHJcbiAgICAgICAgPGZvcm0gKG5nU3VibWl0KT1cIm9uU3VibWl0T3JnKClcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J05hbWUnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW2NsYXNzLmlzLWludmFsaWRdPVwibmFtZS5pbnZhbGlkICYmIG5hbWUudG91Y2hlZFwiIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgIHt7J0EgbmFtZSBpcyByZXF1aXJlZCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0FkZHJlc3MnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImFkZHJlc3NcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydDaXR5JyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjaXR5XCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snUG9zdGFsIGNvZGUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInBvc3RhbFwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J1NJUkVUJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJzaXJldFwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJ3b3JraW5nXCI+XHJcbiAgICAgICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3b3JraW5nIHx8IGZvcm0uaW52YWxpZFwiPnt7J1NhdmUnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBbZGlzYWJsZWRdPVwid29ya2luZ1wiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiPnt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9mb3JtPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLTxzcE9yZ2FuaXNhdGlvbkZvcm0gW21vZGVsXT1cIiBlZGl0aW5nT3JnYW5pc2F0aW9uXCIgKHN1Ym1pdCk9XCJvblNhdmUoJGV2ZW50KVwiIChjYW5jZWwpPVwib25DYW5jZWwoKVwiPlxyXG4gICAgICAgICAgICAgIDwvc3BPcmdhbmlzYXRpb25Gb3JtPi0tPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSA8ZGl2Pnt7J0FkbWluaXN0cmF0b3IgVXNlcicgfCB0cmFuc2xhdGV9fTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJ1c2VyXCIgKm5nSWY9XCJjcmVhdGUgfHwgaXNBZGRpbmdBZG1pblwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmb3JtXCIgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydFbWFpbCcgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFtjbGFzcy5pcy1pbnZhbGlkXT1cImVtYWlsLmludmFsaWQgJiYgZW1haWwudG91Y2hlZFwiIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZW1haWxcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eydBbiBlbWFpbCBpcyByZXF1aXJlZCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gIFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydGaXJzdCBuYW1lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImZpcnN0TmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0xhc3QgbmFtZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJsYXN0TmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J1Bob25lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInBob25lXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPiJdfQ==
@@ -0,0 +1,31 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "ngx-smarterplan-core";
4
+ import * as i2 from "@angular/router";
5
+ export class SpAdminGuard {
6
+ constructor(userService, router) {
7
+ this.userService = userService;
8
+ this.router = router;
9
+ }
10
+ canActivate() {
11
+ let canGo = false;
12
+ if (this.userService.cu) {
13
+ canGo = this.userService.isSPAdmin();
14
+ }
15
+ if (canGo) {
16
+ return true;
17
+ }
18
+ alert("You are not authorised to access this page");
19
+ this.router.navigate([""]);
20
+ return false;
21
+ }
22
+ }
23
+ SpAdminGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SpAdminGuard, deps: [{ token: i1.BaseUserService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable });
24
+ SpAdminGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SpAdminGuard, providedIn: 'root' });
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SpAdminGuard, decorators: [{
26
+ type: Injectable,
27
+ args: [{
28
+ providedIn: 'root'
29
+ }]
30
+ }], ctorParameters: function () { return [{ type: i1.BaseUserService }, { type: i2.Router }]; } });
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3AtYWRtaW4uZ3VhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi9zcC1hZG1pbi5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBUTNDLE1BQU0sT0FBTyxZQUFZO0lBQ3JCLFlBQW9CLFdBQTRCLEVBQVUsTUFBYztRQUFwRCxnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQUcsQ0FBQztJQUU1RSxXQUFXO1FBS1AsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUU7WUFDckIsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDeEM7UUFDRCxJQUFJLEtBQUssRUFBRTtZQUNQLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0IsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQzs7eUdBbEJRLFlBQVk7NkdBQVosWUFBWSxjQUZYLE1BQU07MkZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENhbkFjdGl2YXRlLCBSb3V0ZXIsIFVybFRyZWUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBCYXNlVXNlclNlcnZpY2UgfSBmcm9tICduZ3gtc21hcnRlcnBsYW4tY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNwQWRtaW5HdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlIHtcclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcikge31cclxuXHJcbiAgICBjYW5BY3RpdmF0ZSgpOlxyXG4gICAgICAgIHwgT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT5cclxuICAgICAgICB8IFByb21pc2U8Ym9vbGVhbiB8IFVybFRyZWU+XHJcbiAgICAgICAgfCBib29sZWFuXHJcbiAgICAgICAgfCBVcmxUcmVlIHtcclxuICAgICAgICBsZXQgY2FuR28gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy51c2VyU2VydmljZS5jdSkge1xyXG4gICAgICAgICAgICBjYW5HbyA9IHRoaXMudXNlclNlcnZpY2UuaXNTUEFkbWluKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjYW5Hbykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYWxlcnQoXCJZb3UgYXJlIG5vdCBhdXRob3Jpc2VkIHRvIGFjY2VzcyB0aGlzIHBhZ2VcIik7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiXCJdKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgXHJcbn1cclxuIl19
@@ -0,0 +1,160 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { removeNullKeysFromObject } from 'ngx-smarterplan-core';
3
+ import { v4 as uuidv4 } from "uuid";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "ngx-smarterplan-core";
6
+ import * as i2 from "@angular/forms";
7
+ import * as i3 from "@angular/common";
8
+ import * as i4 from "ngx-clipboard";
9
+ import * as i5 from "@ng-bootstrap/ng-bootstrap";
10
+ import * as i6 from "@ngx-translate/core";
11
+ export class DetailOrganisationComponent {
12
+ constructor(organisationService,
13
+ // private localStripe: StripeService,
14
+ formBuilder) {
15
+ this.organisationService = organisationService;
16
+ this.formBuilder = formBuilder;
17
+ this.orgChanged = new EventEmitter();
18
+ this.loading = false;
19
+ this.connectingStripe = false;
20
+ }
21
+ ngOnInit() {
22
+ this.myOrg = this.currentOrg.id === this.org.id;
23
+ if (!this.org.connectedAccountStripeID && (this.myOrg || this.isSP)) {
24
+ this.setConnectStripeLink();
25
+ }
26
+ }
27
+ ngOnChanges() {
28
+ this.myOrg = this.currentOrg.id === this.org.id;
29
+ }
30
+ async onToken() {
31
+ const token = uuidv4();
32
+ const expires = new Date();
33
+ expires.setDate(expires.getDate() + 7); // 7 days expiration
34
+ this.org = await this.organisationService.updateOrganisation({
35
+ id: this.org.id,
36
+ shareToken: token,
37
+ tokenExpiresAt: expires.getTime(),
38
+ });
39
+ this.orgChanged.emit(true);
40
+ }
41
+ prettifyToken() {
42
+ const expirationDate = new Date(this.org.tokenExpiresAt);
43
+ const diffTime = expirationDate.getTime() - Date.now();
44
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
45
+ const expirationString = diffTime < 0 ? "expired!" : `expires in ${diffDays} days`;
46
+ return `${this.org.shareToken.slice(0, 6)}... ${expirationString}`;
47
+ }
48
+ /**
49
+ * Created New Stripe Account and launches onboarding procedure (mail, phone, business details..) by Stripe
50
+ * @returns null
51
+ */
52
+ // async onCreateStripe() {
53
+ // this.loading = true;
54
+ // // Make the request
55
+ // const responseAccount = await API.post(
56
+ // "stripeApi",
57
+ // "/create/account",
58
+ // {},
59
+ // );
60
+ // console.log(responseAccount);
61
+ // if (responseAccount.err) {
62
+ // this.handleStripeError(responseAccount);
63
+ // return;
64
+ // }
65
+ // const { account } = responseAccount;
66
+ // // save account id to organisation
67
+ // await this.organisationService.update({
68
+ // id: this.org.id,
69
+ // connectedAccountStripeID: account.id,
70
+ // stripeOnBoardingCompleted: false,
71
+ // });
72
+ // const { origin } = document.location;
73
+ // const responseAccountLinks = await this.localStripe.createAccountLink(
74
+ // account.id,
75
+ // origin,
76
+ // );
77
+ // if (responseAccountLinks.err) {
78
+ // this.handleStripeError(responseAccountLinks);
79
+ // return;
80
+ // }
81
+ // window.location.href = responseAccountLinks.accountLinks.url;
82
+ // this.loading = false;
83
+ // }
84
+ // async onCompleteOnboardingStripe() {
85
+ // this.loading = true;
86
+ // const responseAccountLinks = await this.localStripe.createAccountLink(
87
+ // this.org.connectedAccountStripeID,
88
+ // origin,
89
+ // );
90
+ // if (responseAccountLinks.err) {
91
+ // this.handleStripeError(responseAccountLinks);
92
+ // return;
93
+ // }
94
+ // window.location.href = responseAccountLinks.accountLinks.url;
95
+ // this.loading = false;
96
+ // }
97
+ // handleStripeError(stripeResponse) {
98
+ // alert(stripeResponse.err.raw.message);
99
+ // this.loading = false;
100
+ // }
101
+ /**
102
+ * Generate link for Launching OAuth connection with Stripe: https://stripe.com/docs/connect/oauth-standard-accounts#integrating-oauth
103
+ */
104
+ setConnectStripeLink() {
105
+ setTimeout(() => {
106
+ const hyperlink = document.querySelector("#linkStripe");
107
+ if (hyperlink) {
108
+ const clientID = "ca_KQhYOlgR1ipOxLBBQHfQeCLoaySRVD5P"; // TODO change for live Stripe Account
109
+ const { origin } = document.location;
110
+ const returnUrl = `${origin}/stripe/redirect`;
111
+ hyperlink.setAttribute("href", `https://connect.stripe.com/oauth/authorize?response_type=code&client_id=${clientID}&scope=read_write&redirect_uri=${returnUrl}&state=${this.org.id}`);
112
+ }
113
+ }, 200); // wait until the element is rendered
114
+ }
115
+ /** Edit */
116
+ onEdit() {
117
+ this.editForm = this.formBuilder.group({
118
+ id: this.org.id,
119
+ name: this.org.name,
120
+ siret: this.org.siret,
121
+ city: this.org.city,
122
+ address: this.org.address,
123
+ contactDetails: this.org.contactDetails,
124
+ postal: this.org.postal,
125
+ });
126
+ }
127
+ get name() {
128
+ return this.editForm.get("name");
129
+ }
130
+ async onSubmit() {
131
+ const formValue = this.editForm.value;
132
+ removeNullKeysFromObject(formValue);
133
+ try {
134
+ const updatedOrg = await this.organisationService.updateOrganisation(formValue);
135
+ this.org = updatedOrg;
136
+ }
137
+ catch (error) {
138
+ console.error(JSON.stringify(error));
139
+ }
140
+ this.editForm = null;
141
+ }
142
+ onCancel() {
143
+ this.editForm = null;
144
+ }
145
+ }
146
+ DetailOrganisationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: DetailOrganisationComponent, deps: [{ token: i1.OrganisationService }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
147
+ DetailOrganisationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: DetailOrganisationComponent, selector: "lib-detail-organisation", inputs: { org: "org", currentOrg: "currentOrg", isSP: "isSP" }, outputs: { orgChanged: "orgChanged" }, usesOnChanges: true, ngImport: i0, template: "<div>\r\n <h5>{{'Organisation Details' | translate }}</h5>\r\n <div *ngIf=\"!editForm\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{ org.name }}</li>\r\n\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate }}: {{\r\n org.siret ? org.siret : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate }}: {{\r\n org.address ? org.address : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate }}: {{org.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Contact information' | translate}}:\r\n {{ org.contactDetails ? org.contactDetails : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"isSP\">\r\n <div class=\"row ml-0\">\r\n <div>\r\n {{'Active token' | translate }}:\r\n {{ org.shareToken ? prettifyToken() : ('No' | translate) }}\r\n </div>\r\n <div *ngIf=\"org.shareToken && !tokenExpired\" ngxClipboard [cbContent]=\"org.shareToken\"\r\n [style.cursor]=\"'pointer'\" style=\"margin-left: 5px; max-width: 20px;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP || myOrg\"\r\n (click)=\"onEdit()\">\r\n {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onToken()\">{{'Generate\r\n token' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <!--Edit Form-->\r\n <div *ngIf=\"editForm\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"editForm\">\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 {{'A name is required' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Contact information' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"contactDetails\"\r\n placeholder=\"{{'Name, phone, email' | translate}}\">\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 <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"editForm.invalid\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <!--Loading-->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <!--Stripe-->\r\n <hr>\r\n <h5>{{'stripe.account' | translate }}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.connectedAccountStripeID\">\r\n {{'stripe.connected' | translate }}: {{org.connectedAccountStripeID.substring(0, 15) }}...</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.stripeOnBoardingCompleted !== null\">\r\n {{'stripe.completed' | translate }}: {{org.stripeOnBoardingCompleted }}</li>\r\n </ul>\r\n <!-- <a *ngIf=\"(myOrg || isSP) && !org.connectedAccountStripeID\" id=\"linkStripe\" \r\n class=\"ml-3 stripe-connect\"><span>Connect with</span>\r\n </a>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-3 mb-3 ml-3 no-lowercase\"\r\n *ngIf=\"(myOrg || isSP) && org.connectedAccountStripeID && !org.stripeOnBoardingCompleted\"\r\n (click)=\"onCompleteOnboardingStripe()\">{{'stripe.toComplete' | translate}}</button> -->\r\n\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"], components: [{ type: i1.LoaderComponent, selector: "lib-loader" }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.ClipboardDirective, selector: "[ngxClipboard]", inputs: ["ngxClipboard", "container", "cbContent", "cbSuccessMsg"], outputs: ["cbOnSuccess", "cbOnError"] }, { type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { 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]" }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], pipes: { "translate": i6.TranslatePipe } });
148
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: DetailOrganisationComponent, decorators: [{
149
+ type: Component,
150
+ args: [{ selector: 'lib-detail-organisation', template: "<div>\r\n <h5>{{'Organisation Details' | translate }}</h5>\r\n <div *ngIf=\"!editForm\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{ org.name }}</li>\r\n\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate }}: {{\r\n org.siret ? org.siret : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate }}: {{\r\n org.address ? org.address : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate }}: {{org.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Contact information' | translate}}:\r\n {{ org.contactDetails ? org.contactDetails : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"isSP\">\r\n <div class=\"row ml-0\">\r\n <div>\r\n {{'Active token' | translate }}:\r\n {{ org.shareToken ? prettifyToken() : ('No' | translate) }}\r\n </div>\r\n <div *ngIf=\"org.shareToken && !tokenExpired\" ngxClipboard [cbContent]=\"org.shareToken\"\r\n [style.cursor]=\"'pointer'\" style=\"margin-left: 5px; max-width: 20px;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP || myOrg\"\r\n (click)=\"onEdit()\">\r\n {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onToken()\">{{'Generate\r\n token' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <!--Edit Form-->\r\n <div *ngIf=\"editForm\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"editForm\">\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 {{'A name is required' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Contact information' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"contactDetails\"\r\n placeholder=\"{{'Name, phone, email' | translate}}\">\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 <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"editForm.invalid\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <!--Loading-->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <!--Stripe-->\r\n <hr>\r\n <h5>{{'stripe.account' | translate }}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.connectedAccountStripeID\">\r\n {{'stripe.connected' | translate }}: {{org.connectedAccountStripeID.substring(0, 15) }}...</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.stripeOnBoardingCompleted !== null\">\r\n {{'stripe.completed' | translate }}: {{org.stripeOnBoardingCompleted }}</li>\r\n </ul>\r\n <!-- <a *ngIf=\"(myOrg || isSP) && !org.connectedAccountStripeID\" id=\"linkStripe\" \r\n class=\"ml-3 stripe-connect\"><span>Connect with</span>\r\n </a>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-3 mb-3 ml-3 no-lowercase\"\r\n *ngIf=\"(myOrg || isSP) && org.connectedAccountStripeID && !org.stripeOnBoardingCompleted\"\r\n (click)=\"onCompleteOnboardingStripe()\">{{'stripe.toComplete' | translate}}</button> -->\r\n\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"] }]
151
+ }], ctorParameters: function () { return [{ type: i1.OrganisationService }, { type: i2.FormBuilder }]; }, propDecorators: { org: [{
152
+ type: Input
153
+ }], currentOrg: [{
154
+ type: Input
155
+ }], isSP: [{
156
+ type: Input
157
+ }], orgChanged: [{
158
+ type: Output
159
+ }] } });
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2RldGFpbC1vcmdhbmlzYXRpb24vZGV0YWlsLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2RldGFpbC1vcmdhbmlzYXRpb24vZGV0YWlsLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBcUMsd0JBQXdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRyxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7QUFPcEMsTUFBTSxPQUFPLDJCQUEyQjtJQXVCcEMsWUFDWSxtQkFBd0M7SUFDaEQsc0NBQXNDO0lBQzlCLFdBQXdCO1FBRnhCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFFeEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFuQjFCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBTW5ELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFaEIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO0lBWXRCLENBQUM7SUFFSixRQUFRO1FBQ0osSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLElBQUksQ0FB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LE1BQU0sVUFBVSxHQUNaLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDO1NBQ3pCO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUN4QztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQzs7d0hBM0tRLDJCQUEyQjs0R0FBM0IsMkJBQTJCLDJMQ1Z4QywyME1BcUhNOzJGRDNHTywyQkFBMkI7a0JBTHZDLFNBQVM7K0JBQ0UseUJBQXlCO29JQUt4QixHQUFHO3NCQUFYLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBPcmdhbmlzYXRpb24sIE9yZ2FuaXNhdGlvblNlcnZpY2UsIHJlbW92ZU51bGxLZXlzRnJvbU9iamVjdCB9IGZyb20gJ25neC1zbWFydGVycGxhbi1jb3JlJztcclxuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSBcInV1aWRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWRldGFpbC1vcmdhbmlzYXRpb24nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWwtb3JnYW5pc2F0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kZXRhaWwtb3JnYW5pc2F0aW9uLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIERldGFpbE9yZ2FuaXNhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICBASW5wdXQoKSBvcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBASW5wdXQoKSBjdXJyZW50T3JnOiBPcmdhbmlzYXRpb247XHJcblxyXG4gICAgQElucHV0KCkgaXNTUDogYm9vbGVhbjtcclxuXHJcbiAgICBAT3V0cHV0KCkgb3JnQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICBteU9yZzogYm9vbGVhbjtcclxuXHJcbiAgICB0b2tlbkV4cGlyZWQ6IGJvb2xlYW47XHJcblxyXG4gICAgbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgIGNvbm5lY3RpbmdTdHJpcGUgPSBmYWxzZTtcclxuXHJcbiAgICBtb2RhbFJlZjtcclxuXHJcbiAgICBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuXHJcbiAgICBlZGl0Rm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgb3JnYW5pc2F0aW9uU2VydmljZTogT3JnYW5pc2F0aW9uU2VydmljZSxcclxuICAgICAgICAvLyBwcml2YXRlIGxvY2FsU3RyaXBlOiBTdHJpcGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG4gICAgKSB7fVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubXlPcmcgPSB0aGlzLmN1cnJlbnRPcmcuaWQgPT09IHRoaXMub3JnLmlkO1xyXG4gICAgICAgIGlmICghdGhpcy5vcmcuY29ubmVjdGVkQWNjb3VudFN0cmlwZUlEICYmICh0aGlzLm15T3JnIHx8IHRoaXMuaXNTUCkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRDb25uZWN0U3RyaXBlTGluaygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcygpIHtcclxuICAgICAgICB0aGlzLm15T3JnID0gdGhpcy5jdXJyZW50T3JnLmlkID09PSB0aGlzLm9yZy5pZDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblRva2VuKCkge1xyXG4gICAgICAgIGNvbnN0IHRva2VuID0gdXVpZHY0KCk7XHJcbiAgICAgICAgY29uc3QgZXhwaXJlcyA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgZXhwaXJlcy5zZXREYXRlKGV4cGlyZXMuZ2V0RGF0ZSgpICsgNyk7IC8vIDcgZGF5cyBleHBpcmF0aW9uXHJcbiAgICAgICAgdGhpcy5vcmcgPSBhd2FpdCB0aGlzLm9yZ2FuaXNhdGlvblNlcnZpY2UudXBkYXRlT3JnYW5pc2F0aW9uKHtcclxuICAgICAgICAgICAgaWQ6IHRoaXMub3JnLmlkLFxyXG4gICAgICAgICAgICBzaGFyZVRva2VuOiB0b2tlbixcclxuICAgICAgICAgICAgdG9rZW5FeHBpcmVzQXQ6IGV4cGlyZXMuZ2V0VGltZSgpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMub3JnQ2hhbmdlZC5lbWl0KHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByZXR0aWZ5VG9rZW4oKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBleHBpcmF0aW9uRGF0ZSA9IG5ldyBEYXRlKHRoaXMub3JnLnRva2VuRXhwaXJlc0F0KTtcclxuICAgICAgICBjb25zdCBkaWZmVGltZSA9IGV4cGlyYXRpb25EYXRlLmdldFRpbWUoKSAtIERhdGUubm93KCk7XHJcbiAgICAgICAgY29uc3QgZGlmZkRheXMgPSBNYXRoLmNlaWwoZGlmZlRpbWUgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpO1xyXG4gICAgICAgIGNvbnN0IGV4cGlyYXRpb25TdHJpbmcgPVxyXG4gICAgICAgICAgICBkaWZmVGltZSA8IDAgPyBcImV4cGlyZWQhXCIgOiBgZXhwaXJlcyBpbiAke2RpZmZEYXlzfSBkYXlzYDtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5vcmcuc2hhcmVUb2tlbi5zbGljZSgwLCA2KX0uLi4gJHtleHBpcmF0aW9uU3RyaW5nfWA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVkIE5ldyBTdHJpcGUgQWNjb3VudCBhbmQgbGF1bmNoZXMgb25ib2FyZGluZyBwcm9jZWR1cmUgKG1haWwsIHBob25lLCBidXNpbmVzcyBkZXRhaWxzLi4pIGJ5IFN0cmlwZVxyXG4gICAgICogQHJldHVybnMgbnVsbFxyXG4gICAgICovXHJcbiAgICAvLyBhc3luYyBvbkNyZWF0ZVN0cmlwZSgpIHtcclxuICAgIC8vICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgLy8gICAgIC8vIE1ha2UgdGhlIHJlcXVlc3RcclxuICAgIC8vICAgICBjb25zdCByZXNwb25zZUFjY291bnQgPSBhd2FpdCBBUEkucG9zdChcclxuICAgIC8vICAgICAgICAgXCJzdHJpcGVBcGlcIixcclxuICAgIC8vICAgICAgICAgXCIvY3JlYXRlL2FjY291bnRcIixcclxuICAgIC8vICAgICAgICAge30sXHJcbiAgICAvLyAgICAgKTtcclxuICAgIC8vICAgICBjb25zb2xlLmxvZyhyZXNwb25zZUFjY291bnQpO1xyXG4gICAgLy8gICAgIGlmIChyZXNwb25zZUFjY291bnQuZXJyKSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuaGFuZGxlU3RyaXBlRXJyb3IocmVzcG9uc2VBY2NvdW50KTtcclxuICAgIC8vICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgY29uc3QgeyBhY2NvdW50IH0gPSByZXNwb25zZUFjY291bnQ7XHJcbiAgICAvLyAgICAgLy8gc2F2ZSBhY2NvdW50IGlkIHRvIG9yZ2FuaXNhdGlvblxyXG4gICAgLy8gICAgIGF3YWl0IHRoaXMub3JnYW5pc2F0aW9uU2VydmljZS51cGRhdGUoe1xyXG4gICAgLy8gICAgICAgICBpZDogdGhpcy5vcmcuaWQsXHJcbiAgICAvLyAgICAgICAgIGNvbm5lY3RlZEFjY291bnRTdHJpcGVJRDogYWNjb3VudC5pZCxcclxuICAgIC8vICAgICAgICAgc3RyaXBlT25Cb2FyZGluZ0NvbXBsZXRlZDogZmFsc2UsXHJcbiAgICAvLyAgICAgfSk7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IHsgb3JpZ2luIH0gPSBkb2N1bWVudC5sb2NhdGlvbjtcclxuICAgIC8vICAgICBjb25zdCByZXNwb25zZUFjY291bnRMaW5rcyA9IGF3YWl0IHRoaXMubG9jYWxTdHJpcGUuY3JlYXRlQWNjb3VudExpbmsoXHJcbiAgICAvLyAgICAgICAgIGFjY291bnQuaWQsXHJcbiAgICAvLyAgICAgICAgIG9yaWdpbixcclxuICAgIC8vICAgICApO1xyXG4gICAgLy8gICAgIGlmIChyZXNwb25zZUFjY291bnRMaW5rcy5lcnIpIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5oYW5kbGVTdHJpcGVFcnJvcihyZXNwb25zZUFjY291bnRMaW5rcyk7XHJcbiAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByZXNwb25zZUFjY291bnRMaW5rcy5hY2NvdW50TGlua3MudXJsO1xyXG4gICAgLy8gICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIGFzeW5jIG9uQ29tcGxldGVPbmJvYXJkaW5nU3RyaXBlKCkge1xyXG4gICAgLy8gICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAvLyAgICAgY29uc3QgcmVzcG9uc2VBY2NvdW50TGlua3MgPSBhd2FpdCB0aGlzLmxvY2FsU3RyaXBlLmNyZWF0ZUFjY291bnRMaW5rKFxyXG4gICAgLy8gICAgICAgICB0aGlzLm9yZy5jb25uZWN0ZWRBY2NvdW50U3RyaXBlSUQsXHJcbiAgICAvLyAgICAgICAgIG9yaWdpbixcclxuICAgIC8vICAgICApO1xyXG4gICAgLy8gICAgIGlmIChyZXNwb25zZUFjY291bnRMaW5rcy5lcnIpIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5oYW5kbGVTdHJpcGVFcnJvcihyZXNwb25zZUFjY291bnRMaW5rcyk7XHJcbiAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByZXNwb25zZUFjY291bnRMaW5rcy5hY2NvdW50TGlua3MudXJsO1xyXG4gICAgLy8gICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIGhhbmRsZVN0cmlwZUVycm9yKHN0cmlwZVJlc3BvbnNlKSB7XHJcbiAgICAvLyAgICAgYWxlcnQoc3RyaXBlUmVzcG9uc2UuZXJyLnJhdy5tZXNzYWdlKTtcclxuICAgIC8vICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlIGxpbmsgZm9yIExhdW5jaGluZyBPQXV0aCBjb25uZWN0aW9uIHdpdGggU3RyaXBlOiBodHRwczovL3N0cmlwZS5jb20vZG9jcy9jb25uZWN0L29hdXRoLXN0YW5kYXJkLWFjY291bnRzI2ludGVncmF0aW5nLW9hdXRoXHJcbiAgICAgKi9cclxuICAgIHNldENvbm5lY3RTdHJpcGVMaW5rKCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBoeXBlcmxpbmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICAgICAgICAgXCIjbGlua1N0cmlwZVwiLFxyXG4gICAgICAgICAgICApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAoaHlwZXJsaW5rKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRJRCA9IFwiY2FfS1FoWU9sZ1IxaXBPeExCQlFIZlFlQ0xvYXlTUlZENVBcIjsgLy8gVE9ETyBjaGFuZ2UgZm9yIGxpdmUgU3RyaXBlIEFjY291bnRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgb3JpZ2luIH0gPSBkb2N1bWVudC5sb2NhdGlvbjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldHVyblVybCA9IGAke29yaWdpbn0vc3RyaXBlL3JlZGlyZWN0YDtcclxuICAgICAgICAgICAgICAgIGh5cGVybGluay5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJocmVmXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgYGh0dHBzOi8vY29ubmVjdC5zdHJpcGUuY29tL29hdXRoL2F1dGhvcml6ZT9yZXNwb25zZV90eXBlPWNvZGUmY2xpZW50X2lkPSR7Y2xpZW50SUR9JnNjb3BlPXJlYWRfd3JpdGUmcmVkaXJlY3RfdXJpPSR7cmV0dXJuVXJsfSZzdGF0ZT0ke3RoaXMub3JnLmlkfWAsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMjAwKTsgLy8gd2FpdCB1bnRpbCB0aGUgZWxlbWVudCBpcyByZW5kZXJlZFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFZGl0ICovXHJcbiAgICBvbkVkaXQoKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICAgICAgICBpZDogdGhpcy5vcmcuaWQsXHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMub3JnLm5hbWUsXHJcbiAgICAgICAgICAgIHNpcmV0OiB0aGlzLm9yZy5zaXJldCxcclxuICAgICAgICAgICAgY2l0eTogdGhpcy5vcmcuY2l0eSxcclxuICAgICAgICAgICAgYWRkcmVzczogdGhpcy5vcmcuYWRkcmVzcyxcclxuICAgICAgICAgICAgY29udGFjdERldGFpbHM6IHRoaXMub3JnLmNvbnRhY3REZXRhaWxzLFxyXG4gICAgICAgICAgICBwb3N0YWw6IHRoaXMub3JnLnBvc3RhbCxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbmFtZSgpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRGb3JtLmdldChcIm5hbWVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5lZGl0Rm9ybS52YWx1ZTtcclxuICAgICAgICByZW1vdmVOdWxsS2V5c0Zyb21PYmplY3QoZm9ybVZhbHVlKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkT3JnID1cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub3JnYW5pc2F0aW9uU2VydmljZS51cGRhdGVPcmdhbmlzYXRpb24oZm9ybVZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5vcmcgPSB1cGRhdGVkT3JnO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lZGl0Rm9ybSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgb25DYW5jZWwoKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0Rm9ybSA9IG51bGw7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdj5cclxuICAgIDxoNT57eydPcmdhbmlzYXRpb24gRGV0YWlscycgfCB0cmFuc2xhdGUgfX08L2g1PlxyXG4gICAgPGRpdiAqbmdJZj1cIiFlZGl0Rm9ybVwiPlxyXG4gICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydOYW1lJyB8IHRyYW5zbGF0ZX19OiB7eyBvcmcubmFtZSB9fTwvbGk+XHJcblxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydTSVJFVCcgfCB0cmFuc2xhdGUgfX06IHt7XHJcbiAgICAgICAgICAgICAgICBvcmcuc2lyZXQgPyBvcmcuc2lyZXQgOiAoXCJObyBkYXRhXCIgfCB0cmFuc2xhdGUpfX08L2xpPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBZGRyZXNzJyB8IHRyYW5zbGF0ZSB9fToge3tcclxuICAgICAgICAgICAgICAgIG9yZy5hZGRyZXNzID8gb3JnLmFkZHJlc3MgOiAoXCJObyBkYXRhXCIgfCB0cmFuc2xhdGUpfX08L2xpPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydDaXR5JyB8IHRyYW5zbGF0ZSB9fToge3tvcmcuY2l0eSB9fTwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0NvbnRhY3QgaW5mb3JtYXRpb24nIHwgdHJhbnNsYXRlfX06XHJcbiAgICAgICAgICAgICAgICB7eyBvcmcuY29udGFjdERldGFpbHMgPyBvcmcuY29udGFjdERldGFpbHMgOiAoXCJObyBkYXRhXCIgfCB0cmFuc2xhdGUpfX08L2xpPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cImlzU1BcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWwtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FjdGl2ZSB0b2tlbicgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9yZy5zaGFyZVRva2VuID8gcHJldHRpZnlUb2tlbigpIDogKCdObycgfCB0cmFuc2xhdGUpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm9yZy5zaGFyZVRva2VuICYmICF0b2tlbkV4cGlyZWRcIiBuZ3hDbGlwYm9hcmQgW2NiQ29udGVudF09XCJvcmcuc2hhcmVUb2tlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogNXB4OyBtYXgtd2lkdGg6IDIwcHg7XCIgbmdiVG9vbHRpcD1cIkNvcGllZCFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImNsaWNrOmJsdXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uaWZ5XCIgZGF0YS1pY29uPVwibWRpOmNvbnRlbnQtY29weVwiIGRhdGEtaW5saW5lPVwiZmFsc2VcIiBkYXRhLXdpZHRoPVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1oZWlnaHQ9XCIyMFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbXQtMiBtbC0zIGFjdGlvbi1idXR0b25cIiAqbmdJZj1cImlzU1AgfHwgbXlPcmdcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdCgpXCI+XHJcbiAgICAgICAgICAgICAgICB7eydFZGl0JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbXQtMiBtbC0zIGFjdGlvbi1idXR0b25cIiAqbmdJZj1cImlzU1BcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVG9rZW4oKVwiPnt7J0dlbmVyYXRlXHJcbiAgICAgICAgICAgICAgICB0b2tlbicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLUVkaXQgRm9ybS0tPlxyXG4gICAgPGRpdiAqbmdJZj1cImVkaXRGb3JtXCI+XHJcbiAgICAgICAgPGZvcm0gKG5nU3VibWl0KT1cIm9uU3VibWl0KClcIiBbZm9ybUdyb3VwXT1cImVkaXRGb3JtXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydOYW1lJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbY2xhc3MuaXMtaW52YWxpZF09XCJuYW1lLmludmFsaWQgJiYgbmFtZS50b3VjaGVkXCIgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0EgbmFtZSBpcyByZXF1aXJlZCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snQ29udGFjdCBpbmZvcm1hdGlvbicgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImNvbnRhY3REZXRhaWxzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eydOYW1lLCBwaG9uZSwgZW1haWwnIHwgdHJhbnNsYXRlfX1cIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydBZGRyZXNzJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc1wiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0NpdHknIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjaXR5XCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snUG9zdGFsIGNvZGUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJwb3N0YWxcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydTSVJFVCcgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInNpcmV0XCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImVkaXRGb3JtLmludmFsaWRcIj57eydTYXZlJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbCgpXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhY3Rpb24tYnV0dG9uXCI+e3snQ2FuY2VsJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9mb3JtPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tTG9hZGluZy0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgPGxpYi1sb2FkZXI+PC9saWItbG9hZGVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLVN0cmlwZS0tPlxyXG4gICAgPGhyPlxyXG4gICAgPGg1Pnt7J3N0cmlwZS5hY2NvdW50JyB8IHRyYW5zbGF0ZSB9fTwvaDU+XHJcbiAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cclxuICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cIihpc1NQIHx8IG15T3JnKSAmJiBvcmcuY29ubmVjdGVkQWNjb3VudFN0cmlwZUlEXCI+XHJcbiAgICAgICAgICAgIHt7J3N0cmlwZS5jb25uZWN0ZWQnIHwgdHJhbnNsYXRlIH19OiB7e29yZy5jb25uZWN0ZWRBY2NvdW50U3RyaXBlSUQuc3Vic3RyaW5nKDAsIDE1KSB9fS4uLjwvbGk+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCIoaXNTUCB8fCBteU9yZykgJiYgb3JnLnN0cmlwZU9uQm9hcmRpbmdDb21wbGV0ZWQgIT09IG51bGxcIj5cclxuICAgICAgICAgICAge3snc3RyaXBlLmNvbXBsZXRlZCcgfCB0cmFuc2xhdGUgfX06IHt7b3JnLnN0cmlwZU9uQm9hcmRpbmdDb21wbGV0ZWQgfX08L2xpPlxyXG4gICAgPC91bD5cclxuICAgIDwhLS0gPGEgKm5nSWY9XCIobXlPcmcgfHwgaXNTUCkgJiYgIW9yZy5jb25uZWN0ZWRBY2NvdW50U3RyaXBlSURcIiBpZD1cImxpbmtTdHJpcGVcIiBcclxuICAgICAgICBjbGFzcz1cIm1sLTMgc3RyaXBlLWNvbm5lY3RcIj48c3Bhbj5Db25uZWN0IHdpdGg8L3NwYW4+XHJcbiAgICA8L2E+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG10LTMgbWItMyBtbC0zIG5vLWxvd2VyY2FzZVwiXHJcbiAgICAgICAgKm5nSWY9XCIobXlPcmcgfHwgaXNTUCkgJiYgb3JnLmNvbm5lY3RlZEFjY291bnRTdHJpcGVJRCAmJiAhb3JnLnN0cmlwZU9uQm9hcmRpbmdDb21wbGV0ZWRcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkNvbXBsZXRlT25ib2FyZGluZ1N0cmlwZSgpXCI+e3snc3RyaXBlLnRvQ29tcGxldGUnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj4gLS0+XHJcblxyXG48L2Rpdj4iXX0=