tin-spa 14.3.11 → 14.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/README.md +24 -24
  2. package/esm2020/lib/classes/Classes.mjs +53 -206
  3. package/esm2020/lib/classes/LibClasses.mjs +180 -0
  4. package/esm2020/lib/classes/TinCore.mjs +201 -42
  5. package/esm2020/lib/components/alert/alert.component.mjs +12 -6
  6. package/esm2020/lib/components/attach/attach.component.mjs +49 -33
  7. package/esm2020/lib/components/capsules/capsules.component.mjs +63 -0
  8. package/esm2020/lib/components/cards/cards.component.mjs +103 -0
  9. package/esm2020/lib/components/date/date.component.mjs +6 -6
  10. package/esm2020/lib/components/datetime/datetime.component.mjs +6 -3
  11. package/esm2020/lib/components/email/email.component.mjs +133 -0
  12. package/esm2020/lib/components/filter/filter.component.mjs +7 -3
  13. package/esm2020/lib/components/form/form.component.mjs +155 -53
  14. package/esm2020/lib/components/html/html.component.mjs +34 -0
  15. package/esm2020/lib/components/label/label.component.mjs +6 -3
  16. package/esm2020/lib/components/list-dialog/list-dialog.component.mjs +3 -3
  17. package/esm2020/lib/components/money/money.component.mjs +26 -9
  18. package/esm2020/lib/components/multi-select/multi-select.component.mjs +165 -0
  19. package/esm2020/lib/components/multi-text/multi-text.component.mjs +208 -0
  20. package/esm2020/lib/components/nav-menu/nav-menu.component.mjs +32 -28
  21. package/esm2020/lib/components/notes/notes.component.mjs +62 -0
  22. package/esm2020/lib/components/number/number.component.mjs +23 -8
  23. package/esm2020/lib/components/option/option.component.mjs +39 -14
  24. package/esm2020/lib/components/page/page.component.mjs +101 -0
  25. package/esm2020/lib/components/search/search.component.mjs +10 -5
  26. package/esm2020/lib/components/select/select.component.mjs +56 -119
  27. package/esm2020/lib/components/select-bitwise/select-bitwise.component.mjs +87 -0
  28. package/esm2020/lib/components/select-common/select-common.component.mjs +189 -0
  29. package/esm2020/lib/components/select-internal/select-internal.component.mjs +75 -0
  30. package/esm2020/lib/components/select-lite/select-lite.component.mjs +18 -0
  31. package/esm2020/lib/components/steps/steps.component.mjs +83 -61
  32. package/esm2020/lib/components/suffix/suffix.component.mjs +70 -0
  33. package/esm2020/lib/components/table/detailsDialog.component.mjs +179 -37
  34. package/esm2020/lib/components/table/table.component.mjs +142 -108
  35. package/esm2020/lib/components/table-action/table-action.component.mjs +42 -8
  36. package/esm2020/lib/components/table-header/table-header.component.mjs +87 -15
  37. package/esm2020/lib/components/table-internal/detailsDialog-internal.component.mjs +183 -35
  38. package/esm2020/lib/components/table-internal/table-internal.component.mjs +144 -109
  39. package/esm2020/lib/components/table-lite/detailsDialog-lite.component.mjs +371 -0
  40. package/esm2020/lib/components/table-lite/table-lite.component.mjs +441 -0
  41. package/esm2020/lib/components/table-row/table-row.component.mjs +41 -6
  42. package/esm2020/lib/components/text/text.component.mjs +97 -42
  43. package/esm2020/lib/components/tiles/tiles.component.mjs +44 -26
  44. package/esm2020/lib/components/viewer/viewer.component.mjs +7 -3
  45. package/esm2020/lib/components/viewer/viewerDialog.component.mjs +20 -13
  46. package/esm2020/lib/modules/admin/admin-routing.module.mjs +32 -22
  47. package/esm2020/lib/modules/index/index-routing.module.mjs +4 -4
  48. package/esm2020/lib/modules/spa-admin.module.mjs +7 -7
  49. package/esm2020/lib/modules/spa-index.module.mjs +4 -4
  50. package/esm2020/lib/modules/spa-user.module.mjs +3 -3
  51. package/esm2020/lib/modules/user/user-routing.module.mjs +3 -3
  52. package/esm2020/lib/pages/accounts/accountDialog.component.mjs +56 -0
  53. package/esm2020/lib/pages/accounts/accounts.component.mjs +70 -0
  54. package/esm2020/lib/pages/app-models/app-models.component.mjs +56 -0
  55. package/esm2020/lib/pages/approvals/approvals.component.mjs +19 -0
  56. package/esm2020/lib/pages/approvals-config/approvals-config.component.mjs +165 -0
  57. package/esm2020/lib/pages/bug/bug.component.mjs +14 -0
  58. package/esm2020/lib/pages/change-password/change-password.component.mjs +92 -0
  59. package/esm2020/lib/pages/create-account/create-account.component.mjs +110 -0
  60. package/esm2020/lib/pages/customers/customers.component.mjs +21 -0
  61. package/esm2020/lib/{components → pages}/departments/departments.component.mjs +3 -5
  62. package/esm2020/lib/pages/employees/employees.component.mjs +20 -0
  63. package/esm2020/lib/pages/grades/grades.component.mjs +14 -0
  64. package/esm2020/lib/pages/inventory/inventory.component.mjs +99 -0
  65. package/esm2020/lib/pages/inventory/quantityDialog.component.mjs +53 -0
  66. package/esm2020/lib/pages/invitations-table/invitations-table.component.mjs +71 -0
  67. package/esm2020/lib/pages/login/login.component.mjs +166 -0
  68. package/esm2020/lib/pages/logs/logs.component.mjs +42 -0
  69. package/esm2020/lib/pages/membership/membership.component.mjs +44 -0
  70. package/esm2020/lib/pages/notifications/notifications.component.mjs +90 -0
  71. package/esm2020/lib/pages/notifications-config/notifications-config.component.mjs +113 -0
  72. package/esm2020/lib/pages/plans/plans.component.mjs +44 -0
  73. package/esm2020/lib/pages/positions/positions.component.mjs +21 -0
  74. package/esm2020/lib/pages/profile/profile.component.mjs +94 -0
  75. package/esm2020/lib/pages/recover-account/recover-account.component.mjs +46 -0
  76. package/esm2020/lib/{components → pages}/roles/addRoleDialog.component.mjs +3 -3
  77. package/esm2020/lib/pages/roles/roles.component.mjs +151 -0
  78. package/esm2020/lib/{components → pages}/settings/settings.component.mjs +2 -11
  79. package/esm2020/lib/pages/signup/signup.component.mjs +50 -0
  80. package/esm2020/lib/pages/suppliers/suppliers.component.mjs +22 -0
  81. package/esm2020/lib/pages/tasks/tasks.component.mjs +86 -0
  82. package/esm2020/lib/pages/tenant-settings/tenant-settings.component.mjs +228 -0
  83. package/esm2020/lib/pages/tenants/tenants.component.mjs +47 -0
  84. package/esm2020/lib/pages/transactions/transactDialog.component.mjs +80 -0
  85. package/esm2020/lib/pages/transactions/transactions.component.mjs +101 -0
  86. package/esm2020/lib/pages/users/users.component.mjs +141 -0
  87. package/esm2020/lib/pages/welcome/welcome.component.mjs +86 -0
  88. package/esm2020/lib/select-context.directive.mjs +23 -0
  89. package/esm2020/lib/services/auth.service.mjs +3 -2
  90. package/esm2020/lib/services/button.service.mjs +90 -30
  91. package/esm2020/lib/services/csv.service.mjs +49 -0
  92. package/esm2020/lib/services/datalib.service.mjs +504 -76
  93. package/esm2020/lib/services/dialog.service.mjs +24 -7
  94. package/esm2020/lib/services/log.service.mjs +2 -2
  95. package/esm2020/lib/services/notifications.service.mjs +33 -0
  96. package/esm2020/lib/services/table-config.service.mjs +55 -7
  97. package/esm2020/lib/tin-spa.module.mjs +70 -30
  98. package/esm2020/public-api.mjs +33 -25
  99. package/fesm2015/tin-spa.mjs +6258 -2345
  100. package/fesm2015/tin-spa.mjs.map +1 -1
  101. package/fesm2020/tin-spa.mjs +6308 -2336
  102. package/fesm2020/tin-spa.mjs.map +1 -1
  103. package/lib/classes/Classes.d.ts +244 -294
  104. package/lib/classes/LibClasses.d.ts +173 -0
  105. package/lib/classes/TinCore.d.ts +13 -3
  106. package/lib/components/attach/attach.component.d.ts +13 -6
  107. package/lib/components/capsules/capsules.component.d.ts +26 -0
  108. package/lib/components/cards/cards.component.d.ts +39 -0
  109. package/lib/components/datetime/datetime.component.d.ts +2 -1
  110. package/lib/components/email/email.component.d.ts +40 -0
  111. package/lib/components/filter/filter.component.d.ts +1 -0
  112. package/lib/components/form/form.component.d.ts +20 -9
  113. package/lib/components/html/html.component.d.ts +16 -0
  114. package/lib/components/label/label.component.d.ts +2 -1
  115. package/lib/components/money/money.component.d.ts +8 -1
  116. package/lib/components/multi-select/multi-select.component.d.ts +47 -0
  117. package/lib/components/multi-text/multi-text.component.d.ts +56 -0
  118. package/lib/components/nav-menu/nav-menu.component.d.ts +6 -2
  119. package/lib/components/notes/notes.component.d.ts +19 -0
  120. package/lib/components/number/number.component.d.ts +7 -1
  121. package/lib/components/option/option.component.d.ts +11 -2
  122. package/lib/components/page/page.component.d.ts +38 -0
  123. package/lib/components/search/search.component.d.ts +3 -1
  124. package/lib/components/select/select.component.d.ts +16 -35
  125. package/lib/components/select-bitwise/select-bitwise.component.d.ts +31 -0
  126. package/lib/components/select-common/select-common.component.d.ts +50 -0
  127. package/lib/components/select-internal/select-internal.component.d.ts +23 -0
  128. package/lib/components/select-lite/select-lite.component.d.ts +8 -0
  129. package/lib/components/steps/steps.component.d.ts +18 -9
  130. package/lib/components/suffix/suffix.component.d.ts +23 -0
  131. package/lib/components/table/detailsDialog.component.d.ts +24 -7
  132. package/lib/components/table/table.component.d.ts +18 -9
  133. package/lib/components/table-action/table-action.component.d.ts +4 -1
  134. package/lib/components/table-header/table-header.component.d.ts +19 -4
  135. package/lib/components/table-internal/detailsDialog-internal.component.d.ts +24 -7
  136. package/lib/components/table-internal/table-internal.component.d.ts +18 -9
  137. package/lib/components/table-lite/detailsDialog-lite.component.d.ts +81 -0
  138. package/lib/components/table-lite/table-lite.component.d.ts +91 -0
  139. package/lib/components/table-row/table-row.component.d.ts +5 -2
  140. package/lib/components/text/text.component.d.ts +17 -4
  141. package/lib/components/tiles/tiles.component.d.ts +7 -4
  142. package/lib/components/viewer/viewerDialog.component.d.ts +3 -1
  143. package/lib/modules/spa-admin.module.d.ts +6 -6
  144. package/lib/modules/spa-index.module.d.ts +3 -3
  145. package/lib/modules/spa-user.module.d.ts +2 -2
  146. package/lib/pages/app-models/app-models.component.d.ts +15 -0
  147. package/lib/pages/approvals/approvals.component.d.ts +10 -0
  148. package/lib/pages/approvals-config/approvals-config.component.d.ts +24 -0
  149. package/lib/{components → pages}/change-password/change-password.component.d.ts +1 -1
  150. package/lib/{components → pages}/create-account/create-account.component.d.ts +2 -1
  151. package/lib/{components → pages}/customers/customers.component.d.ts +2 -8
  152. package/lib/{components → pages}/invitations-table/invitations-table.component.d.ts +1 -1
  153. package/lib/{components → pages}/login/login.component.d.ts +10 -3
  154. package/lib/{components → pages}/logs/logs.component.d.ts +2 -6
  155. package/lib/{components → pages}/membership/membership.component.d.ts +2 -6
  156. package/lib/pages/notifications/notifications.component.d.ts +16 -0
  157. package/lib/pages/notifications-config/notifications-config.component.d.ts +17 -0
  158. package/lib/{components → pages}/plans/plans.component.d.ts +2 -6
  159. package/lib/{components → pages}/profile/profile.component.d.ts +2 -1
  160. package/lib/{components → pages}/roles/addRoleDialog.component.d.ts +1 -1
  161. package/lib/{components → pages}/roles/roles.component.d.ts +15 -3
  162. package/lib/{components → pages}/signup/signup.component.d.ts +1 -1
  163. package/lib/{components → pages}/suppliers/suppliers.component.d.ts +1 -4
  164. package/lib/{components → pages}/tasks/tasks.component.d.ts +1 -1
  165. package/lib/{components → pages}/tenant-settings/tenant-settings.component.d.ts +12 -7
  166. package/lib/{components → pages}/tenants/tenants.component.d.ts +2 -2
  167. package/lib/{components → pages}/users/users.component.d.ts +8 -16
  168. package/lib/select-context.directive.d.ts +10 -0
  169. package/lib/services/auth.service.d.ts +1 -1
  170. package/lib/services/button.service.d.ts +10 -7
  171. package/lib/services/csv.service.d.ts +10 -0
  172. package/lib/services/datalib.service.d.ts +55 -10
  173. package/lib/services/dialog.service.d.ts +2 -2
  174. package/lib/services/log.service.d.ts +1 -1
  175. package/lib/services/notifications.service.d.ts +12 -0
  176. package/lib/services/table-config.service.d.ts +9 -1
  177. package/lib/tin-spa.module.d.ts +51 -33
  178. package/package.json +1 -1
  179. package/public-api.d.ts +31 -23
  180. package/esm2020/lib/components/accounts/accountDialog.component.mjs +0 -56
  181. package/esm2020/lib/components/accounts/accounts.component.mjs +0 -70
  182. package/esm2020/lib/components/bug/bug.component.mjs +0 -14
  183. package/esm2020/lib/components/change-password/change-password.component.mjs +0 -92
  184. package/esm2020/lib/components/create-account/create-account.component.mjs +0 -109
  185. package/esm2020/lib/components/customers/customers.component.mjs +0 -60
  186. package/esm2020/lib/components/employees/employees.component.mjs +0 -21
  187. package/esm2020/lib/components/grades/grades.component.mjs +0 -14
  188. package/esm2020/lib/components/inventory/inventory.component.mjs +0 -99
  189. package/esm2020/lib/components/inventory/quantityDialog.component.mjs +0 -53
  190. package/esm2020/lib/components/invitations/invitations.component.mjs +0 -14
  191. package/esm2020/lib/components/invitations-table/invitations-table.component.mjs +0 -70
  192. package/esm2020/lib/components/login/login.component.mjs +0 -127
  193. package/esm2020/lib/components/logs/logs.component.mjs +0 -37
  194. package/esm2020/lib/components/membership/membership.component.mjs +0 -48
  195. package/esm2020/lib/components/notifications/notifications.component.mjs +0 -14
  196. package/esm2020/lib/components/plans/plans.component.mjs +0 -47
  197. package/esm2020/lib/components/positions/positions.component.mjs +0 -21
  198. package/esm2020/lib/components/profile/profile.component.mjs +0 -92
  199. package/esm2020/lib/components/recover-account/recover-account.component.mjs +0 -46
  200. package/esm2020/lib/components/roles/roles.component.mjs +0 -91
  201. package/esm2020/lib/components/signup/signup.component.mjs +0 -50
  202. package/esm2020/lib/components/suppliers/suppliers.component.mjs +0 -50
  203. package/esm2020/lib/components/tasks/tasks.component.mjs +0 -86
  204. package/esm2020/lib/components/tenant-settings/inviteDialog.component.mjs +0 -60
  205. package/esm2020/lib/components/tenant-settings/tenant-settings.component.mjs +0 -155
  206. package/esm2020/lib/components/tenants/tenants.component.mjs +0 -47
  207. package/esm2020/lib/components/transactions/transactDialog.component.mjs +0 -80
  208. package/esm2020/lib/components/transactions/transactions.component.mjs +0 -101
  209. package/esm2020/lib/components/users/users.component.mjs +0 -118
  210. package/esm2020/lib/components/welcome/welcome.component.mjs +0 -86
  211. package/lib/components/invitations/invitations.component.d.ts +0 -8
  212. package/lib/components/notifications/notifications.component.d.ts +0 -8
  213. package/lib/components/tenant-settings/inviteDialog.component.d.ts +0 -28
  214. /package/lib/{components → pages}/accounts/accountDialog.component.d.ts +0 -0
  215. /package/lib/{components → pages}/accounts/accounts.component.d.ts +0 -0
  216. /package/lib/{components → pages}/bug/bug.component.d.ts +0 -0
  217. /package/lib/{components → pages}/departments/departments.component.d.ts +0 -0
  218. /package/lib/{components → pages}/employees/employees.component.d.ts +0 -0
  219. /package/lib/{components → pages}/grades/grades.component.d.ts +0 -0
  220. /package/lib/{components → pages}/inventory/inventory.component.d.ts +0 -0
  221. /package/lib/{components → pages}/inventory/quantityDialog.component.d.ts +0 -0
  222. /package/lib/{components → pages}/positions/positions.component.d.ts +0 -0
  223. /package/lib/{components → pages}/recover-account/recover-account.component.d.ts +0 -0
  224. /package/lib/{components → pages}/settings/settings.component.d.ts +0 -0
  225. /package/lib/{components → pages}/transactions/transactDialog.component.d.ts +0 -0
  226. /package/lib/{components → pages}/transactions/transactions.component.d.ts +0 -0
  227. /package/lib/{components → pages}/welcome/welcome.component.d.ts +0 -0
@@ -0,0 +1,208 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { FormControl } from '@angular/forms';
3
+ import { map, startWith } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../services/message.service";
6
+ import * as i2 from "../../services/datalib.service";
7
+ import * as i3 from "@angular/common";
8
+ import * as i4 from "@angular/forms";
9
+ import * as i5 from "@angular/material/button";
10
+ import * as i6 from "@angular/material/icon";
11
+ import * as i7 from "@angular/material/form-field";
12
+ import * as i8 from "@angular/material/chips";
13
+ import * as i9 from "@angular/material/core";
14
+ import * as i10 from "@angular/material/autocomplete";
15
+ import * as i11 from "@angular/material/tooltip";
16
+ import * as i12 from "../suffix/suffix.component";
17
+ export class MultiTextComponent {
18
+ constructor(messageService, dataService) {
19
+ this.messageService = messageService;
20
+ this.dataService = dataService;
21
+ this.display = "";
22
+ this.value = "";
23
+ this.valueChange = new EventEmitter();
24
+ this.readonly = false;
25
+ this.required = true;
26
+ this.hint = "";
27
+ this.strict = false;
28
+ this.copyContent = false;
29
+ this.clearContent = false;
30
+ this.options = [];
31
+ this.optionDisplay = "name"; // Default to name if not provided
32
+ this.optionValue = "value"; // Default to value if not provided
33
+ this.values = [];
34
+ this.control = new FormControl('');
35
+ this.errorState = false;
36
+ this.selectedFromAutocomplete = false;
37
+ this.isHovered = false;
38
+ this.hoverChange = new EventEmitter();
39
+ }
40
+ ngOnInit() {
41
+ this.values = this.value ? this.value.split(';').filter(val => val.trim() !== '') : [];
42
+ this.setupAutoComplete();
43
+ this.getData(this.loadAction);
44
+ }
45
+ ngOnChanges() {
46
+ if (this.options) {
47
+ this.setupAutoComplete();
48
+ }
49
+ }
50
+ setupAutoComplete() {
51
+ this.filteredOptions = this.control.valueChanges.pipe(startWith(''), map(value => this.filterOptions(value)));
52
+ }
53
+ filterOptions(value) {
54
+ if (!value || !this.options)
55
+ return this.options || [];
56
+ const searchValue = value.toString().toLowerCase();
57
+ return this.options.filter(option => {
58
+ const displayValue = option[this.optionDisplay]?.toString().toLowerCase();
59
+ return displayValue?.includes(searchValue);
60
+ });
61
+ }
62
+ add(event) {
63
+ // Skip validation if option was selected from autocomplete
64
+ if (this.selectedFromAutocomplete) {
65
+ this.selectedFromAutocomplete = false;
66
+ return;
67
+ }
68
+ const input = (event.value || '').trim();
69
+ if (!input)
70
+ return;
71
+ if (this.strict) {
72
+ const found = this.options.find(opt => {
73
+ const optionDisplayValue = opt[this.optionDisplay]?.toString().toLowerCase();
74
+ const optionValue = opt[this.optionValue]?.toString().toLowerCase();
75
+ const inputLower = input.toLowerCase();
76
+ return optionDisplayValue === inputLower || optionValue === inputLower;
77
+ });
78
+ // if (!found) {
79
+ // this.errorState = true;
80
+ // this.hint = 'Value must be selected from the list';
81
+ // return;
82
+ // }
83
+ this.addValue(found[this.optionValue]?.toString());
84
+ }
85
+ else {
86
+ this.addValue(input);
87
+ }
88
+ this.resetInput();
89
+ }
90
+ addValue(value) {
91
+ if (!this.values.includes(value)) {
92
+ this.values.push(value);
93
+ this.errorState = false;
94
+ this.updateValue();
95
+ }
96
+ }
97
+ remove(value) {
98
+ const index = this.values.indexOf(value);
99
+ if (index >= 0) {
100
+ this.values.splice(index, 1);
101
+ this.updateValue();
102
+ }
103
+ }
104
+ optionSelected(event) {
105
+ const selectedOption = event.option.value;
106
+ if (selectedOption) {
107
+ this.selectedFromAutocomplete = true;
108
+ this.addValue(selectedOption[this.optionValue]?.toString());
109
+ this.resetInput();
110
+ }
111
+ }
112
+ resetInput() {
113
+ // Reset form control
114
+ this.control.setValue('');
115
+ // Reset input element if available
116
+ if (this.textInput?.nativeElement) {
117
+ this.textInput.nativeElement.value = '';
118
+ }
119
+ }
120
+ updateValue() {
121
+ this.value = this.values.join(';');
122
+ this.valueChange.emit(this.value);
123
+ }
124
+ clear() {
125
+ this.values = [];
126
+ this.updateValue();
127
+ }
128
+ getDisplayValue(value) {
129
+ const option = this.options?.find(opt => opt[this.optionValue]?.toString() === value);
130
+ return option ? option[this.optionDisplay]?.toString() : value;
131
+ }
132
+ copyValues() {
133
+ navigator.clipboard.writeText(this.value).then(() => {
134
+ this.messageService.toast('Copied');
135
+ });
136
+ }
137
+ onMouseEnter() {
138
+ this.isHovered = true;
139
+ this.hoverChange.emit(true);
140
+ }
141
+ onMouseLeave() {
142
+ this.isHovered = false;
143
+ this.hoverChange.emit(false);
144
+ }
145
+ refresh(event) {
146
+ event.stopPropagation();
147
+ if (!this.loadAction) {
148
+ return;
149
+ }
150
+ const refreshAction = {
151
+ ...this.loadAction,
152
+ forceRefresh: true
153
+ };
154
+ this.getData(refreshAction);
155
+ }
156
+ getData(action) {
157
+ if (!action)
158
+ return;
159
+ this.dataService.CallApi(action).subscribe((apiResponse) => {
160
+ if (apiResponse.success) {
161
+ this.options = apiResponse.data;
162
+ this.setupAutoComplete();
163
+ }
164
+ });
165
+ }
166
+ }
167
+ MultiTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MultiTextComponent, deps: [{ token: i1.MessageService }, { token: i2.DataServiceLib }], target: i0.ɵɵFactoryTarget.Component });
168
+ MultiTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: MultiTextComponent, selector: "spa-multi-text", inputs: { display: "display", value: "value", readonly: "readonly", required: "required", hint: "hint", strict: "strict", suffix: "suffix", infoMessage: "infoMessage", copyContent: "copyContent", clearContent: "clearContent", options: "options", optionDisplay: "optionDisplay", optionValue: "optionValue", loadAction: "loadAction" }, outputs: { valueChange: "valueChange", hoverChange: "hoverChange" }, viewQueries: [{ propertyName: "textInput", first: true, predicate: ["textInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-form-field style=\"width: 100%;\" (mouseenter)=\"onMouseEnter()\" (mouseleave)=\"onMouseLeave()\">\r\n <mat-label>{{display}}</mat-label>\r\n <mat-chip-list #chipList>\r\n <mat-chip *ngFor=\"let value of values\" [removable]=\"!readonly\" (removed)=\"remove(value)\">\r\n {{getDisplayValue(value)}}\r\n <mat-icon matChipRemove *ngIf=\"!readonly\">cancel</mat-icon>\r\n </mat-chip>\r\n <input #textInput autocomplete=\"off\" [placeholder]=\"readonly ? '' : display\" [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"[13, 186]\" [matChipInputAddOnBlur]=\"true\" (matChipInputTokenEnd)=\"add($event)\" [formControl]=\"control\" [readonly]=\"readonly\" [matAutocomplete]=\"auto\">\r\n </mat-chip-list>\r\n\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"optionSelected($event)\">\r\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option\">\r\n {{option[optionDisplay]}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n\r\n <mat-error *ngIf=\"errorState\">{{hint}}</mat-error>\r\n <mat-hint *ngIf=\"hint && !errorState\">{{hint}}</mat-hint>\r\n\r\n <div matSuffix class=\"suffix-icons\">\r\n <button mat-icon-button *ngIf=\"loadAction && isHovered\" (click)=\"refresh($event)\" matTooltip=\"Refresh\" matTooltipPosition=\"above\">\r\n <mat-icon color=\"primary\">cached</mat-icon>\r\n </button>\r\n <spa-suffix [label]=\"suffix\" [infoMessage]=\"infoMessage\" [copyContent]=\"copyContent\" [clearContent]=\"clearContent\" (clearClick)=\"clear()\" [isHovered]=\"true\" [(value)]=\"value\"></spa-suffix>\r\n </div>\r\n</mat-form-field>\r\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: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix]" }, { kind: "component", type: i8.MatChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i8.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i8.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i8.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i10.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i10.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i12.SuffixComponent, selector: "spa-suffix", inputs: ["label", "infoMessage", "copyContent", "isHovered", "clearContent", "value"], outputs: ["infoClick", "copyClick", "clearClick", "valueChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] });
169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MultiTextComponent, decorators: [{
170
+ type: Component,
171
+ args: [{ selector: 'spa-multi-text', template: "<mat-form-field style=\"width: 100%;\" (mouseenter)=\"onMouseEnter()\" (mouseleave)=\"onMouseLeave()\">\r\n <mat-label>{{display}}</mat-label>\r\n <mat-chip-list #chipList>\r\n <mat-chip *ngFor=\"let value of values\" [removable]=\"!readonly\" (removed)=\"remove(value)\">\r\n {{getDisplayValue(value)}}\r\n <mat-icon matChipRemove *ngIf=\"!readonly\">cancel</mat-icon>\r\n </mat-chip>\r\n <input #textInput autocomplete=\"off\" [placeholder]=\"readonly ? '' : display\" [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"[13, 186]\" [matChipInputAddOnBlur]=\"true\" (matChipInputTokenEnd)=\"add($event)\" [formControl]=\"control\" [readonly]=\"readonly\" [matAutocomplete]=\"auto\">\r\n </mat-chip-list>\r\n\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"optionSelected($event)\">\r\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option\">\r\n {{option[optionDisplay]}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n\r\n <mat-error *ngIf=\"errorState\">{{hint}}</mat-error>\r\n <mat-hint *ngIf=\"hint && !errorState\">{{hint}}</mat-hint>\r\n\r\n <div matSuffix class=\"suffix-icons\">\r\n <button mat-icon-button *ngIf=\"loadAction && isHovered\" (click)=\"refresh($event)\" matTooltip=\"Refresh\" matTooltipPosition=\"above\">\r\n <mat-icon color=\"primary\">cached</mat-icon>\r\n </button>\r\n <spa-suffix [label]=\"suffix\" [infoMessage]=\"infoMessage\" [copyContent]=\"copyContent\" [clearContent]=\"clearContent\" (clearClick)=\"clear()\" [isHovered]=\"true\" [(value)]=\"value\"></spa-suffix>\r\n </div>\r\n</mat-form-field>\r\n" }]
172
+ }], ctorParameters: function () { return [{ type: i1.MessageService }, { type: i2.DataServiceLib }]; }, propDecorators: { textInput: [{
173
+ type: ViewChild,
174
+ args: ['textInput']
175
+ }], display: [{
176
+ type: Input
177
+ }], value: [{
178
+ type: Input
179
+ }], valueChange: [{
180
+ type: Output
181
+ }], readonly: [{
182
+ type: Input
183
+ }], required: [{
184
+ type: Input
185
+ }], hint: [{
186
+ type: Input
187
+ }], strict: [{
188
+ type: Input
189
+ }], suffix: [{
190
+ type: Input
191
+ }], infoMessage: [{
192
+ type: Input
193
+ }], copyContent: [{
194
+ type: Input
195
+ }], clearContent: [{
196
+ type: Input
197
+ }], options: [{
198
+ type: Input
199
+ }], optionDisplay: [{
200
+ type: Input
201
+ }], optionValue: [{
202
+ type: Input
203
+ }], loadAction: [{
204
+ type: Input
205
+ }], hoverChange: [{
206
+ type: Output
207
+ }] } });
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktdGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90aW4tc3BhL3NyYy9saWIvY29tcG9uZW50cy9tdWx0aS10ZXh0L211bHRpLXRleHQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbXVsdGktdGV4dC9tdWx0aS10ZXh0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk3QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQVNoRCxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLFlBQW9CLGNBQThCLEVBQVUsV0FBMkI7UUFBbkUsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBSTlFLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1YsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzFDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsYUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQixTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1YsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUdmLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLFlBQU8sR0FBVSxFQUFFLENBQUM7UUFDcEIsa0JBQWEsR0FBRyxNQUFNLENBQUMsQ0FBQyxrQ0FBa0M7UUFDMUQsZ0JBQVcsR0FB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c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBaUlJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xyXG5pbXBvcnQgeyBNYXRDaGlwSW5wdXRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBY3Rpb24sIEFwaVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9DbGFzc2VzJztcclxuaW1wb3J0IHsgRGF0YVNlcnZpY2VMaWIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhbGliLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzcGEtbXVsdGktdGV4dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLXRleHQuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNdWx0aVRleHRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLCBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZUxpYikgeyB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3RleHRJbnB1dCcpIHRleHRJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuXHJcbiAgQElucHV0KCkgZGlzcGxheSA9IFwiXCI7XHJcbiAgQElucHV0KCkgdmFsdWUgPSBcIlwiO1xyXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcmVxdWlyZWQgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGhpbnQgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIHN0cmljdCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHN1ZmZpeDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGluZm9NZXNzYWdlOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgY29weUNvbnRlbnQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBjbGVhckNvbnRlbnQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBvcHRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIG9wdGlvbkRpc3BsYXkgPSBcIm5hbWVcIjsgLy8gRGVmYXVsdCB0byBuYW1lIGlmIG5vdCBwcm92aWRlZFxyXG4gIEBJbnB1dCgpIG9wdGlvblZhbHVlID0gXCJ2YWx1ZVwiOyAvLyBEZWZhdWx0IHRvIHZhbHVlIGlmIG5vdCBwcm92aWRlZFxyXG5cclxuICBASW5wdXQoKSBsb2FkQWN0aW9uOiBBY3Rpb247XHJcblxyXG4gIHZhbHVlczogc3RyaW5nW10gPSBbXTtcclxuICBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcclxuICBmaWx0ZXJlZE9wdGlvbnM6IE9ic2VydmFibGU8YW55W10+O1xyXG4gIGVycm9yU3RhdGUgPSBmYWxzZTtcclxuICBwcml2YXRlIHNlbGVjdGVkRnJvbUF1dG9jb21wbGV0ZSA9IGZhbHNlO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMudmFsdWVzID0gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUuc3BsaXQoJzsnKS5maWx0ZXIodmFsID0+IHZhbC50cmltKCkgIT09ICcnKSA6IFtdO1xyXG4gICAgdGhpcy5zZXR1cEF1dG9Db21wbGV0ZSgpO1xyXG4gICAgdGhpcy5nZXREYXRhKHRoaXMubG9hZEFjdGlvbik7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5zZXR1cEF1dG9Db21wbGV0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEF1dG9Db21wbGV0ZSgpIHtcclxuICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICBzdGFydFdpdGgoJycpLFxyXG4gICAgICBtYXAodmFsdWUgPT4gdGhpcy5maWx0ZXJPcHRpb25zKHZhbHVlKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbHRlck9wdGlvbnModmFsdWU6IHN0cmluZyk6IGFueVtdIHtcclxuICAgIGlmICghdmFsdWUgfHwgIXRoaXMub3B0aW9ucykgcmV0dXJuIHRoaXMub3B0aW9ucyB8fCBbXTtcclxuXHJcbiAgICBjb25zdCBzZWFyY2hWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiB7XHJcbiAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IG9wdGlvblt0aGlzLm9wdGlvbkRpc3BsYXldPy50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIHJldHVybiBkaXNwbGF5VmFsdWU/LmluY2x1ZGVzKHNlYXJjaFZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gU2tpcCB2YWxpZGF0aW9uIGlmIG9wdGlvbiB3YXMgc2VsZWN0ZWQgZnJvbSBhdXRvY29tcGxldGVcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkRnJvbUF1dG9jb21wbGV0ZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRnJvbUF1dG9jb21wbGV0ZSA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW5wdXQgPSAoZXZlbnQudmFsdWUgfHwgJycpLnRyaW0oKTtcclxuICAgIGlmICghaW5wdXQpIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5zdHJpY3QpIHtcclxuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLm9wdGlvbnMuZmluZChvcHQgPT4ge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbkRpc3BsYXlWYWx1ZSA9IG9wdFt0aGlzLm9wdGlvbkRpc3BsYXldPy50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBvcHRbdGhpcy5vcHRpb25WYWx1ZV0/LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBjb25zdCBpbnB1dExvd2VyID0gaW5wdXQudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICByZXR1cm4gb3B0aW9uRGlzcGxheVZhbHVlID09PSBpbnB1dExvd2VyIHx8IG9wdGlvblZhbHVlID09PSBpbnB1dExvd2VyO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIGlmICghZm91bmQpIHtcclxuICAgICAgLy8gICB0aGlzLmVycm9yU3RhdGUgPSB0cnVlO1xyXG4gICAgICAvLyAgIHRoaXMuaGludCA9ICdWYWx1ZSBtdXN0IGJlIHNlbGVjdGVkIGZyb20gdGhlIGxpc3QnO1xyXG4gICAgICAvLyAgIHJldHVybjtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgdGhpcy5hZGRWYWx1ZShmb3VuZFt0aGlzLm9wdGlvblZhbHVlXT8udG9TdHJpbmcoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFkZFZhbHVlKGlucHV0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlc2V0SW5wdXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgdGhpcy52YWx1ZXMucHVzaCh2YWx1ZSk7XHJcbiAgICAgIHRoaXMuZXJyb3JTdGF0ZSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnZhbHVlcy5pbmRleE9mKHZhbHVlKTtcclxuICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgIHRoaXMudmFsdWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIHRoaXMudXBkYXRlVmFsdWUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9wdGlvblNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IGV2ZW50Lm9wdGlvbi52YWx1ZTtcclxuICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRnJvbUF1dG9jb21wbGV0ZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuYWRkVmFsdWUoc2VsZWN0ZWRPcHRpb25bdGhpcy5vcHRpb25WYWx1ZV0/LnRvU3RyaW5nKCkpO1xyXG4gICAgICB0aGlzLnJlc2V0SW5wdXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIHJlc2V0SW5wdXQoKTogdm9pZCB7XHJcbiAgICAvLyBSZXNldCBmb3JtIGNvbnRyb2xcclxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSgnJyk7XHJcblxyXG4gICAgLy8gUmVzZXQgaW5wdXQgZWxlbWVudCBpZiBhdmFpbGFibGVcclxuICAgIGlmICh0aGlzLnRleHRJbnB1dD8ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnRleHRJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVWYWx1ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlcy5qb2luKCc7Jyk7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBjbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsdWVzID0gW107XHJcbiAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICBnZXREaXNwbGF5VmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnM/LmZpbmQob3B0ID0+XHJcbiAgICAgIG9wdFt0aGlzLm9wdGlvblZhbHVlXT8udG9TdHJpbmcoKSA9PT0gdmFsdWVcclxuICAgICk7XHJcbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW3RoaXMub3B0aW9uRGlzcGxheV0/LnRvU3RyaW5nKCkgOiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGNvcHlWYWx1ZXMoKTogdm9pZCB7XHJcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0aGlzLnZhbHVlKS50aGVuKCgpID0+IHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdCgnQ29waWVkJyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGlzSG92ZXJlZCA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBob3ZlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBvbk1vdXNlRW50ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzSG92ZXJlZCA9IHRydWU7XHJcbiAgICB0aGlzLmhvdmVyQ2hhbmdlLmVtaXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlTGVhdmUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzSG92ZXJlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5ob3ZlckNoYW5nZS5lbWl0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2goZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKCF0aGlzLmxvYWRBY3Rpb24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlZnJlc2hBY3Rpb24gPSB7XHJcbiAgICAgIC4uLnRoaXMubG9hZEFjdGlvbixcclxuICAgICAgZm9yY2VSZWZyZXNoOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZ2V0RGF0YShyZWZyZXNoQWN0aW9uKTtcclxuICB9XHJcblxyXG4gIGdldERhdGEoYWN0aW9uOiBBY3Rpb24pIHtcclxuICAgIGlmICghYWN0aW9uKSByZXR1cm47XHJcbiAgICB0aGlzLmRhdGFTZXJ2aWNlLkNhbGxBcGkoYWN0aW9uKS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZSkgPT4ge1xyXG4gICAgICBpZiAoYXBpUmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGFwaVJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgdGhpcy5zZXR1cEF1dG9Db21wbGV0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPG1hdC1mb3JtLWZpZWxkIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgKG1vdXNlZW50ZXIpPVwib25Nb3VzZUVudGVyKClcIiAobW91c2VsZWF2ZSk9XCJvbk1vdXNlTGVhdmUoKVwiPlxyXG4gIDxtYXQtbGFiZWw+e3tkaXNwbGF5fX08L21hdC1sYWJlbD5cclxuICA8bWF0LWNoaXAtbGlzdCAjY2hpcExpc3Q+XHJcbiAgICA8bWF0LWNoaXAgKm5nRm9yPVwibGV0IHZhbHVlIG9mIHZhbHVlc1wiIFtyZW1vdmFibGVdPVwiIXJlYWRvbmx5XCIgKHJlbW92ZWQpPVwicmVtb3ZlKHZhbHVlKVwiPlxyXG4gICAgICB7e2dldERpc3BsYXlWYWx1ZSh2YWx1ZSl9fVxyXG4gICAgICA8bWF0LWljb24gbWF0Q2hpcFJlbW92ZSAqbmdJZj1cIiFyZWFkb25seVwiPmNhbmNlbDwvbWF0LWljb24+XHJcbiAgICA8L21hdC1jaGlwPlxyXG4gICAgPGlucHV0ICN0ZXh0SW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgW3BsYWNlaG9sZGVyXT1cInJlYWRvbmx5ID8gJycgOiBkaXNwbGF5XCIgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdFwiIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJbMTMsIDE4Nl1cIiBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cInRydWVcIiAobWF0Q2hpcElucHV0VG9rZW5FbmQpPVwiYWRkKCRldmVudClcIiBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiIFtyZWFkb25seV09XCJyZWFkb25seVwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiPlxyXG4gIDwvbWF0LWNoaXAtbGlzdD5cclxuXHJcbiAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwib3B0aW9uU2VsZWN0ZWQoJGV2ZW50KVwiPlxyXG4gICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cclxuICAgICAge3tvcHRpb25bb3B0aW9uRGlzcGxheV19fVxyXG4gICAgPC9tYXQtb3B0aW9uPlxyXG4gIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuXHJcbiAgPG1hdC1lcnJvciAqbmdJZj1cImVycm9yU3RhdGVcIj57e2hpbnR9fTwvbWF0LWVycm9yPlxyXG4gIDxtYXQtaGludCAqbmdJZj1cImhpbnQgJiYgIWVycm9yU3RhdGVcIj57e2hpbnR9fTwvbWF0LWhpbnQ+XHJcblxyXG4gIDxkaXYgbWF0U3VmZml4IGNsYXNzPVwic3VmZml4LWljb25zXCI+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cImxvYWRBY3Rpb24gJiYgaXNIb3ZlcmVkXCIgKGNsaWNrKT1cInJlZnJlc2goJGV2ZW50KVwiIG1hdFRvb2x0aXA9XCJSZWZyZXNoXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5cclxuICAgICAgPG1hdC1pY29uIGNvbG9yPVwicHJpbWFyeVwiPmNhY2hlZDwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxzcGEtc3VmZml4IFtsYWJlbF09XCJzdWZmaXhcIiBbaW5mb01lc3NhZ2VdPVwiaW5mb01lc3NhZ2VcIiBbY29weUNvbnRlbnRdPVwiY29weUNvbnRlbnRcIiBbY2xlYXJDb250ZW50XT1cImNsZWFyQ29udGVudFwiIChjbGVhckNsaWNrKT1cImNsZWFyKClcIiBbaXNIb3ZlcmVkXT1cInRydWVcIiBbKHZhbHVlKV09XCJ2YWx1ZVwiPjwvc3BhLXN1ZmZpeD5cclxuICA8L2Rpdj5cclxuPC9tYXQtZm9ybS1maWVsZD5cclxuIl19
@@ -1,35 +1,39 @@
1
- import { AppConfig } from './../../classes/Classes';
1
+ import { AppConfig, } from './../../classes/Classes';
2
2
  import { Component, Input } from '@angular/core';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/router";
5
5
  import * as i2 from "../../services/auth.service";
6
6
  import * as i3 from "../../services/storage.service";
7
- import * as i4 from "@abacritt/angularx-social-login";
8
- import * as i5 from "@angular/cdk/layout";
9
- import * as i6 from "../../services/datalib.service";
10
- import * as i7 from "@angular/common";
11
- import * as i8 from "@angular/material/menu";
12
- import * as i9 from "@angular/material/button";
13
- import * as i10 from "@angular/material/icon";
14
- import * as i11 from "@angular/material/list";
15
- import * as i12 from "@angular/material/divider";
16
- import * as i13 from "@angular/material/tooltip";
17
- import * as i14 from "@angular/material/sidenav";
18
- import * as i15 from "@angular/material/toolbar";
19
- import * as i16 from "@angular/material/expansion";
20
- import * as i17 from "../loader/loader.component";
7
+ import * as i4 from "../../services/notifications.service";
8
+ import * as i5 from "@abacritt/angularx-social-login";
9
+ import * as i6 from "@angular/cdk/layout";
10
+ import * as i7 from "../../services/datalib.service";
11
+ import * as i8 from "@angular/common";
12
+ import * as i9 from "@angular/material/menu";
13
+ import * as i10 from "@angular/material/badge";
14
+ import * as i11 from "@angular/material/button";
15
+ import * as i12 from "@angular/material/icon";
16
+ import * as i13 from "@angular/material/list";
17
+ import * as i14 from "@angular/material/divider";
18
+ import * as i15 from "@angular/material/tooltip";
19
+ import * as i16 from "@angular/material/sidenav";
20
+ import * as i17 from "@angular/material/toolbar";
21
+ import * as i18 from "@angular/material/expansion";
22
+ import * as i19 from "../loader/loader.component";
21
23
  export class NavMenuComponent {
22
- constructor(router, authService, storageService, socialService, breakpointObserver, dataService) {
24
+ constructor(router, authService, storageService, notificationsService, socialService, breakpointObserver, dataService) {
23
25
  this.router = router;
24
26
  this.authService = authService;
25
27
  this.storageService = storageService;
28
+ this.notificationsService = notificationsService;
26
29
  this.socialService = socialService;
27
30
  this.breakpointObserver = breakpointObserver;
28
31
  this.dataService = dataService;
32
+ this.notificationCount$ = this.notificationsService.notificationCount$;
29
33
  this.isExpanded = false;
30
34
  this.nowDate = new Date();
31
35
  this.appConfig = new AppConfig();
32
- this.footer = 'alsquaretech.net | Privacy Policy';
36
+ this.footer = 'alsquaretech.net';
33
37
  // detect screen size changes
34
38
  this.breakpointObserver.observe(["(max-width: 600px)"]).subscribe((result) => {
35
39
  if (result.matches) {
@@ -45,6 +49,9 @@ export class NavMenuComponent {
45
49
  this.authService.myRoleObserv.subscribe(rol => this.myRole = rol);
46
50
  this.authService.loggedinObserv.subscribe(obj => this.loggedin = obj);
47
51
  this.authService.tenantNameObserv.subscribe(obj => this.tenantName = obj);
52
+ if (!this.smallScreen) {
53
+ this.isExpanded = true;
54
+ }
48
55
  }
49
56
  collapse() {
50
57
  this.isExpanded = false;
@@ -56,12 +63,6 @@ export class NavMenuComponent {
56
63
  this.isExpanded = false;
57
64
  }
58
65
  logoff() {
59
- // this.socialService.signOut();
60
- // this.authService.Updateloggedin(false);
61
- // this.authService.UpdateAutoLogin(false);
62
- // this.authService.UpdateRole(new Role());
63
- // this.storageService.clear();
64
- // this.router.navigate(["login"]);
65
66
  this.authService.logoff();
66
67
  }
67
68
  redirectTo(link) {
@@ -70,15 +71,18 @@ export class NavMenuComponent {
70
71
  this.router.navigate([link]);
71
72
  }
72
73
  }
74
+ getSubItems(capItem) {
75
+ return capItem.capSubItems.filter(x => x.showMenu && !x.isBool);
76
+ }
73
77
  }
74
- NavMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NavMenuComponent, deps: [{ token: i1.Router }, { token: i2.AuthService }, { token: i3.StorageService }, { token: i4.SocialAuthService }, { token: i5.BreakpointObserver }, { token: i6.DataServiceLib }], target: i0.ɵɵFactoryTarget.Component });
75
- NavMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: NavMenuComponent, selector: "spa-nav-menu", inputs: { appConfig: "appConfig", footer: "footer" }, ngImport: i0, template: "<header *ngIf=\"loggedin && dataService.appConfig.navigation == 'top'\">\r\n\r\n <nav class=\"toolbar navbar navbar-expand-sm navbar-toggleable-sm navbar-light border-bottom box-shadow mb-3 \" style=\"padding-right: 10px;\">\r\n\r\n\r\n <div class=\"container-fluid\" style=\"padding-right: 0px;\">\r\n\r\n <img *ngIf=\"appConfig.logo!=''\" [src]=\"appConfig.logo\" style=\"height: 50px; margin-right: 2em\" />\r\n\r\n <div>\r\n <!-- <div style=\"font-size: 20px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px;\">\r\n {{tenantName}}\r\n </div> -->\r\n\r\n <div *ngIf=\"!dataService.appConfig.multitenant\" style=\"font-size: 22px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\" style=\"font-size: 20px; ; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" aria-label=\"Toggle navigation\" [attr.aria-expanded]=\"isExpanded\" (click)=\"toggle()\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div *ngIf=\"myRole\" class=\" navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse stack-top\" style=\"margin-right: 0px;\" [ngClass]=\"{ show: isExpanded, navitems: isExpanded }\" >\r\n\r\n <button mat-icon-button (click)=\"logoff()\" > <mat-icon>logout</mat-icon> </button>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" > <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button>\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/bug')\"> <mat-icon >support_agent</mat-icon> </button>\r\n\r\n <!-- <button mat-icon-button (click)=\"redirectTo('home/admin/tenants')\"> <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button> -->\r\n </div>\r\n\r\n\r\n <button id=\"btnUser\" mat-button [matMenuTriggerFor]=\"profileMenu\" ><mat-icon style=\"font-size: 24px;\">account_circle</mat-icon> &nbsp;{{loggedUserFullName}}</button>\r\n\r\n <mat-menu #profileMenu=\"matMenu\">\r\n <button id=\"btnProfile\" mat-menu-item (click)=\"redirectTo('home/user/profile')\" >Profile</button>\r\n <button id=\"btnLogOff\" mat-menu-item (click)=\"logoff()\">Log Off</button>\r\n </mat-menu>\r\n\r\n <div *ngFor=\"let item of appConfig.capItems\">\r\n\r\n <!-- Menu Item -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && !item.capSubItems && item.showMenu\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items ignored -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && item.ignoreSubsDisplay\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items to display-->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && !item.ignoreSubsDisplay\" mat-button [matMenuTriggerFor]=\"adminMenu\">{{item.display}}</button>\r\n\r\n\r\n <!-- Sub Menu Items -->\r\n <mat-menu #adminMenu=\"matMenu\">\r\n\r\n <div *ngFor=\"let subItem of item.capSubItems\">\r\n\r\n <button *ngIf=\"myRole[subItem.name] && subItem.showMenu\" mat-menu-item (click)=\"redirectTo(subItem.link)\">{{subItem.display}}</button>\r\n\r\n </div>\r\n\r\n </mat-menu>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </nav>\r\n\r\n</header>\r\n\r\n<div class=\"container-fluid tin-bg-image\" *ngIf=\"dataService.appConfig.navigation == 'top'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n<!-- SIDE -->\r\n<mat-toolbar class=\"tin-bg-image-toolbar\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\" style=\"padding: 0px 8px;\">\r\n\r\n <button mat-icon-button (click)=\"toggle()\" matTooltip=\"Menu\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n\r\n <img [src]=\"dataService.appConfig.logo\" style=\"height: 50px;\" />\r\n\r\n <div style=\"padding-left: 10px; \">\r\n\r\n <div style=\"font-size: 20px; height: 25px; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n <span class=\"toolbar-item-spacer\"></span>\r\n\r\n <!-- buttons -->\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" > <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"redirectTo('home/admin/bug')\"> <mat-icon >help</mat-icon> </button>\r\n\r\n </div>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button matTooltip=\"Notifications\"><mat-icon>notifications</mat-icon></button>\r\n\r\n <button mat-icon-button matTooltip=\"My Account\" [matMenuTriggerFor]=\"userAccountMenu\"><mat-icon>account_circle</mat-icon></button>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"logoff()\"> <mat-icon>logout</mat-icon></button>\r\n\r\n\r\n <!-- my account menu -->\r\n <mat-menu #userAccountMenu [overlapTrigger]=\"false\" yPosition=\"below\">\r\n\r\n <button mat-menu-item routerLink=\"home/user/profile\">\r\n <mat-icon>person</mat-icon><span>Profile</span>\r\n </button>\r\n\r\n <button mat-menu-item routerLink=\"home/admin/bug\" *ngIf=\"dataService.appConfig.multitenant && smallScreen\">\r\n <mat-icon>help</mat-icon> <span>Help</span>\r\n </button>\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <button mat-menu-item (click)=\"logoff()\">\r\n <mat-icon>logout</mat-icon>Logout\r\n </button>\r\n\r\n </mat-menu>\r\n\r\n</mat-toolbar>\r\n\r\n\r\n\r\n\r\n<mat-sidenav-container class=\"app-container\" [hasBackdrop]=\"smallScreen\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n\r\n <mat-sidenav #sidenav [mode]=\"smallScreen ? 'over' : 'over'\" [class.mat-elevation-z4]=\"true\" [opened]=\"isExpanded\" class=\"app-sidenav side-color\" style=\"height: 100%;\">\r\n <mat-nav-list >\r\n\r\n <ng-container *ngFor=\"let cap of dataService.appConfig.capItems\" >\r\n\r\n <!-- Menu item -->\r\n <mat-list-item [routerLink]=\"cap.link\" *ngIf=\"myRole[cap.name] && cap.showMenu && (!cap.capSubItems || cap.capSubItems && cap.ignoreSubsDisplay)\" style=\"height: 40px;font-size: 15px;\" (click)=\"toggle()\">\r\n <mat-icon style=\"margin-right: 5px;\">{{cap.icon}}</mat-icon>{{cap.display}}\r\n </mat-list-item>\r\n\r\n <!-- Menu With Sub items -->\r\n <mat-expansion-panel class=\"side-color\" [class.mat-elevation-z0]=\"true\" *ngIf=\"myRole[cap.name] && cap.showMenu && cap.capSubItems && !cap.ignoreSubsDisplay\">\r\n\r\n <mat-expansion-panel-header style=\"height: 40px;padding-left: 15px;\">\r\n <mat-icon style=\"margin-right: 5px;\">{{cap.icon != 'navigate_next' ? cap.icon : 'fiber_manual_record' }}</mat-icon>{{cap.display}}\r\n </mat-expansion-panel-header>\r\n\r\n <!-- Sub items -->\r\n <mat-nav-list *ngFor=\"let capSub of cap.capSubItems\">\r\n\r\n <mat-list-item [routerLink]=\"capSub.link\" style=\"height: 30px; font-size: 15px;\" (click)=\"toggle()\" *ngIf=\"myRole[cap.name] && cap.showMenu\">\r\n <mat-icon style=\"margin-right: 5px;\">{{capSub.icon}}</mat-icon>{{capSub.display}}\r\n </mat-list-item>\r\n\r\n </mat-nav-list>\r\n\r\n </mat-expansion-panel>\r\n\r\n </ng-container>\r\n\r\n </mat-nav-list>\r\n </mat-sidenav>\r\n\r\n\r\n\r\n <mat-sidenav-content class=\"container-fluid tin-bg-image\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <hr style=\"margin-top: 0px;\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n </mat-sidenav-content>\r\n\r\n</mat-sidenav-container>\r\n\r\n\r\n<!-- footer -->\r\n<div class=\"tin-center\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <label style=\"text-align: center; font-size: 12px;\">&copy; {{nowDate | date : 'yyyy'}} {{footer}}</label>\r\n</div>\r\n\r\n\r\n<div class=\"container-fluid tin-bg-image\" *ngIf=\"!loggedin && dataService.appConfig.navigation == 'side'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n", styles: ["a.navbar-brand{white-space:normal;text-align:center;word-break:break-all}html{font-size:14px}.box-shadow{box-shadow:0 .25rem .75rem #0000000d}.toolbar{height:60px;display:flex;align-items:center;background-color:#03a;color:#fff}.stack-top{z-index:9;margin:20px}.navitems{background-color:#03a}.toolbar-item-spacer{flex:1 1 auto}.app-container{height:90%;margin:0}.app-sidenav{width:200px}.side-color{background-color:#def0fc}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i9.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatNavList, selector: "mat-nav-list", inputs: ["disableRipple", "disabled"], exportAs: ["matNavList"] }, { kind: "component", type: i11.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["disableRipple", "disabled"], exportAs: ["matListItem"] }, { kind: "component", type: i12.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i14.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i14.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i14.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "component", type: i15.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i1.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i16.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i16.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "component", type: i17.LoaderComponent, selector: "spa-loader", inputs: ["logo"] }, { kind: "pipe", type: i7.DatePipe, name: "date" }] });
78
+ NavMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NavMenuComponent, deps: [{ token: i1.Router }, { token: i2.AuthService }, { token: i3.StorageService }, { token: i4.NotificationsService }, { token: i5.SocialAuthService }, { token: i6.BreakpointObserver }, { token: i7.DataServiceLib }], target: i0.ɵɵFactoryTarget.Component });
79
+ NavMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: NavMenuComponent, selector: "spa-nav-menu", inputs: { appConfig: "appConfig", footer: "footer" }, ngImport: i0, template: "<header *ngIf=\"loggedin && dataService.appConfig.navigation == 'top'\">\r\n\r\n <nav class=\"toolbar navbar navbar-expand-sm navbar-toggleable-sm navbar-light border-bottom box-shadow mb-3 \" style=\"padding-right: 10px;\">\r\n\r\n\r\n <div class=\"container-fluid\" style=\"padding-right: 0px;\">\r\n\r\n <img *ngIf=\"appConfig.logo!=''\" [src]=\"appConfig.logo\" style=\"height: 50px; margin-right: 2em\" />\r\n\r\n <div>\r\n <!-- <div style=\"font-size: 20px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px;\">\r\n {{tenantName}}\r\n </div> -->\r\n\r\n <div *ngIf=\"!dataService.appConfig.multitenant\" style=\"font-size: 22px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\" style=\"font-size: 20px; ; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" aria-label=\"Toggle navigation\" [attr.aria-expanded]=\"isExpanded\" (click)=\"toggle()\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div *ngIf=\"myRole\" class=\" navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse stack-top\" style=\"margin-right: 0px;\" [ngClass]=\"{ show: isExpanded, navitems: isExpanded }\" >\r\n\r\n <button mat-icon-button (click)=\"logoff()\" > <mat-icon>logout</mat-icon> </button>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" > <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button>\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/bug')\"> <mat-icon >support_agent</mat-icon> </button>\r\n\r\n <!-- <button mat-icon-button (click)=\"redirectTo('home/admin/notifications')\"> <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button> -->\r\n </div>\r\n\r\n\r\n <button id=\"btnUser\" mat-button [matMenuTriggerFor]=\"profileMenu\" ><mat-icon style=\"font-size: 24px;\">account_circle</mat-icon> &nbsp;{{loggedUserFullName}}</button>\r\n\r\n <mat-menu #profileMenu=\"matMenu\">\r\n <button id=\"btnProfile\" mat-menu-item (click)=\"redirectTo('home/user/profile')\" >Profile</button>\r\n <button id=\"btnLogOff\" mat-menu-item (click)=\"logoff()\">Log Off</button>\r\n </mat-menu>\r\n\r\n <div *ngFor=\"let item of appConfig.capItems\">\r\n\r\n <!-- Menu Item -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && !item.capSubItems && item.showMenu\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items ignored -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && item.ignoreSubsDisplay\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items to display-->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && !item.ignoreSubsDisplay\" mat-button [matMenuTriggerFor]=\"adminMenu\">{{item.display}}</button>\r\n\r\n\r\n <!-- Sub Menu Items -->\r\n <mat-menu #adminMenu=\"matMenu\">\r\n\r\n <div *ngFor=\"let subItem of item.capSubItems\">\r\n\r\n <button *ngIf=\"myRole[subItem.name] && subItem.showMenu\" mat-menu-item (click)=\"redirectTo(subItem.link)\">{{subItem.display}}</button>\r\n\r\n </div>\r\n\r\n </mat-menu>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </nav>\r\n\r\n</header>\r\n\r\n<div class=\"container-fluid tin-bg-image\" *ngIf=\"dataService.appConfig.navigation == 'top'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n<!-- SIDE -->\r\n<mat-toolbar class=\"tin-bg-image-toolbar\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\" style=\"padding: 0px 8px;\">\r\n\r\n <button mat-icon-button (click)=\"toggle()\" matTooltip=\"Menu\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n\r\n <img [src]=\"dataService.appConfig.logo\" style=\"height: 50px;\" />\r\n\r\n <div style=\"padding-left: 10px; \">\r\n\r\n <div style=\"font-size: 22px; font-weight: 400;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <!-- <div style=\"font-size: 20px; height: 25px; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div> -->\r\n\r\n <!-- <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div> -->\r\n\r\n </div>\r\n\r\n\r\n\r\n <span class=\"toolbar-item-spacer\"></span>\r\n\r\n <!-- buttons -->\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <!-- <label style=\"font-size: 14px;\">Hi, {{loggedUserFullName}}</label> -->\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" matTooltip=\"Organisation Settings\">\r\n <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon>\r\n </button>\r\n <label style=\"font-size: 14px;margin-right: 20px;\">{{tenantName}}</label>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"redirectTo('home/admin/bug')\" matTooltip=\"Support\">\r\n <mat-icon >help</mat-icon>\r\n </button>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"redirectTo('home/admin/notifications')\" matTooltip=\"Notifications\">\r\n <mat-icon [matBadge]=\"notificationCount$ | async\" [matBadgeHidden]=\"(notificationCount$ | async) === 0\" matBadgeColor=\"warn\" matBadgeSize=\"small\">notifications</mat-icon>\r\n </button>\r\n\r\n </div>\r\n\r\n\r\n\r\n <button mat-icon-button matTooltip=\"My Account\" [matMenuTriggerFor]=\"userAccountMenu\"><mat-icon>account_circle</mat-icon></button>\r\n <label style=\"font-size: 14px;\">{{loggedUserFullName}}</label>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"logoff()\" matTooltip=\"Signout\">\r\n <mat-icon>logout</mat-icon>\r\n </button>\r\n\r\n\r\n <!-- my account menu -->\r\n <mat-menu #userAccountMenu [overlapTrigger]=\"false\" yPosition=\"below\">\r\n\r\n\r\n <button mat-menu-item routerLink=\"home/user/profile\">\r\n <mat-icon>person</mat-icon><span>Profile</span>\r\n </button>\r\n\r\n <button mat-menu-item routerLink=\"home/admin/bug\" *ngIf=\"dataService.appConfig.multitenant && smallScreen\">\r\n <mat-icon>help</mat-icon> <span>Help</span>\r\n </button>\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <button mat-menu-item (click)=\"logoff()\">\r\n <mat-icon>logout</mat-icon>Logout\r\n </button>\r\n\r\n </mat-menu>\r\n\r\n</mat-toolbar>\r\n\r\n\r\n\r\n\r\n<mat-sidenav-container class=\"app-container\" [hasBackdrop]=\"smallScreen\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n\r\n <mat-sidenav #sidenav [mode]=\"smallScreen ? 'over' : 'side'\" [class.mat-elevation-z4]=\"true\" [opened]=\"isExpanded\" class=\"app-sidenav side-color\" style=\"height: 100%;\"\r\n [ngStyle]=\"{'width': dataService.appConfig.navWidth}\">\r\n <mat-nav-list >\r\n\r\n <ng-container *ngFor=\"let cap of dataService.appConfig.capItems\" >\r\n\r\n <!-- Menu item -->\r\n <mat-list-item [routerLink]=\"cap.link\" *ngIf=\"myRole[cap.name] && cap.showMenu && (!cap.capSubItems || cap.capSubItems && cap.ignoreSubsDisplay)\" style=\"height: 40px;font-size: 15px;\"\r\n (click)=\"smallScreen ? toggle() : null\">\r\n <mat-icon [ngStyle]=\"{'color': cap.color}\" style=\"margin-right: 5px;\">{{cap.icon}}</mat-icon>{{cap.display}}\r\n </mat-list-item>\r\n\r\n <!-- Menu With Sub items -->\r\n <mat-expansion-panel class=\"side-color\" [class.mat-elevation-z0]=\"true\" *ngIf=\"myRole[cap.name] && cap.showMenu && cap.capSubItems && !cap.ignoreSubsDisplay\">\r\n\r\n <mat-expansion-panel-header style=\"height: 40px;padding-left: 15px;\">\r\n <mat-icon [ngStyle]=\"{'color': cap.color}\" style=\"margin-right: 5px;\">{{cap.icon != 'navigate_next' ? cap.icon : 'fiber_manual_record' }}</mat-icon>{{cap.display}}\r\n </mat-expansion-panel-header>\r\n\r\n <!-- Sub items -->\r\n <mat-nav-list *ngFor=\"let capSub of getSubItems(cap)\">\r\n\r\n <mat-list-item [routerLink]=\"capSub.link\" style=\"height: 30px; font-size: 15px;\" (click)=\"smallScreen ? toggle() : null\" *ngIf=\"myRole[capSub.name] && capSub.showMenu\">\r\n <mat-icon [ngStyle]=\"{'color': capSub.color}\" style=\"margin-right: 5px;\">{{capSub.icon}}</mat-icon>{{capSub.display}}\r\n </mat-list-item>\r\n\r\n </mat-nav-list>\r\n\r\n </mat-expansion-panel>\r\n\r\n </ng-container>\r\n\r\n </mat-nav-list>\r\n </mat-sidenav>\r\n\r\n\r\n\r\n <mat-sidenav-content class=\"tin-bg-image\" style=\"padding: 0px 12px;\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <hr style=\"margin-top: 0px;\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n </mat-sidenav-content>\r\n\r\n</mat-sidenav-container>\r\n\r\n\r\n<!-- footer -->\r\n<div class=\"tin-center\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <label style=\"text-align: center; font-size: 12px;\">&copy; {{nowDate | date : 'yyyy'}} <a color=\"primary\" class=\"terms-link\" [href]=\"appConfig.siteUrl\" target=\"_blank\">{{footer}}</a> | <a color=\"primary\" class=\"terms-link\" [href]=\"appConfig.privacyUrl\" target=\"_blank\">Privacy Policy</a>.</label>\r\n</div>\r\n\r\n\r\n<div class=\"tin-bg-image\" *ngIf=\"!loggedin && dataService.appConfig.navigation == 'side'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n", styles: ["a.navbar-brand{white-space:normal;text-align:center;word-break:break-all}html{font-size:14px}.box-shadow{box-shadow:0 .25rem .75rem #0000000d}.toolbar{height:60px;display:flex;align-items:center;background-color:#03a;color:#fff}.stack-top{z-index:9;margin:20px}.navitems{background-color:#03a}.toolbar-item-spacer{flex:1 1 auto}.app-container{height:90%;margin:0}.app-sidenav{width:200px}.side-color{background-color:#e6f4ff}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i10.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: i11.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i13.MatNavList, selector: "mat-nav-list", inputs: ["disableRipple", "disabled"], exportAs: ["matNavList"] }, { kind: "component", type: i13.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["disableRipple", "disabled"], exportAs: ["matListItem"] }, { kind: "component", type: i14.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i15.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i16.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i16.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i16.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "component", type: i17.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i1.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i18.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i18.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "component", type: i19.LoaderComponent, selector: "spa-loader", inputs: ["logo"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.DatePipe, name: "date" }] });
76
80
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NavMenuComponent, decorators: [{
77
81
  type: Component,
78
- args: [{ selector: 'spa-nav-menu', template: "<header *ngIf=\"loggedin && dataService.appConfig.navigation == 'top'\">\r\n\r\n <nav class=\"toolbar navbar navbar-expand-sm navbar-toggleable-sm navbar-light border-bottom box-shadow mb-3 \" style=\"padding-right: 10px;\">\r\n\r\n\r\n <div class=\"container-fluid\" style=\"padding-right: 0px;\">\r\n\r\n <img *ngIf=\"appConfig.logo!=''\" [src]=\"appConfig.logo\" style=\"height: 50px; margin-right: 2em\" />\r\n\r\n <div>\r\n <!-- <div style=\"font-size: 20px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px;\">\r\n {{tenantName}}\r\n </div> -->\r\n\r\n <div *ngIf=\"!dataService.appConfig.multitenant\" style=\"font-size: 22px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\" style=\"font-size: 20px; ; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" aria-label=\"Toggle navigation\" [attr.aria-expanded]=\"isExpanded\" (click)=\"toggle()\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div *ngIf=\"myRole\" class=\" navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse stack-top\" style=\"margin-right: 0px;\" [ngClass]=\"{ show: isExpanded, navitems: isExpanded }\" >\r\n\r\n <button mat-icon-button (click)=\"logoff()\" > <mat-icon>logout</mat-icon> </button>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" > <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button>\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/bug')\"> <mat-icon >support_agent</mat-icon> </button>\r\n\r\n <!-- <button mat-icon-button (click)=\"redirectTo('home/admin/tenants')\"> <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button> -->\r\n </div>\r\n\r\n\r\n <button id=\"btnUser\" mat-button [matMenuTriggerFor]=\"profileMenu\" ><mat-icon style=\"font-size: 24px;\">account_circle</mat-icon> &nbsp;{{loggedUserFullName}}</button>\r\n\r\n <mat-menu #profileMenu=\"matMenu\">\r\n <button id=\"btnProfile\" mat-menu-item (click)=\"redirectTo('home/user/profile')\" >Profile</button>\r\n <button id=\"btnLogOff\" mat-menu-item (click)=\"logoff()\">Log Off</button>\r\n </mat-menu>\r\n\r\n <div *ngFor=\"let item of appConfig.capItems\">\r\n\r\n <!-- Menu Item -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && !item.capSubItems && item.showMenu\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items ignored -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && item.ignoreSubsDisplay\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items to display-->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && !item.ignoreSubsDisplay\" mat-button [matMenuTriggerFor]=\"adminMenu\">{{item.display}}</button>\r\n\r\n\r\n <!-- Sub Menu Items -->\r\n <mat-menu #adminMenu=\"matMenu\">\r\n\r\n <div *ngFor=\"let subItem of item.capSubItems\">\r\n\r\n <button *ngIf=\"myRole[subItem.name] && subItem.showMenu\" mat-menu-item (click)=\"redirectTo(subItem.link)\">{{subItem.display}}</button>\r\n\r\n </div>\r\n\r\n </mat-menu>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </nav>\r\n\r\n</header>\r\n\r\n<div class=\"container-fluid tin-bg-image\" *ngIf=\"dataService.appConfig.navigation == 'top'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n<!-- SIDE -->\r\n<mat-toolbar class=\"tin-bg-image-toolbar\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\" style=\"padding: 0px 8px;\">\r\n\r\n <button mat-icon-button (click)=\"toggle()\" matTooltip=\"Menu\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n\r\n <img [src]=\"dataService.appConfig.logo\" style=\"height: 50px;\" />\r\n\r\n <div style=\"padding-left: 10px; \">\r\n\r\n <div style=\"font-size: 20px; height: 25px; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n <span class=\"toolbar-item-spacer\"></span>\r\n\r\n <!-- buttons -->\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" > <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"redirectTo('home/admin/bug')\"> <mat-icon >help</mat-icon> </button>\r\n\r\n </div>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button matTooltip=\"Notifications\"><mat-icon>notifications</mat-icon></button>\r\n\r\n <button mat-icon-button matTooltip=\"My Account\" [matMenuTriggerFor]=\"userAccountMenu\"><mat-icon>account_circle</mat-icon></button>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"logoff()\"> <mat-icon>logout</mat-icon></button>\r\n\r\n\r\n <!-- my account menu -->\r\n <mat-menu #userAccountMenu [overlapTrigger]=\"false\" yPosition=\"below\">\r\n\r\n <button mat-menu-item routerLink=\"home/user/profile\">\r\n <mat-icon>person</mat-icon><span>Profile</span>\r\n </button>\r\n\r\n <button mat-menu-item routerLink=\"home/admin/bug\" *ngIf=\"dataService.appConfig.multitenant && smallScreen\">\r\n <mat-icon>help</mat-icon> <span>Help</span>\r\n </button>\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <button mat-menu-item (click)=\"logoff()\">\r\n <mat-icon>logout</mat-icon>Logout\r\n </button>\r\n\r\n </mat-menu>\r\n\r\n</mat-toolbar>\r\n\r\n\r\n\r\n\r\n<mat-sidenav-container class=\"app-container\" [hasBackdrop]=\"smallScreen\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n\r\n <mat-sidenav #sidenav [mode]=\"smallScreen ? 'over' : 'over'\" [class.mat-elevation-z4]=\"true\" [opened]=\"isExpanded\" class=\"app-sidenav side-color\" style=\"height: 100%;\">\r\n <mat-nav-list >\r\n\r\n <ng-container *ngFor=\"let cap of dataService.appConfig.capItems\" >\r\n\r\n <!-- Menu item -->\r\n <mat-list-item [routerLink]=\"cap.link\" *ngIf=\"myRole[cap.name] && cap.showMenu && (!cap.capSubItems || cap.capSubItems && cap.ignoreSubsDisplay)\" style=\"height: 40px;font-size: 15px;\" (click)=\"toggle()\">\r\n <mat-icon style=\"margin-right: 5px;\">{{cap.icon}}</mat-icon>{{cap.display}}\r\n </mat-list-item>\r\n\r\n <!-- Menu With Sub items -->\r\n <mat-expansion-panel class=\"side-color\" [class.mat-elevation-z0]=\"true\" *ngIf=\"myRole[cap.name] && cap.showMenu && cap.capSubItems && !cap.ignoreSubsDisplay\">\r\n\r\n <mat-expansion-panel-header style=\"height: 40px;padding-left: 15px;\">\r\n <mat-icon style=\"margin-right: 5px;\">{{cap.icon != 'navigate_next' ? cap.icon : 'fiber_manual_record' }}</mat-icon>{{cap.display}}\r\n </mat-expansion-panel-header>\r\n\r\n <!-- Sub items -->\r\n <mat-nav-list *ngFor=\"let capSub of cap.capSubItems\">\r\n\r\n <mat-list-item [routerLink]=\"capSub.link\" style=\"height: 30px; font-size: 15px;\" (click)=\"toggle()\" *ngIf=\"myRole[cap.name] && cap.showMenu\">\r\n <mat-icon style=\"margin-right: 5px;\">{{capSub.icon}}</mat-icon>{{capSub.display}}\r\n </mat-list-item>\r\n\r\n </mat-nav-list>\r\n\r\n </mat-expansion-panel>\r\n\r\n </ng-container>\r\n\r\n </mat-nav-list>\r\n </mat-sidenav>\r\n\r\n\r\n\r\n <mat-sidenav-content class=\"container-fluid tin-bg-image\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <hr style=\"margin-top: 0px;\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n </mat-sidenav-content>\r\n\r\n</mat-sidenav-container>\r\n\r\n\r\n<!-- footer -->\r\n<div class=\"tin-center\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <label style=\"text-align: center; font-size: 12px;\">&copy; {{nowDate | date : 'yyyy'}} {{footer}}</label>\r\n</div>\r\n\r\n\r\n<div class=\"container-fluid tin-bg-image\" *ngIf=\"!loggedin && dataService.appConfig.navigation == 'side'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n", styles: ["a.navbar-brand{white-space:normal;text-align:center;word-break:break-all}html{font-size:14px}.box-shadow{box-shadow:0 .25rem .75rem #0000000d}.toolbar{height:60px;display:flex;align-items:center;background-color:#03a;color:#fff}.stack-top{z-index:9;margin:20px}.navitems{background-color:#03a}.toolbar-item-spacer{flex:1 1 auto}.app-container{height:90%;margin:0}.app-sidenav{width:200px}.side-color{background-color:#def0fc}\n"] }]
79
- }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.AuthService }, { type: i3.StorageService }, { type: i4.SocialAuthService }, { type: i5.BreakpointObserver }, { type: i6.DataServiceLib }]; }, propDecorators: { appConfig: [{
82
+ args: [{ selector: 'spa-nav-menu', template: "<header *ngIf=\"loggedin && dataService.appConfig.navigation == 'top'\">\r\n\r\n <nav class=\"toolbar navbar navbar-expand-sm navbar-toggleable-sm navbar-light border-bottom box-shadow mb-3 \" style=\"padding-right: 10px;\">\r\n\r\n\r\n <div class=\"container-fluid\" style=\"padding-right: 0px;\">\r\n\r\n <img *ngIf=\"appConfig.logo!=''\" [src]=\"appConfig.logo\" style=\"height: 50px; margin-right: 2em\" />\r\n\r\n <div>\r\n <!-- <div style=\"font-size: 20px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px;\">\r\n {{tenantName}}\r\n </div> -->\r\n\r\n <div *ngIf=\"!dataService.appConfig.multitenant\" style=\"font-size: 22px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\" style=\"font-size: 20px; ; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" aria-label=\"Toggle navigation\" [attr.aria-expanded]=\"isExpanded\" (click)=\"toggle()\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div *ngIf=\"myRole\" class=\" navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse stack-top\" style=\"margin-right: 0px;\" [ngClass]=\"{ show: isExpanded, navitems: isExpanded }\" >\r\n\r\n <button mat-icon-button (click)=\"logoff()\" > <mat-icon>logout</mat-icon> </button>\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" > <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button>\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/bug')\"> <mat-icon >support_agent</mat-icon> </button>\r\n\r\n <!-- <button mat-icon-button (click)=\"redirectTo('home/admin/notifications')\"> <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon> </button> -->\r\n </div>\r\n\r\n\r\n <button id=\"btnUser\" mat-button [matMenuTriggerFor]=\"profileMenu\" ><mat-icon style=\"font-size: 24px;\">account_circle</mat-icon> &nbsp;{{loggedUserFullName}}</button>\r\n\r\n <mat-menu #profileMenu=\"matMenu\">\r\n <button id=\"btnProfile\" mat-menu-item (click)=\"redirectTo('home/user/profile')\" >Profile</button>\r\n <button id=\"btnLogOff\" mat-menu-item (click)=\"logoff()\">Log Off</button>\r\n </mat-menu>\r\n\r\n <div *ngFor=\"let item of appConfig.capItems\">\r\n\r\n <!-- Menu Item -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && !item.capSubItems && item.showMenu\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items ignored -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && item.ignoreSubsDisplay\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items to display-->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && !item.ignoreSubsDisplay\" mat-button [matMenuTriggerFor]=\"adminMenu\">{{item.display}}</button>\r\n\r\n\r\n <!-- Sub Menu Items -->\r\n <mat-menu #adminMenu=\"matMenu\">\r\n\r\n <div *ngFor=\"let subItem of item.capSubItems\">\r\n\r\n <button *ngIf=\"myRole[subItem.name] && subItem.showMenu\" mat-menu-item (click)=\"redirectTo(subItem.link)\">{{subItem.display}}</button>\r\n\r\n </div>\r\n\r\n </mat-menu>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </nav>\r\n\r\n</header>\r\n\r\n<div class=\"container-fluid tin-bg-image\" *ngIf=\"dataService.appConfig.navigation == 'top'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n<!-- SIDE -->\r\n<mat-toolbar class=\"tin-bg-image-toolbar\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\" style=\"padding: 0px 8px;\">\r\n\r\n <button mat-icon-button (click)=\"toggle()\" matTooltip=\"Menu\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n\r\n <img [src]=\"dataService.appConfig.logo\" style=\"height: 50px;\" />\r\n\r\n <div style=\"padding-left: 10px; \">\r\n\r\n <div style=\"font-size: 22px; font-weight: 400;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n <!-- <div style=\"font-size: 20px; height: 25px; font-weight: 400;\" [ngStyle]=\"{'margin-top': dataService.appConfig.multitenant ? '12px' : ''}\">\r\n {{appConfig.appName}}\r\n </div> -->\r\n\r\n <!-- <div *ngIf=\"dataService.appConfig.multitenant && tenantName\" style=\"font-size: 12px; margin-bottom: 5px;\">\r\n {{tenantName}}\r\n </div> -->\r\n\r\n </div>\r\n\r\n\r\n\r\n <span class=\"toolbar-item-spacer\"></span>\r\n\r\n <!-- buttons -->\r\n\r\n <div *ngIf=\"dataService.appConfig.multitenant\">\r\n\r\n <!-- <label style=\"font-size: 14px;\">Hi, {{loggedUserFullName}}</label> -->\r\n\r\n <button mat-icon-button (click)=\"redirectTo('home/admin/tenant-settings')\" matTooltip=\"Organisation Settings\">\r\n <mat-icon fontSet=\"material-icons-round\">apartment</mat-icon>\r\n </button>\r\n <label style=\"font-size: 14px;margin-right: 20px;\">{{tenantName}}</label>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"redirectTo('home/admin/bug')\" matTooltip=\"Support\">\r\n <mat-icon >help</mat-icon>\r\n </button>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"redirectTo('home/admin/notifications')\" matTooltip=\"Notifications\">\r\n <mat-icon [matBadge]=\"notificationCount$ | async\" [matBadgeHidden]=\"(notificationCount$ | async) === 0\" matBadgeColor=\"warn\" matBadgeSize=\"small\">notifications</mat-icon>\r\n </button>\r\n\r\n </div>\r\n\r\n\r\n\r\n <button mat-icon-button matTooltip=\"My Account\" [matMenuTriggerFor]=\"userAccountMenu\"><mat-icon>account_circle</mat-icon></button>\r\n <label style=\"font-size: 14px;\">{{loggedUserFullName}}</label>\r\n\r\n <button *ngIf=\"!smallScreen\" mat-icon-button (click)=\"logoff()\" matTooltip=\"Signout\">\r\n <mat-icon>logout</mat-icon>\r\n </button>\r\n\r\n\r\n <!-- my account menu -->\r\n <mat-menu #userAccountMenu [overlapTrigger]=\"false\" yPosition=\"below\">\r\n\r\n\r\n <button mat-menu-item routerLink=\"home/user/profile\">\r\n <mat-icon>person</mat-icon><span>Profile</span>\r\n </button>\r\n\r\n <button mat-menu-item routerLink=\"home/admin/bug\" *ngIf=\"dataService.appConfig.multitenant && smallScreen\">\r\n <mat-icon>help</mat-icon> <span>Help</span>\r\n </button>\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <button mat-menu-item (click)=\"logoff()\">\r\n <mat-icon>logout</mat-icon>Logout\r\n </button>\r\n\r\n </mat-menu>\r\n\r\n</mat-toolbar>\r\n\r\n\r\n\r\n\r\n<mat-sidenav-container class=\"app-container\" [hasBackdrop]=\"smallScreen\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n\r\n <mat-sidenav #sidenav [mode]=\"smallScreen ? 'over' : 'side'\" [class.mat-elevation-z4]=\"true\" [opened]=\"isExpanded\" class=\"app-sidenav side-color\" style=\"height: 100%;\"\r\n [ngStyle]=\"{'width': dataService.appConfig.navWidth}\">\r\n <mat-nav-list >\r\n\r\n <ng-container *ngFor=\"let cap of dataService.appConfig.capItems\" >\r\n\r\n <!-- Menu item -->\r\n <mat-list-item [routerLink]=\"cap.link\" *ngIf=\"myRole[cap.name] && cap.showMenu && (!cap.capSubItems || cap.capSubItems && cap.ignoreSubsDisplay)\" style=\"height: 40px;font-size: 15px;\"\r\n (click)=\"smallScreen ? toggle() : null\">\r\n <mat-icon [ngStyle]=\"{'color': cap.color}\" style=\"margin-right: 5px;\">{{cap.icon}}</mat-icon>{{cap.display}}\r\n </mat-list-item>\r\n\r\n <!-- Menu With Sub items -->\r\n <mat-expansion-panel class=\"side-color\" [class.mat-elevation-z0]=\"true\" *ngIf=\"myRole[cap.name] && cap.showMenu && cap.capSubItems && !cap.ignoreSubsDisplay\">\r\n\r\n <mat-expansion-panel-header style=\"height: 40px;padding-left: 15px;\">\r\n <mat-icon [ngStyle]=\"{'color': cap.color}\" style=\"margin-right: 5px;\">{{cap.icon != 'navigate_next' ? cap.icon : 'fiber_manual_record' }}</mat-icon>{{cap.display}}\r\n </mat-expansion-panel-header>\r\n\r\n <!-- Sub items -->\r\n <mat-nav-list *ngFor=\"let capSub of getSubItems(cap)\">\r\n\r\n <mat-list-item [routerLink]=\"capSub.link\" style=\"height: 30px; font-size: 15px;\" (click)=\"smallScreen ? toggle() : null\" *ngIf=\"myRole[capSub.name] && capSub.showMenu\">\r\n <mat-icon [ngStyle]=\"{'color': capSub.color}\" style=\"margin-right: 5px;\">{{capSub.icon}}</mat-icon>{{capSub.display}}\r\n </mat-list-item>\r\n\r\n </mat-nav-list>\r\n\r\n </mat-expansion-panel>\r\n\r\n </ng-container>\r\n\r\n </mat-nav-list>\r\n </mat-sidenav>\r\n\r\n\r\n\r\n <mat-sidenav-content class=\"tin-bg-image\" style=\"padding: 0px 12px;\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <hr style=\"margin-top: 0px;\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n </mat-sidenav-content>\r\n\r\n</mat-sidenav-container>\r\n\r\n\r\n<!-- footer -->\r\n<div class=\"tin-center\" *ngIf=\"loggedin && dataService.appConfig.navigation == 'side'\">\r\n <label style=\"text-align: center; font-size: 12px;\">&copy; {{nowDate | date : 'yyyy'}} <a color=\"primary\" class=\"terms-link\" [href]=\"appConfig.siteUrl\" target=\"_blank\">{{footer}}</a> | <a color=\"primary\" class=\"terms-link\" [href]=\"appConfig.privacyUrl\" target=\"_blank\">Privacy Policy</a>.</label>\r\n</div>\r\n\r\n\r\n<div class=\"tin-bg-image\" *ngIf=\"!loggedin && dataService.appConfig.navigation == 'side'\">\r\n <router-outlet></router-outlet>\r\n <spa-loader [logo]=\"this.dataService.appConfig.logo\"></spa-loader>\r\n</div>\r\n", styles: ["a.navbar-brand{white-space:normal;text-align:center;word-break:break-all}html{font-size:14px}.box-shadow{box-shadow:0 .25rem .75rem #0000000d}.toolbar{height:60px;display:flex;align-items:center;background-color:#03a;color:#fff}.stack-top{z-index:9;margin:20px}.navitems{background-color:#03a}.toolbar-item-spacer{flex:1 1 auto}.app-container{height:90%;margin:0}.app-sidenav{width:200px}.side-color{background-color:#e6f4ff}\n"] }]
83
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.AuthService }, { type: i3.StorageService }, { type: i4.NotificationsService }, { type: i5.SocialAuthService }, { type: i6.BreakpointObserver }, { type: i7.DataServiceLib }]; }, propDecorators: { appConfig: [{
80
84
  type: Input
81
85
  }], footer: [{
82
86
  type: Input
83
87
  }] } });
84
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbmF2LW1lbnUvbmF2LW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbmF2LW1lbnUvbmF2LW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBbUIsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWN6RCxNQUFNLE9BQU8sZ0JBQWdCO0lBRTNCLFlBQW1CLE1BQWMsRUFBUyxXQUF3QixFQUFVLGNBQThCLEVBQVUsYUFBZ0MsRUFBVSxrQkFBc0MsRUFBUyxXQUEyQjtRQUFyTixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBbUI7UUFBVSx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQVMsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBMkJ4TyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRW5CLFlBQU8sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1FBR1gsY0FBUyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7UUFDNUIsV0FBTSxHQUFXLG1DQUFtQyxDQUFDO1FBaEM1RCw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUF1QixFQUFFLEVBQUU7WUFFNUYsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO2dCQUNsQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTthQUN4QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQTthQUN6QjtRQUVILENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVGLFFBQVE7UUFFTixJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUNyRixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUE7UUFDckUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFBO0lBRTNFLENBQUM7SUFpQkQsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDckMsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsTUFBTTtRQUNKLGdDQUFnQztRQUNoQywwQ0FBMEM7UUFDMUMsMkNBQTJDO1FBQzNDLDJDQUEyQztRQUMzQywrQkFBK0I7UUFDL0IsbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFZO1FBRXJCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVoQixJQUFJLElBQUksSUFBRSxFQUFFLEVBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDOUI7SUFFSCxDQUFDOzs2R0FyRVUsZ0JBQWdCO2lHQUFoQixnQkFBZ0IsMEdDZjdCLCt1U0FpT0E7MkZEbE5hLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxjQUFjO2tQQXNDZixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcENvbmZpZywgUm9sZSwgQ29uc3RhbnRzIH0gZnJvbSAnLi8uLi8uLi9jbGFzc2VzL0NsYXNzZXMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgIEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTb2NpYWxBdXRoU2VydmljZSB9IGZyb20gJ0BhYmFjcml0dC9hbmd1bGFyeC1zb2NpYWwtbG9naW4nO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZUxpYiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGFsaWIuc2VydmljZSc7XHJcbmltcG9ydCB7IEJyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludFN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzcGEtbmF2LW1lbnUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uYXYtbWVudS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmF2LW1lbnUuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOYXZNZW51Q29tcG9uZW50IHtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIHJvdXRlcjogUm91dGVyLCBwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLCBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSwgcHJpdmF0ZSBzb2NpYWxTZXJ2aWNlOiBTb2NpYWxBdXRoU2VydmljZSwgcHJpdmF0ZSBicmVha3BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlciwgcHVibGljIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZUxpYiwpIHtcclxuICAgIC8vIGRldGVjdCBzY3JlZW4gc2l6ZSBjaGFuZ2VzXHJcbiAgICB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlci5vYnNlcnZlKFtcIihtYXgtd2lkdGg6IDYwMHB4KVwiXSkuc3Vic2NyaWJlKChyZXN1bHQ6IEJyZWFrcG9pbnRTdGF0ZSkgPT4ge1xyXG5cclxuICAgICAgaWYgKHJlc3VsdC5tYXRjaGVzKSB7XHJcbiAgICAgICAgdGhpcy5zbWFsbFNjcmVlbiA9IHRydWVcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNtYWxsU2NyZWVuID0gZmFsc2VcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nZ2VkVXNlckZ1bGxOYW1lLnN1YnNjcmliZSh1c2VyID0+IHRoaXMubG9nZ2VkVXNlckZ1bGxOYW1lID0gdXNlcilcclxuICAgIHRoaXMuYXV0aFNlcnZpY2UubXlSb2xlT2JzZXJ2LnN1YnNjcmliZShyb2wgPT4gdGhpcy5teVJvbGUgPSByb2wpO1xyXG4gICAgdGhpcy5hdXRoU2VydmljZS5sb2dnZWRpbk9ic2Vydi5zdWJzY3JpYmUob2JqID0+IHRoaXMubG9nZ2VkaW4gPSBvYmopXHJcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLnRlbmFudE5hbWVPYnNlcnYuc3Vic2NyaWJlKG9iaiA9PiB0aGlzLnRlbmFudE5hbWUgPSBvYmopXHJcblxyXG4gIH1cclxuXHJcbiAgc21hbGxTY3JlZW5cclxuICBteVJvbGU7XHJcbiAgbG9nZ2VkVXNlckZ1bGxOYW1lOiBzdHJpbmc7XHJcbiAgdGVuYW50TmFtZSA6IHN0cmluZztcclxuICBsb2dnZWRpbjogYm9vbGVhbjtcclxuICBpc0V4cGFuZGVkID0gZmFsc2U7XHJcblxyXG4gIG5vd0RhdGUgPSBuZXcgRGF0ZSgpXHJcblxyXG5cclxuICBASW5wdXQoKSBhcHBDb25maWcgPSBuZXcgQXBwQ29uZmlnKCk7XHJcbiAgQElucHV0KCkgZm9vdGVyOiBzdHJpbmcgPSAnYWxzcXVhcmV0ZWNoLm5ldCB8IFByaXZhY3kgUG9saWN5JztcclxuXHJcblxyXG5cclxuICBjb2xsYXBzZSgpIHtcclxuICAgIHRoaXMuaXNFeHBhbmRlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlKCkge1xyXG4gICAgdGhpcy5pc0V4cGFuZGVkID0gIXRoaXMuaXNFeHBhbmRlZDtcclxuICB9XHJcblxyXG4gIGNsb3NlU2lkZSgpIHtcclxuICAgIHRoaXMuaXNFeHBhbmRlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbG9nb2ZmKCkge1xyXG4gICAgLy8gdGhpcy5zb2NpYWxTZXJ2aWNlLnNpZ25PdXQoKTtcclxuICAgIC8vIHRoaXMuYXV0aFNlcnZpY2UuVXBkYXRlbG9nZ2VkaW4oZmFsc2UpO1xyXG4gICAgLy8gdGhpcy5hdXRoU2VydmljZS5VcGRhdGVBdXRvTG9naW4oZmFsc2UpO1xyXG4gICAgLy8gdGhpcy5hdXRoU2VydmljZS5VcGRhdGVSb2xlKG5ldyBSb2xlKCkpO1xyXG4gICAgLy8gdGhpcy5zdG9yYWdlU2VydmljZS5jbGVhcigpO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wibG9naW5cIl0pO1xyXG4gICAgdGhpcy5hdXRoU2VydmljZS5sb2dvZmYoKTtcclxuICB9XHJcblxyXG4gIHJlZGlyZWN0VG8obGluazogc3RyaW5nKXtcclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlKCk7XHJcblxyXG4gICAgaWYgKGxpbmshPVwiXCIpe1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbbGlua10pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxufVxyXG4iLCI8aGVhZGVyICpuZ0lmPVwibG9nZ2VkaW4gJiYgZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm5hdmlnYXRpb24gPT0gJ3RvcCdcIj5cclxuXHJcbiAgPG5hdiBjbGFzcz1cInRvb2xiYXIgbmF2YmFyIG5hdmJhci1leHBhbmQtc20gbmF2YmFyLXRvZ2dsZWFibGUtc20gbmF2YmFyLWxpZ2h0ICBib3JkZXItYm90dG9tIGJveC1zaGFkb3cgbWItMyBcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCI+XHJcblxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDBweDtcIj5cclxuXHJcbiAgICAgIDxpbWcgKm5nSWY9XCJhcHBDb25maWcubG9nbyE9JydcIiBbc3JjXT1cImFwcENvbmZpZy5sb2dvXCIgc3R5bGU9XCJoZWlnaHQ6IDUwcHg7IG1hcmdpbi1yaWdodDogMmVtXCIgLz5cclxuXHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMjBweDtcIj5cclxuICAgICAgICAgICAgICB7e2FwcENvbmZpZy5hcHBOYW1lfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50ICYmIHRlbmFudE5hbWVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtcIj5cclxuICAgICAgICAgICAgICB7e3RlbmFudE5hbWV9fVxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50XCIgc3R5bGU9XCJmb250LXNpemU6IDIycHg7XCI+XHJcbiAgICAgICAgICB7e2FwcENvbmZpZy5hcHBOYW1lfX1cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudFwiIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4OyA7IGZvbnQtd2VpZ2h0OiA0MDA7XCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50ID8gJzEycHgnIDogJyd9XCI+XHJcbiAgICAgICAgICB7e2FwcENvbmZpZy5hcHBOYW1lfX1cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudCAmJiB0ZW5hbnROYW1lXCIgc3R5bGU9XCJmb250LXNpemU6IDEycHg7IG1hcmdpbi1ib3R0b206IDVweDtcIj5cclxuICAgICAgICAgIHt7dGVuYW50TmFtZX19XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIiBkYXRhLXRhcmdldD1cIi5uYXZiYXItY29sbGFwc2VcIiBhcmlhLWxhYmVsPVwiVG9nZ2xlIG5hdmlnYXRpb25cIiBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzRXhwYW5kZWRcIiAoY2xpY2spPVwidG9nZ2xlKClcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyLWljb25cIj48L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIm15Um9sZVwiIGNsYXNzPVwiIG5hdmJhci1jb2xsYXBzZSBjb2xsYXBzZSBkLXNtLWlubGluZS1mbGV4IGZsZXgtc20tcm93LXJldmVyc2Ugc3RhY2stdG9wXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDBweDtcIiBbbmdDbGFzc109XCJ7IHNob3c6IGlzRXhwYW5kZWQsIG5hdml0ZW1zOiBpc0V4cGFuZGVkIH1cIiA+XHJcblxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJsb2dvZmYoKVwiID4gPG1hdC1pY29uPmxvZ291dDwvbWF0LWljb24+IDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50XCI+XHJcblxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlZGlyZWN0VG8oJ2hvbWUvYWRtaW4vdGVuYW50LXNldHRpbmdzJylcIiA+IDxtYXQtaWNvbiBmb250U2V0PVwibWF0ZXJpYWwtaWNvbnMtcm91bmRcIj5hcGFydG1lbnQ8L21hdC1pY29uPiA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVkaXJlY3RUbygnaG9tZS9hZG1pbi9idWcnKVwiPiA8bWF0LWljb24gPnN1cHBvcnRfYWdlbnQ8L21hdC1pY29uPiA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8IS0tIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZWRpcmVjdFRvKCdob21lL2FkbWluL3RlbmFudHMnKVwiPiA8bWF0LWljb24gZm9udFNldD1cIm1hdGVyaWFsLWljb25zLXJvdW5kXCI+YXBhcnRtZW50PC9tYXQtaWNvbj4gPC9idXR0b24+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiBpZD1cImJ0blVzZXJcIiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJwcm9maWxlTWVudVwiICA+PG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOiAyNHB4O1wiPmFjY291bnRfY2lyY2xlPC9tYXQtaWNvbj4gICZuYnNwO3t7bG9nZ2VkVXNlckZ1bGxOYW1lfX08L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPG1hdC1tZW51ICNwcm9maWxlTWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICAgIDxidXR0b24gaWQ9XCJidG5Qcm9maWxlXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVkaXJlY3RUbygnaG9tZS91c2VyL3Byb2ZpbGUnKVwiID5Qcm9maWxlPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYnRuTG9nT2ZmXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwibG9nb2ZmKClcIj5Mb2cgT2ZmPC9idXR0b24+XHJcbiAgICAgICAgPC9tYXQtbWVudT5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhcHBDb25maWcuY2FwSXRlbXNcIj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1lbnUgSXRlbSAtLT5cclxuICAgICAgICAgIDxidXR0b24gaWQ9XCJidG5NZW51XCIgKm5nSWY9XCJteVJvbGVbaXRlbS5uYW1lXSAmJiAhaXRlbS5jYXBTdWJJdGVtcyAmJiBpdGVtLnNob3dNZW51XCIgbWF0LWJ1dHRvbiAoY2xpY2spPVwicmVkaXJlY3RUbyhpdGVtLmxpbmspXCI+e3tpdGVtLmRpc3BsYXl9fTwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDwhLS0gTWVudSBJdGVtIHdpdGggU3ViIGl0ZW1zIGlnbm9yZWQgLS0+XHJcbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYnRuTWVudVwiICpuZ0lmPVwibXlSb2xlW2l0ZW0ubmFtZV0gJiYgaXRlbS5jYXBTdWJJdGVtcyAmJiBpdGVtLnNob3dNZW51ICYmIGl0ZW0uaWdub3JlU3Vic0Rpc3BsYXlcIiBtYXQtYnV0dG9uIChjbGljayk9XCJyZWRpcmVjdFRvKGl0ZW0ubGluaylcIj57e2l0ZW0uZGlzcGxheX19PC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPCEtLSBNZW51IEl0ZW0gd2l0aCBTdWIgaXRlbXMgdG8gZGlzcGxheS0tPlxyXG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImJ0bk1lbnVcIiAqbmdJZj1cIm15Um9sZVtpdGVtLm5hbWVdICYmIGl0ZW0uY2FwU3ViSXRlbXMgJiYgaXRlbS5zaG93TWVudSAmJiAhaXRlbS5pZ25vcmVTdWJzRGlzcGxheVwiIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImFkbWluTWVudVwiPnt7aXRlbS5kaXNwbGF5fX08L2J1dHRvbj5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSBTdWIgTWVudSBJdGVtcyAtLT5cclxuICAgICAgICAgIDxtYXQtbWVudSAjYWRtaW5NZW51PVwibWF0TWVudVwiPlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3ViSXRlbSBvZiBpdGVtLmNhcFN1Ykl0ZW1zXCI+XHJcblxyXG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJteVJvbGVbc3ViSXRlbS5uYW1lXSAmJiBzdWJJdGVtLnNob3dNZW51XCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVkaXJlY3RUbyhzdWJJdGVtLmxpbmspXCI+e3tzdWJJdGVtLmRpc3BsYXl9fTwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9tYXQtbWVudT5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvbmF2PlxyXG5cclxuPC9oZWFkZXI+XHJcblxyXG48ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkIHRpbi1iZy1pbWFnZVwiICpuZ0lmPVwiZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm5hdmlnYXRpb24gPT0gJ3RvcCdcIj5cclxuICA8cm91dGVyLW91dGxldD48L3JvdXRlci1vdXRsZXQ+XHJcbiAgPHNwYS1sb2FkZXIgW2xvZ29dPVwidGhpcy5kYXRhU2VydmljZS5hcHBDb25maWcubG9nb1wiPjwvc3BhLWxvYWRlcj5cclxuPC9kaXY+XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbjwhLS0gU0lERSAtLT5cclxuPG1hdC10b29sYmFyIGNsYXNzPVwidGluLWJnLWltYWdlLXRvb2xiYXJcIiAqbmdJZj1cImxvZ2dlZGluICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZpZ2F0aW9uID09ICdzaWRlJ1wiIHN0eWxlPVwicGFkZGluZzogMHB4IDhweDtcIj5cclxuXHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInRvZ2dsZSgpXCIgbWF0VG9vbHRpcD1cIk1lbnVcIj5cclxuICAgIDxtYXQtaWNvbj5tZW51PC9tYXQtaWNvbj5cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPGltZyBbc3JjXT1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5sb2dvXCIgc3R5bGU9XCJoZWlnaHQ6IDUwcHg7XCIgLz5cclxuXHJcbiAgPGRpdiBzdHlsZT1cInBhZGRpbmctbGVmdDogMTBweDsgXCI+XHJcblxyXG4gICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMjBweDsgaGVpZ2h0OiAyNXB4OyBmb250LXdlaWdodDogNDAwO1wiIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudCA/ICcxMnB4JyA6ICcnfVwiPlxyXG4gICAgICB7e2FwcENvbmZpZy5hcHBOYW1lfX1cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJkYXRhU2VydmljZS5hcHBDb25maWcubXVsdGl0ZW5hbnQgJiYgdGVuYW50TmFtZVwiIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBtYXJnaW4tYm90dG9tOiA1cHg7XCI+XHJcbiAgICAgIHt7dGVuYW50TmFtZX19XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG5cclxuXHJcbiAgPHNwYW4gY2xhc3M9XCJ0b29sYmFyLWl0ZW0tc3BhY2VyXCI+PC9zcGFuPlxyXG5cclxuICA8IS0tIGJ1dHRvbnMgLS0+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJkYXRhU2VydmljZS5hcHBDb25maWcubXVsdGl0ZW5hbnRcIj5cclxuXHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVkaXJlY3RUbygnaG9tZS9hZG1pbi90ZW5hbnQtc2V0dGluZ3MnKVwiID4gPG1hdC1pY29uIGZvbnRTZXQ9XCJtYXRlcmlhbC1pY29ucy1yb3VuZFwiPmFwYXJ0bWVudDwvbWF0LWljb24+IDwvYnV0dG9uPlxyXG5cclxuICAgIDxidXR0b24gKm5nSWY9XCIhc21hbGxTY3JlZW5cIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlZGlyZWN0VG8oJ2hvbWUvYWRtaW4vYnVnJylcIj4gPG1hdC1pY29uID5oZWxwPC9tYXQtaWNvbj4gPC9idXR0b24+XHJcblxyXG4gIDwvZGl2PlxyXG5cclxuICA8YnV0dG9uICpuZ0lmPVwiIXNtYWxsU2NyZWVuXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJOb3RpZmljYXRpb25zXCI+PG1hdC1pY29uPm5vdGlmaWNhdGlvbnM8L21hdC1pY29uPjwvYnV0dG9uPlxyXG5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiTXkgQWNjb3VudFwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJ1c2VyQWNjb3VudE1lbnVcIj48bWF0LWljb24+YWNjb3VudF9jaXJjbGU8L21hdC1pY29uPjwvYnV0dG9uPlxyXG5cclxuICA8YnV0dG9uICpuZ0lmPVwiIXNtYWxsU2NyZWVuXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJsb2dvZmYoKVwiPiA8bWF0LWljb24+bG9nb3V0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuXHJcblxyXG4gIDwhLS0gbXkgYWNjb3VudCBtZW51IC0tPlxyXG4gIDxtYXQtbWVudSAjdXNlckFjY291bnRNZW51IFtvdmVybGFwVHJpZ2dlcl09XCJmYWxzZVwiIHlQb3NpdGlvbj1cImJlbG93XCI+XHJcblxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIHJvdXRlckxpbms9XCJob21lL3VzZXIvcHJvZmlsZVwiPlxyXG4gICAgICA8bWF0LWljb24+cGVyc29uPC9tYXQtaWNvbj48c3Bhbj5Qcm9maWxlPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICByb3V0ZXJMaW5rPVwiaG9tZS9hZG1pbi9idWdcIiAqbmdJZj1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudCAmJiBzbWFsbFNjcmVlblwiPlxyXG4gICAgICA8bWF0LWljb24+aGVscDwvbWF0LWljb24+IDxzcGFuPkhlbHA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cclxuXHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImxvZ29mZigpXCI+XHJcbiAgICAgIDxtYXQtaWNvbj5sb2dvdXQ8L21hdC1pY29uPkxvZ291dFxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gIDwvbWF0LW1lbnU+XHJcblxyXG48L21hdC10b29sYmFyPlxyXG5cclxuXHJcblxyXG5cclxuPG1hdC1zaWRlbmF2LWNvbnRhaW5lciBjbGFzcz1cImFwcC1jb250YWluZXJcIiBbaGFzQmFja2Ryb3BdPVwic21hbGxTY3JlZW5cIiAqbmdJZj1cImxvZ2dlZGluICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZpZ2F0aW9uID09ICdzaWRlJ1wiPlxyXG5cclxuICA8bWF0LXNpZGVuYXYgI3NpZGVuYXYgW21vZGVdPVwic21hbGxTY3JlZW4gPyAnb3ZlcicgOiAnb3ZlcidcIiBbY2xhc3MubWF0LWVsZXZhdGlvbi16NF09XCJ0cnVlXCIgW29wZW5lZF09XCJpc0V4cGFuZGVkXCIgIGNsYXNzPVwiYXBwLXNpZGVuYXYgc2lkZS1jb2xvclwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlO1wiPlxyXG4gICAgPG1hdC1uYXYtbGlzdCA+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjYXAgb2YgZGF0YVNlcnZpY2UuYXBwQ29uZmlnLmNhcEl0ZW1zXCIgPlxyXG5cclxuICAgICAgICA8IS0tIE1lbnUgaXRlbSAtLT5cclxuICAgICAgICA8bWF0LWxpc3QtaXRlbSBbcm91dGVyTGlua109XCJjYXAubGlua1wiICAqbmdJZj1cIm15Um9sZVtjYXAubmFtZV0gJiYgY2FwLnNob3dNZW51ICYmICghY2FwLmNhcFN1Ykl0ZW1zIHx8IGNhcC5jYXBTdWJJdGVtcyAmJiBjYXAuaWdub3JlU3Vic0Rpc3BsYXkpXCIgc3R5bGU9XCJoZWlnaHQ6IDQwcHg7Zm9udC1zaXplOiAxNXB4O1wiIChjbGljayk9XCJ0b2dnbGUoKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA1cHg7XCI+e3tjYXAuaWNvbn19PC9tYXQtaWNvbj57e2NhcC5kaXNwbGF5fX1cclxuICAgICAgICA8L21hdC1saXN0LWl0ZW0+XHJcblxyXG4gICAgICAgIDwhLS0gTWVudSBXaXRoIFN1YiBpdGVtcyAtLT5cclxuICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBjbGFzcz1cInNpZGUtY29sb3JcIiBbY2xhc3MubWF0LWVsZXZhdGlvbi16MF09XCJ0cnVlXCIgICpuZ0lmPVwibXlSb2xlW2NhcC5uYW1lXSAmJiBjYXAuc2hvd01lbnUgJiYgY2FwLmNhcFN1Ykl0ZW1zICYmICFjYXAuaWdub3JlU3Vic0Rpc3BsYXlcIj5cclxuXHJcbiAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIgc3R5bGU9XCJoZWlnaHQ6IDQwcHg7cGFkZGluZy1sZWZ0OiAxNXB4O1wiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDVweDtcIj57e2NhcC5pY29uICE9ICduYXZpZ2F0ZV9uZXh0JyA/IGNhcC5pY29uIDogJ2ZpYmVyX21hbnVhbF9yZWNvcmQnIH19PC9tYXQtaWNvbj57e2NhcC5kaXNwbGF5fX1cclxuICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcblxyXG4gICAgICAgICAgPCEtLSBTdWIgaXRlbXMgLS0+XHJcbiAgICAgICAgICA8bWF0LW5hdi1saXN0ICpuZ0Zvcj1cImxldCBjYXBTdWIgb2YgY2FwLmNhcFN1Ykl0ZW1zXCI+XHJcblxyXG4gICAgICAgICAgICA8bWF0LWxpc3QtaXRlbSBbcm91dGVyTGlua109XCJjYXBTdWIubGlua1wiIHN0eWxlPVwiaGVpZ2h0OiAzMHB4OyBmb250LXNpemU6IDE1cHg7XCIgKGNsaWNrKT1cInRvZ2dsZSgpXCIgKm5nSWY9XCJteVJvbGVbY2FwLm5hbWVdICYmIGNhcC5zaG93TWVudVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cIm1hcmdpbi1yaWdodDogNXB4O1wiPnt7Y2FwU3ViLmljb259fTwvbWF0LWljb24+e3tjYXBTdWIuZGlzcGxheX19XHJcbiAgICAgICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cclxuXHJcbiAgICAgICAgICA8L21hdC1uYXYtbGlzdD5cclxuXHJcbiAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPC9tYXQtbmF2LWxpc3Q+XHJcbiAgPC9tYXQtc2lkZW5hdj5cclxuXHJcblxyXG5cclxuICA8bWF0LXNpZGVuYXYtY29udGVudCBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCB0aW4tYmctaW1hZ2VcIiAqbmdJZj1cImxvZ2dlZGluICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZpZ2F0aW9uID09ICdzaWRlJ1wiPlxyXG4gICAgPGhyIHN0eWxlPVwibWFyZ2luLXRvcDogMHB4O1wiPlxyXG4gICAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxyXG4gICAgPHNwYS1sb2FkZXIgW2xvZ29dPVwidGhpcy5kYXRhU2VydmljZS5hcHBDb25maWcubG9nb1wiPjwvc3BhLWxvYWRlcj5cclxuICA8L21hdC1zaWRlbmF2LWNvbnRlbnQ+XHJcblxyXG48L21hdC1zaWRlbmF2LWNvbnRhaW5lcj5cclxuXHJcblxyXG48IS0tIGZvb3RlciAtLT5cclxuPGRpdiBjbGFzcz1cInRpbi1jZW50ZXJcIiAqbmdJZj1cImxvZ2dlZGluICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZpZ2F0aW9uID09ICdzaWRlJ1wiPlxyXG4gIDxsYWJlbCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxMnB4O1wiPiZjb3B5OyB7e25vd0RhdGUgfCBkYXRlIDogJ3l5eXknfX0ge3tmb290ZXJ9fTwvbGFiZWw+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgdGluLWJnLWltYWdlXCIgKm5nSWY9XCIhbG9nZ2VkaW4gJiYgZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm5hdmlnYXRpb24gPT0gJ3NpZGUnXCI+XHJcbiAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxyXG4gIDxzcGEtbG9hZGVyIFtsb2dvXT1cInRoaXMuZGF0YVNlcnZpY2UuYXBwQ29uZmlnLmxvZ29cIj48L3NwYS1sb2FkZXI+XHJcbjwvZGl2PlxyXG4iXX0=
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbmF2LW1lbnUvbmF2LW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbmF2LW1lbnUvbmF2LW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsR0FBWSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlekQsTUFBTSxPQUFPLGdCQUFnQjtJQUUzQixZQUFtQixNQUFjLEVBQVMsV0FBd0IsRUFBVSxjQUE4QixFQUFVLG9CQUEwQyxFQUNwSixhQUFnQyxFQUFVLGtCQUFzQyxFQUFTLFdBQTJCO1FBRDNHLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBUyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFVLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDcEosa0JBQWEsR0FBYixhQUFhLENBQW1CO1FBQVUsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUFTLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQTBCOUgsdUJBQWtCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDO1FBTWxFLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFbkIsWUFBTyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFHWCxjQUFTLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUM1QixXQUFNLEdBQVcsa0JBQWtCLENBQUM7UUFyQzNDLDZCQUE2QjtRQUM3QixJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQXVCLEVBQUUsRUFBRTtZQUU1RixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO2FBQ3hCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO2FBQ3pCO1FBRUgsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUYsUUFBUTtRQUVOLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxDQUFBO1FBQ3JGLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQTtRQUNyRSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUE7UUFFekUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDeEI7SUFFSCxDQUFDO0lBa0JELFFBQVE7UUFDTixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBWTtRQUVyQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEIsSUFBSSxJQUFJLElBQUUsRUFBRSxFQUFDO1lBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQzlCO0lBRUgsQ0FBQztJQUdELFdBQVcsQ0FBQyxPQUFpQjtRQUMzQixPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUUsQ0FBQztJQUNuRSxDQUFDOzs2R0ExRVUsZ0JBQWdCO2lHQUFoQixnQkFBZ0IsMEdDaEI3Qix5M1VBc1BBOzJGRHRPYSxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsY0FBYztxUkE0Q2YsU0FBUztzQkFBakIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBDb25maWcsIENhcEl0ZW0sIH0gZnJvbSAnLi8uLi8uLi9jbGFzc2VzL0NsYXNzZXMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgIEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTb2NpYWxBdXRoU2VydmljZSB9IGZyb20gJ0BhYmFjcml0dC9hbmd1bGFyeC1zb2NpYWwtbG9naW4nO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZUxpYiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGFsaWIuc2VydmljZSc7XHJcbmltcG9ydCB7IEJyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludFN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9ucy5zZXJ2aWNlJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NwYS1uYXYtbWVudScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25hdi1tZW51LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9uYXYtbWVudS5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE5hdk1lbnVDb21wb25lbnQge1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcm91dGVyOiBSb3V0ZXIsIHB1YmxpYyBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLCBwcml2YXRlIG5vdGlmaWNhdGlvbnNTZXJ2aWNlOiBOb3RpZmljYXRpb25zU2VydmljZSxcclxuICAgIHByaXZhdGUgc29jaWFsU2VydmljZTogU29jaWFsQXV0aFNlcnZpY2UsIHByaXZhdGUgYnJlYWtwb2ludE9ic2VydmVyOiBCcmVha3BvaW50T2JzZXJ2ZXIsIHB1YmxpYyBkYXRhU2VydmljZTogRGF0YVNlcnZpY2VMaWIsKSB7XHJcbiAgICAvLyBkZXRlY3Qgc2NyZWVuIHNpemUgY2hhbmdlc1xyXG4gICAgdGhpcy5icmVha3BvaW50T2JzZXJ2ZXIub2JzZXJ2ZShbXCIobWF4LXdpZHRoOiA2MDBweClcIl0pLnN1YnNjcmliZSgocmVzdWx0OiBCcmVha3BvaW50U3RhdGUpID0+IHtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQubWF0Y2hlcykge1xyXG4gICAgICAgIHRoaXMuc21hbGxTY3JlZW4gPSB0cnVlXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zbWFsbFNjcmVlbiA9IGZhbHNlXHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmxvZ2dlZFVzZXJGdWxsTmFtZS5zdWJzY3JpYmUodXNlciA9PiB0aGlzLmxvZ2dlZFVzZXJGdWxsTmFtZSA9IHVzZXIpXHJcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLm15Um9sZU9ic2Vydi5zdWJzY3JpYmUocm9sID0+IHRoaXMubXlSb2xlID0gcm9sKTtcclxuICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nZ2VkaW5PYnNlcnYuc3Vic2NyaWJlKG9iaiA9PiB0aGlzLmxvZ2dlZGluID0gb2JqKVxyXG4gICAgdGhpcy5hdXRoU2VydmljZS50ZW5hbnROYW1lT2JzZXJ2LnN1YnNjcmliZShvYmogPT4gdGhpcy50ZW5hbnROYW1lID0gb2JqKVxyXG5cclxuICAgIGlmICghdGhpcy5zbWFsbFNjcmVlbikge1xyXG4gICAgICB0aGlzLmlzRXhwYW5kZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIG5vdGlmaWNhdGlvbkNvdW50JCA9IHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2Uubm90aWZpY2F0aW9uQ291bnQkO1xyXG4gIHNtYWxsU2NyZWVuXHJcbiAgbXlSb2xlO1xyXG4gIGxvZ2dlZFVzZXJGdWxsTmFtZTogc3RyaW5nO1xyXG4gIHRlbmFudE5hbWUgOiBzdHJpbmc7XHJcbiAgbG9nZ2VkaW46IGJvb2xlYW47XHJcbiAgaXNFeHBhbmRlZCA9IGZhbHNlO1xyXG5cclxuICBub3dEYXRlID0gbmV3IERhdGUoKVxyXG5cclxuXHJcbiAgQElucHV0KCkgYXBwQ29uZmlnID0gbmV3IEFwcENvbmZpZygpO1xyXG4gIEBJbnB1dCgpIGZvb3Rlcjogc3RyaW5nID0gJ2Fsc3F1YXJldGVjaC5uZXQnO1xyXG5cclxuXHJcblxyXG4gIGNvbGxhcHNlKCkge1xyXG4gICAgdGhpcy5pc0V4cGFuZGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGUoKSB7XHJcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSAhdGhpcy5pc0V4cGFuZGVkO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VTaWRlKCkge1xyXG4gICAgdGhpcy5pc0V4cGFuZGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBsb2dvZmYoKSB7XHJcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmxvZ29mZigpO1xyXG4gIH1cclxuXHJcbiAgcmVkaXJlY3RUbyhsaW5rOiBzdHJpbmcpe1xyXG5cclxuICAgIHRoaXMuY29sbGFwc2UoKTtcclxuXHJcbiAgICBpZiAobGluayE9XCJcIil7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtsaW5rXSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGdldFN1Ykl0ZW1zKGNhcEl0ZW0gOiBDYXBJdGVtKSA6IENhcEl0ZW1bXSB7XHJcbiAgICByZXR1cm4gY2FwSXRlbS5jYXBTdWJJdGVtcy5maWx0ZXIoeCA9PiB4LnNob3dNZW51ICYmICF4LmlzQm9vbCApO1xyXG4gIH1cclxuXHJcblxyXG5cclxufVxyXG4iLCI8aGVhZGVyICpuZ0lmPVwibG9nZ2VkaW4gJiYgZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm5hdmlnYXRpb24gPT0gJ3RvcCdcIj5cclxuXHJcbiAgPG5hdiBjbGFzcz1cInRvb2xiYXIgbmF2YmFyIG5hdmJhci1leHBhbmQtc20gbmF2YmFyLXRvZ2dsZWFibGUtc20gbmF2YmFyLWxpZ2h0ICBib3JkZXItYm90dG9tIGJveC1zaGFkb3cgbWItMyBcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCI+XHJcblxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDBweDtcIj5cclxuXHJcbiAgICAgIDxpbWcgKm5nSWY9XCJhcHBDb25maWcubG9nbyE9JydcIiBbc3JjXT1cImFwcENvbmZpZy5sb2dvXCIgc3R5bGU9XCJoZWlnaHQ6IDUwcHg7IG1hcmdpbi1yaWdodDogMmVtXCIgLz5cclxuXHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMjBweDtcIj5cclxuICAgICAgICAgICAgICB7e2FwcENvbmZpZy5hcHBOYW1lfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50ICYmIHRlbmFudE5hbWVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtcIj5cclxuICAgICAgICAgICAgICB7e3RlbmFudE5hbWV9fVxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50XCIgc3R5bGU9XCJmb250LXNpemU6IDIycHg7XCI+XHJcbiAgICAgICAgICB7e2FwcENvbmZpZy5hcHBOYW1lfX1cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudFwiIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4OyA7IGZvbnQtd2VpZ2h0OiA0MDA7XCIgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzogZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50ID8gJzEycHgnIDogJyd9XCI+XHJcbiAgICAgICAgICB7e2FwcENvbmZpZy5hcHBOYW1lfX1cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudCAmJiB0ZW5hbnROYW1lXCIgc3R5bGU9XCJmb250LXNpemU6IDEycHg7IG1hcmdpbi1ib3R0b206IDVweDtcIj5cclxuICAgICAgICAgIHt7dGVuYW50TmFtZX19XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIiBkYXRhLXRhcmdldD1cIi5uYXZiYXItY29sbGFwc2VcIiBhcmlhLWxhYmVsPVwiVG9nZ2xlIG5hdmlnYXRpb25cIiBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzRXhwYW5kZWRcIiAoY2xpY2spPVwidG9nZ2xlKClcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyLWljb25cIj48L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIm15Um9sZVwiIGNsYXNzPVwiIG5hdmJhci1jb2xsYXBzZSBjb2xsYXBzZSBkLXNtLWlubGluZS1mbGV4IGZsZXgtc20tcm93LXJldmVyc2Ugc3RhY2stdG9wXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDBweDtcIiBbbmdDbGFzc109XCJ7IHNob3c6IGlzRXhwYW5kZWQsIG5hdml0ZW1zOiBpc0V4cGFuZGVkIH1cIiA+XHJcblxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJsb2dvZmYoKVwiID4gPG1hdC1pY29uPmxvZ291dDwvbWF0LWljb24+IDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50XCI+XHJcblxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlZGlyZWN0VG8oJ2hvbWUvYWRtaW4vdGVuYW50LXNldHRpbmdzJylcIiA+IDxtYXQtaWNvbiBmb250U2V0PVwibWF0ZXJpYWwtaWNvbnMtcm91bmRcIj5hcGFydG1lbnQ8L21hdC1pY29uPiA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVkaXJlY3RUbygnaG9tZS9hZG1pbi9idWcnKVwiPiA8bWF0LWljb24gPnN1cHBvcnRfYWdlbnQ8L21hdC1pY29uPiA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8IS0tIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZWRpcmVjdFRvKCdob21lL2FkbWluL25vdGlmaWNhdGlvbnMnKVwiPiA8bWF0LWljb24gZm9udFNldD1cIm1hdGVyaWFsLWljb25zLXJvdW5kXCI+YXBhcnRtZW50PC9tYXQtaWNvbj4gPC9idXR0b24+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiBpZD1cImJ0blVzZXJcIiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJwcm9maWxlTWVudVwiICA+PG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOiAyNHB4O1wiPmFjY291bnRfY2lyY2xlPC9tYXQtaWNvbj4gICZuYnNwO3t7bG9nZ2VkVXNlckZ1bGxOYW1lfX08L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPG1hdC1tZW51ICNwcm9maWxlTWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICAgIDxidXR0b24gaWQ9XCJidG5Qcm9maWxlXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVkaXJlY3RUbygnaG9tZS91c2VyL3Byb2ZpbGUnKVwiID5Qcm9maWxlPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYnRuTG9nT2ZmXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwibG9nb2ZmKClcIj5Mb2cgT2ZmPC9idXR0b24+XHJcbiAgICAgICAgPC9tYXQtbWVudT5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhcHBDb25maWcuY2FwSXRlbXNcIj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1lbnUgSXRlbSAtLT5cclxuICAgICAgICAgIDxidXR0b24gaWQ9XCJidG5NZW51XCIgKm5nSWY9XCJteVJvbGVbaXRlbS5uYW1lXSAmJiAhaXRlbS5jYXBTdWJJdGVtcyAmJiBpdGVtLnNob3dNZW51XCIgbWF0LWJ1dHRvbiAoY2xpY2spPVwicmVkaXJlY3RUbyhpdGVtLmxpbmspXCI+e3tpdGVtLmRpc3BsYXl9fTwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDwhLS0gTWVudSBJdGVtIHdpdGggU3ViIGl0ZW1zIGlnbm9yZWQgLS0+XHJcbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYnRuTWVudVwiICpuZ0lmPVwibXlSb2xlW2l0ZW0ubmFtZV0gJiYgaXRlbS5jYXBTdWJJdGVtcyAmJiBpdGVtLnNob3dNZW51ICYmIGl0ZW0uaWdub3JlU3Vic0Rpc3BsYXlcIiBtYXQtYnV0dG9uIChjbGljayk9XCJyZWRpcmVjdFRvKGl0ZW0ubGluaylcIj57e2l0ZW0uZGlzcGxheX19PC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPCEtLSBNZW51IEl0ZW0gd2l0aCBTdWIgaXRlbXMgdG8gZGlzcGxheS0tPlxyXG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImJ0bk1lbnVcIiAqbmdJZj1cIm15Um9sZVtpdGVtLm5hbWVdICYmIGl0ZW0uY2FwU3ViSXRlbXMgJiYgaXRlbS5zaG93TWVudSAmJiAhaXRlbS5pZ25vcmVTdWJzRGlzcGxheVwiIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImFkbWluTWVudVwiPnt7aXRlbS5kaXNwbGF5fX08L2J1dHRvbj5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSBTdWIgTWVudSBJdGVtcyAtLT5cclxuICAgICAgICAgIDxtYXQtbWVudSAjYWRtaW5NZW51PVwibWF0TWVudVwiPlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3ViSXRlbSBvZiBpdGVtLmNhcFN1Ykl0ZW1zXCI+XHJcblxyXG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJteVJvbGVbc3ViSXRlbS5uYW1lXSAmJiBzdWJJdGVtLnNob3dNZW51XCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVkaXJlY3RUbyhzdWJJdGVtLmxpbmspXCI+e3tzdWJJdGVtLmRpc3BsYXl9fTwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9tYXQtbWVudT5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvbmF2PlxyXG5cclxuPC9oZWFkZXI+XHJcblxyXG48ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkIHRpbi1iZy1pbWFnZVwiICpuZ0lmPVwiZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm5hdmlnYXRpb24gPT0gJ3RvcCdcIj5cclxuICA8cm91dGVyLW91dGxldD48L3JvdXRlci1vdXRsZXQ+XHJcbiAgPHNwYS1sb2FkZXIgW2xvZ29dPVwidGhpcy5kYXRhU2VydmljZS5hcHBDb25maWcubG9nb1wiPjwvc3BhLWxvYWRlcj5cclxuPC9kaXY+XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbjwhLS0gU0lERSAtLT5cclxuPG1hdC10b29sYmFyIGNsYXNzPVwidGluLWJnLWltYWdlLXRvb2xiYXJcIiAqbmdJZj1cImxvZ2dlZGluICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZpZ2F0aW9uID09ICdzaWRlJ1wiIHN0eWxlPVwicGFkZGluZzogMHB4IDhweDtcIj5cclxuXHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInRvZ2dsZSgpXCIgbWF0VG9vbHRpcD1cIk1lbnVcIj5cclxuICAgIDxtYXQtaWNvbj5tZW51PC9tYXQtaWNvbj5cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPGltZyBbc3JjXT1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5sb2dvXCIgc3R5bGU9XCJoZWlnaHQ6IDUwcHg7XCIgLz5cclxuXHJcbiAgPGRpdiBzdHlsZT1cInBhZGRpbmctbGVmdDogMTBweDsgXCI+XHJcblxyXG4gICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMjJweDsgZm9udC13ZWlnaHQ6IDQwMDtcIj5cclxuICAgICAge3thcHBDb25maWcuYXBwTmFtZX19XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDIwcHg7IGhlaWdodDogMjVweDsgZm9udC13ZWlnaHQ6IDQwMDtcIiBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBkYXRhU2VydmljZS5hcHBDb25maWcubXVsdGl0ZW5hbnQgPyAnMTJweCcgOiAnJ31cIj5cclxuICAgICAge3thcHBDb25maWcuYXBwTmFtZX19XHJcbiAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgPCEtLSA8ZGl2ICpuZ0lmPVwiZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm11bHRpdGVuYW50ICYmIHRlbmFudE5hbWVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDsgbWFyZ2luLWJvdHRvbTogNXB4O1wiPlxyXG4gICAgICB7e3RlbmFudE5hbWV9fVxyXG4gICAgPC9kaXY+IC0tPlxyXG5cclxuICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICA8c3BhbiBjbGFzcz1cInRvb2xiYXItaXRlbS1zcGFjZXJcIj48L3NwYW4+XHJcblxyXG4gIDwhLS0gYnV0dG9ucyAtLT5cclxuXHJcbiAgPGRpdiAqbmdJZj1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudFwiPlxyXG5cclxuICAgIDwhLS0gPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOiAxNHB4O1wiPkhpLCB7e2xvZ2dlZFVzZXJGdWxsTmFtZX19PC9sYWJlbD4gLS0+XHJcblxyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlZGlyZWN0VG8oJ2hvbWUvYWRtaW4vdGVuYW50LXNldHRpbmdzJylcIiBtYXRUb29sdGlwPVwiT3JnYW5pc2F0aW9uIFNldHRpbmdzXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBmb250U2V0PVwibWF0ZXJpYWwtaWNvbnMtcm91bmRcIj5hcGFydG1lbnQ8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6IDE0cHg7bWFyZ2luLXJpZ2h0OiAyMHB4O1wiPnt7dGVuYW50TmFtZX19PC9sYWJlbD5cclxuXHJcbiAgICA8YnV0dG9uICpuZ0lmPVwiIXNtYWxsU2NyZWVuXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZWRpcmVjdFRvKCdob21lL2FkbWluL2J1ZycpXCIgIG1hdFRvb2x0aXA9XCJTdXBwb3J0XCI+XHJcbiAgICAgIDxtYXQtaWNvbiA+aGVscDwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8YnV0dG9uICpuZ0lmPVwiIXNtYWxsU2NyZWVuXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZWRpcmVjdFRvKCdob21lL2FkbWluL25vdGlmaWNhdGlvbnMnKVwiIG1hdFRvb2x0aXA9XCJOb3RpZmljYXRpb25zXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBbbWF0QmFkZ2VdPVwibm90aWZpY2F0aW9uQ291bnQkIHwgYXN5bmNcIiBbbWF0QmFkZ2VIaWRkZW5dPVwiKG5vdGlmaWNhdGlvbkNvdW50JCB8IGFzeW5jKSA9PT0gMFwiIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCIgbWF0QmFkZ2VTaXplPVwic21hbGxcIj5ub3RpZmljYXRpb25zPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiTXkgQWNjb3VudFwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJ1c2VyQWNjb3VudE1lbnVcIj48bWF0LWljb24+YWNjb3VudF9jaXJjbGU8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDtcIj57e2xvZ2dlZFVzZXJGdWxsTmFtZX19PC9sYWJlbD5cclxuXHJcbiAgPGJ1dHRvbiAqbmdJZj1cIiFzbWFsbFNjcmVlblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwibG9nb2ZmKClcIiAgbWF0VG9vbHRpcD1cIlNpZ25vdXRcIj5cclxuICAgIDxtYXQtaWNvbj5sb2dvdXQ8L21hdC1pY29uPlxyXG4gIDwvYnV0dG9uPlxyXG5cclxuXHJcbiAgPCEtLSBteSBhY2NvdW50IG1lbnUgLS0+XHJcbiAgPG1hdC1tZW51ICN1c2VyQWNjb3VudE1lbnUgW292ZXJsYXBUcmlnZ2VyXT1cImZhbHNlXCIgeVBvc2l0aW9uPVwiYmVsb3dcIj5cclxuXHJcblxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIHJvdXRlckxpbms9XCJob21lL3VzZXIvcHJvZmlsZVwiPlxyXG4gICAgICA8bWF0LWljb24+cGVyc29uPC9tYXQtaWNvbj48c3Bhbj5Qcm9maWxlPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICByb3V0ZXJMaW5rPVwiaG9tZS9hZG1pbi9idWdcIiAqbmdJZj1cImRhdGFTZXJ2aWNlLmFwcENvbmZpZy5tdWx0aXRlbmFudCAmJiBzbWFsbFNjcmVlblwiPlxyXG4gICAgICA8bWF0LWljb24+aGVscDwvbWF0LWljb24+IDxzcGFuPkhlbHA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cclxuXHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImxvZ29mZigpXCI+XHJcbiAgICAgIDxtYXQtaWNvbj5sb2dvdXQ8L21hdC1pY29uPkxvZ291dFxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gIDwvbWF0LW1lbnU+XHJcblxyXG48L21hdC10b29sYmFyPlxyXG5cclxuXHJcblxyXG5cclxuPG1hdC1zaWRlbmF2LWNvbnRhaW5lciBjbGFzcz1cImFwcC1jb250YWluZXJcIiBbaGFzQmFja2Ryb3BdPVwic21hbGxTY3JlZW5cIiAqbmdJZj1cImxvZ2dlZGluICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZpZ2F0aW9uID09ICdzaWRlJ1wiPlxyXG5cclxuICA8bWF0LXNpZGVuYXYgI3NpZGVuYXYgW21vZGVdPVwic21hbGxTY3JlZW4gPyAnb3ZlcicgOiAnc2lkZSdcIiBbY2xhc3MubWF0LWVsZXZhdGlvbi16NF09XCJ0cnVlXCIgW29wZW5lZF09XCJpc0V4cGFuZGVkXCIgIGNsYXNzPVwiYXBwLXNpZGVuYXYgc2lkZS1jb2xvclwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlO1wiXHJcbiAgW25nU3R5bGVdPVwieyd3aWR0aCc6IGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZXaWR0aH1cIj5cclxuICAgIDxtYXQtbmF2LWxpc3QgPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2FwIG9mIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5jYXBJdGVtc1wiID5cclxuXHJcbiAgICAgICAgPCEtLSBNZW51IGl0ZW0gLS0+XHJcbiAgICAgICAgPG1hdC1saXN0LWl0ZW0gW3JvdXRlckxpbmtdPVwiY2FwLmxpbmtcIiAgKm5nSWY9XCJteVJvbGVbY2FwLm5hbWVdICYmIGNhcC5zaG93TWVudSAmJiAoIWNhcC5jYXBTdWJJdGVtcyB8fCBjYXAuY2FwU3ViSXRlbXMgJiYgY2FwLmlnbm9yZVN1YnNEaXNwbGF5KVwiIHN0eWxlPVwiaGVpZ2h0OiA0MHB4O2ZvbnQtc2l6ZTogMTVweDtcIlxyXG4gICAgICAgIChjbGljayk9XCJzbWFsbFNjcmVlbiA/IHRvZ2dsZSgpIDogbnVsbFwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uIFtuZ1N0eWxlXT1cInsnY29sb3InOiBjYXAuY29sb3J9XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDVweDtcIj57e2NhcC5pY29ufX08L21hdC1pY29uPnt7Y2FwLmRpc3BsYXl9fVxyXG4gICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cclxuXHJcbiAgICAgICAgPCEtLSBNZW51IFdpdGggU3ViIGl0ZW1zIC0tPlxyXG4gICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIGNsYXNzPVwic2lkZS1jb2xvclwiIFtjbGFzcy5tYXQtZWxldmF0aW9uLXowXT1cInRydWVcIiAgKm5nSWY9XCJteVJvbGVbY2FwLm5hbWVdICYmIGNhcC5zaG93TWVudSAmJiBjYXAuY2FwU3ViSXRlbXMgJiYgIWNhcC5pZ25vcmVTdWJzRGlzcGxheVwiPlxyXG5cclxuICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlciBzdHlsZT1cImhlaWdodDogNDBweDtwYWRkaW5nLWxlZnQ6IDE1cHg7XCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbiBbbmdTdHlsZV09XCJ7J2NvbG9yJzogY2FwLmNvbG9yfVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA1cHg7XCI+e3tjYXAuaWNvbiAhPSAnbmF2aWdhdGVfbmV4dCcgPyBjYXAuaWNvbiA6ICdmaWJlcl9tYW51YWxfcmVjb3JkJyB9fTwvbWF0LWljb24+e3tjYXAuZGlzcGxheX19XHJcbiAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG5cclxuICAgICAgICAgIDwhLS0gU3ViIGl0ZW1zIC0tPlxyXG4gICAgICAgICAgPG1hdC1uYXYtbGlzdCAqbmdGb3I9XCJsZXQgY2FwU3ViIG9mIGdldFN1Ykl0ZW1zKGNhcClcIj5cclxuXHJcbiAgICAgICAgICAgIDxtYXQtbGlzdC1pdGVtIFtyb3V0ZXJMaW5rXT1cImNhcFN1Yi5saW5rXCIgc3R5bGU9XCJoZWlnaHQ6IDMwcHg7IGZvbnQtc2l6ZTogMTVweDtcIiAoY2xpY2spPVwic21hbGxTY3JlZW4gPyB0b2dnbGUoKSA6IG51bGxcIiAqbmdJZj1cIm15Um9sZVtjYXBTdWIubmFtZV0gJiYgY2FwU3ViLnNob3dNZW51XCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uIFtuZ1N0eWxlXT1cInsnY29sb3InOiBjYXBTdWIuY29sb3J9XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDVweDtcIj57e2NhcFN1Yi5pY29ufX08L21hdC1pY29uPnt7Y2FwU3ViLmRpc3BsYXl9fVxyXG4gICAgICAgICAgICA8L21hdC1saXN0LWl0ZW0+XHJcblxyXG4gICAgICAgICAgPC9tYXQtbmF2LWxpc3Q+XHJcblxyXG4gICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuXHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwvbWF0LW5hdi1saXN0PlxyXG4gIDwvbWF0LXNpZGVuYXY+XHJcblxyXG5cclxuXHJcbiAgPG1hdC1zaWRlbmF2LWNvbnRlbnQgY2xhc3M9XCJ0aW4tYmctaW1hZ2VcIiBzdHlsZT1cInBhZGRpbmc6IDBweCAxMnB4O1wiICpuZ0lmPVwibG9nZ2VkaW4gJiYgZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm5hdmlnYXRpb24gPT0gJ3NpZGUnXCI+XHJcbiAgICA8aHIgc3R5bGU9XCJtYXJnaW4tdG9wOiAwcHg7XCI+XHJcbiAgICA8cm91dGVyLW91dGxldD48L3JvdXRlci1vdXRsZXQ+XHJcbiAgICA8c3BhLWxvYWRlciBbbG9nb109XCJ0aGlzLmRhdGFTZXJ2aWNlLmFwcENvbmZpZy5sb2dvXCI+PC9zcGEtbG9hZGVyPlxyXG4gIDwvbWF0LXNpZGVuYXYtY29udGVudD5cclxuXHJcbjwvbWF0LXNpZGVuYXYtY29udGFpbmVyPlxyXG5cclxuXHJcbjwhLS0gZm9vdGVyIC0tPlxyXG48ZGl2IGNsYXNzPVwidGluLWNlbnRlclwiICpuZ0lmPVwibG9nZ2VkaW4gJiYgZGF0YVNlcnZpY2UuYXBwQ29uZmlnLm5hdmlnYXRpb24gPT0gJ3NpZGUnXCI+XHJcbiAgPGxhYmVsIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDEycHg7XCI+JmNvcHk7IHt7bm93RGF0ZSB8IGRhdGUgOiAneXl5eSd9fSA8YSBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cInRlcm1zLWxpbmtcIiBbaHJlZl09XCJhcHBDb25maWcuc2l0ZVVybFwiIHRhcmdldD1cIl9ibGFua1wiPnt7Zm9vdGVyfX08L2E+IHwgPGEgY29sb3I9XCJwcmltYXJ5XCIgY2xhc3M9XCJ0ZXJtcy1saW5rXCIgW2hyZWZdPVwiYXBwQ29uZmlnLnByaXZhY3lVcmxcIiB0YXJnZXQ9XCJfYmxhbmtcIj5Qcml2YWN5IFBvbGljeTwvYT4uPC9sYWJlbD5cclxuPC9kaXY+XHJcblxyXG5cclxuPGRpdiBjbGFzcz1cInRpbi1iZy1pbWFnZVwiICpuZ0lmPVwiIWxvZ2dlZGluICYmIGRhdGFTZXJ2aWNlLmFwcENvbmZpZy5uYXZpZ2F0aW9uID09ICdzaWRlJ1wiPlxyXG4gIDxyb3V0ZXItb3V0bGV0Pjwvcm91dGVyLW91dGxldD5cclxuICA8c3BhLWxvYWRlciBbbG9nb109XCJ0aGlzLmRhdGFTZXJ2aWNlLmFwcENvbmZpZy5sb2dvXCI+PC9zcGEtbG9hZGVyPlxyXG48L2Rpdj5cclxuIl19