@smarterplan/ngx-smarterplan-admin 0.2.3 → 0.3.0

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 (64) hide show
  1. package/esm2022/lib/admin/admin.component.mjs +36 -0
  2. package/esm2022/lib/chevron/chevron.component.mjs +19 -0
  3. package/{esm2020 → esm2022}/lib/guest-link/guest-link.component.mjs +70 -62
  4. package/esm2022/lib/guide.guard.mjs +29 -0
  5. package/{esm2020 → esm2022}/lib/helpers.mjs +24 -24
  6. package/esm2022/lib/name-from-id.pipe.mjs +31 -0
  7. package/esm2022/lib/ngx-smarterplan-admin-routing.module.mjs +48 -0
  8. package/esm2022/lib/ngx-smarterplan-admin.module.mjs +89 -0
  9. package/esm2022/lib/ngx-smarterplan-admin.service.mjs +15 -0
  10. package/esm2022/lib/organisation/organisation.component.mjs +182 -0
  11. package/esm2022/lib/sp-admin.guard.mjs +29 -0
  12. package/esm2022/lib/user/detail-organisation/detail-organisation.component.mjs +207 -0
  13. package/esm2022/lib/user/form-mission/form-mission.component.mjs +290 -0
  14. package/esm2022/lib/user/form-organisation/form-organisation.component.mjs +139 -0
  15. package/esm2022/lib/user/user-mission-form/user-mission-form.component.mjs +132 -0
  16. package/esm2022/lib/user/user.component.mjs +353 -0
  17. package/esm2022/lib/visitor/create-batch/create-batch.component.mjs +112 -0
  18. package/esm2022/lib/visitor/template/template.component.mjs +295 -0
  19. package/esm2022/lib/visitor/visitor.component.mjs +318 -0
  20. package/{esm2020 → esm2022}/public-api.mjs +5 -5
  21. package/{esm2020 → esm2022}/smarterplan-ngx-smarterplan-admin.mjs +4 -4
  22. package/{fesm2020 → fesm2022}/smarterplan-ngx-smarterplan-admin.mjs +2205 -2065
  23. package/{fesm2020 → fesm2022}/smarterplan-ngx-smarterplan-admin.mjs.map +1 -1
  24. package/index.d.ts +5 -5
  25. package/lib/admin/admin.component.d.ts +13 -13
  26. package/lib/chevron/chevron.component.d.ts +9 -9
  27. package/lib/guest-link/guest-link.component.d.ts +20 -20
  28. package/lib/guide.guard.d.ts +11 -11
  29. package/lib/helpers.d.ts +2 -2
  30. package/lib/name-from-id.pipe.d.ts +11 -11
  31. package/lib/ngx-smarterplan-admin-routing.module.d.ts +7 -7
  32. package/lib/ngx-smarterplan-admin.module.d.ts +26 -26
  33. package/lib/ngx-smarterplan-admin.service.d.ts +6 -6
  34. package/lib/organisation/organisation.component.d.ts +54 -54
  35. package/lib/sp-admin.guard.d.ts +11 -11
  36. package/lib/user/detail-organisation/detail-organisation.component.d.ts +49 -49
  37. package/lib/user/form-mission/form-mission.component.d.ts +63 -63
  38. package/lib/user/form-organisation/form-organisation.component.d.ts +32 -32
  39. package/lib/user/user-mission-form/user-mission-form.component.d.ts +32 -32
  40. package/lib/user/user.component.d.ts +102 -102
  41. package/lib/visitor/create-batch/create-batch.component.d.ts +23 -23
  42. package/lib/visitor/template/template.component.d.ts +58 -58
  43. package/lib/visitor/visitor.component.d.ts +70 -70
  44. package/package.json +10 -16
  45. package/public-api.d.ts +2 -2
  46. package/esm2020/lib/admin/admin.component.mjs +0 -34
  47. package/esm2020/lib/chevron/chevron.component.mjs +0 -19
  48. package/esm2020/lib/guide.guard.mjs +0 -26
  49. package/esm2020/lib/name-from-id.pipe.mjs +0 -29
  50. package/esm2020/lib/ngx-smarterplan-admin-routing.module.mjs +0 -47
  51. package/esm2020/lib/ngx-smarterplan-admin.module.mjs +0 -88
  52. package/esm2020/lib/ngx-smarterplan-admin.service.mjs +0 -14
  53. package/esm2020/lib/organisation/organisation.component.mjs +0 -171
  54. package/esm2020/lib/sp-admin.guard.mjs +0 -26
  55. package/esm2020/lib/user/detail-organisation/detail-organisation.component.mjs +0 -191
  56. package/esm2020/lib/user/form-mission/form-mission.component.mjs +0 -265
  57. package/esm2020/lib/user/form-organisation/form-organisation.component.mjs +0 -125
  58. package/esm2020/lib/user/user-mission-form/user-mission-form.component.mjs +0 -121
  59. package/esm2020/lib/user/user.component.mjs +0 -336
  60. package/esm2020/lib/visitor/create-batch/create-batch.component.mjs +0 -106
  61. package/esm2020/lib/visitor/template/template.component.mjs +0 -277
  62. package/esm2020/lib/visitor/visitor.component.mjs +0 -299
  63. package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs +0 -2245
  64. package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs.map +0 -1
@@ -0,0 +1,112 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { validEmail, RoleStatus } from '@smarterplan/ngx-smarterplan-core';
3
+ import * as Papa from 'papaparse';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@smarterplan/ngx-smarterplan-core";
6
+ import * as i2 from "@ngx-translate/core";
7
+ import * as i3 from "@angular/common";
8
+ class CreateBatchComponent {
9
+ missionService;
10
+ userService;
11
+ translate;
12
+ template;
13
+ createdMissions = new EventEmitter();
14
+ addedEmails = [];
15
+ csvFile;
16
+ working = false;
17
+ constructor(missionService, userService, translate) {
18
+ this.missionService = missionService;
19
+ this.userService = userService;
20
+ this.translate = translate;
21
+ }
22
+ ngOnInit() { }
23
+ onAddEmail(value) {
24
+ if (value) {
25
+ if (validEmail(value)) {
26
+ this.addedEmails.push(value);
27
+ }
28
+ else {
29
+ alert("Please, enter a valid email address");
30
+ }
31
+ }
32
+ }
33
+ onDelete(index) {
34
+ this.addedEmails.splice(index, 1);
35
+ }
36
+ onCancel() {
37
+ this.createdMissions.emit(null);
38
+ }
39
+ async onCreateMissions() {
40
+ const createdMissions = [];
41
+ let user;
42
+ this.working = true;
43
+ await Promise.all(this.addedEmails.map(async (mail) => {
44
+ user = await this.userService.profileForMail(mail);
45
+ if (!user) {
46
+ try {
47
+ const profile = await this.userService.createUserAWSandProfile({
48
+ email: mail,
49
+ lastName: mail,
50
+ firstName: "",
51
+ phone: "",
52
+ }, true);
53
+ user = profile;
54
+ }
55
+ catch (error) {
56
+ alert(`Error creating users: ${this.translate.instant(error)}`);
57
+ this.working = false;
58
+ return;
59
+ }
60
+ }
61
+ if (user) {
62
+ const missionInput = {
63
+ organisationID: this.template.organisationID,
64
+ orderedOrganisationID: this.template.organisationID,
65
+ level: this.template.level,
66
+ role: RoleStatus.VISITOR_MUSEUM,
67
+ description: "Generated from template",
68
+ userID: user.id,
69
+ startDateTime: this.template.startDateTime,
70
+ endDateTime: this.template.endDateTime,
71
+ spaceID: this.template.spaceID,
72
+ zoneID: this.template.zoneID,
73
+ templateMissionID: this.template.id,
74
+ hashtags: this.template.hashtags,
75
+ };
76
+ const mission = await this.missionService.create(missionInput);
77
+ createdMissions.push(mission);
78
+ }
79
+ }));
80
+ this.working = false;
81
+ this.createdMissions.emit(createdMissions);
82
+ this.addedEmails = [];
83
+ }
84
+ async handleFileInput(eventTarget) {
85
+ const files = eventTarget.files;
86
+ const uploaded = files.item(0);
87
+ if (uploaded.name.includes(".csv")) {
88
+ Papa.parse(uploaded, {
89
+ complete: function onComplete(results) {
90
+ for (const mail of results.data) {
91
+ this.addedEmails.push(mail[0]);
92
+ }
93
+ }.bind(this),
94
+ });
95
+ }
96
+ else {
97
+ alert("Not a csv file");
98
+ }
99
+ }
100
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateBatchComponent, deps: [{ token: i1.MissionService }, { token: i1.BaseUserService }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
101
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CreateBatchComponent, selector: "lib-create-batch", inputs: { template: "template" }, outputs: { createdMissions: "createdMissions" }, ngImport: i0, template: "<div>\r\n <h4>{{'Add email address' | translate}}</h4>\r\n <div class=\"row\">\r\n <input class=\"form-control custom-form\" #box (keyup.enter)=\"onAddEmail(box.value); box.value=''\"\r\n placeholder=\"me@example.com\" data-testid=\"form-user-email\">\r\n <div class=\"outer_circle\" style='margin-left: 1.1em;'>\r\n <button id='btn-icon' (click)=\"onAddEmail(box.value); box.value=''\" data-testid=\"form-user-email-btn\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-3\">\r\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\r\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event.target)\" />\r\n {{'Upload from csv' | translate}}</label>\r\n </div>\r\n\r\n <ul *ngIf=\"addedEmails.length > 0\">\r\n <li class=\"list_item\" *ngFor=\"let mail of addedEmails; index as index\">{{mail}}\r\n <div class=\"icon-container\" (click)=\"onDelete(index)\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </li>\r\n </ul>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div class=\"row action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mr-2 mt-3 action-button\" data-testid=\"form-user-submit-btn\" (click)=\"onCreateMissions()\">\r\n {{'Create users' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mr-2 mt-3 action-button\" data-testid=\"form-user-cancel-btn\" (click)=\"onCancel()\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n</div>", styles: ["#btn-icon{width:30px;height:30px;background:url(../../../../assets/icons/plus.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../assets/icons/plus-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../assets/icons/plus.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px;margin-left:5px}.custom-form{width:80%}h4{color:var(--smarterplan-primary)}.pointer{cursor:pointer}.list_item{display:flex;font-size:1.1em}.icon-container{cursor:pointer;margin-left:5px}input[type=file]{display:none}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
102
+ }
103
+ export { CreateBatchComponent };
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateBatchComponent, decorators: [{
105
+ type: Component,
106
+ args: [{ selector: 'lib-create-batch', template: "<div>\r\n <h4>{{'Add email address' | translate}}</h4>\r\n <div class=\"row\">\r\n <input class=\"form-control custom-form\" #box (keyup.enter)=\"onAddEmail(box.value); box.value=''\"\r\n placeholder=\"me@example.com\" data-testid=\"form-user-email\">\r\n <div class=\"outer_circle\" style='margin-left: 1.1em;'>\r\n <button id='btn-icon' (click)=\"onAddEmail(box.value); box.value=''\" data-testid=\"form-user-email-btn\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-3\">\r\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\r\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event.target)\" />\r\n {{'Upload from csv' | translate}}</label>\r\n </div>\r\n\r\n <ul *ngIf=\"addedEmails.length > 0\">\r\n <li class=\"list_item\" *ngFor=\"let mail of addedEmails; index as index\">{{mail}}\r\n <div class=\"icon-container\" (click)=\"onDelete(index)\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </li>\r\n </ul>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div class=\"row action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mr-2 mt-3 action-button\" data-testid=\"form-user-submit-btn\" (click)=\"onCreateMissions()\">\r\n {{'Create users' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mr-2 mt-3 action-button\" data-testid=\"form-user-cancel-btn\" (click)=\"onCancel()\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n</div>", styles: ["#btn-icon{width:30px;height:30px;background:url(../../../../assets/icons/plus.svg);border:none;vertical-align:middle}#btn-icon:hover{background:url(../../../../assets/icons/plus-over.svg)}#btn-icon[disabled]:hover{background:url(../../../../assets/icons/plus.svg)}.outer_circle{background-color:#ebebeb;border-radius:50%;width:32px;height:32px;padding:1px;margin-left:5px}.custom-form{width:80%}h4{color:var(--smarterplan-primary)}.pointer{cursor:pointer}.list_item{display:flex;font-size:1.1em}.icon-container{cursor:pointer;margin-left:5px}input[type=file]{display:none}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
107
+ }], ctorParameters: function () { return [{ type: i1.MissionService }, { type: i1.BaseUserService }, { type: i2.TranslateService }]; }, propDecorators: { template: [{
108
+ type: Input
109
+ }], createdMissions: [{
110
+ type: Output
111
+ }] } });
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWJhdGNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1hZG1pbi9zcmMvbGliL3Zpc2l0b3IvY3JlYXRlLWJhdGNoL2NyZWF0ZS1iYXRjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi92aXNpdG9yL2NyZWF0ZS1iYXRjaC9jcmVhdGUtYmF0Y2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRSxPQUFPLEVBQXFELFVBQVUsRUFBaUIsVUFBVSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDN0ksT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7Ozs7O0FBRWxDLE1BS2Esb0JBQW9CO0lBWWpCO0lBQ0E7SUFDQTtJQWJILFFBQVEsQ0FBZ0I7SUFFdkIsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7SUFFMUQsV0FBVyxHQUFhLEVBQUUsQ0FBQztJQUUzQixPQUFPLENBQU87SUFFZCxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBRWhCLFlBQ1ksY0FBOEIsRUFDOUIsV0FBNEIsRUFDNUIsU0FBMkI7UUFGM0IsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtJQUNuQyxDQUFDO0lBRUwsUUFBUSxLQUFXLENBQUM7SUFFcEIsVUFBVSxDQUFDLEtBQWE7UUFDcEIsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMs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LENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLFFBQVEsRUFBRSxTQUFTLFVBQVUsQ0FBQyxPQUFPO29CQUNqQyxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7d0JBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNsQztnQkFDTCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNmLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUMzQjtJQUNMLENBQUM7d0dBNUdRLG9CQUFvQjs0RkFBcEIsb0JBQW9CLDJJQ1ZqQyw0dERBaUNNOztTRHZCTyxvQkFBb0I7NEZBQXBCLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDSSxrQkFBa0I7a0tBS25CLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBNaXNzaW9uLCBNaXNzaW9uU2VydmljZSwgQmFzZVVzZXJTZXJ2aWNlLCBQcm9maWxlLCB2YWxpZEVtYWlsLCBWaXNpdFRlbXBsYXRlLCBSb2xlU3RhdHVzIH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuaW1wb3J0ICogYXMgUGFwYSBmcm9tICdwYXBhcGFyc2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1jcmVhdGUtYmF0Y2gnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NyZWF0ZS1iYXRjaC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9jcmVhdGUtYmF0Y2guY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3JlYXRlQmF0Y2hDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgQElucHV0KCkgdGVtcGxhdGU6IFZpc2l0VGVtcGxhdGU7XHJcblxyXG4gICAgQE91dHB1dCgpIGNyZWF0ZWRNaXNzaW9ucyA9IG5ldyBFdmVudEVtaXR0ZXI8TWlzc2lvbltdPigpO1xyXG5cclxuICAgIGFkZGVkRW1haWxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIGNzdkZpbGU6IEZpbGU7XHJcblxyXG4gICAgd29ya2luZyA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgbWlzc2lvblNlcnZpY2U6IE1pc3Npb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICkgeyB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7IH1cclxuXHJcbiAgICBvbkFkZEVtYWlsKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgaWYgKHZhbGlkRW1haWwodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZGVkRW1haWxzLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWxlcnQoXCJQbGVhc2UsIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzc1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkRlbGV0ZShpbmRleCkge1xyXG4gICAgICAgIHRoaXMuYWRkZWRFbWFpbHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZWRNaXNzaW9ucy5lbWl0KG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQ3JlYXRlTWlzc2lvbnMoKSB7XHJcbiAgICAgICAgY29uc3QgY3JlYXRlZE1pc3Npb25zID0gW107XHJcbiAgICAgICAgbGV0IHVzZXI6IFByb2ZpbGU7XHJcbiAgICAgICAgdGhpcy53b3JraW5nID0gdHJ1ZTtcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgdGhpcy5hZGRlZEVtYWlscy5tYXAoYXN5bmMgKG1haWwpID0+IHtcclxuICAgICAgICAgICAgICAgIHVzZXIgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLnByb2ZpbGVGb3JNYWlsKG1haWwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZVVzZXJBV1NhbmRQcm9maWxlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IG1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROYW1lOiBtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE5hbWU6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25lOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgPSBwcm9maWxlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIGNyZWF0aW5nIHVzZXJzOiAke3RoaXMudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWlzc2lvbklucHV0OiBNaXNzaW9uID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogdGhpcy50ZW1wbGF0ZS5vcmdhbmlzYXRpb25JRCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZE9yZ2FuaXNhdGlvbklEOiB0aGlzLnRlbXBsYXRlLm9yZ2FuaXNhdGlvbklELFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogdGhpcy50ZW1wbGF0ZS5sZXZlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZTogUm9sZVN0YXR1cy5WSVNJVE9SX01VU0VVTSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiR2VuZXJhdGVkIGZyb20gdGVtcGxhdGVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklEOiB1c2VyLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydERhdGVUaW1lOiB0aGlzLnRlbXBsYXRlLnN0YXJ0RGF0ZVRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZERhdGVUaW1lOiB0aGlzLnRlbXBsYXRlLmVuZERhdGVUaW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZUlEOiB0aGlzLnRlbXBsYXRlLnNwYWNlSUQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVJRDogdGhpcy50ZW1wbGF0ZS56b25lSUQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlTWlzc2lvbklEOiB0aGlzLnRlbXBsYXRlLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFnczogdGhpcy50ZW1wbGF0ZS5oYXNodGFncyxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pc3Npb24gPSBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmNyZWF0ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2lvbklucHV0LFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZE1pc3Npb25zLnB1c2gobWlzc2lvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVkTWlzc2lvbnMuZW1pdChjcmVhdGVkTWlzc2lvbnMpO1xyXG4gICAgICAgIHRoaXMuYWRkZWRFbWFpbHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVGaWxlSW5wdXQoZXZlbnRUYXJnZXQ6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGZpbGVzID0gZXZlbnRUYXJnZXQuZmlsZXM7XHJcbiAgICAgICAgY29uc3QgdXBsb2FkZWQgPSBmaWxlcy5pdGVtKDApO1xyXG4gICAgICAgIGlmICh1cGxvYWRlZC5uYW1lLmluY2x1ZGVzKFwiLmNzdlwiKSkge1xyXG4gICAgICAgICAgICBQYXBhLnBhcnNlKHVwbG9hZGVkLCB7XHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gb25Db21wbGV0ZShyZXN1bHRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYWlsIG9mIHJlc3VsdHMuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZGVkRW1haWxzLnB1c2gobWFpbFswXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhbGVydChcIk5vdCBhIGNzdiBmaWxlXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn1cclxuIiwiPGRpdj5cclxuICAgIDxoND57eydBZGQgZW1haWwgYWRkcmVzcycgfCB0cmFuc2xhdGV9fTwvaDQ+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIGN1c3RvbS1mb3JtXCIgI2JveCAoa2V5dXAuZW50ZXIpPVwib25BZGRFbWFpbChib3gudmFsdWUpOyBib3gudmFsdWU9JydcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIm1lQGV4YW1wbGUuY29tXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLXVzZXItZW1haWxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwib3V0ZXJfY2lyY2xlXCIgc3R5bGU9J21hcmdpbi1sZWZ0OiAxLjFlbTsnPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGlkPSdidG4taWNvbicgKGNsaWNrKT1cIm9uQWRkRW1haWwoYm94LnZhbHVlKTsgYm94LnZhbHVlPScnXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLXVzZXItZW1haWwtYnRuXCI+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IG10LTNcIj5cclxuICAgICAgICA8bGFiZWwgZm9yPVwiZmlsZVwiIGNsYXNzPVwiYnRuIGJ0bi1sYWJlbC1maWxlIHJvdW5kZWQtcGlsbFwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImZpbGVcIiAoY2hhbmdlKT1cImhhbmRsZUZpbGVJbnB1dCgkZXZlbnQudGFyZ2V0KVwiIC8+XHJcbiAgICAgICAgICAgIHt7J1VwbG9hZCBmcm9tIGNzdicgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8dWwgKm5nSWY9XCJhZGRlZEVtYWlscy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibGlzdF9pdGVtXCIgKm5nRm9yPVwibGV0IG1haWwgb2YgYWRkZWRFbWFpbHM7IGluZGV4IGFzIGluZGV4XCI+e3ttYWlsfX1cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tY29udGFpbmVyXCIgKGNsaWNrKT1cIm9uRGVsZXRlKGluZGV4KVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uaWZ5XCIgZGF0YS1pY29uPVwibWRpOnRyYXNoLWNhbi1vdXRsaW5lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwid29ya2luZ1wiPlxyXG4gICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBhY3Rpb24tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbXItMiBtdC0zIGFjdGlvbi1idXR0b25cIiBkYXRhLXRlc3RpZD1cImZvcm0tdXNlci1zdWJtaXQtYnRuXCIgKGNsaWNrKT1cIm9uQ3JlYXRlTWlzc2lvbnMoKVwiPlxyXG4gICAgICAgICAgICB7eydDcmVhdGUgdXNlcnMnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1yLTIgbXQtMyBhY3Rpb24tYnV0dG9uXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLXVzZXItY2FuY2VsLWJ0blwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+XHJcbiAgICAgICAgICAgIHt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG48L2Rpdj4iXX0=