@smarterplan/ngx-smarterplan-core 0.3.11

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 (134) hide show
  1. package/README.md +24 -0
  2. package/esm2020/lib/components/csv-export/csv-export.component.mjs +59 -0
  3. package/esm2020/lib/components/loader/loader.component.mjs +14 -0
  4. package/esm2020/lib/components/menu-bar/avatar/avatar.component.mjs +75 -0
  5. package/esm2020/lib/components/menu-bar/menu-bar.component.mjs +115 -0
  6. package/esm2020/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +254 -0
  7. package/esm2020/lib/components/menu-bar/range-date-picker/range-date-picker.component.mjs +81 -0
  8. package/esm2020/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +39 -0
  9. package/esm2020/lib/components/search-bar/search-bar.component.mjs +63 -0
  10. package/esm2020/lib/components/support-modal/support-modal.component.mjs +59 -0
  11. package/esm2020/lib/config.mjs +4 -0
  12. package/esm2020/lib/helpers.service.mjs +468 -0
  13. package/esm2020/lib/mattertagData.mjs +177 -0
  14. package/esm2020/lib/ngx-smarterplan-core.module.mjs +117 -0
  15. package/esm2020/lib/ngx-smarterplan-core.service.mjs +14 -0
  16. package/esm2020/lib/pipes/duration-to-string.pipe.mjs +66 -0
  17. package/esm2020/lib/pipes/hashtag-from-id.pipe.mjs +26 -0
  18. package/esm2020/lib/pipes/safe-url.pipe.mjs +20 -0
  19. package/esm2020/lib/pipes/time-date-to-local-string.pipe.mjs +104 -0
  20. package/esm2020/lib/pipes/username-from-id.pipe.mjs +29 -0
  21. package/esm2020/lib/services/base-tab.service.mjs +24 -0
  22. package/esm2020/lib/services/baseVisibility.service.mjs +17 -0
  23. package/esm2020/lib/services/booking.service.mjs +161 -0
  24. package/esm2020/lib/services/content.service.mjs +135 -0
  25. package/esm2020/lib/services/filter.service.mjs +560 -0
  26. package/esm2020/lib/services/intervention.service.mjs +236 -0
  27. package/esm2020/lib/services/locale.service.mjs +45 -0
  28. package/esm2020/lib/services/matterport-import.service.mjs +339 -0
  29. package/esm2020/lib/services/matterport.service.mjs +876 -0
  30. package/esm2020/lib/services/models/affectation.service.mjs +60 -0
  31. package/esm2020/lib/services/models/base-object.service.mjs +70 -0
  32. package/esm2020/lib/services/models/capture.service.mjs +34 -0
  33. package/esm2020/lib/services/models/comment.service.mjs +98 -0
  34. package/esm2020/lib/services/models/domain.service.mjs +77 -0
  35. package/esm2020/lib/services/models/equipment.service.mjs +629 -0
  36. package/esm2020/lib/services/models/event.service.mjs +128 -0
  37. package/esm2020/lib/services/models/feature.service.mjs +339 -0
  38. package/esm2020/lib/services/models/hashtag.service.mjs +38 -0
  39. package/esm2020/lib/services/models/layer.service.mjs +33 -0
  40. package/esm2020/lib/services/models/measurement.service.mjs +158 -0
  41. package/esm2020/lib/services/models/mission.service.mjs +185 -0
  42. package/esm2020/lib/services/models/navigation.service.mjs +76 -0
  43. package/esm2020/lib/services/models/node.service.mjs +31 -0
  44. package/esm2020/lib/services/models/operation.service.mjs +59 -0
  45. package/esm2020/lib/services/models/organisation.service.mjs +73 -0
  46. package/esm2020/lib/services/models/plan.service.mjs +573 -0
  47. package/esm2020/lib/services/models/poi.service.mjs +48 -0
  48. package/esm2020/lib/services/models/profile.service.mjs +54 -0
  49. package/esm2020/lib/services/models/property.service.mjs +34 -0
  50. package/esm2020/lib/services/models/space.service.mjs +184 -0
  51. package/esm2020/lib/services/models/template.service.mjs +41 -0
  52. package/esm2020/lib/services/models/ticket.service.mjs +454 -0
  53. package/esm2020/lib/services/models/visit.service.mjs +130 -0
  54. package/esm2020/lib/services/models/zone.service.mjs +184 -0
  55. package/esm2020/lib/services/navigator.service.mjs +165 -0
  56. package/esm2020/lib/services/s3.service.mjs +124 -0
  57. package/esm2020/lib/services/search.service.mjs +124 -0
  58. package/esm2020/lib/services/support.service.mjs +42 -0
  59. package/esm2020/lib/services/tag.service.mjs +101 -0
  60. package/esm2020/lib/services/user.service.mjs +444 -0
  61. package/esm2020/lib/services/viewer.service.mjs +395 -0
  62. package/esm2020/lib/services/zone-drawer.service.mjs +76 -0
  63. package/esm2020/lib/types.service.mjs +266 -0
  64. package/esm2020/public-api.mjs +63 -0
  65. package/esm2020/smarterplan-ngx-smarterplan-core.mjs +5 -0
  66. package/fesm2015/smarterplan-ngx-smarterplan-core.mjs +10057 -0
  67. package/fesm2015/smarterplan-ngx-smarterplan-core.mjs.map +1 -0
  68. package/fesm2020/smarterplan-ngx-smarterplan-core.mjs +9371 -0
  69. package/fesm2020/smarterplan-ngx-smarterplan-core.mjs.map +1 -0
  70. package/lib/components/csv-export/csv-export.component.d.ts +18 -0
  71. package/lib/components/loader/loader.component.d.ts +8 -0
  72. package/lib/components/menu-bar/avatar/avatar.component.d.ts +18 -0
  73. package/lib/components/menu-bar/menu-bar.component.d.ts +35 -0
  74. package/lib/components/menu-bar/navigation-bar/navigation-bar.component.d.ts +66 -0
  75. package/lib/components/menu-bar/range-date-picker/range-date-picker.component.d.ts +24 -0
  76. package/lib/components/modal-switch-visit/modal-switch-visit.component.d.ts +22 -0
  77. package/lib/components/search-bar/search-bar.component.d.ts +16 -0
  78. package/lib/components/support-modal/support-modal.component.d.ts +24 -0
  79. package/lib/config.d.ts +17 -0
  80. package/lib/helpers.service.d.ts +79 -0
  81. package/lib/mattertagData.d.ts +65 -0
  82. package/lib/ngx-smarterplan-core.module.d.ts +28 -0
  83. package/lib/ngx-smarterplan-core.service.d.ts +6 -0
  84. package/lib/pipes/duration-to-string.pipe.d.ts +12 -0
  85. package/lib/pipes/hashtag-from-id.pipe.d.ts +10 -0
  86. package/lib/pipes/safe-url.pipe.d.ts +10 -0
  87. package/lib/pipes/time-date-to-local-string.pipe.d.ts +16 -0
  88. package/lib/pipes/username-from-id.pipe.d.ts +11 -0
  89. package/lib/services/base-tab.service.d.ts +10 -0
  90. package/lib/services/baseVisibility.service.d.ts +8 -0
  91. package/lib/services/booking.service.d.ts +21 -0
  92. package/lib/services/content.service.d.ts +28 -0
  93. package/lib/services/filter.service.d.ts +58 -0
  94. package/lib/services/intervention.service.d.ts +25 -0
  95. package/lib/services/locale.service.d.ts +23 -0
  96. package/lib/services/matterport-import.service.d.ts +46 -0
  97. package/lib/services/matterport.service.d.ts +141 -0
  98. package/lib/services/models/affectation.service.d.ts +14 -0
  99. package/lib/services/models/base-object.service.d.ts +20 -0
  100. package/lib/services/models/capture.service.d.ts +13 -0
  101. package/lib/services/models/comment.service.d.ts +26 -0
  102. package/lib/services/models/domain.service.d.ts +19 -0
  103. package/lib/services/models/equipment.service.d.ts +88 -0
  104. package/lib/services/models/event.service.d.ts +43 -0
  105. package/lib/services/models/feature.service.d.ts +71 -0
  106. package/lib/services/models/hashtag.service.d.ts +13 -0
  107. package/lib/services/models/layer.service.d.ts +11 -0
  108. package/lib/services/models/measurement.service.d.ts +43 -0
  109. package/lib/services/models/mission.service.d.ts +32 -0
  110. package/lib/services/models/navigation.service.d.ts +22 -0
  111. package/lib/services/models/node.service.d.ts +12 -0
  112. package/lib/services/models/operation.service.d.ts +15 -0
  113. package/lib/services/models/organisation.service.d.ts +19 -0
  114. package/lib/services/models/plan.service.d.ts +117 -0
  115. package/lib/services/models/poi.service.d.ts +15 -0
  116. package/lib/services/models/profile.service.d.ts +15 -0
  117. package/lib/services/models/property.service.d.ts +13 -0
  118. package/lib/services/models/space.service.d.ts +38 -0
  119. package/lib/services/models/template.service.d.ts +15 -0
  120. package/lib/services/models/ticket.service.d.ts +86 -0
  121. package/lib/services/models/visit.service.d.ts +24 -0
  122. package/lib/services/models/zone.service.d.ts +25 -0
  123. package/lib/services/navigator.service.d.ts +55 -0
  124. package/lib/services/s3.service.d.ts +13 -0
  125. package/lib/services/search.service.d.ts +20 -0
  126. package/lib/services/support.service.d.ts +17 -0
  127. package/lib/services/tag.service.d.ts +45 -0
  128. package/lib/services/user.service.d.ts +104 -0
  129. package/lib/services/viewer.service.d.ts +113 -0
  130. package/lib/services/zone-drawer.service.d.ts +7 -0
  131. package/lib/types.service.d.ts +723 -0
  132. package/package.json +41 -0
  133. package/public-api.d.ts +56 -0
  134. package/smarterplan-ngx-smarterplan-core.d.ts +5 -0
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # NgxSmarterplanCore
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.2.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project ngx-smarterplan-core` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ngx-smarterplan-core`.
8
+ > Note: Don't forget to add `--project ngx-smarterplan-core` or else it will be added to the default project in your `angular.json` file.
9
+
10
+ ## Build
11
+
12
+ Run `ng build ngx-smarterplan-core` to build the project. The build artifacts will be stored in the `dist/` directory.
13
+
14
+ ## Publishing
15
+
16
+ After building your library with `ng build ngx-smarterplan-core`, go to the dist folder `cd dist/ngx-smarterplan-core` and run `npm publish`.
17
+
18
+ ## Running unit tests
19
+
20
+ Run `ng test ngx-smarterplan-core` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
+
22
+ ## Further help
23
+
24
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
@@ -0,0 +1,59 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@ngx-translate/core";
4
+ export class CsvExportComponent {
5
+ constructor() {
6
+ /** Header of the CSV, titles for each columns */
7
+ this.headers = [];
8
+ /** Array of each rows (array of array of string), if it's not set, then the function getRows() will be used */
9
+ this.rowsInput = undefined;
10
+ /** Function used to get rows if rowsInput is not set, call each time the user click on the button to generate the CSV file */
11
+ this.getRows = undefined;
12
+ /** Title of the file to download */
13
+ this.title = "file";
14
+ /** Label for the button to click */
15
+ this.buttonLabel = "Export";
16
+ /** Delimiter for the CSV */
17
+ this.delimeter = ";";
18
+ }
19
+ async onClickDownload() {
20
+ let rows = this.rowsInput;
21
+ if (!rows) {
22
+ rows = await Promise.resolve(this.getRows());
23
+ }
24
+ const data = `data:text/csv;charset=utf-8,${this.headers.join(this.delimeter)}\n${rows
25
+ .map((row) =>
26
+ /** Clean each rows/cells */
27
+ row
28
+ .map((value) => value
29
+ .replace(this.delimeter, " ")
30
+ .replace("\n", " ")
31
+ .replace("\r", " "))
32
+ .join(this.delimeter))
33
+ .join("\n")}`;
34
+ /** Create a link to download the file */
35
+ const link = document.createElement("a");
36
+ link.setAttribute("href", encodeURI(data));
37
+ link.setAttribute("download", `${this.title}.csv`);
38
+ document.body.append(link);
39
+ link.click();
40
+ link.remove();
41
+ }
42
+ }
43
+ CsvExportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CsvExportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
44
+ CsvExportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: CsvExportComponent, selector: "lib-csv-export", inputs: { headers: "headers", rowsInput: "rowsInput", getRows: "getRows", title: "title", buttonLabel: "buttonLabel" }, ngImport: i0, template: "<span [style.cursor]=\"'pointer'\" (click)=\"onClickDownload()\" class=\"download-csv d-flex\">\n <span class=\"iconify\" data-icon=\"mdi:file-download-outline\"></span>\n {{ buttonLabel | translate}}\n</span>\n", styles: [".download-csv{color:var(--smarterplan-primary)}\n"], pipes: { "translate": i1.TranslatePipe } });
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CsvExportComponent, decorators: [{
46
+ type: Component,
47
+ args: [{ selector: 'lib-csv-export', template: "<span [style.cursor]=\"'pointer'\" (click)=\"onClickDownload()\" class=\"download-csv d-flex\">\n <span class=\"iconify\" data-icon=\"mdi:file-download-outline\"></span>\n {{ buttonLabel | translate}}\n</span>\n", styles: [".download-csv{color:var(--smarterplan-primary)}\n"] }]
48
+ }], propDecorators: { headers: [{
49
+ type: Input
50
+ }], rowsInput: [{
51
+ type: Input
52
+ }], getRows: [{
53
+ type: Input
54
+ }], title: [{
55
+ type: Input
56
+ }], buttonLabel: [{
57
+ type: Input
58
+ }] } });
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LWV4cG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL2NvbXBvbmVudHMvY3N2LWV4cG9ydC9jc3YtZXhwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9jc3YtZXhwb3J0L2Nzdi1leHBvcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU9qRCxNQUFNLE9BQU8sa0JBQWtCO0lBTC9CO1FBT0ksaURBQWlEO1FBQ3hDLFlBQU8sR0FBYSxFQUFFLENBQUM7UUFFaEMsK0dBQStHO1FBQ3RHLGNBQVMsR0FBZSxTQUFTLENBQUM7UUFFM0MsOEhBQThIO1FBQ3JILFlBQU8sR0FBRyxTQUFTLENBQUM7UUFFN0Isb0NBQW9DO1FBQzNCLFVBQUssR0FBVyxNQUFNLENBQUM7UUFFaEMsb0NBQW9DO1FBQzNCLGdCQUFXLEdBQVcsUUFBUSxDQUFDO1FBRXhDLDRCQUE0QjtRQUM1QixjQUFTLEdBQVcsR0FBRyxDQUFDO0tBK0IzQjtJQTdCRyxLQUFLLENBQUMsZUFBZTtRQUNqQixJQUFJLElBQUksR0FBZSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ2hEO1FBQ0QsTUFBTSxJQUFJLEdBQUcsK0JBQStCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN6RCxJQUFJLENBQUMsU0FBUyxDQUNqQixLQUFLLElBQUk7YUFDTCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNULDRCQUE0QjtRQUM1QixHQUFHO2FBQ0UsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDWCxLQUFLO2FBQ0EsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO2FBQzVCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO2FBQ2xCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQzFCO2FBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDNUI7YUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUVsQix5Q0FBeUM7UUFDekMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNsQixDQUFDOzsrR0FoRFEsa0JBQWtCO21HQUFsQixrQkFBa0IsOEtDUC9CLDJOQUlBOzJGREdhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxnQkFBZ0I7OEJBT2YsT0FBTztzQkFBZixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItY3N2LWV4cG9ydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jc3YtZXhwb3J0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3N2LWV4cG9ydC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENzdkV4cG9ydENvbXBvbmVudCB7XG4gICAgXG4gICAgLyoqIEhlYWRlciBvZiB0aGUgQ1NWLCB0aXRsZXMgZm9yIGVhY2ggY29sdW1ucyAqL1xuICAgIEBJbnB1dCgpIGhlYWRlcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvKiogQXJyYXkgb2YgZWFjaCByb3dzIChhcnJheSBvZiBhcnJheSBvZiBzdHJpbmcpLCBpZiBpdCdzIG5vdCBzZXQsIHRoZW4gdGhlIGZ1bmN0aW9uIGdldFJvd3MoKSB3aWxsIGJlIHVzZWQgKi9cbiAgICBASW5wdXQoKSByb3dzSW5wdXQ6IHN0cmluZ1tdW10gPSB1bmRlZmluZWQ7XG5cbiAgICAvKiogRnVuY3Rpb24gdXNlZCB0byBnZXQgcm93cyBpZiByb3dzSW5wdXQgaXMgbm90IHNldCwgY2FsbCBlYWNoIHRpbWUgdGhlIHVzZXIgY2xpY2sgb24gdGhlIGJ1dHRvbiB0byBnZW5lcmF0ZSB0aGUgQ1NWIGZpbGUgKi9cbiAgICBASW5wdXQoKSBnZXRSb3dzID0gdW5kZWZpbmVkO1xuXG4gICAgLyoqIFRpdGxlIG9mIHRoZSBmaWxlIHRvIGRvd25sb2FkICovXG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZyA9IFwiZmlsZVwiO1xuXG4gICAgLyoqIExhYmVsIGZvciB0aGUgYnV0dG9uIHRvIGNsaWNrICovXG4gICAgQElucHV0KCkgYnV0dG9uTGFiZWw6IHN0cmluZyA9IFwiRXhwb3J0XCI7XG5cbiAgICAvKiogRGVsaW1pdGVyIGZvciB0aGUgQ1NWICovXG4gICAgZGVsaW1ldGVyOiBzdHJpbmcgPSBcIjtcIjtcblxuICAgIGFzeW5jIG9uQ2xpY2tEb3dubG9hZCgpIHtcbiAgICAgICAgbGV0IHJvd3M6IHN0cmluZ1tdW10gPSB0aGlzLnJvd3NJbnB1dDtcbiAgICAgICAgaWYgKCFyb3dzKSB7XG4gICAgICAgICAgICByb3dzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHRoaXMuZ2V0Um93cygpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gYGRhdGE6dGV4dC9jc3Y7Y2hhcnNldD11dGYtOCwke3RoaXMuaGVhZGVycy5qb2luKFxuICAgICAgICAgICAgdGhpcy5kZWxpbWV0ZXIsXG4gICAgICAgICl9XFxuJHtyb3dzXG4gICAgICAgICAgICAubWFwKChyb3cpID0+XG4gICAgICAgICAgICAgICAgLyoqIENsZWFuIGVhY2ggcm93cy9jZWxscyAqL1xuICAgICAgICAgICAgICAgIHJvd1xuICAgICAgICAgICAgICAgICAgICAubWFwKCh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UodGhpcy5kZWxpbWV0ZXIsIFwiIFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiXFxuXCIsIFwiIFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiXFxyXCIsIFwiIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuam9pbih0aGlzLmRlbGltZXRlciksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbihcIlxcblwiKX1gO1xuXG4gICAgICAgIC8qKiBDcmVhdGUgYSBsaW5rIHRvIGRvd25sb2FkIHRoZSBmaWxlICovXG4gICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGVuY29kZVVSSShkYXRhKSk7XG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKFwiZG93bmxvYWRcIiwgYCR7dGhpcy50aXRsZX0uY3N2YCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGxpbmspO1xuICAgICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICAgIGxpbmsucmVtb3ZlKCk7XG4gICAgfVxufVxuIiwiPHNwYW4gW3N0eWxlLmN1cnNvcl09XCIncG9pbnRlcidcIiAoY2xpY2spPVwib25DbGlja0Rvd25sb2FkKClcIiBjbGFzcz1cImRvd25sb2FkLWNzdiBkLWZsZXhcIj5cbiAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6ZmlsZS1kb3dubG9hZC1vdXRsaW5lXCI+PC9zcGFuPlxuICAgIHt7IGJ1dHRvbkxhYmVsIHwgdHJhbnNsYXRlfX1cbjwvc3Bhbj5cbiJdfQ==
@@ -0,0 +1,14 @@
1
+ import { Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class LoaderComponent {
4
+ constructor() { }
5
+ ngOnInit() {
6
+ }
7
+ }
8
+ LoaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: LoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9
+ LoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: LoaderComponent, selector: "lib-loader", ngImport: i0, template: "<div class=\"sk-fading-circle\">\r\n <img src=\"../../../../assets/icons/smarterplan.svg\">\r\n <div class=\"sk-circle1 sk-circle\"></div>\r\n <div class=\"sk-circle2 sk-circle\"></div>\r\n <div class=\"sk-circle3 sk-circle\"></div>\r\n <div class=\"sk-circle4 sk-circle\"></div>\r\n <div class=\"sk-circle5 sk-circle\"></div>\r\n <div class=\"sk-circle6 sk-circle\"></div>\r\n <div class=\"sk-circle7 sk-circle\"></div>\r\n <div class=\"sk-circle8 sk-circle\"></div>\r\n <div class=\"sk-circle9 sk-circle\"></div>\r\n <div class=\"sk-circle10 sk-circle\"></div>\r\n <div class=\"sk-circle11 sk-circle\"></div>\r\n <div class=\"sk-circle12 sk-circle\"></div>\r\n</div>\r\n", styles: [".sk-fading-circle{width:88px;height:88px;position:relative}.sk-fading-circle img{width:2rem;position:absolute;left:calc(50% - 16px);top:calc(50% - 16px)}.sk-fading-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-fading-circle .sk-circle:before{content:\"\";display:block;margin:0 auto;width:15%;height:15%;background-color:var(--smarterplan-primary);border-radius:100%;animation:sk-circleFadeDelay 1.2s infinite ease-in-out both}.sk-fading-circle .sk-circle2{transform:rotate(30deg)}.sk-fading-circle .sk-circle3{transform:rotate(60deg)}.sk-fading-circle .sk-circle4{transform:rotate(90deg)}.sk-fading-circle .sk-circle5{transform:rotate(120deg)}.sk-fading-circle .sk-circle6{transform:rotate(150deg)}.sk-fading-circle .sk-circle7{transform:rotate(180deg)}.sk-fading-circle .sk-circle8{transform:rotate(210deg)}.sk-fading-circle .sk-circle9{transform:rotate(240deg)}.sk-fading-circle .sk-circle10{transform:rotate(270deg)}.sk-fading-circle .sk-circle11{transform:rotate(300deg)}.sk-fading-circle .sk-circle12{transform:rotate(330deg)}.sk-fading-circle .sk-circle2:before{animation-delay:-1.1s}.sk-fading-circle .sk-circle3:before{animation-delay:-1s}.sk-fading-circle .sk-circle4:before{animation-delay:-.9s}.sk-fading-circle .sk-circle5:before{animation-delay:-.8s}.sk-fading-circle .sk-circle6:before{animation-delay:-.7s}.sk-fading-circle .sk-circle7:before{animation-delay:-.6s}.sk-fading-circle .sk-circle8:before{animation-delay:-.5s}.sk-fading-circle .sk-circle9:before{animation-delay:-.4s}.sk-fading-circle .sk-circle10:before{animation-delay:-.3s}.sk-fading-circle .sk-circle11:before{animation-delay:-.2s}.sk-fading-circle .sk-circle12:before{animation-delay:-.1s}@keyframes sk-circleFadeDelay{0%,39%,to{opacity:0}40%{opacity:1}}\n"] });
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: LoaderComponent, decorators: [{
11
+ type: Component,
12
+ args: [{ selector: 'lib-loader', template: "<div class=\"sk-fading-circle\">\r\n <img src=\"../../../../assets/icons/smarterplan.svg\">\r\n <div class=\"sk-circle1 sk-circle\"></div>\r\n <div class=\"sk-circle2 sk-circle\"></div>\r\n <div class=\"sk-circle3 sk-circle\"></div>\r\n <div class=\"sk-circle4 sk-circle\"></div>\r\n <div class=\"sk-circle5 sk-circle\"></div>\r\n <div class=\"sk-circle6 sk-circle\"></div>\r\n <div class=\"sk-circle7 sk-circle\"></div>\r\n <div class=\"sk-circle8 sk-circle\"></div>\r\n <div class=\"sk-circle9 sk-circle\"></div>\r\n <div class=\"sk-circle10 sk-circle\"></div>\r\n <div class=\"sk-circle11 sk-circle\"></div>\r\n <div class=\"sk-circle12 sk-circle\"></div>\r\n</div>\r\n", styles: [".sk-fading-circle{width:88px;height:88px;position:relative}.sk-fading-circle img{width:2rem;position:absolute;left:calc(50% - 16px);top:calc(50% - 16px)}.sk-fading-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-fading-circle .sk-circle:before{content:\"\";display:block;margin:0 auto;width:15%;height:15%;background-color:var(--smarterplan-primary);border-radius:100%;animation:sk-circleFadeDelay 1.2s infinite ease-in-out both}.sk-fading-circle .sk-circle2{transform:rotate(30deg)}.sk-fading-circle .sk-circle3{transform:rotate(60deg)}.sk-fading-circle .sk-circle4{transform:rotate(90deg)}.sk-fading-circle .sk-circle5{transform:rotate(120deg)}.sk-fading-circle .sk-circle6{transform:rotate(150deg)}.sk-fading-circle .sk-circle7{transform:rotate(180deg)}.sk-fading-circle .sk-circle8{transform:rotate(210deg)}.sk-fading-circle .sk-circle9{transform:rotate(240deg)}.sk-fading-circle .sk-circle10{transform:rotate(270deg)}.sk-fading-circle .sk-circle11{transform:rotate(300deg)}.sk-fading-circle .sk-circle12{transform:rotate(330deg)}.sk-fading-circle .sk-circle2:before{animation-delay:-1.1s}.sk-fading-circle .sk-circle3:before{animation-delay:-1s}.sk-fading-circle .sk-circle4:before{animation-delay:-.9s}.sk-fading-circle .sk-circle5:before{animation-delay:-.8s}.sk-fading-circle .sk-circle6:before{animation-delay:-.7s}.sk-fading-circle .sk-circle7:before{animation-delay:-.6s}.sk-fading-circle .sk-circle8:before{animation-delay:-.5s}.sk-fading-circle .sk-circle9:before{animation-delay:-.4s}.sk-fading-circle .sk-circle10:before{animation-delay:-.3s}.sk-fading-circle .sk-circle11:before{animation-delay:-.2s}.sk-fading-circle .sk-circle12:before{animation-delay:-.1s}@keyframes sk-circleFadeDelay{0%,39%,to{opacity:0}40%{opacity:1}}\n"] }]
13
+ }], ctorParameters: function () { return []; } });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9sb2FkZXIvbG9hZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9sb2FkZXIvbG9hZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7O0FBT2xELE1BQU0sT0FBTyxlQUFlO0lBRXhCLGdCQUFnQixDQUFDO0lBRWpCLFFBQVE7SUFDUixDQUFDOzs0R0FMUSxlQUFlO2dHQUFmLGVBQWUsa0RDUDVCLHlzQkFlQTsyRkRSYSxlQUFlO2tCQUwzQixTQUFTOytCQUNFLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItbG9hZGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbG9hZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9sb2FkZXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTG9hZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwic2stZmFkaW5nLWNpcmNsZVwiPlxyXG4gICAgPGltZyBzcmM9XCIuLi8uLi8uLi8uLi9hc3NldHMvaWNvbnMvc21hcnRlcnBsYW4uc3ZnXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2stY2lyY2xlMSBzay1jaXJjbGVcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzay1jaXJjbGUyIHNrLWNpcmNsZVwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNrLWNpcmNsZTMgc2stY2lyY2xlXCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2stY2lyY2xlNCBzay1jaXJjbGVcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzay1jaXJjbGU1IHNrLWNpcmNsZVwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNrLWNpcmNsZTYgc2stY2lyY2xlXCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2stY2lyY2xlNyBzay1jaXJjbGVcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzay1jaXJjbGU4IHNrLWNpcmNsZVwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNrLWNpcmNsZTkgc2stY2lyY2xlXCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2stY2lyY2xlMTAgc2stY2lyY2xlXCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2stY2lyY2xlMTEgc2stY2lyY2xlXCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2stY2lyY2xlMTIgc2stY2lyY2xlXCI+PC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -0,0 +1,75 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { uploadFileToS3, getSignedImageUrlForProfile } from '../../../services/s3.service';
3
+ import { ProfileEntity } from '../../../types.service';
4
+ import { Md5 } from "ts-md5/dist/md5";
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../../services/user.service";
7
+ import * as i2 from "../../../services/models/profile.service";
8
+ const cache = {};
9
+ export class AvatarComponent {
10
+ constructor(userService, profileService) {
11
+ this.userService = userService;
12
+ this.profileService = profileService;
13
+ this.size = 45;
14
+ this.userService.isChanged.subscribe(() => {
15
+ if (!this.currentUser) {
16
+ this.currentUser = this.userService.cu;
17
+ this.setAvatar(this.currentUser);
18
+ }
19
+ });
20
+ }
21
+ async ngOnInit() {
22
+ if (this.userID) {
23
+ const profile = await this.profileService.getProfile(this.userID);
24
+ if (profile) {
25
+ const user = new ProfileEntity(profile);
26
+ this.setAvatar(user);
27
+ }
28
+ }
29
+ else {
30
+ this.currentUser = this.userService.cu;
31
+ this.setAvatar(this.currentUser);
32
+ }
33
+ }
34
+ async setAvatar(user) {
35
+ const { id, avatar, email } = user;
36
+ // If avatar is not cached, check first if we have an avatar URL to fetch
37
+ // from S3. If not, retrieve it from libravatar.
38
+ // TODO use in a Service to be able to change/upload freely.
39
+ if (!cache.hasOwnProperty(id)) {
40
+ if (!avatar && email) {
41
+ const md5 = new Md5();
42
+ const md5hash = md5.appendStr(email).end();
43
+ const avatar = `https://seccdn.libravatar.org/avatar/${md5hash}?s=${this.size}&default=identicon`;
44
+ const url = await fetch(avatar)
45
+ .then((res) => res.blob())
46
+ .then((blob) => {
47
+ const file = new File([blob], "avatar.jpeg", {
48
+ type: "image/jpeg",
49
+ });
50
+ return uploadFileToS3("avatars/", file, id);
51
+ });
52
+ await this.profileService.updateProfile({ id, avatar: url });
53
+ user.avatar = url;
54
+ cache[id] = avatar;
55
+ }
56
+ if (avatar) {
57
+ // TODO generating signed urls for avatar makes NO SENSE ($$$)
58
+ // Sorry got to copypaste that, but really need to get rid of
59
+ cache[id] = await getSignedImageUrlForProfile(user);
60
+ }
61
+ }
62
+ this.avatar = cache[id];
63
+ }
64
+ }
65
+ AvatarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AvatarComponent, deps: [{ token: i1.BaseUserService }, { token: i2.ProfileService }], target: i0.ɵɵFactoryTarget.Component });
66
+ AvatarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: AvatarComponent, selector: "lib-avatar", inputs: { size: "size", userID: "userID" }, ngImport: i0, template: `<img [src]="avatar" />`, isInline: true, styles: ["img{max-width:100%;max-height:100%;height:100%;width:100%;border-radius:50%}\n"] });
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AvatarComponent, decorators: [{
68
+ type: Component,
69
+ args: [{ selector: 'lib-avatar', template: `<img [src]="avatar" />`, styles: ["img{max-width:100%;max-height:100%;height:100%;width:100%;border-radius:50%}\n"] }]
70
+ }], ctorParameters: function () { return [{ type: i1.BaseUserService }, { type: i2.ProfileService }]; }, propDecorators: { size: [{
71
+ type: Input
72
+ }], userID: [{
73
+ type: Input
74
+ }] } });
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhdGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9tZW51LWJhci9hdmF0YXIvYXZhdGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFM0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQUV0QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7QUFNakIsTUFBTSxPQUFPLGVBQWU7SUFVeEIsWUFDWSxXQUE0QixFQUM1QixjQUE4QjtRQUQ5QixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBVmpDLFNBQUksR0FBVyxFQUFFLENBQUM7UUFZdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDcEM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNWLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLElBQUksT0FBTyxFQUFFO2dCQUNULE1BQU0sSUFBSSxHQUFHLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3hCO1NBQ0o7YUFBTTtZQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDcEM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFtQjtRQUMvQixNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFbkMseUVBQXlFO1FBQ3pFLGdEQUFnRDtRQUNoRCw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7Z0JBQ2xCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzNDLE1BQU0sTUFBTSxHQUFHLHdDQUF3QyxPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksb0JBQW9CLENBQUM7Z0JBQ2xHLE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQztxQkFDMUIsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7cUJBQ3pCLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUNYLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsYUFBYSxFQUFFO3dCQUN6QyxJQUFJLEVBQUUsWUFBWTtxQkFDckIsQ0FBQyxDQUFDO29CQUNILE9BQU8sY0FBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2hELENBQUMsQ0FBQyxDQUFDO2dCQUNQLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO2dCQUNsQixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO2FBQ3RCO1lBQ0QsSUFBSSxNQUFNLEVBQUU7Z0JBQ1IsOERBQThEO2dCQUM5RCw2REFBNkQ7Z0JBQzdELEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3ZEO1NBQ0o7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1QixDQUFDOzs0R0FqRVEsZUFBZTtnR0FBZixlQUFlLDhGQUhoQix3QkFBd0I7MkZBR3ZCLGVBQWU7a0JBTDNCLFNBQVM7K0JBQ0UsWUFBWSxZQUNaLHdCQUF3QjttSUFLdkIsSUFBSTtzQkFBWixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUHJvZmlsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2RlbHMvcHJvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IHVwbG9hZEZpbGVUb1MzLCBnZXRTaWduZWRJbWFnZVVybEZvclByb2ZpbGUgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zMy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQcm9maWxlRW50aXR5IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMuc2VydmljZSc7XG5pbXBvcnQgeyBNZDUgfSBmcm9tIFwidHMtbWQ1L2Rpc3QvbWQ1XCI7XG5cbmNvbnN0IGNhY2hlID0ge307XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYXZhdGFyJyxcbiAgdGVtcGxhdGU6IGA8aW1nIFtzcmNdPVwiYXZhdGFyXCIgLz5gLFxuICBzdHlsZVVybHM6IFtcIi4vYXZhdGFyLmNvbXBvbmVudC5zY3NzXCJdLFxufSlcbmV4cG9ydCBjbGFzcyBBdmF0YXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgQElucHV0KCkgc2l6ZTogbnVtYmVyID0gNDU7XG5cbiAgICBASW5wdXQoKSB1c2VySUQ6IHN0cmluZztcblxuICAgIGN1cnJlbnRVc2VyOiBQcm9maWxlRW50aXR5O1xuXG4gICAgYXZhdGFyO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwcm9maWxlU2VydmljZTogUHJvZmlsZVNlcnZpY2UsXG4gICAgKSB7XG4gICAgICAgIHRoaXMudXNlclNlcnZpY2UuaXNDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudFVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRVc2VyID0gdGhpcy51c2VyU2VydmljZS5jdTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEF2YXRhcih0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnVzZXJJRCkge1xuICAgICAgICAgICAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UHJvZmlsZSh0aGlzLnVzZXJJRCk7XG4gICAgICAgICAgICBpZiAocHJvZmlsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBuZXcgUHJvZmlsZUVudGl0eShwcm9maWxlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEF2YXRhcih1c2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFVzZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmN1O1xuICAgICAgICAgICAgdGhpcy5zZXRBdmF0YXIodGhpcy5jdXJyZW50VXNlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBzZXRBdmF0YXIodXNlcjogUHJvZmlsZUVudGl0eSkge1xuICAgICAgICBjb25zdCB7IGlkLCBhdmF0YXIsIGVtYWlsIH0gPSB1c2VyO1xuXG4gICAgICAgIC8vIElmIGF2YXRhciBpcyBub3QgY2FjaGVkLCBjaGVjayBmaXJzdCBpZiB3ZSBoYXZlIGFuIGF2YXRhciBVUkwgdG8gZmV0Y2hcbiAgICAgICAgLy8gZnJvbSBTMy4gSWYgbm90LCByZXRyaWV2ZSBpdCBmcm9tIGxpYnJhdmF0YXIuXG4gICAgICAgIC8vIFRPRE8gdXNlIGluIGEgU2VydmljZSB0byBiZSBhYmxlIHRvIGNoYW5nZS91cGxvYWQgZnJlZWx5LlxuICAgICAgICBpZiAoIWNhY2hlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgaWYgKCFhdmF0YXIgJiYgZW1haWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZDUgPSBuZXcgTWQ1KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWQ1aGFzaCA9IG1kNS5hcHBlbmRTdHIoZW1haWwpLmVuZCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGF2YXRhciA9IGBodHRwczovL3NlY2Nkbi5saWJyYXZhdGFyLm9yZy9hdmF0YXIvJHttZDVoYXNofT9zPSR7dGhpcy5zaXplfSZkZWZhdWx0PWlkZW50aWNvbmA7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgZmV0Y2goYXZhdGFyKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzKSA9PiByZXMuYmxvYigpKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoYmxvYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgXCJhdmF0YXIuanBlZ1wiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbWFnZS9qcGVnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGxvYWRGaWxlVG9TMyhcImF2YXRhcnMvXCIsIGZpbGUsIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS51cGRhdGVQcm9maWxlKHsgaWQsIGF2YXRhcjogdXJsIH0pO1xuICAgICAgICAgICAgICAgIHVzZXIuYXZhdGFyID0gdXJsO1xuICAgICAgICAgICAgICAgIGNhY2hlW2lkXSA9IGF2YXRhcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhdmF0YXIpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIGdlbmVyYXRpbmcgc2lnbmVkIHVybHMgZm9yIGF2YXRhciBtYWtlcyBOTyBTRU5TRSAoJCQkKVxuICAgICAgICAgICAgICAgIC8vIFNvcnJ5IGdvdCB0byBjb3B5cGFzdGUgdGhhdCwgYnV0IHJlYWxseSBuZWVkIHRvIGdldCByaWQgb2ZcbiAgICAgICAgICAgICAgICBjYWNoZVtpZF0gPSBhd2FpdCBnZXRTaWduZWRJbWFnZVVybEZvclByb2ZpbGUodXNlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdmF0YXIgPSBjYWNoZVtpZF07XG4gICAgfVxufVxuIl19
@@ -0,0 +1,115 @@
1
+ import { Component } from '@angular/core';
2
+ import { SupportModalComponent } from '../support-modal/support-modal.component';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/router";
5
+ import * as i2 from "../../services/locale.service";
6
+ import * as i3 from "../../services/user.service";
7
+ import * as i4 from "../../services/navigator.service";
8
+ import * as i5 from "../../services/support.service";
9
+ import * as i6 from "./range-date-picker/range-date-picker.component";
10
+ import * as i7 from "./avatar/avatar.component";
11
+ import * as i8 from "./navigation-bar/navigation-bar.component";
12
+ import * as i9 from "@angular/common";
13
+ import * as i10 from "@ng-bootstrap/ng-bootstrap";
14
+ import * as i11 from "@angular/forms";
15
+ import * as i12 from "@ngx-translate/core";
16
+ export class MenuBarComponent {
17
+ constructor(router, localeService, userService, navigatorService, supportService) {
18
+ this.router = router;
19
+ this.localeService = localeService;
20
+ this.userService = userService;
21
+ this.navigatorService = navigatorService;
22
+ this.supportService = supportService;
23
+ this.isVisitor = true;
24
+ this.isVisible = false;
25
+ this.userSubscription = this.userService.isChanged.subscribe((isChanged) => {
26
+ if (isChanged) {
27
+ this.update();
28
+ }
29
+ });
30
+ this.navSubscription = this.navigatorService.isVisibleChanged.subscribe((data) => {
31
+ this.isVisible = data;
32
+ });
33
+ }
34
+ ngOnInit() {
35
+ this.update();
36
+ }
37
+ ngAfterViewInit() {
38
+ const input = document.querySelector("#mainSearchBar");
39
+ if (input) {
40
+ input.addEventListener("keydown", ({ key }) => {
41
+ if (key === "Enter") {
42
+ this.onSubmit();
43
+ }
44
+ });
45
+ }
46
+ this.handleCloseNavbarForItems();
47
+ }
48
+ ngOnDestroy() {
49
+ if (this.userSubscription) {
50
+ this.userSubscription.unsubscribe();
51
+ }
52
+ if (this.navSubscription) {
53
+ this.navSubscription.unsubscribe();
54
+ }
55
+ }
56
+ async signOut() {
57
+ await this.userService.logoutCurrentAndSignOutAuth();
58
+ this.router.navigate(["auth"]);
59
+ }
60
+ async update() {
61
+ this.user = this.userService.cu;
62
+ this.mission = this.userService.currentMissions[0];
63
+ this.isManager = this.userService.hasManagerRoleInAnyMission();
64
+ this.isVisitor = this.userService.isVisitor();
65
+ if (!this.isVisitor) {
66
+ this.isVisible = true;
67
+ }
68
+ }
69
+ // eslint-disable-next-line class-methods-use-this
70
+ onSubmit() {
71
+ const input = document.querySelector("#mainSearchBar");
72
+ const searchValue = input.value.toLowerCase();
73
+ if (searchValue !== "") {
74
+ const baseUrl = location.origin;
75
+ window.open(`${baseUrl}/dashboard/search?term=${searchValue}`, "_blank");
76
+ }
77
+ }
78
+ onToggleVisible() {
79
+ this.isVisible = !this.isVisible;
80
+ }
81
+ handleCloseNavbarForItems() {
82
+ const navItems = document.querySelectorAll(".nav-link");
83
+ const buttonNavToggler = document.querySelector(".navbar-toggler");
84
+ const navbarItemContainer = document.querySelector("#nav-item-container");
85
+ const navbarItemContainerTwo = document.querySelector("#nav-item-container-blue");
86
+ // eslint-disable-next-line unicorn/no-array-for-each
87
+ navItems.forEach((navItem) => {
88
+ navItem.addEventListener("click", () => {
89
+ if (navbarItemContainer.classList.contains("show")) {
90
+ buttonNavToggler.setAttribute("aria-expanded", "false");
91
+ navbarItemContainer.classList.remove("show");
92
+ navbarItemContainer.classList.replace("collapse", "collapsing");
93
+ navbarItemContainerTwo.classList.remove("show");
94
+ navbarItemContainerTwo.classList.replace("collapse", "collapsing");
95
+ setTimeout(() => {
96
+ navbarItemContainer.classList.replace("collapsing", "collapse");
97
+ }, 500);
98
+ setTimeout(() => {
99
+ navbarItemContainerTwo.classList.replace("collapsing", "collapse");
100
+ }, 500);
101
+ }
102
+ });
103
+ });
104
+ }
105
+ openSupportForm() {
106
+ this.supportService.openSupportForm(SupportModalComponent);
107
+ }
108
+ }
109
+ MenuBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MenuBarComponent, deps: [{ token: i1.Router }, { token: i2.LocaleService }, { token: i3.BaseUserService }, { token: i4.NavigatorService }, { token: i5.SupportService }], target: i0.ɵɵFactoryTarget.Component });
110
+ MenuBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: MenuBarComponent, selector: "lib-menu-bar", ngImport: i0, template: "<div id=\"menu-bar\">\r\n <div *ngIf=\"!isVisitor\">\r\n <nav class=\"navbar navbar-expand-md navbar-light p-0\">\r\n <div class=\"container-fluid\" *ngIf=\"isVisible\">\r\n <div class=\"navbar-brand\" [routerLink]=\"['/dashboard']\">\r\n <img alt=\"\" src=\"../assets/images/logos/logo-rvb-straight.png\">\r\n </div>\r\n <button class=\"navbar-toggler\" data-bs-target=\".navbar-collapse\" data-bs-toggle=\"collapse\" type=\"button\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n <div class=\"collapse navbar-collapse\" id=\"nav-item-container\">\r\n <form class=\"form-inline ms-3\">\r\n <input class=\"form-control search-button\" placeholder=\"keyword\" id=\"mainSearchBar\" type=\"text\">\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSubmit()\">{{'Search' |\r\n translate}}</button>\r\n <lib-range-date-picker></lib-range-date-picker>\r\n </form>\r\n \r\n <!-- <div class=\"d-md-none\">\r\n <app-dashboard-navigation></app-dashboard-navigation>\r\n </div> -->\r\n <div class=\"ms-auto nav-item dropdown\">\r\n <div class=\"profile_pic dropdown-toggle\" data-bs-toggle=\"dropdown\">\r\n <lib-avatar></lib-avatar>\r\n </div>\r\n <div class=\"dropdown-menu dropdown-menu-right\">\r\n <p *ngIf=\"user && mission\" class=\"p-2\">\r\n <span class=\"username\">{{ user.displayName }}</span><br />\r\n <span class=\"user-role\">{{ mission.role }}</span><br />\r\n <span class=\"org\">{{ mission.organisation ? mission.organisation.name : \"No organisation\" |\r\n translate}}</span>\r\n </p>\r\n <div class=\"dropdown-divider\"></div>\r\n <!-- <a class=\"dropdown-item\" routerLink=\"/debug\" *ngIf=\"isManager\">Debug</a> -->\r\n <a class=\"dropdown-item\" (click)=\"localeService.modal()\">{{'Language' | translate}}</a>\r\n <a class=\"dropdown-item\" routerLink=\"/dashboard\">{{'Data management' | translate}}</a>\r\n <a class=\"dropdown-item\" routerLink=\"/admin\" *ngIf=\"isManager\">\r\n {{'Users management' | translate}}</a>\r\n <a class=\"dropdown-item\" routerLink=\"/profile\">\r\n {{'Profile' | translate}}</a>\r\n <div class=\"dropdown-divider\"></div>\r\n <button class=\"dropdown-item\" (click)=\"openSupportForm()\">{{\"Help\" | translate}}</button>\r\n <button class=\"dropdown-item\" (click)=\"signOut()\">{{\"Logout\" | translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </nav>\r\n <lib-navigation-bar *ngIf=\"isVisible\"></lib-navigation-bar>\r\n </div>\r\n</div>\r\n \r\n", styles: [":host{position:sticky;top:0;z-index:200}.navbar{z-index:200}.navbar-brand{padding-top:5px;padding-bottom:5px;cursor:pointer}.navbar-brand img{height:70px}.profile_pic{border-radius:50%;height:45px;width:45px;margin:1em;border:.2px solid #969696}.navbar-nav .profile-pic-container .dropdown-menu{position:absolute}.navbar.second-nav{z-index:199;background-color:var(--smarterplan-primary)}.profile_pic.dropdown-toggle:after{display:none}.navbar-light{border-bottom:1px solid var(--smarterplan-primary);background-color:#fff}input,select{margin-right:15px}.select{background:transparent;border:none;color:#fff;margin:6px 20px 0;width:auto}button{background-color:#fff;color:var(--smarterplan-primary);padding:5px 10px}button:disabled,button[disabled]{color:#c04f4f}.navbar-toggler{margin-right:1em}.icon{height:40px;width:40px;color:var(--smarterplan-primary)}.search-button{width:auto}\n"], components: [{ type: i6.RangeDatePickerComponent, selector: "lib-range-date-picker" }, { type: i7.AvatarComponent, selector: "lib-avatar", inputs: ["size", "userID"] }, { type: i8.NavigationBarComponent, selector: "lib-navigation-bar" }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgbNavbar, selector: ".navbar" }, { type: i1.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i11.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }], pipes: { "translate": i12.TranslatePipe } });
111
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MenuBarComponent, decorators: [{
112
+ type: Component,
113
+ args: [{ selector: 'lib-menu-bar', template: "<div id=\"menu-bar\">\r\n <div *ngIf=\"!isVisitor\">\r\n <nav class=\"navbar navbar-expand-md navbar-light p-0\">\r\n <div class=\"container-fluid\" *ngIf=\"isVisible\">\r\n <div class=\"navbar-brand\" [routerLink]=\"['/dashboard']\">\r\n <img alt=\"\" src=\"../assets/images/logos/logo-rvb-straight.png\">\r\n </div>\r\n <button class=\"navbar-toggler\" data-bs-target=\".navbar-collapse\" data-bs-toggle=\"collapse\" type=\"button\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n <div class=\"collapse navbar-collapse\" id=\"nav-item-container\">\r\n <form class=\"form-inline ms-3\">\r\n <input class=\"form-control search-button\" placeholder=\"keyword\" id=\"mainSearchBar\" type=\"text\">\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onSubmit()\">{{'Search' |\r\n translate}}</button>\r\n <lib-range-date-picker></lib-range-date-picker>\r\n </form>\r\n \r\n <!-- <div class=\"d-md-none\">\r\n <app-dashboard-navigation></app-dashboard-navigation>\r\n </div> -->\r\n <div class=\"ms-auto nav-item dropdown\">\r\n <div class=\"profile_pic dropdown-toggle\" data-bs-toggle=\"dropdown\">\r\n <lib-avatar></lib-avatar>\r\n </div>\r\n <div class=\"dropdown-menu dropdown-menu-right\">\r\n <p *ngIf=\"user && mission\" class=\"p-2\">\r\n <span class=\"username\">{{ user.displayName }}</span><br />\r\n <span class=\"user-role\">{{ mission.role }}</span><br />\r\n <span class=\"org\">{{ mission.organisation ? mission.organisation.name : \"No organisation\" |\r\n translate}}</span>\r\n </p>\r\n <div class=\"dropdown-divider\"></div>\r\n <!-- <a class=\"dropdown-item\" routerLink=\"/debug\" *ngIf=\"isManager\">Debug</a> -->\r\n <a class=\"dropdown-item\" (click)=\"localeService.modal()\">{{'Language' | translate}}</a>\r\n <a class=\"dropdown-item\" routerLink=\"/dashboard\">{{'Data management' | translate}}</a>\r\n <a class=\"dropdown-item\" routerLink=\"/admin\" *ngIf=\"isManager\">\r\n {{'Users management' | translate}}</a>\r\n <a class=\"dropdown-item\" routerLink=\"/profile\">\r\n {{'Profile' | translate}}</a>\r\n <div class=\"dropdown-divider\"></div>\r\n <button class=\"dropdown-item\" (click)=\"openSupportForm()\">{{\"Help\" | translate}}</button>\r\n <button class=\"dropdown-item\" (click)=\"signOut()\">{{\"Logout\" | translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </nav>\r\n <lib-navigation-bar *ngIf=\"isVisible\"></lib-navigation-bar>\r\n </div>\r\n</div>\r\n \r\n", styles: [":host{position:sticky;top:0;z-index:200}.navbar{z-index:200}.navbar-brand{padding-top:5px;padding-bottom:5px;cursor:pointer}.navbar-brand img{height:70px}.profile_pic{border-radius:50%;height:45px;width:45px;margin:1em;border:.2px solid #969696}.navbar-nav .profile-pic-container .dropdown-menu{position:absolute}.navbar.second-nav{z-index:199;background-color:var(--smarterplan-primary)}.profile_pic.dropdown-toggle:after{display:none}.navbar-light{border-bottom:1px solid var(--smarterplan-primary);background-color:#fff}input,select{margin-right:15px}.select{background:transparent;border:none;color:#fff;margin:6px 20px 0;width:auto}button{background-color:#fff;color:var(--smarterplan-primary);padding:5px 10px}button:disabled,button[disabled]{color:#c04f4f}.navbar-toggler{margin-right:1em}.icon{height:40px;width:40px;color:var(--smarterplan-primary)}.search-button{width:auto}\n"] }]
114
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.LocaleService }, { type: i3.BaseUserService }, { type: i4.NavigatorService }, { type: i5.SupportService }]; } });
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1iYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9jb21wb25lbnRzL21lbnUtYmFyL21lbnUtYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9tZW51LWJhci9tZW51LWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBUWxELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7Ozs7Ozs7OztBQU9qRixNQUFNLE9BQU8sZ0JBQWdCO0lBZ0J6QixZQUNZLE1BQWMsRUFDZixhQUE0QixFQUMzQixXQUE0QixFQUM1QixnQkFBa0MsRUFDbEMsY0FBOEI7UUFKOUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNmLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzNCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQWYxQyxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBRWpCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFlZCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUN4RCxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ1YsSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ2pCO1FBQ0wsQ0FBQyxDQUNKLENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxT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ICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IExvY2FsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2NhbGUuc2VydmljZSc7XHJcbmltcG9ydCB7IE5hdmlnYXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9uYXZpZ2F0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1cHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3VwcG9ydC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZVVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUHJvZmlsZUVudGl0eSwgTWlzc2lvbiB9IGZyb20gJy4uLy4uL3R5cGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdXBwb3J0TW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9zdXBwb3J0LW1vZGFsL3N1cHBvcnQtbW9kYWwuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLW1lbnUtYmFyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbWVudS1iYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL21lbnUtYmFyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE1lbnVCYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIHVzZXI6IFByb2ZpbGVFbnRpdHk7XHJcblxyXG4gICAgbWlzc2lvbjogTWlzc2lvbjtcclxuXHJcbiAgICBpc1Zpc2l0b3IgPSB0cnVlO1xyXG5cclxuICAgIGlzVmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgIGlzTWFuYWdlcjogYm9vbGVhbjtcclxuXHJcbiAgICB1c2VyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgbmF2U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICBwdWJsaWMgbG9jYWxlU2VydmljZTogTG9jYWxlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBuYXZpZ2F0b3JTZXJ2aWNlOiBOYXZpZ2F0b3JTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgc3VwcG9ydFNlcnZpY2U6IFN1cHBvcnRTZXJ2aWNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy51c2VyU3Vic2NyaXB0aW9uID0gdGhpcy51c2VyU2VydmljZS5pc0NoYW5nZWQuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAoaXNDaGFuZ2VkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMubmF2U3Vic2NyaXB0aW9uID0gdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmlzVmlzaWJsZUNoYW5nZWQuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1Zpc2libGUgPSBkYXRhO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICAgICBcIiNtYWluU2VhcmNoQmFyXCIsXHJcbiAgICAgICAgKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgIGlmIChpbnB1dCkge1xyXG4gICAgICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCAoeyBrZXkgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJFbnRlclwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblN1Ym1pdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5oYW5kbGVDbG9zZU5hdmJhckZvckl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudXNlclN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnVzZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubmF2U3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF2U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNpZ25PdXQoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5sb2dvdXRDdXJyZW50QW5kU2lnbk91dEF1dGgoKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJhdXRoXCJdKTsgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1cGRhdGUoKSB7XHJcbiAgICAgICAgdGhpcy51c2VyID0gdGhpcy51c2VyU2VydmljZS5jdTtcclxuICAgICAgICB0aGlzLm1pc3Npb24gPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRNaXNzaW9uc1swXTtcclxuICAgICAgICB0aGlzLmlzTWFuYWdlciA9IHRoaXMudXNlclNlcnZpY2UuaGFzTWFuYWdlclJvbGVJbkFueU1pc3Npb24oKTtcclxuICAgICAgICB0aGlzLmlzVmlzaXRvciA9IHRoaXMudXNlclNlcnZpY2UuaXNWaXNpdG9yKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzVmlzaXRvcikge1xyXG4gICAgICAgICAgICB0aGlzLmlzVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXHJcbiAgICBvblN1Ym1pdCgpIHtcclxuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAgIFwiI21haW5TZWFyY2hCYXJcIixcclxuICAgICAgICApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoVmFsdWUgPSBpbnB1dC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChzZWFyY2hWYWx1ZSAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gbG9jYXRpb24ub3JpZ2luO1xyXG4gICAgICAgICAgICB3aW5kb3cub3BlbihcclxuICAgICAgICAgICAgICAgIGAke2Jhc2VVcmx9L2Rhc2hib2FyZC9zZWFyY2g/dGVybT0ke3NlYXJjaFZhbHVlfWAsXHJcbiAgICAgICAgICAgICAgICBcIl9ibGFua1wiLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblRvZ2dsZVZpc2libGUoKSB7XHJcbiAgICAgICAgdGhpcy5pc1Zpc2libGUgPSAhdGhpcy5pc1Zpc2libGU7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ2xvc2VOYXZiYXJGb3JJdGVtcygpIHtcclxuICAgICAgICBjb25zdCBuYXZJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIubmF2LWxpbmtcIik7XHJcbiAgICAgICAgY29uc3QgYnV0dG9uTmF2VG9nZ2xlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubmF2YmFyLXRvZ2dsZXJcIik7XHJcbiAgICAgICAgY29uc3QgbmF2YmFySXRlbUNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAgIFwiI25hdi1pdGVtLWNvbnRhaW5lclwiLFxyXG4gICAgICAgICkgYXMgSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgbmF2YmFySXRlbUNvbnRhaW5lclR3byA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAgIFwiI25hdi1pdGVtLWNvbnRhaW5lci1ibHVlXCIsXHJcbiAgICAgICAgKSBhcyBIVE1MRGl2RWxlbWVudDtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1hcnJheS1mb3ItZWFjaFxyXG4gICAgICAgIG5hdkl0ZW1zLmZvckVhY2goKG5hdkl0ZW0pID0+IHtcclxuICAgICAgICAgICAgbmF2SXRlbS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5hdmJhckl0ZW1Db250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKFwic2hvd1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbk5hdlRvZ2dsZXIuc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCBcImZhbHNlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdmJhckl0ZW1Db250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcInNob3dcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF2YmFySXRlbUNvbnRhaW5lci5jbGFzc0xpc3QucmVwbGFjZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xsYXBzZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNvbGxhcHNpbmdcIixcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdmJhckl0ZW1Db250YWluZXJUd28uY2xhc3NMaXN0LnJlbW92ZShcInNob3dcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF2YmFySXRlbUNvbnRhaW5lclR3by5jbGFzc0xpc3QucmVwbGFjZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xsYXBzZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNvbGxhcHNpbmdcIixcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2YmFySXRlbUNvbnRhaW5lci5jbGFzc0xpc3QucmVwbGFjZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sbGFwc2luZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xsYXBzZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmJhckl0ZW1Db250YWluZXJUd28uY2xhc3NMaXN0LnJlcGxhY2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbGxhcHNpbmdcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sbGFwc2VcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvcGVuU3VwcG9ydEZvcm0oKSB7XHJcbiAgICAgICAgdGhpcy5zdXBwb3J0U2VydmljZS5vcGVuU3VwcG9ydEZvcm0oU3VwcG9ydE1vZGFsQ29tcG9uZW50KTtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiPGRpdiBpZD1cIm1lbnUtYmFyXCI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiIWlzVmlzaXRvclwiPlxyXG4gICAgICA8bmF2IGNsYXNzPVwibmF2YmFyIG5hdmJhci1leHBhbmQtbWQgbmF2YmFyLWxpZ2h0IHAtMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIiAqbmdJZj1cImlzVmlzaWJsZVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdmJhci1icmFuZFwiIFtyb3V0ZXJMaW5rXT1cIlsnL2Rhc2hib2FyZCddXCI+XHJcbiAgICAgICAgICAgIDxpbWcgYWx0PVwiXCIgc3JjPVwiLi4vYXNzZXRzL2ltYWdlcy9sb2dvcy9sb2dvLXJ2Yi1zdHJhaWdodC5wbmdcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyXCIgZGF0YS1icy10YXJnZXQ9XCIubmF2YmFyLWNvbGxhcHNlXCIgZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZiYXItdG9nZ2xlci1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlXCIgaWQ9XCJuYXYtaXRlbS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWlubGluZSBtcy0zXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1idXR0b25cIiBwbGFjZWhvbGRlcj1cImtleXdvcmRcIiBpZD1cIm1haW5TZWFyY2hCYXJcIiB0eXBlPVwidGV4dFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiIChjbGljayk9XCJvblN1Ym1pdCgpXCI+e3snU2VhcmNoJyB8XHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxsaWItcmFuZ2UtZGF0ZS1waWNrZXI+PC9saWItcmFuZ2UtZGF0ZS1waWNrZXI+XHJcbiAgICAgICAgICAgIDwvZm9ybT5cclxuICBcclxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZC1tZC1ub25lXCI+XHJcbiAgICAgICAgICAgICAgPGFwcC1kYXNoYm9hcmQtbmF2aWdhdGlvbj48L2FwcC1kYXNoYm9hcmQtbmF2aWdhdGlvbj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXMtYXV0byBuYXYtaXRlbSBkcm9wZG93blwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9maWxlX3BpYyBkcm9wZG93bi10b2dnbGVcIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICA8bGliLWF2YXRhcj48L2xpYi1hdmF0YXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnUgZHJvcGRvd24tbWVudS1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJ1c2VyICYmIG1pc3Npb25cIiBjbGFzcz1cInAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVzZXJuYW1lXCI+e3sgdXNlci5kaXNwbGF5TmFtZSB9fTwvc3Bhbj48YnIgLz5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1c2VyLXJvbGVcIj57eyBtaXNzaW9uLnJvbGUgfX08L3NwYW4+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JnXCI+e3sgbWlzc2lvbi5vcmdhbmlzYXRpb24gPyBtaXNzaW9uLm9yZ2FuaXNhdGlvbi5uYW1lIDogXCJObyBvcmdhbmlzYXRpb25cIiB8XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiByb3V0ZXJMaW5rPVwiL2RlYnVnXCIgKm5nSWY9XCJpc01hbmFnZXJcIj5EZWJ1ZzwvYT4gLS0+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwibG9jYWxlU2VydmljZS5tb2RhbCgpXCI+e3snTGFuZ3VhZ2UnIHwgdHJhbnNsYXRlfX08L2E+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiByb3V0ZXJMaW5rPVwiL2Rhc2hib2FyZFwiPnt7J0RhdGEgbWFuYWdlbWVudCcgfCB0cmFuc2xhdGV9fTwvYT5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIHJvdXRlckxpbms9XCIvYWRtaW5cIiAqbmdJZj1cImlzTWFuYWdlclwiPlxyXG4gICAgICAgICAgICAgICAgICB7eydVc2VycyBtYW5hZ2VtZW50JyB8IHRyYW5zbGF0ZX19PC9hPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgcm91dGVyTGluaz1cIi9wcm9maWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7J1Byb2ZpbGUnIHwgdHJhbnNsYXRlfX08L2E+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwib3BlblN1cHBvcnRGb3JtKClcIj57e1wiSGVscFwiIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cInNpZ25PdXQoKVwiPnt7XCJMb2dvdXRcIiB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmF2PlxyXG4gICAgICA8bGliLW5hdmlnYXRpb24tYmFyICpuZ0lmPVwiaXNWaXNpYmxlXCI+PC9saWItbmF2aWdhdGlvbi1iYXI+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbiAgXHJcbiJdfQ==