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
@@ -1,26 +1,34 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
1
+ import { Component, ContentChild, EventEmitter, Input, Output } from '@angular/core';
2
2
  import { Core } from '../../classes/TinCore';
3
+ import { BehaviorSubject } from 'rxjs';
3
4
  import * as i0 from "@angular/core";
4
5
  import * as i1 from "../../services/message.service";
5
6
  import * as i2 from "../../services/datalib.service";
6
- import * as i3 from "@angular/common";
7
- import * as i4 from "@angular/material/button";
8
- import * as i5 from "../text/text.component";
9
- import * as i6 from "../check/check.component";
10
- import * as i7 from "../date/date.component";
11
- import * as i8 from "../label/label.component";
12
- import * as i9 from "../select/select.component";
13
- import * as i10 from "../money/money.component";
14
- import * as i11 from "../attach/attach.component";
15
- import * as i12 from "../number/number.component";
16
- import * as i13 from "../viewer/viewer.component";
17
- import * as i14 from "../../pipes/camelToWords.pipe";
18
- // import { DialogService } from '../../services/dialog.service';
19
- // import { DetailsDialog } from '../table/detailsDialog.component';
7
+ import * as i3 from "../../services/auth.service";
8
+ import * as i4 from "@angular/common";
9
+ import * as i5 from "@angular/material/button";
10
+ import * as i6 from "@angular/material/icon";
11
+ import * as i7 from "../text/text.component";
12
+ import * as i8 from "../check/check.component";
13
+ import * as i9 from "../date/date.component";
14
+ import * as i10 from "../datetime/datetime.component";
15
+ import * as i11 from "../label/label.component";
16
+ import * as i12 from "../money/money.component";
17
+ import * as i13 from "../attach/attach.component";
18
+ import * as i14 from "../number/number.component";
19
+ import * as i15 from "../viewer/viewer.component";
20
+ import * as i16 from "../email/email.component";
21
+ import * as i17 from "../multi-text/multi-text.component";
22
+ import * as i18 from "../multi-select/multi-select.component";
23
+ import * as i19 from "../html/html.component";
24
+ import * as i20 from "../notes/notes.component";
25
+ import * as i21 from "../../pipes/camelToWords.pipe";
20
26
  export class FormComponent {
21
- constructor(messageService, dataService) {
27
+ constructor(messageService, dataService, authService) {
22
28
  this.messageService = messageService;
23
29
  this.dataService = dataService;
30
+ this.authService = authService;
31
+ this.hasAccess = false;
24
32
  this.files = [];
25
33
  this.buttonDisplay = "Submit";
26
34
  this.isProcessing = false;
@@ -29,6 +37,11 @@ export class FormComponent {
29
37
  this.inputChange = new EventEmitter();
30
38
  }
31
39
  ngOnInit() {
40
+ this.hasAccess = Core.hasFormAccess(this.config, this.authService.currentRoleSource.value);
41
+ if (!this.hasAccess) {
42
+ // this.messageService.toast('Access denied'); // Optional - notify user
43
+ return;
44
+ }
32
45
  if (!this.config.fields) {
33
46
  this.messageService.toast("Please Configure Form Fields");
34
47
  return;
@@ -38,6 +51,20 @@ export class FormComponent {
38
51
  return;
39
52
  }
40
53
  this.fields = this.config.fields;
54
+ // Initialize BehaviorSubjects for fields with loadActions
55
+ this.fields?.forEach(field => {
56
+ if (field.loadAction && !field.optionsSubject && !field.masterField) {
57
+ field.optionsSubject = new BehaviorSubject([]);
58
+ // Subscribe to options changes
59
+ field.optionsSubject.subscribe(newOptions => {
60
+ field.options = newOptions;
61
+ // Update child fields that depend on this field
62
+ if (this.childFields?.some(x => x.masterField === field.name)) {
63
+ this.updateChildOptions(field.name);
64
+ }
65
+ });
66
+ }
67
+ });
41
68
  if (this.config.multiColumn) {
42
69
  this.multiColumn = this.config.multiColumn;
43
70
  }
@@ -48,64 +75,135 @@ export class FormComponent {
48
75
  this.buttonDisplay = this.config.button.display;
49
76
  }
50
77
  this.fileField = this.fields.find(x => x.type == 'file');
51
- if (this.config?.button?.action && this.fileField) {
78
+ if (this.config?.button?.action && this.fileField || this.config?.button?.action.url.includes("/form")) {
52
79
  this.config.button.action.isFormData = true;
53
80
  }
54
81
  this.childFields = this.fields.filter(x => x.masterField);
55
82
  this.childFields.forEach(child => {
56
83
  let master = this.fields.find(x => x.name == child.masterField);
57
- this.updateChildOptions(master);
84
+ if (child.loadAction) {
85
+ this.loadChildMasterOptions(child);
86
+ }
87
+ else {
88
+ this.updateChildOptions(master.name);
89
+ }
58
90
  });
91
+ this.fields.forEach(field => {
92
+ if (field.loadAction) {
93
+ this.loadChildMasterOptions(field);
94
+ }
95
+ });
96
+ this.initializeCompositeFields();
97
+ this.applyValueCalculations();
59
98
  }
60
- ngOnChanges() {
99
+ initializeCompositeFields() {
100
+ this.fields.forEach(field => {
101
+ if (field.type === 'composite' && field.subfields) {
102
+ field.subfields.forEach(subfield => {
103
+ if (this.data[subfield.name] === undefined) {
104
+ this.data[subfield.name] = Core.getInitialValue(subfield);
105
+ }
106
+ });
107
+ }
108
+ });
61
109
  }
62
- ngAfterViewInit() {
110
+ applyValueCalculations() {
111
+ if (!this.data || !this.fields)
112
+ return;
113
+ // Get visible fields that have valueCalculation functions
114
+ const calculatedFields = this.getVisibleFields()
115
+ .filter(field => typeof field.valueCalculation === 'function');
116
+ if (calculatedFields.length === 0)
117
+ return;
118
+ // Apply calculations to each field
119
+ calculatedFields.forEach(field => {
120
+ try {
121
+ const calculatedValue = field.valueCalculation(this.data);
122
+ if (calculatedValue !== undefined) {
123
+ this.data[field.name] = calculatedValue;
124
+ }
125
+ }
126
+ catch (error) {
127
+ console.error(`Error calculating value for field ${field.name}:`, error);
128
+ }
129
+ });
63
130
  }
64
- getVisibleFields() {
65
- return this.fields?.filter(x => Core.testVisible(this.config, this.data, x));
131
+ getVisibleSubfields(field) {
132
+ return Core.getVisibleSubfields(this.config, this.data, field, this.authService.currentRoleSource.value);
66
133
  }
67
- testReadOnly(f) {
68
- if (this.config.mode == 'create') {
69
- return false;
70
- }
71
- if (f.readonly)
72
- return true;
73
- if (this.config.mode == 'view') {
134
+ getVisibleFields() {
135
+ let visibleFields = this.fields?.filter(x => Core.testVisible(this.config, this.data, x, this.authService.currentRoleSource.value)) ?? [];
136
+ // Filter out fields under collapsed sections
137
+ return visibleFields.filter(field => {
138
+ if (field.type === 'section')
139
+ return true;
140
+ if (field.section) {
141
+ const sectionField = this.fields.find(f => f.type === 'section' && f.name === field.section);
142
+ return !sectionField?.collapsed;
143
+ }
74
144
  return true;
145
+ });
146
+ }
147
+ testReadOnly(field) {
148
+ return Core.testReadOnly(this.config, this.data, field);
149
+ }
150
+ testRequired(field) {
151
+ return Core.testRequired(this.config, this.data, field);
152
+ }
153
+ toggleSection(field) {
154
+ if (field.type === 'section') {
155
+ field.collapsed = !field.collapsed;
75
156
  }
76
- if (f.readonlyCondition) {
77
- return f.readonlyCondition(this.data);
157
+ }
158
+ hasSectionFields(sectionName) {
159
+ return this.fields?.some(field => field.section === sectionName &&
160
+ Core.testVisible(this.config, this.data, field, this.authService.currentRoleSource.value)) ?? false;
161
+ }
162
+ shouldSectionCollapse(field) {
163
+ if (field.collapsedCondition) {
164
+ return field.collapsedCondition(this.data);
78
165
  }
79
- return false;
166
+ return field.collapsed ?? false;
167
+ }
168
+ onInfoClick(event, infoMessage) {
169
+ event.stopPropagation();
170
+ this.messageService.info(infoMessage);
171
+ }
172
+ selectChanged(field) {
173
+ this.inputChanged(field, this.data[field.name]);
80
174
  }
81
175
  inputChanged(field, value) {
82
176
  this.inputChange.emit({ field: field, value: value });
83
- this.updateChildOptions(field);
84
- if (this.config.mode == 'create' && field.child) {
85
- let child = this.fields.find(x => x.name == field.child.childField);
86
- this.data[child.name] = field.options.find(x => x[field.optionValue] == value)[field.child.childValueField];
87
- }
177
+ this.updateChildOptions(field.name);
88
178
  if (this.config.mode == 'create' && field.children) {
89
- console.log("Children found");
90
179
  field.children.forEach(childConfig => {
91
180
  let child = this.fields.find(x => x.name == childConfig.childField);
92
- console.log("Child found");
93
- this.data[child.name] = field.options.find(x => x[field.optionValue] == value)[childConfig.childValueField];
181
+ this.data[child.name] = field.options.find(x => x[field.optionValue ?? 'value'] == value)[childConfig.childValueField];
94
182
  });
95
183
  }
184
+ this.applyValueCalculations();
96
185
  }
97
- updateChildOptions(masterField) {
98
- let child = this.childFields.find(x => x.masterField == masterField.name);
186
+ updateChildOptions(masterFieldName) {
187
+ let child = this.childFields.find(x => x.masterField == masterFieldName);
99
188
  if (child != null) {
100
189
  //current is master
101
- //filter child options based on master value
102
- child.options = child.masterOptions.filter(x => x[masterField.optionValue] == this.data[masterField.name]);
190
+ if (child.masterOptions) {
191
+ child.options = child.masterOptions.filter(x => x[child.masterOptionValue ?? 'masterValue'] == this.data[masterFieldName]);
192
+ }
193
+ else {
194
+ console.log("Master Options not found");
195
+ }
103
196
  }
104
197
  }
105
- handleInfoClick(field) {
106
- if (field.infoMessage) {
107
- this.messageService.info(field.infoMessage);
108
- }
198
+ loadChildMasterOptions(child) {
199
+ if (!child.loadAction)
200
+ return;
201
+ this.dataService.CallApi(child.loadAction).subscribe((apiResponse) => {
202
+ if (apiResponse.success) {
203
+ child.masterOptions = apiResponse.data;
204
+ this.updateChildOptions(child.masterField);
205
+ }
206
+ });
109
207
  }
110
208
  buttonClicked() {
111
209
  this.buttonClick.emit(this.data);
@@ -162,6 +260,7 @@ export class FormComponent {
162
260
  if (this.config.reset) {
163
261
  Core.resetObject(this.fields, this.data);
164
262
  this.files = [];
263
+ this.applyValueCalculations();
165
264
  }
166
265
  }
167
266
  else {
@@ -172,12 +271,15 @@ export class FormComponent {
172
271
  processForm() {
173
272
  }
174
273
  }
175
- FormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FormComponent, deps: [{ token: i1.MessageService }, { token: i2.DataServiceLib }], target: i0.ɵɵFactoryTarget.Component });
176
- FormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: FormComponent, selector: "spa-form", inputs: { files: "files", data: "data", config: "config" }, outputs: { buttonClick: "buttonClick", inputChange: "inputChange" }, usesOnChanges: true, ngImport: i0, template: "\r\n<div [ngClass]=\"multiColumn ? 'tin-grid' : 'tin-col'\">\r\n\r\n <div [ngClass]=\"field.span || field.type =='section' || field.type =='file' || field.type =='file-view' ? 'span-col' : ''\" *ngFor=\"let field of getVisibleFields()\">\r\n\r\n <ng-container >\r\n\r\n <ng-container [ngSwitch]=\"field.type\" class=\"highlight\">\r\n\r\n <div *ngSwitchCase=\"'section'\" class=\"title\">\r\n <label style=\"font-size: larger;\">{{field.name | camelToWords}}</label>\r\n </div>\r\n\r\n <ng-container *ngSwitchCase=\"'file'\">\r\n <div class=\"mt-1 mb-2\" *ngIf=\"config.mode !='view'\">\r\n <spa-attach message=\"Drag and Drop files here\" [(files)]=\"files\"></spa-attach>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'file-view'\">\r\n <div class=\"mt-1 mb-2\" *ngIf=\"config.mode && config.mode !='create'\">\r\n <spa-viewer [fileAction]=\"config.fileAction\" [path]=\"field.path\" [folderName]=\"data[field.keyFiledName]\" ></spa-viewer>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <label *ngSwitchCase=\"'blank'\"></label>\r\n\r\n <spa-label *ngSwitchCase=\"'label'\" [display]=\"field.alias ?? field.name | camelToWords\" [value]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" ></spa-label>\r\n\r\n <spa-number *ngSwitchCase=\"'number'\" [display]=\"field.alias ?? field.name | camelToWords\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [required]=\"field.required\" [min]=\"field.min\" [max]=\"field.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" (infoClick)=\"handleInfoClick(field)\" [suffix]=\"field.suffix\"></spa-number>\r\n\r\n <spa-money *ngSwitchCase=\"'money'\" [display]=\"field.alias ?? field.name | camelToWords\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [required]=\"field.required\" [min]=\"field.min\" [max]=\"field.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" (infoClick)=\"handleInfoClick(field)\"></spa-money>\r\n\r\n <spa-check *ngSwitchCase=\"'checkbox'\" [display]=\"field.alias ?? field.name | camelToWords\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [readonly]=\"testReadOnly(field)\" [infoMessage]=\"field.infoMessage\" (infoClick)=\"handleInfoClick(field)\"></spa-check>\r\n\r\n <spa-date *ngSwitchCase=\"'date'\" [display]=\"field.alias ?? field.name | camelToWords\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [min]=\"field?.min\" [max]=\"field?.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" (infoClick)=\"handleInfoClick(field)\"></spa-date>\r\n\r\n <spa-select *ngSwitchCase=\"'select'\"\r\n [display]=\"field.alias ?? field.name | camelToWords\" [nullable]=\"field.nullable\"\r\n [options]=\"field.options\" [masterOptions]=\"field.masterOptions\" [optionDisplay]=\"field.optionDisplay ?? 'name'\" [optionValue]=\"field.optionValue ?? 'value'\"\r\n [(value)]=\"data[field.name]\" [defaultFirstValue]=\"field.defaultFirstValue\" (valueChange)=\"inputChanged(field, data[field.name])\"\r\n [readonly]=\"testReadOnly(field)\"\r\n [hint]=\"field.hint\"\r\n [peekConfig]=\"field.peekConfig\"\r\n [infoMessage]=\"field.infoMessage\"\r\n >\r\n </spa-select>\r\n\r\n <spa-select *ngSwitchCase=\"'multi-select'\" [display]=\"field.alias ?? field.name | camelToWords\" [options]=\"field.options\" [optionDisplay]=\"field.optionDisplay ?? 'name'\" [optionValue]=\"field.optionValue ?? 'value'\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [readonly]=\"testReadOnly(field)\" [multiple]=\"true\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" (infoClick)=\"handleInfoClick(field)\">\r\n </spa-select>\r\n\r\n <spa-text *ngSwitchDefault [display]=\"field.alias ?? field.name | camelToWords\" [options]=\"field.options\" [optionValue]=\"field.optionValue ?? 'value'\" [rows]=\"field.rows\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field,data[field.name])\" [required]=\"field.required\" [min]=\"field.min\" [max]=\"field.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" (infoClick)=\"handleInfoClick(field)\" [suffix]=\"field.suffix\"></spa-text>\r\n\r\n </ng-container>\r\n\r\n </ng-container>\r\n\r\n </div>\r\n\r\n\r\n <div class=\"span-col-center\" *ngIf=\"config.button\">\r\n <button mat-raised-button color=\"primary\" (click)=\"buttonClicked()\" cdkFocusInitial>{{buttonDisplay}}</button>\r\n </div>\r\n\r\n\r\n</div>\r\n", styles: [".title{margin-top:1em;font-size:larger;font-weight:300}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i4.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: i5.TextComponent, selector: "spa-text", inputs: ["readonly", "hint", "display", "placeholder", "value", "format", "type", "rows", "width", "options", "optionValue", "required", "min", "max", "regex", "suffix", "infoMessage"], outputs: ["valueChange", "leave", "enterPress", "infoClick"] }, { kind: "component", type: i6.CheckComponent, selector: "spa-check", inputs: ["readonly", "display", "value", "infoMessage"], outputs: ["valueChange", "click", "check", "uncheck", "infoClick"] }, { kind: "component", type: i7.DateComponent, selector: "spa-date", inputs: ["required", "min", "max", "readonly", "hint", "value", "display", "placeholder", "width", "infoMessage"], outputs: ["valueChange", "infoClick"] }, { kind: "component", type: i8.LabelComponent, selector: "spa-label", inputs: ["display", "value", "format"] }, { kind: "component", type: i9.SelectComponent, selector: "spa-select", inputs: ["width", "readonly", "required", "defaultFirstValue", "readonlyMode", "hint", "placeholder", "multiple", "display", "value", "options", "masterOptions", "optionValue", "optionDisplay", "optionDisplayExtra", "nullable", "peekConfig", "infoMessage"], outputs: ["valueChange", "infoClick"] }, { kind: "component", type: i10.MoneyComponent, selector: "spa-money", inputs: ["readonly", "hint", "display", "placeholder", "value", "width", "currency", "required", "min", "max", "infoMessage"], outputs: ["valueChange", "leave", "enterPress", "infoClick"] }, { kind: "component", type: i11.AttachComponent, selector: "spa-attach", inputs: ["message", "files", "enableUpload"], outputs: ["filesChange", "upload"] }, { kind: "component", type: i12.NumberComponent, selector: "spa-number", inputs: ["readonly", "hint", "display", "placeholder", "value", "width", "required", "min", "max", "step", "suffix", "infoMessage"], outputs: ["valueChange", "leave", "enterPress", "infoClick"] }, { kind: "component", type: i13.ViewerComponent, selector: "spa-viewer", inputs: ["fileAction", "path", "folderName", "fileNames", "removable", "display", "title"], outputs: ["remove"] }, { kind: "pipe", type: i14.CamelToWordsPipe, name: "camelToWords" }] });
274
+ FormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FormComponent, deps: [{ token: i1.MessageService }, { token: i2.DataServiceLib }, { token: i3.AuthService }], target: i0.ɵɵFactoryTarget.Component });
275
+ FormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: FormComponent, selector: "spa-form", inputs: { files: "files", data: "data", config: "config" }, outputs: { buttonClick: "buttonClick", inputChange: "inputChange" }, queries: [{ propertyName: "dynamicSelectTemplate", first: true, predicate: ["dynamicSelect"], descendants: true }], ngImport: i0, template: "\r\n\r\n\r\n<div class=\"tin-form-container\" >\r\n <div [ngClass]=\"[multiColumn ? 'tin-grid' : 'tin-col', config.notesConfig ? 'width-75' : 'width-100']\" class=\"form-main-content\">\r\n\r\n <div *ngIf=\"!hasAccess\" class=\"tin-center\">\r\n <p><em>Access Restricted</em></p>\r\n </div>\r\n \r\n <div [ngClass]=\"field.span || field.type =='section' || field.type =='file' || field.type =='file-view' ? 'span-col' : ''\" *ngFor=\"let field of getVisibleFields()\">\r\n \r\n <ng-container>\r\n \r\n <ng-container [ngSwitch]=\"field.type\" class=\"highlight\">\r\n \r\n <div *ngSwitchCase=\"'section'\" class=\"title d-flex align-items-center\" (click)=\"toggleSection(field)\" style=\"cursor: pointer;\">\r\n <label style=\"font-size: larger;margin-right: 10px;\">{{field.alias ?? field.name | camelToWords}}</label>\r\n <mat-icon *ngIf=\"field.infoMessage\" (click)=\"onInfoClick($event, field.infoMessage)\" style=\"color: steelblue; font-size: 14px;\">info</mat-icon>\r\n <!-- <button mat-icon-button class=\"info-icon-button\" matTooltip=\"Info\" matTooltipPosition=\"above\">\r\n \r\n </button> -->\r\n <mat-icon *ngIf=\"hasSectionFields(field.name)\">{{shouldSectionCollapse(field) ? 'expand_more' : 'expand_less'}}</mat-icon>\r\n </div>\r\n \r\n <ng-container *ngSwitchCase=\"'file'\">\r\n <div class=\"mt-1 mb-2\" *ngIf=\"config.mode !='view'\">\r\n <spa-attach [message]=\"field.alias ?? 'Drag and Drop files here'\" [(files)]=\"files\" [fileOptions]=\"field.fileOptions\"></spa-attach>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngSwitchCase=\"'file-view'\">\r\n <div class=\"mt-1 mb-2\" *ngIf=\"config.mode && config.mode !='create'\">\r\n <spa-viewer [fileAction]=\"field.loadAction\" [path]=\"field.path\" [folderName]=\"data[field.keyField]\" ></spa-viewer>\r\n </div>\r\n </ng-container>\r\n \r\n <spa-html *ngSwitchCase=\"'html'\" [display]=\"field.alias | camelToWords\" [value]=\"data[field.name]\" [maxHeight]=\"field.maxHeight\"></spa-html>\r\n \r\n <label *ngSwitchCase=\"'blank'\"></label>\r\n \r\n <label *ngSwitchCase=\"'string'\" [ngStyle]=\"{'font-size':field.size ?? '14px'}\" >{{data[field.name] ?? field.alias ?? field.name}} {{field.suffix ?? ''}}</label>\r\n \r\n <spa-label *ngSwitchCase=\"'label'\" [display]=\"field.alias ?? field.name | camelToWords\" [value]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [format]=\"field.format ?? 'text'\" [suffix]=\"field.suffix\"></spa-label>\r\n \r\n <spa-number *ngSwitchCase=\"'number'\" [display]=\"field.alias ?? field.name | camelToWords\" [width]=\"field.width\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [required]=\"testRequired(field)\" [min]=\"field.min\" [max]=\"field.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" [suffix]=\"field.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\"></spa-number>\r\n \r\n <spa-money *ngSwitchCase=\"'money'\" [display]=\"field.alias ?? field.name | camelToWords\" [width]=\"field.width\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [required]=\"testRequired(field)\" [min]=\"field.min\" [max]=\"field.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" [suffix]=\"field.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\"></spa-money>\r\n \r\n <spa-check *ngSwitchCase=\"'checkbox'\" [display]=\"field.alias ?? field.name | camelToWords\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [readonly]=\"testReadOnly(field)\" [infoMessage]=\"field.infoMessage\" ></spa-check>\r\n \r\n <spa-date *ngSwitchCase=\"'date'\" [display]=\"field.alias ?? field.name | camelToWords\" [width]=\"field.width\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [min]=\"field?.min\" [max]=\"field?.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" ></spa-date>\r\n \r\n <spa-datetime *ngSwitchCase=\"'datetime'\" [display]=\"field.alias ?? field.name | camelToWords\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [readonly]=\"testReadOnly(field)\" [min]=\"field.min\" [max]=\"field.max\" [infoMessage]=\"field.infoMessage\" ></spa-datetime>\r\n \r\n <spa-email *ngSwitchCase=\"'email'\" [display]=\"field.alias ?? field.name | camelToWords\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field,data[field.name])\" [required]=\"testRequired(field)\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" [suffix]=\"field.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\"></spa-email>\r\n \r\n <spa-text *ngSwitchCase=\"'password'\" [format]=\"'password'\" [display]=\"field.alias ?? field.name | camelToWords\" [width]=\"field.width\" [options]=\"field.options\" [optionValue]=\"field.optionValue ?? 'value'\" [rows]=\"field.rows\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field,data[field.name])\" [required]=\"testRequired(field)\" [min]=\"field.min\" [max]=\"field.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" [suffix]=\"field.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\"></spa-text>\r\n \r\n \r\n <ng-container *ngSwitchCase=\"'select'\">\r\n <ng-container *ngTemplateOutlet=\"dynamicSelectTemplate; context: {\r\n $implicit: field,\r\n field: field,\r\n data: data,\r\n testReadOnly: testReadOnly.bind(this),\r\n selectChanged: selectChanged.bind(this)\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n \r\n \r\n <spa-multi-select *ngSwitchCase=\"'multi-select'\" [display]=\"field.alias ?? field.name | camelToWords\" [width]=\"field.width\" [options]=\"field.options\" [optionDisplay]=\"field.optionDisplay ?? 'name'\" [optionValue]=\"field.optionValue ?? 'value'\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [required]=\"testRequired(field)\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" [suffix]=\"field.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\" [loadAction]=\"field.loadAction\">\r\n </spa-multi-select>\r\n \r\n <spa-multi-text *ngSwitchCase=\"'multi-text'\" [strict]=\"field.strict\" [display]=\"field.alias ?? field.name | camelToWords\" [options]=\"field.options\" [optionDisplay]=\"field.optionDisplay ?? 'name'\" [optionValue]=\"field.optionValue ?? 'value'\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field,data[field.name])\" [required]=\"testRequired(field)\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" [suffix]=\"field.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\" [loadAction]=\"field.loadAction\"></spa-multi-text>\r\n \r\n \r\n \r\n <ng-container *ngSwitchCase=\"'composite'\">\r\n <div class=\"composite-field-container\">\r\n <div class=\"composite-field-group\">\r\n <ng-container *ngFor=\"let subfield of getVisibleSubfields(field)\">\r\n <ng-container [ngSwitch]=\"subfield.type\">\r\n \r\n <label *ngSwitchCase=\"'string'\" [ngStyle]=\"{'font-size':field.size ?? '14px'}\" >{{data[field.name] ?? field.alias ?? field.name}} {{field.suffix ?? ''}}</label>\r\n \r\n <spa-number *ngSwitchCase=\"'number'\" [display]=\"subfield.alias ?? subfield.name | camelToWords\" [width]=\"subfield.width\" [(value)]=\"data[subfield.name]\" (valueChange)=\"inputChanged(subfield, $event)\" [required]=\"testRequired(subfield)\" [min]=\"subfield.min\" [max]=\"subfield.max\" [readonly]=\"testReadOnly(field) || testReadOnly(subfield)\" [hint]=\"subfield.hint\" [infoMessage]=\"subfield.infoMessage\" [suffix]=\"subfield.suffix\" [copyContent]=\"subfield.copyContent\" [clearContent]=\"subfield.clearContent\"></spa-number>\r\n \r\n <spa-money *ngSwitchCase=\"'money'\" [display]=\"subfield.alias ?? subfield.name | camelToWords\" [width]=\"subfield.width\" [(value)]=\"data[subfield.name]\" (valueChange)=\"inputChanged(subfield, $event)\" [required]=\"testRequired(subfield)\" [min]=\"subfield.min\" [max]=\"subfield.max\" [readonly]=\"testReadOnly(field) || testReadOnly(subfield)\" [hint]=\"subfield.hint\" [infoMessage]=\"subfield.infoMessage\" [suffix]=\"subfield.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\"></spa-money>\r\n \r\n <spa-check *ngSwitchCase=\"'checkbox'\" [display]=\"subfield.alias ?? subfield.name | camelToWords\" [(value)]=\"data[subfield.name]\" (valueChange)=\"inputChanged(subfield, $event)\" [readonly]=\"testReadOnly(field) || testReadOnly(subfield)\" [infoMessage]=\"subfield.infoMessage\" ></spa-check>\r\n \r\n <spa-date *ngSwitchCase=\"'date'\" [display]=\"subfield.alias ?? subfield.name | camelToWords\" [width]=\"subfield.width\" [(value)]=\"data[subfield.name]\" (valueChange)=\"inputChanged(subfield, $event)\" [min]=\"subfield.min\" [max]=\"subfield.max\" [readonly]=\"testReadOnly(field) || testReadOnly(subfield)\" [hint]=\"subfield.hint\" [infoMessage]=\"subfield.infoMessage\" ></spa-date>\r\n \r\n <spa-datetime *ngSwitchCase=\"'datetime'\" [display]=\"subfield.alias ?? subfield.name | camelToWords\" [(value)]=\"data[subfield.name]\" (valueChange)=\"inputChanged(subfield, $event)\" [readonly]=\"testReadOnly(field) || testReadOnly(subfield)\" [min]=\"subfield.min\" [max]=\"subfield.max\" [infoMessage]=\"subfield.infoMessage\" ></spa-datetime>\r\n \r\n <ng-container *ngSwitchCase=\"'select'\">\r\n <ng-container *ngTemplateOutlet=\"dynamicSelectTemplate; context: {\r\n $implicit: field,\r\n field: field,\r\n data: data,\r\n testReadOnly: testReadOnly.bind(this),\r\n selectChanged: selectChanged.bind(this)\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n \r\n <spa-text *ngSwitchDefault [display]=\"subfield.alias ?? subfield.name | camelToWords\" [width]=\"subfield.width\" [options]=\"subfield.options\" [optionDisplay]=\"subfield.optionDisplay ?? 'name'\" [optionValue]=\"subfield.optionValue ?? 'value'\" [rows]=\"subfield.rows\" [(value)]=\"data[subfield.name]\" (valueChange)=\"inputChanged(subfield, $event)\" [required]=\"testRequired(subfield)\" [min]=\"subfield.min\" [max]=\"subfield.max\" [readonly]=\"testReadOnly(field) || testReadOnly(subfield)\" [hint]=\"subfield.hint\" [infoMessage]=\"subfield.infoMessage\" [suffix]=\"subfield.suffix\" [copyContent]=\"subfield.copyContent\" [clearContent]=\"subfield.clearContent\" [loadAction]=\"subfield.loadAction\"></spa-text>\r\n \r\n \r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n \r\n <spa-text *ngSwitchDefault [display]=\"field.alias ?? field.name | camelToWords\" [width]=\"field.width\" [options]=\"field.options\" [optionDisplay]=\"field.optionDisplay ?? 'name'\" [optionValue]=\"field.optionValue ?? 'value'\" [rows]=\"field.rows\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field,data[field.name])\" [required]=\"testRequired(field)\" [min]=\"field.min\" [max]=\"field.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" [suffix]=\"field.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\" [loadAction]=\"field.loadAction\"></spa-text>\r\n \r\n </ng-container>\r\n \r\n </ng-container>\r\n \r\n </div>\r\n \r\n \r\n <div class=\"span-col-center\" *ngIf=\"config.button\">\r\n <button mat-raised-button color=\"primary\" (click)=\"buttonClicked()\" cdkFocusInitial>{{buttonDisplay}}</button>\r\n </div>\r\n \r\n \r\n </div>\r\n <div class=\"notes-section\" *ngIf=\"config.notesConfig\">\r\n <spa-notes\r\n [title]=\"config.notesConfig.title || 'Notes'\"\r\n [notes]=\"config.notesConfig.notes || []\"\r\n [loadAction]=\"config.notesConfig.loadAction\"\r\n [loadIDField]=\"config.notesConfig.loadIDField\"\r\n [data]=\"data\"\r\n [nameField]=\"config.notesConfig.nameField || 'createdByName'\"\r\n [dateField]=\"config.notesConfig.dateField || 'createdDate'\"\r\n [commentField]=\"config.notesConfig.commentField || 'details'\">\r\n </spa-notes>\r\n </div>\r\n</div>\r\n\r\n", styles: [".title{margin-top:1em;font-size:larger;font-weight:300}.composite-field-group{display:flex;flex-direction:row;flex-wrap:wrap;gap:12px}.tin-form-container{display:flex;flex-direction:row;width:100%;gap:16px}.width-100{width:100%!important}.width-75{width:70%!important}.notes-section{width:400px;border-left:1px solid #e0e0e0}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { 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: "component", type: i7.TextComponent, selector: "spa-text", inputs: ["appearance", "readonly", "hint", "display", "placeholder", "value", "format", "type", "rows", "width", "copyContent", "clearContent", "options", "optionDisplay", "optionValue", "loadAction", "required", "min", "max", "regex", "suffix", "infoMessage"], outputs: ["valueChange", "leave", "enterPress"] }, { kind: "component", type: i8.CheckComponent, selector: "spa-check", inputs: ["readonly", "display", "value", "infoMessage"], outputs: ["valueChange", "click", "check", "uncheck", "infoClick"] }, { kind: "component", type: i9.DateComponent, selector: "spa-date", inputs: ["required", "min", "max", "readonly", "hint", "value", "display", "placeholder", "width", "infoMessage"], outputs: ["valueChange", "infoClick"] }, { kind: "component", type: i10.DatetimeComponent, selector: "spa-datetime", inputs: ["display", "value", "readonly", "width", "min", "max", "infoMessage"], outputs: ["valueChange", "infoClick"] }, { kind: "component", type: i11.LabelComponent, selector: "spa-label", inputs: ["display", "value", "format", "suffix"] }, { kind: "component", type: i12.MoneyComponent, selector: "spa-money", inputs: ["readonly", "hint", "display", "placeholder", "value", "width", "currency", "required", "min", "max", "infoMessage", "copyContent", "clearContent", "suffix"], outputs: ["valueChange", "leave", "enterPress", "infoClick"] }, { kind: "component", type: i13.AttachComponent, selector: "spa-attach", inputs: ["fileOptions", "message", "files", "enableUpload"], outputs: ["filesChange", "upload"] }, { kind: "component", type: i14.NumberComponent, selector: "spa-number", inputs: ["readonly", "hint", "display", "placeholder", "value", "width", "required", "min", "max", "step", "suffix", "infoMessage", "copyContent", "clearContent"], outputs: ["valueChange", "leave", "enterPress", "infoClick"] }, { kind: "component", type: i15.ViewerComponent, selector: "spa-viewer", inputs: ["fileAction", "path", "folderName", "fileNames", "removable", "display", "title"], outputs: ["remove"] }, { kind: "component", type: i16.EmailComponent, selector: "spa-email", inputs: ["display", "value", "readonly", "required", "hint", "suffix", "infoMessage", "copyContent", "clearContent", "options", "optionValue"], outputs: ["valueChange"] }, { kind: "component", type: i17.MultiTextComponent, selector: "spa-multi-text", inputs: ["display", "value", "readonly", "required", "hint", "strict", "suffix", "infoMessage", "copyContent", "clearContent", "options", "optionDisplay", "optionValue", "loadAction"], outputs: ["valueChange", "hoverChange"] }, { kind: "component", type: i18.MultiSelectComponent, selector: "spa-multi-select", inputs: ["display", "value", "readonly", "required", "hint", "options", "optionDisplay", "optionValue", "infoMessage", "copyContent", "clearContent", "nullable", "placeholder", "width", "suffix", "loadAction"], outputs: ["valueChange", "hoverChange"] }, { kind: "component", type: i19.HtmlComponent, selector: "spa-html", inputs: ["value", "maxHeight", "display"] }, { kind: "component", type: i20.NotesComponent, selector: "spa-notes", inputs: ["title", "notes", "loadAction", "loadIDField", "data", "nameField", "dateField", "commentField"] }, { kind: "pipe", type: i21.CamelToWordsPipe, name: "camelToWords" }] });
177
276
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FormComponent, decorators: [{
178
277
  type: Component,
179
- args: [{ selector: 'spa-form', template: "\r\n<div [ngClass]=\"multiColumn ? 'tin-grid' : 'tin-col'\">\r\n\r\n <div [ngClass]=\"field.span || field.type =='section' || field.type =='file' || field.type =='file-view' ? 'span-col' : ''\" *ngFor=\"let field of getVisibleFields()\">\r\n\r\n <ng-container >\r\n\r\n <ng-container [ngSwitch]=\"field.type\" class=\"highlight\">\r\n\r\n <div *ngSwitchCase=\"'section'\" class=\"title\">\r\n <label style=\"font-size: larger;\">{{field.name | camelToWords}}</label>\r\n </div>\r\n\r\n <ng-container *ngSwitchCase=\"'file'\">\r\n <div class=\"mt-1 mb-2\" *ngIf=\"config.mode !='view'\">\r\n <spa-attach message=\"Drag and Drop files here\" [(files)]=\"files\"></spa-attach>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'file-view'\">\r\n <div class=\"mt-1 mb-2\" *ngIf=\"config.mode && config.mode !='create'\">\r\n <spa-viewer [fileAction]=\"config.fileAction\" [path]=\"field.path\" [folderName]=\"data[field.keyFiledName]\" ></spa-viewer>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <label *ngSwitchCase=\"'blank'\"></label>\r\n\r\n <spa-label *ngSwitchCase=\"'label'\" [display]=\"field.alias ?? field.name | camelToWords\" [value]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" ></spa-label>\r\n\r\n <spa-number *ngSwitchCase=\"'number'\" [display]=\"field.alias ?? field.name | camelToWords\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [required]=\"field.required\" [min]=\"field.min\" [max]=\"field.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" (infoClick)=\"handleInfoClick(field)\" [suffix]=\"field.suffix\"></spa-number>\r\n\r\n <spa-money *ngSwitchCase=\"'money'\" [display]=\"field.alias ?? field.name | camelToWords\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [required]=\"field.required\" [min]=\"field.min\" [max]=\"field.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" (infoClick)=\"handleInfoClick(field)\"></spa-money>\r\n\r\n <spa-check *ngSwitchCase=\"'checkbox'\" [display]=\"field.alias ?? field.name | camelToWords\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [readonly]=\"testReadOnly(field)\" [infoMessage]=\"field.infoMessage\" (infoClick)=\"handleInfoClick(field)\"></spa-check>\r\n\r\n <spa-date *ngSwitchCase=\"'date'\" [display]=\"field.alias ?? field.name | camelToWords\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [min]=\"field?.min\" [max]=\"field?.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" (infoClick)=\"handleInfoClick(field)\"></spa-date>\r\n\r\n <spa-select *ngSwitchCase=\"'select'\"\r\n [display]=\"field.alias ?? field.name | camelToWords\" [nullable]=\"field.nullable\"\r\n [options]=\"field.options\" [masterOptions]=\"field.masterOptions\" [optionDisplay]=\"field.optionDisplay ?? 'name'\" [optionValue]=\"field.optionValue ?? 'value'\"\r\n [(value)]=\"data[field.name]\" [defaultFirstValue]=\"field.defaultFirstValue\" (valueChange)=\"inputChanged(field, data[field.name])\"\r\n [readonly]=\"testReadOnly(field)\"\r\n [hint]=\"field.hint\"\r\n [peekConfig]=\"field.peekConfig\"\r\n [infoMessage]=\"field.infoMessage\"\r\n >\r\n </spa-select>\r\n\r\n <spa-select *ngSwitchCase=\"'multi-select'\" [display]=\"field.alias ?? field.name | camelToWords\" [options]=\"field.options\" [optionDisplay]=\"field.optionDisplay ?? 'name'\" [optionValue]=\"field.optionValue ?? 'value'\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [readonly]=\"testReadOnly(field)\" [multiple]=\"true\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" (infoClick)=\"handleInfoClick(field)\">\r\n </spa-select>\r\n\r\n <spa-text *ngSwitchDefault [display]=\"field.alias ?? field.name | camelToWords\" [options]=\"field.options\" [optionValue]=\"field.optionValue ?? 'value'\" [rows]=\"field.rows\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field,data[field.name])\" [required]=\"field.required\" [min]=\"field.min\" [max]=\"field.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" (infoClick)=\"handleInfoClick(field)\" [suffix]=\"field.suffix\"></spa-text>\r\n\r\n </ng-container>\r\n\r\n </ng-container>\r\n\r\n </div>\r\n\r\n\r\n <div class=\"span-col-center\" *ngIf=\"config.button\">\r\n <button mat-raised-button color=\"primary\" (click)=\"buttonClicked()\" cdkFocusInitial>{{buttonDisplay}}</button>\r\n </div>\r\n\r\n\r\n</div>\r\n", styles: [".title{margin-top:1em;font-size:larger;font-weight:300}\n"] }]
180
- }], ctorParameters: function () { return [{ type: i1.MessageService }, { type: i2.DataServiceLib }]; }, propDecorators: { files: [{
278
+ args: [{ selector: 'spa-form', template: "\r\n\r\n\r\n<div class=\"tin-form-container\" >\r\n <div [ngClass]=\"[multiColumn ? 'tin-grid' : 'tin-col', config.notesConfig ? 'width-75' : 'width-100']\" class=\"form-main-content\">\r\n\r\n <div *ngIf=\"!hasAccess\" class=\"tin-center\">\r\n <p><em>Access Restricted</em></p>\r\n </div>\r\n \r\n <div [ngClass]=\"field.span || field.type =='section' || field.type =='file' || field.type =='file-view' ? 'span-col' : ''\" *ngFor=\"let field of getVisibleFields()\">\r\n \r\n <ng-container>\r\n \r\n <ng-container [ngSwitch]=\"field.type\" class=\"highlight\">\r\n \r\n <div *ngSwitchCase=\"'section'\" class=\"title d-flex align-items-center\" (click)=\"toggleSection(field)\" style=\"cursor: pointer;\">\r\n <label style=\"font-size: larger;margin-right: 10px;\">{{field.alias ?? field.name | camelToWords}}</label>\r\n <mat-icon *ngIf=\"field.infoMessage\" (click)=\"onInfoClick($event, field.infoMessage)\" style=\"color: steelblue; font-size: 14px;\">info</mat-icon>\r\n <!-- <button mat-icon-button class=\"info-icon-button\" matTooltip=\"Info\" matTooltipPosition=\"above\">\r\n \r\n </button> -->\r\n <mat-icon *ngIf=\"hasSectionFields(field.name)\">{{shouldSectionCollapse(field) ? 'expand_more' : 'expand_less'}}</mat-icon>\r\n </div>\r\n \r\n <ng-container *ngSwitchCase=\"'file'\">\r\n <div class=\"mt-1 mb-2\" *ngIf=\"config.mode !='view'\">\r\n <spa-attach [message]=\"field.alias ?? 'Drag and Drop files here'\" [(files)]=\"files\" [fileOptions]=\"field.fileOptions\"></spa-attach>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngSwitchCase=\"'file-view'\">\r\n <div class=\"mt-1 mb-2\" *ngIf=\"config.mode && config.mode !='create'\">\r\n <spa-viewer [fileAction]=\"field.loadAction\" [path]=\"field.path\" [folderName]=\"data[field.keyField]\" ></spa-viewer>\r\n </div>\r\n </ng-container>\r\n \r\n <spa-html *ngSwitchCase=\"'html'\" [display]=\"field.alias | camelToWords\" [value]=\"data[field.name]\" [maxHeight]=\"field.maxHeight\"></spa-html>\r\n \r\n <label *ngSwitchCase=\"'blank'\"></label>\r\n \r\n <label *ngSwitchCase=\"'string'\" [ngStyle]=\"{'font-size':field.size ?? '14px'}\" >{{data[field.name] ?? field.alias ?? field.name}} {{field.suffix ?? ''}}</label>\r\n \r\n <spa-label *ngSwitchCase=\"'label'\" [display]=\"field.alias ?? field.name | camelToWords\" [value]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [format]=\"field.format ?? 'text'\" [suffix]=\"field.suffix\"></spa-label>\r\n \r\n <spa-number *ngSwitchCase=\"'number'\" [display]=\"field.alias ?? field.name | camelToWords\" [width]=\"field.width\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [required]=\"testRequired(field)\" [min]=\"field.min\" [max]=\"field.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" [suffix]=\"field.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\"></spa-number>\r\n \r\n <spa-money *ngSwitchCase=\"'money'\" [display]=\"field.alias ?? field.name | camelToWords\" [width]=\"field.width\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [required]=\"testRequired(field)\" [min]=\"field.min\" [max]=\"field.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" [suffix]=\"field.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\"></spa-money>\r\n \r\n <spa-check *ngSwitchCase=\"'checkbox'\" [display]=\"field.alias ?? field.name | camelToWords\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [readonly]=\"testReadOnly(field)\" [infoMessage]=\"field.infoMessage\" ></spa-check>\r\n \r\n <spa-date *ngSwitchCase=\"'date'\" [display]=\"field.alias ?? field.name | camelToWords\" [width]=\"field.width\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [min]=\"field?.min\" [max]=\"field?.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" ></spa-date>\r\n \r\n <spa-datetime *ngSwitchCase=\"'datetime'\" [display]=\"field.alias ?? field.name | camelToWords\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [readonly]=\"testReadOnly(field)\" [min]=\"field.min\" [max]=\"field.max\" [infoMessage]=\"field.infoMessage\" ></spa-datetime>\r\n \r\n <spa-email *ngSwitchCase=\"'email'\" [display]=\"field.alias ?? field.name | camelToWords\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field,data[field.name])\" [required]=\"testRequired(field)\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" [suffix]=\"field.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\"></spa-email>\r\n \r\n <spa-text *ngSwitchCase=\"'password'\" [format]=\"'password'\" [display]=\"field.alias ?? field.name | camelToWords\" [width]=\"field.width\" [options]=\"field.options\" [optionValue]=\"field.optionValue ?? 'value'\" [rows]=\"field.rows\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field,data[field.name])\" [required]=\"testRequired(field)\" [min]=\"field.min\" [max]=\"field.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" [suffix]=\"field.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\"></spa-text>\r\n \r\n \r\n <ng-container *ngSwitchCase=\"'select'\">\r\n <ng-container *ngTemplateOutlet=\"dynamicSelectTemplate; context: {\r\n $implicit: field,\r\n field: field,\r\n data: data,\r\n testReadOnly: testReadOnly.bind(this),\r\n selectChanged: selectChanged.bind(this)\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n \r\n \r\n <spa-multi-select *ngSwitchCase=\"'multi-select'\" [display]=\"field.alias ?? field.name | camelToWords\" [width]=\"field.width\" [options]=\"field.options\" [optionDisplay]=\"field.optionDisplay ?? 'name'\" [optionValue]=\"field.optionValue ?? 'value'\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field, data[field.name])\" [required]=\"testRequired(field)\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" [suffix]=\"field.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\" [loadAction]=\"field.loadAction\">\r\n </spa-multi-select>\r\n \r\n <spa-multi-text *ngSwitchCase=\"'multi-text'\" [strict]=\"field.strict\" [display]=\"field.alias ?? field.name | camelToWords\" [options]=\"field.options\" [optionDisplay]=\"field.optionDisplay ?? 'name'\" [optionValue]=\"field.optionValue ?? 'value'\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field,data[field.name])\" [required]=\"testRequired(field)\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" [suffix]=\"field.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\" [loadAction]=\"field.loadAction\"></spa-multi-text>\r\n \r\n \r\n \r\n <ng-container *ngSwitchCase=\"'composite'\">\r\n <div class=\"composite-field-container\">\r\n <div class=\"composite-field-group\">\r\n <ng-container *ngFor=\"let subfield of getVisibleSubfields(field)\">\r\n <ng-container [ngSwitch]=\"subfield.type\">\r\n \r\n <label *ngSwitchCase=\"'string'\" [ngStyle]=\"{'font-size':field.size ?? '14px'}\" >{{data[field.name] ?? field.alias ?? field.name}} {{field.suffix ?? ''}}</label>\r\n \r\n <spa-number *ngSwitchCase=\"'number'\" [display]=\"subfield.alias ?? subfield.name | camelToWords\" [width]=\"subfield.width\" [(value)]=\"data[subfield.name]\" (valueChange)=\"inputChanged(subfield, $event)\" [required]=\"testRequired(subfield)\" [min]=\"subfield.min\" [max]=\"subfield.max\" [readonly]=\"testReadOnly(field) || testReadOnly(subfield)\" [hint]=\"subfield.hint\" [infoMessage]=\"subfield.infoMessage\" [suffix]=\"subfield.suffix\" [copyContent]=\"subfield.copyContent\" [clearContent]=\"subfield.clearContent\"></spa-number>\r\n \r\n <spa-money *ngSwitchCase=\"'money'\" [display]=\"subfield.alias ?? subfield.name | camelToWords\" [width]=\"subfield.width\" [(value)]=\"data[subfield.name]\" (valueChange)=\"inputChanged(subfield, $event)\" [required]=\"testRequired(subfield)\" [min]=\"subfield.min\" [max]=\"subfield.max\" [readonly]=\"testReadOnly(field) || testReadOnly(subfield)\" [hint]=\"subfield.hint\" [infoMessage]=\"subfield.infoMessage\" [suffix]=\"subfield.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\"></spa-money>\r\n \r\n <spa-check *ngSwitchCase=\"'checkbox'\" [display]=\"subfield.alias ?? subfield.name | camelToWords\" [(value)]=\"data[subfield.name]\" (valueChange)=\"inputChanged(subfield, $event)\" [readonly]=\"testReadOnly(field) || testReadOnly(subfield)\" [infoMessage]=\"subfield.infoMessage\" ></spa-check>\r\n \r\n <spa-date *ngSwitchCase=\"'date'\" [display]=\"subfield.alias ?? subfield.name | camelToWords\" [width]=\"subfield.width\" [(value)]=\"data[subfield.name]\" (valueChange)=\"inputChanged(subfield, $event)\" [min]=\"subfield.min\" [max]=\"subfield.max\" [readonly]=\"testReadOnly(field) || testReadOnly(subfield)\" [hint]=\"subfield.hint\" [infoMessage]=\"subfield.infoMessage\" ></spa-date>\r\n \r\n <spa-datetime *ngSwitchCase=\"'datetime'\" [display]=\"subfield.alias ?? subfield.name | camelToWords\" [(value)]=\"data[subfield.name]\" (valueChange)=\"inputChanged(subfield, $event)\" [readonly]=\"testReadOnly(field) || testReadOnly(subfield)\" [min]=\"subfield.min\" [max]=\"subfield.max\" [infoMessage]=\"subfield.infoMessage\" ></spa-datetime>\r\n \r\n <ng-container *ngSwitchCase=\"'select'\">\r\n <ng-container *ngTemplateOutlet=\"dynamicSelectTemplate; context: {\r\n $implicit: field,\r\n field: field,\r\n data: data,\r\n testReadOnly: testReadOnly.bind(this),\r\n selectChanged: selectChanged.bind(this)\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n \r\n <spa-text *ngSwitchDefault [display]=\"subfield.alias ?? subfield.name | camelToWords\" [width]=\"subfield.width\" [options]=\"subfield.options\" [optionDisplay]=\"subfield.optionDisplay ?? 'name'\" [optionValue]=\"subfield.optionValue ?? 'value'\" [rows]=\"subfield.rows\" [(value)]=\"data[subfield.name]\" (valueChange)=\"inputChanged(subfield, $event)\" [required]=\"testRequired(subfield)\" [min]=\"subfield.min\" [max]=\"subfield.max\" [readonly]=\"testReadOnly(field) || testReadOnly(subfield)\" [hint]=\"subfield.hint\" [infoMessage]=\"subfield.infoMessage\" [suffix]=\"subfield.suffix\" [copyContent]=\"subfield.copyContent\" [clearContent]=\"subfield.clearContent\" [loadAction]=\"subfield.loadAction\"></spa-text>\r\n \r\n \r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n \r\n <spa-text *ngSwitchDefault [display]=\"field.alias ?? field.name | camelToWords\" [width]=\"field.width\" [options]=\"field.options\" [optionDisplay]=\"field.optionDisplay ?? 'name'\" [optionValue]=\"field.optionValue ?? 'value'\" [rows]=\"field.rows\" [(value)]=\"data[field.name]\" (valueChange)=\"inputChanged(field,data[field.name])\" [required]=\"testRequired(field)\" [min]=\"field.min\" [max]=\"field.max\" [readonly]=\"testReadOnly(field)\" [hint]=\"field.hint\" [infoMessage]=\"field.infoMessage\" [suffix]=\"field.suffix\" [copyContent]=\"field.copyContent\" [clearContent]=\"field.clearContent\" [loadAction]=\"field.loadAction\"></spa-text>\r\n \r\n </ng-container>\r\n \r\n </ng-container>\r\n \r\n </div>\r\n \r\n \r\n <div class=\"span-col-center\" *ngIf=\"config.button\">\r\n <button mat-raised-button color=\"primary\" (click)=\"buttonClicked()\" cdkFocusInitial>{{buttonDisplay}}</button>\r\n </div>\r\n \r\n \r\n </div>\r\n <div class=\"notes-section\" *ngIf=\"config.notesConfig\">\r\n <spa-notes\r\n [title]=\"config.notesConfig.title || 'Notes'\"\r\n [notes]=\"config.notesConfig.notes || []\"\r\n [loadAction]=\"config.notesConfig.loadAction\"\r\n [loadIDField]=\"config.notesConfig.loadIDField\"\r\n [data]=\"data\"\r\n [nameField]=\"config.notesConfig.nameField || 'createdByName'\"\r\n [dateField]=\"config.notesConfig.dateField || 'createdDate'\"\r\n [commentField]=\"config.notesConfig.commentField || 'details'\">\r\n </spa-notes>\r\n </div>\r\n</div>\r\n\r\n", styles: [".title{margin-top:1em;font-size:larger;font-weight:300}.composite-field-group{display:flex;flex-direction:row;flex-wrap:wrap;gap:12px}.tin-form-container{display:flex;flex-direction:row;width:100%;gap:16px}.width-100{width:100%!important}.width-75{width:70%!important}.notes-section{width:400px;border-left:1px solid #e0e0e0}\n"] }]
279
+ }], ctorParameters: function () { return [{ type: i1.MessageService }, { type: i2.DataServiceLib }, { type: i3.AuthService }]; }, propDecorators: { dynamicSelectTemplate: [{
280
+ type: ContentChild,
281
+ args: ['dynamicSelect']
282
+ }], files: [{
181
283
  type: Input
182
284
  }], data: [{
183
285
  type: Input
@@ -188,4 +290,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
188
290
  }], inputChange: [{
189
291
  type: Output
190
292
  }] } });
191
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90aW4tc3BhL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2Zvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBRzdDLGlFQUFpRTtBQUNqRSxvRUFBb0U7QUFPcEUsTUFBTSxPQUFPLGFBQWE7SUFFeEIsWUFBcUIsY0FBOEIsRUFBVSxXQUEyQjtRQUFuRSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFrRi9FLFVBQUssR0FBVSxFQUFFLENBQUM7UUFFM0Isa0JBQWEsR0FBRyxRQUFRLENBQUM7UUFDekIsaUJBQVksR0FBYSxLQUFLLENBQUM7UUFDL0IsZ0JBQVcsR0FBYSxLQUFLLENBQUM7UUFNcEIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQTdGaUQsQ0FBQztJQUU3RixRQUFRO1FBRU4sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFDO1lBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUE7WUFDekQsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyw0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QUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29uZmlnLCBGaWVsZCwgQnV0dG9uIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9DbGFzc2VzJztcclxuaW1wb3J0IHsgQ29yZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvVGluQ29yZSc7XHJcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWVzc2FnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGF0YVNlcnZpY2VMaWIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhbGliLnNlcnZpY2UnO1xyXG4vLyBpbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xyXG4vLyBpbXBvcnQgeyBEZXRhaWxzRGlhbG9nIH0gZnJvbSAnLi4vdGFibGUvZGV0YWlsc0RpYWxvZy5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzcGEtZm9ybScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Zvcm0uY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgY29uc3RydWN0b3IoIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLCBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZUxpYikgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIGlmICghdGhpcy5jb25maWcuZmllbGRzKXtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIlBsZWFzZSBDb25maWd1cmUgRm9ybSBGaWVsZHNcIilcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5kYXRhKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJQbGVhc2UgQ29uZmlndXJlIEZvcm0gRGF0YVwiKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWVsZHMgPSB0aGlzLmNvbmZpZy5maWVsZHM7XHJcblxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5tdWx0aUNvbHVtbil7XHJcbiAgICAgIHRoaXMubXVsdGlDb2x1bW4gPSB0aGlzLmNvbmZpZy5tdWx0aUNvbHVtblxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMubXVsdGlDb2x1bW4gPSB0aGlzLmZpZWxkcy5sZW5ndGggPiAyXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnPy5idXR0b24/LmRpc3BsYXkpe1xyXG4gICAgICB0aGlzLmJ1dHRvbkRpc3BsYXkgPSB0aGlzLmNvbmZpZy5idXR0b24uZGlzcGxheTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbGVGaWVsZCA9IHRoaXMuZmllbGRzLmZpbmQoeCA9PiB4LnR5cGUgPT0gJ2ZpbGUnKVxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZz8uYnV0dG9uPy5hY3Rpb24gJiYgdGhpcy5maWxlRmllbGQpIHtcclxuICAgICAgdGhpcy5jb25maWcuYnV0dG9uLmFjdGlvbi5pc0Zvcm1EYXRhID0gdHJ1ZTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGlsZEZpZWxkcyA9IHRoaXMuZmllbGRzLmZpbHRlcih4ID0+IHgubWFzdGVyRmllbGQpXHJcblxyXG4gICAgdGhpcy5jaGlsZEZpZWxkcy5mb3JFYWNoKGNoaWxkID0+IHtcclxuICAgICAgbGV0IG1hc3RlciA9IHRoaXMuZmllbGRzLmZpbmQoeCA9PiB4Lm5hbWUgPT0gY2hpbGQubWFzdGVyRmllbGQpXHJcbiAgICAgIHRoaXMudXBkYXRlQ2hpbGRPcHRpb25zKG1hc3Rlcik7XHJcblxyXG4gICAgfSk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gIH1cclxuXHJcbiAgZ2V0VmlzaWJsZUZpZWxkcygpe1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGRzPy5maWx0ZXIoeCA9PiBDb3JlLnRlc3RWaXNpYmxlKHRoaXMuY29uZmlnLCB0aGlzLmRhdGEsIHgpKVxyXG4gIH1cclxuXHJcblxyXG5cclxuICB0ZXN0UmVhZE9ubHkoZjogRmllbGQpOiBib29sZWFuIHtcclxuXHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLm1vZGUgPT0gJ2NyZWF0ZScpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmLnJlYWRvbmx5KSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWcubW9kZSA9PSAndmlldycpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGlmIChmLnJlYWRvbmx5Q29uZGl0aW9uKSB7XHJcbiAgICAgIHJldHVybiBmLnJlYWRvbmx5Q29uZGl0aW9uKHRoaXMuZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIGZpbGVOYW1lc1xyXG4gIGZpbGVGaWVsZDogRmllbGQ7XHJcbiAgZmlsZVZpZXdGaWVsZDogRmllbGQ7XHJcbiAgQElucHV0KCkgZmlsZXM6IGFueVtdID0gW107XHJcbiAgZmllbGRzOiBGaWVsZFtdO1xyXG4gIGJ1dHRvbkRpc3BsYXkgPSBcIlN1Ym1pdFwiO1xyXG4gIGlzUHJvY2Vzc2luZyA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtdWx0aUNvbHVtbiA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY2hpbGRGaWVsZHMgOiBGaWVsZFtdO1xyXG5cclxuICBASW5wdXQoKSBkYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgY29uZmlnOiBGb3JtQ29uZmlnO1xyXG4gIEBPdXRwdXQoKSBidXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgaW5wdXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIGlucHV0Q2hhbmdlZChmaWVsZCA6IEZpZWxkLCB2YWx1ZSl7XHJcblxyXG5cclxuICAgIHRoaXMuaW5wdXRDaGFuZ2UuZW1pdCh7IGZpZWxkOiBmaWVsZCwgdmFsdWU6IHZhbHVlfSlcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUNoaWxkT3B0aW9ucyhmaWVsZClcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWcubW9kZSA9PSAnY3JlYXRlJyAmJiBmaWVsZC5jaGlsZCl7XHJcblxyXG4gICAgICBsZXQgY2hpbGQgPSB0aGlzLmZpZWxkcy5maW5kKHggPT4geC5uYW1lID09IGZpZWxkLmNoaWxkLmNoaWxkRmllbGQpXHJcbiAgICAgIHRoaXMuZGF0YVtjaGlsZC5uYW1lXSA9IGZpZWxkLm9wdGlvbnMuZmluZCh4ID0+IHhbZmllbGQub3B0aW9uVmFsdWVdID09IHZhbHVlKVtmaWVsZC5jaGlsZC5jaGlsZFZhbHVlRmllbGRdXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBpZiAodGhpcy5jb25maWcubW9kZSA9PSAnY3JlYXRlJyAmJiBmaWVsZC5jaGlsZHJlbil7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQ2hpbGRyZW4gZm91bmRcIilcclxuXHJcbiAgICAgIGZpZWxkLmNoaWxkcmVuLmZvckVhY2goY2hpbGRDb25maWcgPT4ge1xyXG5cclxuICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmZpZWxkcy5maW5kKHggPT4geC5uYW1lID09IGNoaWxkQ29uZmlnLmNoaWxkRmllbGQpXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJDaGlsZCBmb3VuZFwiKVxyXG5cclxuICAgICAgICB0aGlzLmRhdGFbY2hpbGQubmFtZV0gPSBmaWVsZC5vcHRpb25zLmZpbmQoeCA9PiB4W2ZpZWxkLm9wdGlvblZhbHVlXSA9PSB2YWx1ZSlbY2hpbGRDb25maWcuY2hpbGRWYWx1ZUZpZWxkXVxyXG5cclxuICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHVwZGF0ZUNoaWxkT3B0aW9ucyhtYXN0ZXJGaWVsZDogRmllbGQpe1xyXG5cclxuICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRGaWVsZHMuZmluZCh4ID0+IHgubWFzdGVyRmllbGQgPT0gbWFzdGVyRmllbGQubmFtZSlcclxuICAgIGlmIChjaGlsZCAhPSBudWxsKSB7XHJcblxyXG4gICAgICAvL2N1cnJlbnQgaXMgbWFzdGVyXHJcblxyXG4gICAgICAvL2ZpbHRlciBjaGlsZCBvcHRpb25zIGJhc2VkIG9uIG1hc3RlciB2YWx1ZVxyXG4gICAgICBjaGlsZC5vcHRpb25zID0gY2hpbGQubWFzdGVyT3B0aW9ucy5maWx0ZXIoeCA9PiB4W21hc3RlckZpZWxkLm9wdGlvblZhbHVlXSA9PSB0aGlzLmRhdGFbbWFzdGVyRmllbGQubmFtZV0pXHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBoYW5kbGVJbmZvQ2xpY2soZmllbGQ6IEZpZWxkKSB7XHJcbiAgICBpZiAoZmllbGQuaW5mb01lc3NhZ2UpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5pbmZvKGZpZWxkLmluZm9NZXNzYWdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJ1dHRvbkNsaWNrZWQoKXtcclxuXHJcbiAgICB0aGlzLmJ1dHRvbkNsaWNrLmVtaXQodGhpcy5kYXRhKTtcclxuXHJcbiAgICBsZXQgYnV0dG9uID0gdGhpcy5jb25maWcuYnV0dG9uO1xyXG5cclxuICAgIGlmICghYnV0dG9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvL3ZhbGlkYXRpb25cclxuICAgIGxldCByZXNwID0gQ29yZS52YWxpZGF0ZU9iamVjdCh0aGlzLmdldFZpc2libGVGaWVsZHMoKSx0aGlzLmRhdGEpO1xyXG4gICAgaWYgKHJlc3AgIT0gJycpe1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KHJlc3ApXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA8IDEgJiYgdGhpcy5maWxlRmllbGQ/LnJlcXVpcmVkICYmIHRoaXMuY29uZmlnLm1vZGUgPT0nY3JlYXRlJykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiUGxlYXNlIGF0dGFjaCBmaWxlKHMpXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGlmIChidXR0b24uY29uZmlybSl7XHJcblxyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmNvbmZpcm0oYCR7YnV0dG9uLmNvbmZpcm0ubWVzc2FnZX1gKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQgPT0gXCJ5ZXNcIikge1xyXG4gICAgICAgICAgdGhpcy5wcm9jZXNzQ2FsbChidXR0b24pXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5wcm9jZXNzQ2FsbChidXR0b24pXHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc0NhbGwoYnV0dG9uOiBCdXR0b24pe1xyXG5cclxuICAgIGlmICghYnV0dG9uLmFjdGlvbikgcmV0dXJuXHJcblxyXG4gICAgbGV0IGRhdGFPdXQ7XHJcblxyXG4gICAgaWYgKGJ1dHRvbi5hY3Rpb24uaXNGb3JtRGF0YSl7XHJcblxyXG4gICAgICBsZXQgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChgdXBsb2FkRmlsZSR7aX1gLCB0aGlzLmZpbGVzW2ldLCB0aGlzLmZpbGVzW2ldLm5hbWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3JtRGF0YS5hcHBlbmQoXCJkYXRhXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpO1xyXG5cclxuXHJcbiAgICAgIGRhdGFPdXQgPSBmb3JtRGF0YVxyXG4gICAgfWVsc2V7XHJcblxyXG4gICAgICBkYXRhT3V0ID0gdGhpcy5kYXRhXHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IHRydWVcclxuICAgIHRoaXMuZGF0YVNlcnZpY2UuQ2FsbEFwaShidXR0b24uYWN0aW9uLCBkYXRhT3V0KS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2VcclxuXHJcbiAgICAgIGlmIChhcGlSZXNwb25zZS5zdWNjZXNzKSB7XHJcblxyXG4gICAgICAgIGlmIChidXR0b24uYWN0aW9uLnN1Y2Nlc3NNZXNzYWdlKSB7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KGJ1dHRvbi5hY3Rpb24uc3VjY2Vzc01lc3NhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiU3VibWl0dGVkXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnJlc2V0KSB7XHJcbiAgICAgICAgICBDb3JlLnJlc2V0T2JqZWN0KHRoaXMuZmllbGRzLCB0aGlzLmRhdGEpXHJcbiAgICAgICAgICB0aGlzLmZpbGVzID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIkVycm9yOiBcIiArIGFwaVJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb2Nlc3NGb3JtKCl7XHJcblxyXG5cclxuXHJcblxyXG5cclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuIiwiXHJcbjxkaXYgW25nQ2xhc3NdPVwibXVsdGlDb2x1bW4gPyAndGluLWdyaWQnIDogJ3Rpbi1jb2wnXCI+XHJcblxyXG4gIDxkaXYgW25nQ2xhc3NdPVwiZmllbGQuc3BhbiB8fCBmaWVsZC50eXBlID09J3NlY3Rpb24nIHx8IGZpZWxkLnR5cGUgPT0nZmlsZScgfHwgZmllbGQudHlwZSA9PSdmaWxlLXZpZXcnICA/ICdzcGFuLWNvbCcgOiAnJ1wiICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBnZXRWaXNpYmxlRmllbGRzKClcIj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICA+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJmaWVsZC50eXBlXCIgY2xhc3M9XCJoaWdobGlnaHRcIj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ3NlY3Rpb24nXCIgY2xhc3M9XCJ0aXRsZVwiPlxyXG4gICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOiBsYXJnZXI7XCI+e3tmaWVsZC5uYW1lIHwgY2FtZWxUb1dvcmRzfX08L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZmlsZSdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xIG1iLTJcIiAqbmdJZj1cImNvbmZpZy5tb2RlICE9J3ZpZXcnXCI+XHJcbiAgICAgICAgICAgIDxzcGEtYXR0YWNoIG1lc3NhZ2U9XCJEcmFnIGFuZCBEcm9wIGZpbGVzIGhlcmVcIiBbKGZpbGVzKV09XCJmaWxlc1wiPjwvc3BhLWF0dGFjaD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZmlsZS12aWV3J1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTEgbWItMlwiICpuZ0lmPVwiY29uZmlnLm1vZGUgJiYgY29uZmlnLm1vZGUgIT0nY3JlYXRlJ1wiPlxyXG4gICAgICAgICAgICA8c3BhLXZpZXdlciBbZmlsZUFjdGlvbl09XCJjb25maWcuZmlsZUFjdGlvblwiIFtwYXRoXT1cImZpZWxkLnBhdGhcIiBbZm9sZGVyTmFtZV09XCJkYXRhW2ZpZWxkLmtleUZpbGVkTmFtZV1cIiA+PC9zcGEtdmlld2VyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bGFiZWwgKm5nU3dpdGNoQ2FzZT1cIidibGFuaydcIj48L2xhYmVsPlxyXG5cclxuICAgICAgICA8c3BhLWxhYmVsICpuZ1N3aXRjaENhc2U9XCInbGFiZWwnXCIgW2Rpc3BsYXldPVwiZmllbGQuYWxpYXMgPz8gZmllbGQubmFtZSB8IGNhbWVsVG9Xb3Jkc1wiIFt2YWx1ZV09XCJkYXRhW2ZpZWxkLm5hbWVdXCIgKHZhbHVlQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChmaWVsZCwgZGF0YVtmaWVsZC5uYW1lXSlcIiA+PC9zcGEtbGFiZWw+XHJcblxyXG4gICAgICAgIDxzcGEtbnVtYmVyICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiIFtkaXNwbGF5XT1cImZpZWxkLmFsaWFzID8/IGZpZWxkLm5hbWUgfCBjYW1lbFRvV29yZHNcIiBbKHZhbHVlKV09XCJkYXRhW2ZpZWxkLm5hbWVdXCIgKHZhbHVlQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChmaWVsZCwgZGF0YVtmaWVsZC5uYW1lXSlcIiBbcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIiBbbWluXT1cImZpZWxkLm1pblwiIFttYXhdPVwiZmllbGQubWF4XCIgW3JlYWRvbmx5XT1cInRlc3RSZWFkT25seShmaWVsZClcIiBbaGludF09XCJmaWVsZC5oaW50XCIgW2luZm9NZXNzYWdlXT1cImZpZWxkLmluZm9NZXNzYWdlXCIgKGluZm9DbGljayk9XCJoYW5kbGVJbmZvQ2xpY2soZmllbGQpXCIgW3N1ZmZpeF09XCJmaWVsZC5zdWZmaXhcIj48L3NwYS1udW1iZXI+XHJcblxyXG4gICAgICAgIDxzcGEtbW9uZXkgKm5nU3dpdGNoQ2FzZT1cIidtb25leSdcIiBbZGlzcGxheV09XCJmaWVsZC5hbGlhcyA/PyBmaWVsZC5uYW1lIHwgY2FtZWxUb1dvcmRzXCIgWyh2YWx1ZSldPVwiZGF0YVtmaWVsZC5uYW1lXVwiICh2YWx1ZUNoYW5nZSk9XCJpbnB1dENoYW5nZWQoZmllbGQsIGRhdGFbZmllbGQubmFtZV0pXCIgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCIgW21pbl09XCJmaWVsZC5taW5cIiBbbWF4XT1cImZpZWxkLm1heFwiIFtyZWFkb25seV09XCJ0ZXN0UmVhZE9ubHkoZmllbGQpXCIgW2hpbnRdPVwiZmllbGQuaGludFwiIFtpbmZvTWVzc2FnZV09XCJmaWVsZC5pbmZvTWVzc2FnZVwiIChpbmZvQ2xpY2spPVwiaGFuZGxlSW5mb0NsaWNrKGZpZWxkKVwiPjwvc3BhLW1vbmV5PlxyXG5cclxuICAgICAgICA8c3BhLWNoZWNrICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCIgW2Rpc3BsYXldPVwiZmllbGQuYWxpYXMgPz8gZmllbGQubmFtZSB8IGNhbWVsVG9Xb3Jkc1wiIFsodmFsdWUpXT1cImRhdGFbZmllbGQubmFtZV1cIiAodmFsdWVDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGZpZWxkLCBkYXRhW2ZpZWxkLm5hbWVdKVwiIFtyZWFkb25seV09XCJ0ZXN0UmVhZE9ubHkoZmllbGQpXCIgW2luZm9NZXNzYWdlXT1cImZpZWxkLmluZm9NZXNzYWdlXCIgKGluZm9DbGljayk9XCJoYW5kbGVJbmZvQ2xpY2soZmllbGQpXCI+PC9zcGEtY2hlY2s+XHJcblxyXG4gICAgICAgIDxzcGEtZGF0ZSAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCIgW2Rpc3BsYXldPVwiZmllbGQuYWxpYXMgPz8gZmllbGQubmFtZSB8IGNhbWVsVG9Xb3Jkc1wiIFsodmFsdWUpXT1cImRhdGFbZmllbGQubmFtZV1cIiAodmFsdWVDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGZpZWxkLCBkYXRhW2ZpZWxkLm5hbWVdKVwiIFttaW5dPVwiZmllbGQ/Lm1pblwiIFttYXhdPVwiZmllbGQ/Lm1heFwiIFtyZWFkb25seV09XCJ0ZXN0UmVhZE9ubHkoZmllbGQpXCIgW2hpbnRdPVwiZmllbGQuaGludFwiIFtpbmZvTWVzc2FnZV09XCJmaWVsZC5pbmZvTWVzc2FnZVwiIChpbmZvQ2xpY2spPVwiaGFuZGxlSW5mb0NsaWNrKGZpZWxkKVwiPjwvc3BhLWRhdGU+XHJcblxyXG4gICAgICAgIDxzcGEtc2VsZWN0ICpuZ1N3aXRjaENhc2U9XCInc2VsZWN0J1wiXHJcbiAgICAgICAgICBbZGlzcGxheV09XCJmaWVsZC5hbGlhcyA/PyBmaWVsZC5uYW1lIHwgY2FtZWxUb1dvcmRzXCIgW251bGxhYmxlXT1cImZpZWxkLm51bGxhYmxlXCJcclxuICAgICAgICAgIFtvcHRpb25zXT1cImZpZWxkLm9wdGlvbnNcIiBbbWFzdGVyT3B0aW9uc109XCJmaWVsZC5tYXN0ZXJPcHRpb25zXCIgW29wdGlvbkRpc3BsYXldPVwiZmllbGQub3B0aW9uRGlzcGxheSA/PyAnbmFtZSdcIiBbb3B0aW9uVmFsdWVdPVwiZmllbGQub3B0aW9uVmFsdWUgPz8gJ3ZhbHVlJ1wiXHJcbiAgICAgICAgICBbKHZhbHVlKV09XCJkYXRhW2ZpZWxkLm5hbWVdXCIgW2RlZmF1bHRGaXJzdFZhbHVlXT1cImZpZWxkLmRlZmF1bHRGaXJzdFZhbHVlXCIgKHZhbHVlQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChmaWVsZCwgZGF0YVtmaWVsZC5uYW1lXSlcIlxyXG4gICAgICAgICAgW3JlYWRvbmx5XT1cInRlc3RSZWFkT25seShmaWVsZClcIlxyXG4gICAgICAgICAgW2hpbnRdPVwiZmllbGQuaGludFwiXHJcbiAgICAgICAgICBbcGVla0NvbmZpZ109XCJmaWVsZC5wZWVrQ29uZmlnXCJcclxuICAgICAgICAgIFtpbmZvTWVzc2FnZV09XCJmaWVsZC5pbmZvTWVzc2FnZVwiXHJcbiAgICAgICAgID5cclxuICAgICAgICA8L3NwYS1zZWxlY3Q+XHJcblxyXG4gICAgICAgIDxzcGEtc2VsZWN0ICpuZ1N3aXRjaENhc2U9XCInbXVsdGktc2VsZWN0J1wiIFtkaXNwbGF5XT1cImZpZWxkLmFsaWFzID8/IGZpZWxkLm5hbWUgfCBjYW1lbFRvV29yZHNcIiBbb3B0aW9uc109XCJmaWVsZC5vcHRpb25zXCIgW29wdGlvbkRpc3BsYXldPVwiZmllbGQub3B0aW9uRGlzcGxheSA/PyAnbmFtZSdcIiBbb3B0aW9uVmFsdWVdPVwiZmllbGQub3B0aW9uVmFsdWUgPz8gJ3ZhbHVlJ1wiIFsodmFsdWUpXT1cImRhdGFbZmllbGQubmFtZV1cIiAodmFsdWVDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGZpZWxkLCBkYXRhW2ZpZWxkLm5hbWVdKVwiIFtyZWFkb25seV09XCJ0ZXN0UmVhZE9ubHkoZmllbGQpXCIgW211bHRpcGxlXT1cInRydWVcIiBbaGludF09XCJmaWVsZC5oaW50XCIgW2luZm9NZXNzYWdlXT1cImZpZWxkLmluZm9NZXNzYWdlXCIgKGluZm9DbGljayk9XCJoYW5kbGVJbmZvQ2xpY2soZmllbGQpXCI+XHJcbiAgICAgICAgPC9zcGEtc2VsZWN0PlxyXG5cclxuICAgICAgICA8c3BhLXRleHQgKm5nU3dpdGNoRGVmYXVsdCBbZGlzcGxheV09XCJmaWVsZC5hbGlhcyA/PyBmaWVsZC5uYW1lIHwgY2FtZWxUb1dvcmRzXCIgW29wdGlvbnNdPVwiZmllbGQub3B0aW9uc1wiIFtvcHRpb25WYWx1ZV09XCJmaWVsZC5vcHRpb25WYWx1ZSA/PyAndmFsdWUnXCIgW3Jvd3NdPVwiZmllbGQucm93c1wiIFsodmFsdWUpXT1cImRhdGFbZmllbGQubmFtZV1cIiAodmFsdWVDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGZpZWxkLGRhdGFbZmllbGQubmFtZV0pXCIgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCIgW21pbl09XCJmaWVsZC5taW5cIiBbbWF4XT1cImZpZWxkLm1heFwiIFtyZWFkb25seV09XCJ0ZXN0UmVhZE9ubHkoZmllbGQpXCIgW2hpbnRdPVwiZmllbGQuaGludFwiIFtpbmZvTWVzc2FnZV09XCJmaWVsZC5pbmZvTWVzc2FnZVwiIChpbmZvQ2xpY2spPVwiaGFuZGxlSW5mb0NsaWNrKGZpZWxkKVwiIFtzdWZmaXhdPVwiZmllbGQuc3VmZml4XCI+PC9zcGEtdGV4dD5cclxuXHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8L2Rpdj5cclxuXHJcblxyXG4gIDxkaXYgY2xhc3M9XCJzcGFuLWNvbC1jZW50ZXJcIiAqbmdJZj1cImNvbmZpZy5idXR0b25cIj5cclxuICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgIChjbGljayk9XCJidXR0b25DbGlja2VkKClcIiAgY2RrRm9jdXNJbml0aWFsPnt7YnV0dG9uRGlzcGxheX19PC9idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG5cclxuPC9kaXY+XHJcbiJdfQ==
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90aW4tc3BhL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2Zvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBRTFHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUc3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVN2QyxNQUFNLE9BQU8sYUFBYTtJQUV4QixZQUFvQixjQUE4QixFQUFVLFdBQTJCLEVBQVUsV0FBd0I7UUFBckcsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFxRnpILGNBQVMsR0FBRyxLQUFLLENBQUM7UUFJVCxVQUFLLEdBQVUsRUFBRSxDQUFDO1FBRTNCLGtCQUFhLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBTW5CLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFwR2tGLENBQUM7SUFFOUgsUUFBUTtRQUVOLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFM0YsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsd0VBQXdFO1lBQ3hFLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBQztZQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO1lBQ3pELE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtZQUN2RCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBRWpDLDBEQUEwRDtRQUMxRCxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMzQixJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtnQkFDbkUsS0FBSyxDQUFDLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBUSxFQUFFLENBQUMsQ0FBQztnQkFFdEQsK0JBQStCO2dCQUMvQixLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDMUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7b0JBRTNCLGdEQUFnRDtvQkFDaEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUM3RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNyQztnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFHSCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFDO1lBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUE7U0FDM0M7YUFBSTtZQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1NBQzFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUM7WUFDL0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7U0FDakQ7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQTtRQUV4RCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3RHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBRTdDO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUd6RCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMvQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQy9ELElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BDO2lCQUFJO2dCQUNILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDdEM7UUFFSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzFCLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUdqQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBcUJELHlCQUF5QjtRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMxQixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUU7Z0JBQ2pELEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUNqQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTt3QkFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDM0Q7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUV2QywwREFBMEQ7UUFDMUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7YUFDN0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxLQUFLLENBQUMsZ0JBQWdCLEtBQUssVUFBVSxDQUFDLENBQUM7UUFFakUsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFFMUMsbUNBQW1DO1FBQ25DLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMvQixJQUFJO2dCQUNGLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFELElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRTtvQkFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsZUFBZSxDQUFDO2lCQUN6QzthQUNGO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsS0FBSyxDQUFDLElBQUksR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzFFO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBYTtRQUMvQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFHM0csQ0FBQztJQUdELGdCQUFnQjtRQUNkLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFMUksNkNBQTZDO1FBQzdDLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUMxQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzdGLE9BQU8sQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDO2FBQ2pDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBWTtRQUN2QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxZQUFZLENBQUMsS0FBWTtRQUN2QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxhQUFhLENBQUMsS0FBWTtRQUN4QixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQzVCLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1NBQ3BDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLFdBQW1CO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDL0IsS0FBSyxDQUFDLE9BQU8sS0FBSyxXQUFXO1lBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUMxRixJQUFJLEtBQUssQ0FBQztJQUNiLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFZO1FBQ2hDLElBQUksS0FBSyxDQUFDLGtCQUFrQixFQUFFO1lBQzVCLE9BQU8sS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM1QztRQUNELE9BQU8sS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUdELFdBQVcsQ0FBQyxLQUFpQixFQUFFLFdBQW1CO1FBQ2hELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBR0QsYUFBYSxDQUFDLEtBQVk7UUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUUsQ0FBQTtJQUNsRCxDQUFDO0lBSUQsWUFBWSxDQUFDLEtBQWEsRUFBRSxLQUFLO1FBRS9CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtRQUVwRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBR25DLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUM7WUFDakQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQ25DLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUE7Z0JBQ25FLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1lBQ3hILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUVoQyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsZUFBdUI7UUFFeEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLGVBQWUsQ0FBQyxDQUFBO1FBQ3hFLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtZQUVqQixtQkFBbUI7WUFHbkIsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFDO2dCQUN0QixLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUE7YUFDM0g7aUJBQUk7Z0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO2FBQ3hDO1NBRUY7SUFDSCxDQUFDO0lBRU8sc0JBQXNCLENBQUMsS0FBWTtRQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVU7WUFBRSxPQUFPO1FBRTlCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUF3QixFQUFFLEVBQUU7WUFDaEYsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFO2dCQUV2QixLQUFLLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDNUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFHRCxhQUFhO1FBRVgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBRWhDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxPQUFPO1NBQ1I7UUFFRCxZQUFZO1FBQ1osSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEUsSUFBSSxJQUFJLElBQUksRUFBRSxFQUFDO1lBQ2IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDL0IsT0FBTztTQUNSO1FBSUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUcsUUFBUSxFQUFFO1lBQ3BGLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDbkQsT0FBTztTQUNSO1FBR0QsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFDO1lBRWpCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUM1RSxJQUFJLE1BQU0sSUFBSSxLQUFLLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUE7aUJBQ3pCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FFSjthQUFJO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUN6QjtJQUtILENBQUM7SUFFRCxXQUFXLENBQUMsTUFBYztRQUV4QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFBRSxPQUFNO1FBRTFCLElBQUksT0FBTyxDQUFDO1FBRVosSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBQztZQUUzQixJQUFJLFFBQVEsR0FBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0RTtZQUVELFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFHbkQsT0FBTyxHQUFHLFFBQVEsQ0FBQTtTQUNuQjthQUFJO1lBRUgsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUE7U0FDcEI7UUFLRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQTtRQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3pFLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFBO1lBRXpCLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRTtnQkFFdkIsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRTtvQkFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDekQ7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ3hDO2dCQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQ3hDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNoQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztpQkFDL0I7YUFHRjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzVEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztJQU1YLENBQUM7OzBHQTFWVSxhQUFhOzhGQUFiLGFBQWEscVNDZDFCLHNyYUFtSkE7MkZEcklhLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsVUFBVTs0SkF5RlcscUJBQXFCO3NCQUFuRCxZQUFZO3VCQUFDLGVBQWU7Z0JBTXBCLEtBQUs7c0JBQWIsS0FBSztnQkFRRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbmZpZywgRmllbGQsIEJ1dHRvbiwgQXBpUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9jbGFzc2VzL0NsYXNzZXMnO1xyXG5pbXBvcnQgeyBDb3JlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9UaW5Db3JlJztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZUxpYiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGFsaWIuc2VydmljZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzcGEtZm9ybScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Zvcm0uY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsIHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlTGliLCBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIHRoaXMuaGFzQWNjZXNzID0gQ29yZS5oYXNGb3JtQWNjZXNzKHRoaXMuY29uZmlnLCB0aGlzLmF1dGhTZXJ2aWNlLmN1cnJlbnRSb2xlU291cmNlLnZhbHVlKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuaGFzQWNjZXNzKSB7XHJcbiAgICAgIC8vIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoJ0FjY2VzcyBkZW5pZWQnKTsgLy8gT3B0aW9uYWwgLSBub3RpZnkgdXNlclxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5maWVsZHMpe1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiUGxlYXNlIENvbmZpZ3VyZSBGb3JtIEZpZWxkc1wiKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmRhdGEpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIlBsZWFzZSBDb25maWd1cmUgRm9ybSBEYXRhXCIpXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpZWxkcyA9IHRoaXMuY29uZmlnLmZpZWxkcztcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIEJlaGF2aW9yU3ViamVjdHMgZm9yIGZpZWxkcyB3aXRoIGxvYWRBY3Rpb25zXHJcbiAgICB0aGlzLmZpZWxkcz8uZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgIGlmIChmaWVsZC5sb2FkQWN0aW9uICYmICFmaWVsZC5vcHRpb25zU3ViamVjdCAmJiAhZmllbGQubWFzdGVyRmllbGQpIHtcclxuICAgICAgICBmaWVsZC5vcHRpb25zU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcclxuXHJcbiAgICAgICAgLy8gU3Vic2NyaWJlIHRvIG9wdGlvbnMgY2hhbmdlc1xyXG4gICAgICAgIGZpZWxkLm9wdGlvbnNTdWJqZWN0LnN1YnNjcmliZShuZXdPcHRpb25zID0+IHtcclxuICAgICAgICAgIGZpZWxkLm9wdGlvbnMgPSBuZXdPcHRpb25zO1xyXG5cclxuICAgICAgICAgIC8vIFVwZGF0ZSBjaGlsZCBmaWVsZHMgdGhhdCBkZXBlbmQgb24gdGhpcyBmaWVsZFxyXG4gICAgICAgICAgaWYgKHRoaXMuY2hpbGRGaWVsZHM/LnNvbWUoeCA9PiB4Lm1hc3RlckZpZWxkID09PSBmaWVsZC5uYW1lKSkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkT3B0aW9ucyhmaWVsZC5uYW1lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5tdWx0aUNvbHVtbil7XHJcbiAgICAgIHRoaXMubXVsdGlDb2x1bW4gPSB0aGlzLmNvbmZpZy5tdWx0aUNvbHVtblxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMubXVsdGlDb2x1bW4gPSB0aGlzLmZpZWxkcy5sZW5ndGggPiAyXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnPy5idXR0b24/LmRpc3BsYXkpe1xyXG4gICAgICB0aGlzLmJ1dHRvbkRpc3BsYXkgPSB0aGlzLmNvbmZpZy5idXR0b24uZGlzcGxheTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbGVGaWVsZCA9IHRoaXMuZmllbGRzLmZpbmQoeCA9PiB4LnR5cGUgPT0gJ2ZpbGUnKVxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZz8uYnV0dG9uPy5hY3Rpb24gJiYgdGhpcy5maWxlRmllbGQgfHwgdGhpcy5jb25maWc/LmJ1dHRvbj8uYWN0aW9uLnVybC5pbmNsdWRlcyhcIi9mb3JtXCIpKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnLmJ1dHRvbi5hY3Rpb24uaXNGb3JtRGF0YSA9IHRydWU7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hpbGRGaWVsZHMgPSB0aGlzLmZpZWxkcy5maWx0ZXIoeCA9PiB4Lm1hc3RlckZpZWxkKVxyXG5cclxuXHJcbiAgICB0aGlzLmNoaWxkRmllbGRzLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICBsZXQgbWFzdGVyID0gdGhpcy5maWVsZHMuZmluZCh4ID0+IHgubmFtZSA9PSBjaGlsZC5tYXN0ZXJGaWVsZClcclxuICAgICAgaWYgKGNoaWxkLmxvYWRBY3Rpb24pIHtcclxuICAgICAgICB0aGlzLmxvYWRDaGlsZE1hc3Rlck9wdGlvbnMoY2hpbGQpO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkT3B0aW9ucyhtYXN0ZXIubmFtZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgaWYgKGZpZWxkLmxvYWRBY3Rpb24pIHtcclxuICAgICAgICB0aGlzLmxvYWRDaGlsZE1hc3Rlck9wdGlvbnMoZmllbGQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmluaXRpYWxpemVDb21wb3NpdGVGaWVsZHMoKTtcclxuXHJcblxyXG4gICAgdGhpcy5hcHBseVZhbHVlQ2FsY3VsYXRpb25zKCk7XHJcbiAgfVxyXG5cclxuICBAQ29udGVudENoaWxkKCdkeW5hbWljU2VsZWN0JykgZHluYW1pY1NlbGVjdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBoYXNBY2Nlc3MgPSBmYWxzZTtcclxuICBmaWxlTmFtZXNcclxuICBmaWxlRmllbGQ6IEZpZWxkO1xyXG4gIGZpbGVWaWV3RmllbGQ6IEZpZWxkO1xyXG4gIEBJbnB1dCgpIGZpbGVzOiBhbnlbXSA9IFtdO1xyXG4gIGZpZWxkczogRmllbGRbXTtcclxuICBidXR0b25EaXNwbGF5ID0gXCJTdWJtaXRcIjtcclxuICBpc1Byb2Nlc3Npbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtdWx0aUNvbHVtbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjaGlsZEZpZWxkczogRmllbGRbXTtcclxuXHJcbiAgQElucHV0KCkgZGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIGNvbmZpZzogRm9ybUNvbmZpZztcclxuICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGlucHV0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBpbml0aWFsaXplQ29tcG9zaXRlRmllbGRzKCkge1xyXG4gICAgdGhpcy5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnY29tcG9zaXRlJyAmJiBmaWVsZC5zdWJmaWVsZHMpIHtcclxuICAgICAgICBmaWVsZC5zdWJmaWVsZHMuZm9yRWFjaChzdWJmaWVsZCA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5kYXRhW3N1YmZpZWxkLm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhW3N1YmZpZWxkLm5hbWVdID0gQ29yZS5nZXRJbml0aWFsVmFsdWUoc3ViZmllbGQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlWYWx1ZUNhbGN1bGF0aW9ucygpIHtcclxuICAgIGlmICghdGhpcy5kYXRhIHx8ICF0aGlzLmZpZWxkcykgcmV0dXJuO1xyXG4gICAgXHJcbiAgICAvLyBHZXQgdmlzaWJsZSBmaWVsZHMgdGhhdCBoYXZlIHZhbHVlQ2FsY3VsYXRpb24gZnVuY3Rpb25zXHJcbiAgICBjb25zdCBjYWxjdWxhdGVkRmllbGRzID0gdGhpcy5nZXRWaXNpYmxlRmllbGRzKClcclxuICAgICAgLmZpbHRlcihmaWVsZCA9PiB0eXBlb2YgZmllbGQudmFsdWVDYWxjdWxhdGlvbiA9PT0gJ2Z1bmN0aW9uJyk7XHJcbiAgICBcclxuICAgIGlmIChjYWxjdWxhdGVkRmllbGRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgXHJcbiAgICAvLyBBcHBseSBjYWxjdWxhdGlvbnMgdG8gZWFjaCBmaWVsZFxyXG4gICAgY2FsY3VsYXRlZEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBjYWxjdWxhdGVkVmFsdWUgPSBmaWVsZC52YWx1ZUNhbGN1bGF0aW9uKHRoaXMuZGF0YSk7XHJcbiAgICAgICAgaWYgKGNhbGN1bGF0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFbZmllbGQubmFtZV0gPSBjYWxjdWxhdGVkVmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNhbGN1bGF0aW5nIHZhbHVlIGZvciBmaWVsZCAke2ZpZWxkLm5hbWV9OmAsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRWaXNpYmxlU3ViZmllbGRzKGZpZWxkIDogRmllbGQpe1xyXG4gICAgcmV0dXJuIENvcmUuZ2V0VmlzaWJsZVN1YmZpZWxkcyh0aGlzLmNvbmZpZywgdGhpcy5kYXRhLCBmaWVsZCwgdGhpcy5hdXRoU2VydmljZS5jdXJyZW50Um9sZVNvdXJjZS52YWx1ZSk7XHJcblxyXG5cclxuICB9XHJcblxyXG5cclxuICBnZXRWaXNpYmxlRmllbGRzKCkge1xyXG4gICAgbGV0IHZpc2libGVGaWVsZHMgPSB0aGlzLmZpZWxkcz8uZmlsdGVyKHggPT4gQ29yZS50ZXN0VmlzaWJsZSh0aGlzLmNvbmZpZywgdGhpcy5kYXRhLCB4LCB0aGlzLmF1dGhTZXJ2aWNlLmN1cnJlbnRSb2xlU291cmNlLnZhbHVlKSkgPz8gW107XHJcblxyXG4gICAgLy8gRmlsdGVyIG91dCBmaWVsZHMgdW5kZXIgY29sbGFwc2VkIHNlY3Rpb25zXHJcbiAgICByZXR1cm4gdmlzaWJsZUZpZWxkcy5maWx0ZXIoZmllbGQgPT4ge1xyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3NlY3Rpb24nKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKGZpZWxkLnNlY3Rpb24pIHtcclxuICAgICAgICBjb25zdCBzZWN0aW9uRmllbGQgPSB0aGlzLmZpZWxkcy5maW5kKGYgPT4gZi50eXBlID09PSAnc2VjdGlvbicgJiYgZi5uYW1lID09PSBmaWVsZC5zZWN0aW9uKTtcclxuICAgICAgICByZXR1cm4gIXNlY3Rpb25GaWVsZD8uY29sbGFwc2VkO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0ZXN0UmVhZE9ubHkoZmllbGQ6IEZpZWxkKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gQ29yZS50ZXN0UmVhZE9ubHkodGhpcy5jb25maWcsIHRoaXMuZGF0YSwgZmllbGQpO1xyXG4gIH1cclxuXHJcbiAgdGVzdFJlcXVpcmVkKGZpZWxkOiBGaWVsZCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIENvcmUudGVzdFJlcXVpcmVkKHRoaXMuY29uZmlnLCB0aGlzLmRhdGEsIGZpZWxkKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb24oZmllbGQ6IEZpZWxkKSB7XHJcbiAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3NlY3Rpb24nKSB7XHJcbiAgICAgIGZpZWxkLmNvbGxhcHNlZCA9ICFmaWVsZC5jb2xsYXBzZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYXNTZWN0aW9uRmllbGRzKHNlY3Rpb25OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpZWxkcz8uc29tZShmaWVsZCA9PlxyXG4gICAgICBmaWVsZC5zZWN0aW9uID09PSBzZWN0aW9uTmFtZSAmJlxyXG4gICAgICBDb3JlLnRlc3RWaXNpYmxlKHRoaXMuY29uZmlnLCB0aGlzLmRhdGEsIGZpZWxkLCB0aGlzLmF1dGhTZXJ2aWNlLmN1cnJlbnRSb2xlU291cmNlLnZhbHVlKVxyXG4gICAgKSA/PyBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNob3VsZFNlY3Rpb25Db2xsYXBzZShmaWVsZDogRmllbGQpOiBib29sZWFuIHtcclxuICAgIGlmIChmaWVsZC5jb2xsYXBzZWRDb25kaXRpb24pIHtcclxuICAgICAgcmV0dXJuIGZpZWxkLmNvbGxhcHNlZENvbmRpdGlvbih0aGlzLmRhdGEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpZWxkLmNvbGxhcHNlZCA/PyBmYWxzZTtcclxuICB9XHJcblxyXG5cclxuICBvbkluZm9DbGljayhldmVudDogTW91c2VFdmVudCwgaW5mb01lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmluZm8oaW5mb01lc3NhZ2UpO1xyXG4gIH1cclxuXHJcblxyXG4gIHNlbGVjdENoYW5nZWQoZmllbGQ6IEZpZWxkKXtcclxuICAgIHRoaXMuaW5wdXRDaGFuZ2VkKGZpZWxkLCB0aGlzLmRhdGFbZmllbGQubmFtZV0gKVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBpbnB1dENoYW5nZWQoZmllbGQgOiBGaWVsZCwgdmFsdWUpe1xyXG5cclxuICAgIHRoaXMuaW5wdXRDaGFuZ2UuZW1pdCh7IGZpZWxkOiBmaWVsZCwgdmFsdWU6IHZhbHVlfSlcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUNoaWxkT3B0aW9ucyhmaWVsZC5uYW1lKVxyXG5cclxuXHJcbiAgICBpZiAodGhpcy5jb25maWcubW9kZSA9PSAnY3JlYXRlJyAmJiBmaWVsZC5jaGlsZHJlbil7XHJcbiAgICAgIGZpZWxkLmNoaWxkcmVuLmZvckVhY2goY2hpbGRDb25maWcgPT4ge1xyXG4gICAgICAgIGxldCBjaGlsZCA9IHRoaXMuZmllbGRzLmZpbmQoeCA9PiB4Lm5hbWUgPT0gY2hpbGRDb25maWcuY2hpbGRGaWVsZClcclxuICAgICAgICB0aGlzLmRhdGFbY2hpbGQubmFtZV0gPSBmaWVsZC5vcHRpb25zLmZpbmQoeCA9PiB4W2ZpZWxkLm9wdGlvblZhbHVlID8/ICd2YWx1ZSddID09IHZhbHVlKVtjaGlsZENvbmZpZy5jaGlsZFZhbHVlRmllbGRdXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXBwbHlWYWx1ZUNhbGN1bGF0aW9ucygpO1xyXG5cclxuICB9XHJcblxyXG4gIHVwZGF0ZUNoaWxkT3B0aW9ucyhtYXN0ZXJGaWVsZE5hbWU6IHN0cmluZyl7XHJcblxyXG4gICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZEZpZWxkcy5maW5kKHggPT4geC5tYXN0ZXJGaWVsZCA9PSBtYXN0ZXJGaWVsZE5hbWUpXHJcbiAgICBpZiAoY2hpbGQgIT0gbnVsbCkge1xyXG5cclxuICAgICAgLy9jdXJyZW50IGlzIG1hc3RlclxyXG5cclxuXHJcbiAgICAgIGlmIChjaGlsZC5tYXN0ZXJPcHRpb25zKXtcclxuICAgICAgICBjaGlsZC5vcHRpb25zID0gY2hpbGQubWFzdGVyT3B0aW9ucy5maWx0ZXIoeCA9PiB4W2NoaWxkLm1hc3Rlck9wdGlvblZhbHVlID8/ICdtYXN0ZXJWYWx1ZSddID09IHRoaXMuZGF0YVttYXN0ZXJGaWVsZE5hbWVdKVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIk1hc3RlciBPcHRpb25zIG5vdCBmb3VuZFwiKVxyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkQ2hpbGRNYXN0ZXJPcHRpb25zKGNoaWxkOiBGaWVsZCkge1xyXG4gICAgaWYgKCFjaGlsZC5sb2FkQWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5kYXRhU2VydmljZS5DYWxsQXBpKGNoaWxkLmxvYWRBY3Rpb24pLnN1YnNjcmliZSgoYXBpUmVzcG9uc2U6IEFwaVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIGlmIChhcGlSZXNwb25zZS5zdWNjZXNzKSB7XHJcblxyXG4gICAgICAgIGNoaWxkLm1hc3Rlck9wdGlvbnMgPSBhcGlSZXNwb25zZS5kYXRhO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2hpbGRPcHRpb25zKGNoaWxkLm1hc3RlckZpZWxkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgYnV0dG9uQ2xpY2tlZCgpe1xyXG5cclxuICAgIHRoaXMuYnV0dG9uQ2xpY2suZW1pdCh0aGlzLmRhdGEpO1xyXG5cclxuICAgIGxldCBidXR0b24gPSB0aGlzLmNvbmZpZy5idXR0b247XHJcblxyXG4gICAgaWYgKCFidXR0b24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vdmFsaWRhdGlvblxyXG4gICAgbGV0IHJlc3AgPSBDb3JlLnZhbGlkYXRlT2JqZWN0KHRoaXMuZ2V0VmlzaWJsZUZpZWxkcygpLHRoaXMuZGF0YSk7XHJcbiAgICBpZiAocmVzcCAhPSAnJyl7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QocmVzcClcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgaWYgKHRoaXMuZmlsZXMubGVuZ3RoIDwgMSAmJiB0aGlzLmZpbGVGaWVsZD8ucmVxdWlyZWQgJiYgdGhpcy5jb25maWcubW9kZSA9PSdjcmVhdGUnKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJQbGVhc2UgYXR0YWNoIGZpbGUocylcIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgaWYgKGJ1dHRvbi5jb25maXJtKXtcclxuXHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuY29uZmlybShgJHtidXR0b24uY29uZmlybS5tZXNzYWdlfWApLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PSBcInllc1wiKSB7XHJcbiAgICAgICAgICB0aGlzLnByb2Nlc3NDYWxsKGJ1dHRvbilcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLnByb2Nlc3NDYWxsKGJ1dHRvbilcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgfVxyXG5cclxuICBwcm9jZXNzQ2FsbChidXR0b246IEJ1dHRvbil7XHJcblxyXG4gICAgaWYgKCFidXR0b24uYWN0aW9uKSByZXR1cm5cclxuXHJcbiAgICBsZXQgZGF0YU91dDtcclxuXHJcbiAgICBpZiAoYnV0dG9uLmFjdGlvbi5pc0Zvcm1EYXRhKXtcclxuXHJcbiAgICAgIGxldCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGB1cGxvYWRGaWxlJHtpfWAsIHRoaXMuZmlsZXNbaV0sIHRoaXMuZmlsZXNbaV0ubmFtZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvcm1EYXRhLmFwcGVuZChcImRhdGFcIiwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhKSk7XHJcblxyXG5cclxuICAgICAgZGF0YU91dCA9IGZvcm1EYXRhXHJcbiAgICB9ZWxzZXtcclxuXHJcbiAgICAgIGRhdGFPdXQgPSB0aGlzLmRhdGFcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IHRydWVcclxuICAgIHRoaXMuZGF0YVNlcnZpY2UuQ2FsbEFwaShidXR0b24uYWN0aW9uLCBkYXRhT3V0KS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2VcclxuXHJcbiAgICAgIGlmIChhcGlSZXNwb25zZS5zdWNjZXNzKSB7XHJcblxyXG4gICAgICAgIGlmIChidXR0b24uYWN0aW9uLnN1Y2Nlc3NNZXNzYWdlKSB7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KGJ1dHRvbi5hY3Rpb24uc3VjY2Vzc01lc3NhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiU3VibWl0dGVkXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnJlc2V0KSB7XHJcbiAgICAgICAgICBDb3JlLnJlc2V0T2JqZWN0KHRoaXMuZmllbGRzLCB0aGlzLmRhdGEpXHJcbiAgICAgICAgICB0aGlzLmZpbGVzID0gW107XHJcbiAgICAgICAgICB0aGlzLmFwcGx5VmFsdWVDYWxjdWxhdGlvbnMoKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiRXJyb3I6IFwiICsgYXBpUmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc0Zvcm0oKXtcclxuXHJcblxyXG5cclxuXHJcblxyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG4iLCJcclxuXHJcblxyXG48ZGl2IGNsYXNzPVwidGluLWZvcm0tY29udGFpbmVyXCIgPlxyXG4gIDxkaXYgW25nQ2xhc3NdPVwiW211bHRpQ29sdW1uID8gJ3Rpbi1ncmlkJyA6ICd0aW4tY29sJywgY29uZmlnLm5vdGVzQ29uZmlnID8gJ3dpZHRoLTc1JyA6ICd3aWR0aC0xMDAnXVwiIGNsYXNzPVwiZm9ybS1tYWluLWNvbnRlbnRcIj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiIWhhc0FjY2Vzc1wiIGNsYXNzPVwidGluLWNlbnRlclwiPlxyXG4gICAgICA8cD48ZW0+QWNjZXNzIFJlc3RyaWN0ZWQ8L2VtPjwvcD5cclxuICAgIDwvZGl2PlxyXG4gIFxyXG4gICAgPGRpdiBbbmdDbGFzc109XCJmaWVsZC5zcGFuIHx8IGZpZWxkLnR5cGUgPT0nc2VjdGlvbicgfHwgZmllbGQudHlwZSA9PSdmaWxlJyB8fCBmaWVsZC50eXBlID09J2ZpbGUtdmlldycgID8gJ3NwYW4tY29sJyA6ICcnXCIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGdldFZpc2libGVGaWVsZHMoKVwiPlxyXG4gIFxyXG4gICAgICA8bmctY29udGFpbmVyPlxyXG4gIFxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImZpZWxkLnR5cGVcIiBjbGFzcz1cImhpZ2hsaWdodFwiPlxyXG4gIFxyXG4gICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ3NlY3Rpb24nXCIgY2xhc3M9XCJ0aXRsZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24oZmllbGQpXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogbGFyZ2VyO21hcmdpbi1yaWdodDogMTBweDtcIj57e2ZpZWxkLmFsaWFzID8/IGZpZWxkLm5hbWUgfCBjYW1lbFRvV29yZHN9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImZpZWxkLmluZm9NZXNzYWdlXCIgKGNsaWNrKT1cIm9uSW5mb0NsaWNrKCRldmVudCwgZmllbGQuaW5mb01lc3NhZ2UpXCIgc3R5bGU9XCJjb2xvcjogc3RlZWxibHVlOyBmb250LXNpemU6IDE0cHg7XCI+aW5mbzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiAgbWF0LWljb24tYnV0dG9uIGNsYXNzPVwiaW5mby1pY29uLWJ1dHRvblwiICBtYXRUb29sdGlwPVwiSW5mb1wiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XHJcbiAgXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cclxuICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiaGFzU2VjdGlvbkZpZWxkcyhmaWVsZC5uYW1lKVwiPnt7c2hvdWxkU2VjdGlvbkNvbGxhcHNlKGZpZWxkKSA/ICdleHBhbmRfbW9yZScgOiAnZXhwYW5kX2xlc3MnfX08L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZmlsZSdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTEgbWItMlwiICpuZ0lmPVwiY29uZmlnLm1vZGUgIT0ndmlldydcIj5cclxuICAgICAgICAgICAgICA8c3BhLWF0dGFjaCBbbWVzc2FnZV09XCJmaWVsZC5hbGlhcyA/PyAnRHJhZyBhbmQgRHJvcCBmaWxlcyBoZXJlJ1wiIFsoZmlsZXMpXT1cImZpbGVzXCIgW2ZpbGVPcHRpb25zXT1cImZpZWxkLmZpbGVPcHRpb25zXCI+PC9zcGEtYXR0YWNoPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gIFxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ZpbGUtdmlldydcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTEgbWItMlwiICpuZ0lmPVwiY29uZmlnLm1vZGUgJiYgY29uZmlnLm1vZGUgIT0nY3JlYXRlJ1wiPlxyXG4gICAgICAgICAgICAgIDxzcGEtdmlld2VyIFtmaWxlQWN0aW9uXT1cImZpZWxkLmxvYWRBY3Rpb25cIiBbcGF0aF09XCJmaWVsZC5wYXRoXCIgW2ZvbGRlck5hbWVdPVwiZGF0YVtmaWVsZC5rZXlGaWVsZF1cIiA+PC9zcGEtdmlld2VyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gIFxyXG4gICAgICAgICAgPHNwYS1odG1sICpuZ1N3aXRjaENhc2U9XCInaHRtbCdcIiBbZGlzcGxheV09XCJmaWVsZC5hbGlhcyB8IGNhbWVsVG9Xb3Jkc1wiIFt2YWx1ZV09XCJkYXRhW2ZpZWxkLm5hbWVdXCIgW21heEhlaWdodF09XCJmaWVsZC5tYXhIZWlnaHRcIj48L3NwYS1odG1sPlxyXG4gIFxyXG4gICAgICAgICAgPGxhYmVsICpuZ1N3aXRjaENhc2U9XCInYmxhbmsnXCI+PC9sYWJlbD5cclxuICBcclxuICAgICAgICAgIDxsYWJlbCAqbmdTd2l0Y2hDYXNlPVwiJ3N0cmluZydcIiBbbmdTdHlsZV09XCJ7J2ZvbnQtc2l6ZSc6ZmllbGQuc2l6ZSA/PyAnMTRweCd9XCIgPnt7ZGF0YVtmaWVsZC5uYW1lXSA/PyBmaWVsZC5hbGlhcyA/PyBmaWVsZC5uYW1lfX0ge3tmaWVsZC5zdWZmaXggPz8gJyd9fTwvbGFiZWw+XHJcbiAgXHJcbiAgICAgICAgICA8c3BhLWxhYmVsICpuZ1N3aXRjaENhc2U9XCInbGFiZWwnXCIgW2Rpc3BsYXldPVwiZmllbGQuYWxpYXMgPz8gZmllbGQubmFtZSB8IGNhbWVsVG9Xb3Jkc1wiIFt2YWx1ZV09XCJkYXRhW2ZpZWxkLm5hbWVdXCIgKHZhbHVlQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChmaWVsZCwgZGF0YVtmaWVsZC5uYW1lXSlcIiBbZm9ybWF0XT1cImZpZWxkLmZvcm1hdCA/PyAndGV4dCdcIiBbc3VmZml4XT1cImZpZWxkLnN1ZmZpeFwiPjwvc3BhLWxhYmVsPlxyXG4gIFxyXG4gICAgICAgICAgPHNwYS1udW1iZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCIgW2Rpc3BsYXldPVwiZmllbGQuYWxpYXMgPz8gZmllbGQubmFtZSB8IGNhbWVsVG9Xb3Jkc1wiIFt3aWR0aF09XCJmaWVsZC53aWR0aFwiIFsodmFsdWUpXT1cImRhdGFbZmllbGQubmFtZV1cIiAodmFsdWVDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGZpZWxkLCBkYXRhW2ZpZWxkLm5hbWVdKVwiIFtyZXF1aXJlZF09XCJ0ZXN0UmVxdWlyZWQoZmllbGQpXCIgW21pbl09XCJmaWVsZC5taW5cIiBbbWF4XT1cImZpZWxkLm1heFwiIFtyZWFkb25seV09XCJ0ZXN0UmVhZE9ubHkoZmllbGQpXCIgW2hpbnRdPVwiZmllbGQuaGludFwiIFtpbmZvTWVzc2FnZV09XCJmaWVsZC5pbmZvTWVzc2FnZVwiIFtzdWZmaXhdPVwiZmllbGQuc3VmZml4XCIgW2NvcHlDb250ZW50XT1cImZpZWxkLmNvcHlDb250ZW50XCIgW2NsZWFyQ29udGVudF09XCJmaWVsZC5jbGVhckNvbnRlbnRcIj48L3NwYS1udW1iZXI+XHJcbiAgXHJcbiAgICAgICAgICA8c3BhLW1vbmV5ICpuZ1N3aXRjaENhc2U9XCInbW9uZXknXCIgW2Rpc3BsYXldPVwiZmllbGQuYWxpYXMgPz8gZmllbGQubmFtZSB8IGNhbWVsVG9Xb3Jkc1wiIFt3aWR0aF09XCJmaWVsZC53aWR0aFwiIFsodmFsdWUpXT1cImRhdGFbZmllbGQubmFtZV1cIiAodmFsdWVDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGZpZWxkLCBkYXRhW2ZpZWxkLm5hbWVdKVwiIFtyZXF1aXJlZF09XCJ0ZXN0UmVxdWlyZWQoZmllbGQpXCIgW21pbl09XCJmaWVsZC5taW5cIiBbbWF4XT1cImZpZWxkLm1heFwiIFtyZWFkb25seV09XCJ0ZXN0UmVhZE9ubHkoZmllbGQpXCIgW2hpbnRdPVwiZmllbGQuaGludFwiIFtpbmZvTWVzc2FnZV09XCJmaWVsZC5pbmZvTWVzc2FnZVwiIFtzdWZmaXhdPVwiZmllbGQuc3VmZml4XCIgW2NvcHlDb250ZW50XT1cImZpZWxkLmNvcHlDb250ZW50XCIgW2NsZWFyQ29udGVudF09XCJmaWVsZC5jbGVhckNvbnRlbnRcIj48L3NwYS1tb25leT5cclxuICBcclxuICAgICAgICAgIDxzcGEtY2hlY2sgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIiBbZGlzcGxheV09XCJmaWVsZC5hbGlhcyA/PyBmaWVsZC5uYW1lIHwgY2FtZWxUb1dvcmRzXCIgWyh2YWx1ZSldPVwiZGF0YVtmaWVsZC5uYW1lXVwiICh2YWx1ZUNoYW5nZSk9XCJpbnB1dENoYW5nZWQoZmllbGQsIGRhdGFbZmllbGQubmFtZV0pXCIgW3JlYWRvbmx5XT1cInRlc3RSZWFkT25seShmaWVsZClcIiBbaW5mb01lc3NhZ2VdPVwiZmllbGQuaW5mb01lc3NhZ2VcIiA+PC9zcGEtY2hlY2s+XHJcbiAgXHJcbiAgICAgICAgICA8c3BhLWRhdGUgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiIFtkaXNwbGF5XT1cImZpZWxkLmFsaWFzID8/IGZpZWxkLm5hbWUgfCBjYW1lbFRvV29yZHNcIiBbd2lkdGhdPVwiZmllbGQud2lkdGhcIiBbKHZhbHVlKV09XCJkYXRhW2ZpZWxkLm5hbWVdXCIgKHZhbHVlQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChmaWVsZCwgZGF0YVtmaWVsZC5uYW1lXSlcIiBbbWluXT1cImZpZWxkPy5taW5cIiBbbWF4XT1cImZpZWxkPy5tYXhcIiBbcmVhZG9ubHldPVwidGVzdFJlYWRPbmx5KGZpZWxkKVwiIFtoaW50XT1cImZpZWxkLmhpbnRcIiBbaW5mb01lc3NhZ2VdPVwiZmllbGQuaW5mb01lc3NhZ2VcIiA+PC9zcGEtZGF0ZT5cclxuICBcclxuICAgICAgICAgIDxzcGEtZGF0ZXRpbWUgKm5nU3dpdGNoQ2FzZT1cIidkYXRldGltZSdcIiBbZGlzcGxheV09XCJmaWVsZC5hbGlhcyA/PyBmaWVsZC5uYW1lIHwgY2FtZWxUb1dvcmRzXCIgWyh2YWx1ZSldPVwiZGF0YVtmaWVsZC5uYW1lXVwiICh2YWx1ZUNoYW5nZSk9XCJpbnB1dENoYW5nZWQoZmllbGQsIGRhdGFbZmllbGQubmFtZV0pXCIgW3JlYWRvbmx5XT1cInRlc3RSZWFkT25seShmaWVsZClcIiBbbWluXT1cImZpZWxkLm1pblwiIFttYXhdPVwiZmllbGQubWF4XCIgW2luZm9NZXNzYWdlXT1cImZpZWxkLmluZm9NZXNzYWdlXCIgPjwvc3BhLWRhdGV0aW1lPlxyXG4gIFxyXG4gICAgICAgICAgPHNwYS1lbWFpbCAqbmdTd2l0Y2hDYXNlPVwiJ2VtYWlsJ1wiIFtkaXNwbGF5XT1cImZpZWxkLmFsaWFzID8/IGZpZWxkLm5hbWUgfCBjYW1lbFRvV29yZHNcIiBbKHZhbHVlKV09XCJkYXRhW2ZpZWxkLm5hbWVdXCIgKHZhbHVlQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChmaWVsZCxkYXRhW2ZpZWxkLm5hbWVdKVwiIFtyZXF1aXJlZF09XCJ0ZXN0UmVxdWlyZWQoZmllbGQpXCIgW3JlYWRvbmx5XT1cInRlc3RSZWFkT25seShmaWVsZClcIiBbaGludF09XCJmaWVsZC5oaW50XCIgW2luZm9NZXNzYWdlXT1cImZpZWxkLmluZm9NZXNzYWdlXCIgIFtzdWZmaXhdPVwiZmllbGQuc3VmZml4XCIgW2NvcHlDb250ZW50XT1cImZpZWxkLmNvcHlDb250ZW50XCIgW2NsZWFyQ29udGVudF09XCJmaWVsZC5jbGVhckNvbnRlbnRcIj48L3NwYS1lbWFpbD5cclxuICBcclxuICAgICAgICAgIDxzcGEtdGV4dCAqbmdTd2l0Y2hDYXNlPVwiJ3Bhc3N3b3JkJ1wiIFtmb3JtYXRdPVwiJ3Bhc3N3b3JkJ1wiIFtkaXNwbGF5XT1cImZpZWxkLmFsaWFzID8/IGZpZWxkLm5hbWUgfCBjYW1lbFRvV29yZHNcIiBbd2lkdGhdPVwiZmllbGQud2lkdGhcIiBbb3B0aW9uc109XCJmaWVsZC5vcHRpb25zXCIgW29wdGlvblZhbHVlXT1cImZpZWxkLm9wdGlvblZhbHVlID8/ICd2YWx1ZSdcIiBbcm93c109XCJmaWVsZC5yb3dzXCIgWyh2YWx1ZSldPVwiZGF0YVtmaWVsZC5uYW1lXVwiICh2YWx1ZUNoYW5nZSk9XCJpbnB1dENoYW5nZWQoZmllbGQsZGF0YVtmaWVsZC5uYW1lXSlcIiBbcmVxdWlyZWRdPVwidGVzdFJlcXVpcmVkKGZpZWxkKVwiIFttaW5dPVwiZmllbGQubWluXCIgW21heF09XCJmaWVsZC5tYXhcIiBbcmVhZG9ubHldPVwidGVzdFJlYWRPbmx5KGZpZWxkKVwiIFtoaW50XT1cImZpZWxkLmhpbnRcIiBbaW5mb01lc3NhZ2VdPVwiZmllbGQuaW5mb01lc3NhZ2VcIiBbc3VmZml4XT1cImZpZWxkLnN1ZmZpeFwiIFtjb3B5Q29udGVudF09XCJmaWVsZC5jb3B5Q29udGVudFwiIFtjbGVhckNvbnRlbnRdPVwiZmllbGQuY2xlYXJDb250ZW50XCI+PC9zcGEtdGV4dD5cclxuICBcclxuICBcclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzZWxlY3QnXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkeW5hbWljU2VsZWN0VGVtcGxhdGU7IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBmaWVsZCxcclxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgIHRlc3RSZWFkT25seTogdGVzdFJlYWRPbmx5LmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0Q2hhbmdlZDogc2VsZWN0Q2hhbmdlZC5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICBcclxuICBcclxuICAgICAgICAgIDxzcGEtbXVsdGktc2VsZWN0ICpuZ1N3aXRjaENhc2U9XCInbXVsdGktc2VsZWN0J1wiIFtkaXNwbGF5XT1cImZpZWxkLmFsaWFzID8/IGZpZWxkLm5hbWUgfCBjYW1lbFRvV29yZHNcIiBbd2lkdGhdPVwiZmllbGQud2lkdGhcIiBbb3B0aW9uc109XCJmaWVsZC5vcHRpb25zXCIgW29wdGlvbkRpc3BsYXldPVwiZmllbGQub3B0aW9uRGlzcGxheSA/PyAnbmFtZSdcIiBbb3B0aW9uVmFsdWVdPVwiZmllbGQub3B0aW9uVmFsdWUgPz8gJ3ZhbHVlJ1wiIFsodmFsdWUpXT1cImRhdGFbZmllbGQubmFtZV1cIiAodmFsdWVDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGZpZWxkLCBkYXRhW2ZpZWxkLm5hbWVdKVwiIFtyZXF1aXJlZF09XCJ0ZXN0UmVxdWlyZWQoZmllbGQpXCIgW3JlYWRvbmx5XT1cInRlc3RSZWFkT25seShmaWVsZClcIiBbaGludF09XCJmaWVsZC5oaW50XCIgW2luZm9NZXNzYWdlXT1cImZpZWxkLmluZm9NZXNzYWdlXCIgW3N1ZmZpeF09XCJmaWVsZC5zdWZmaXhcIiBbY29weUNvbnRlbnRdPVwiZmllbGQuY29weUNvbnRlbnRcIiBbY2xlYXJDb250ZW50XT1cImZpZWxkLmNsZWFyQ29udGVudFwiIFtsb2FkQWN0aW9uXT1cImZpZWxkLmxvYWRBY3Rpb25cIj5cclxuICAgICAgICAgIDwvc3BhLW11bHRpLXNlbGVjdD5cclxuICBcclxuICAgICAgICAgIDxzcGEtbXVsdGktdGV4dCAqbmdTd2l0Y2hDYXNlPVwiJ211bHRpLXRleHQnXCIgW3N0cmljdF09XCJmaWVsZC5zdHJpY3RcIiBbZGlzcGxheV09XCJmaWVsZC5hbGlhcyA/PyBmaWVsZC5uYW1lIHwgY2FtZWxUb1dvcmRzXCIgW29wdGlvbnNdPVwiZmllbGQub3B0aW9uc1wiIFtvcHRpb25EaXNwbGF5XT1cImZpZWxkLm9wdGlvbkRpc3BsYXkgPz8gJ25hbWUnXCIgW29wdGlvblZhbHVlXT1cImZpZWxkLm9wdGlvblZhbHVlID8/ICd2YWx1ZSdcIiBbKHZhbHVlKV09XCJkYXRhW2ZpZWxkLm5hbWVdXCIgKHZhbHVlQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChmaWVsZCxkYXRhW2ZpZWxkLm5hbWVdKVwiIFtyZXF1aXJlZF09XCJ0ZXN0UmVxdWlyZWQoZmllbGQpXCIgW3JlYWRvbmx5XT1cInRlc3RSZWFkT25seShmaWVsZClcIiBbaGludF09XCJmaWVsZC5oaW50XCIgW2luZm9NZXNzYWdlXT1cImZpZWxkLmluZm9NZXNzYWdlXCIgW3N1ZmZpeF09XCJmaWVsZC5zdWZmaXhcIiBbY29weUNvbnRlbnRdPVwiZmllbGQuY29weUNvbnRlbnRcIiBbY2xlYXJDb250ZW50XT1cImZpZWxkLmNsZWFyQ29udGVudFwiIFtsb2FkQWN0aW9uXT1cImZpZWxkLmxvYWRBY3Rpb25cIj48L3NwYS1tdWx0aS10ZXh0PlxyXG4gIFxyXG4gIFxyXG4gIFxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NvbXBvc2l0ZSdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBvc2l0ZS1maWVsZC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcG9zaXRlLWZpZWxkLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJmaWVsZCBvZiBnZXRWaXNpYmxlU3ViZmllbGRzKGZpZWxkKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJzdWJmaWVsZC50eXBlXCI+XHJcbiAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsICpuZ1N3aXRjaENhc2U9XCInc3RyaW5nJ1wiIFtuZ1N0eWxlXT1cInsnZm9udC1zaXplJzpmaWVsZC5zaXplID8/ICcxNHB4J31cIiA+e3tkYXRhW2ZpZWxkLm5hbWVdID8/IGZpZWxkLmFsaWFzID8/IGZpZWxkLm5hbWV9fSB7e2ZpZWxkLnN1ZmZpeCA/PyAnJ319PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8c3BhLW51bWJlciAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIiBbZGlzcGxheV09XCJzdWJmaWVsZC5hbGlhcyA/PyBzdWJmaWVsZC5uYW1lIHwgY2FtZWxUb1dvcmRzXCIgW3dpZHRoXT1cInN1YmZpZWxkLndpZHRoXCIgWyh2YWx1ZSldPVwiZGF0YVtzdWJmaWVsZC5uYW1lXVwiICh2YWx1ZUNoYW5nZSk9XCJpbnB1dENoYW5nZWQoc3ViZmllbGQsICRldmVudClcIiBbcmVxdWlyZWRdPVwidGVzdFJlcXVpcmVkKHN1YmZpZWxkKVwiIFttaW5dPVwic3ViZmllbGQubWluXCIgW21heF09XCJzdWJmaWVsZC5tYXhcIiBbcmVhZG9ubHldPVwidGVzdFJlYWRPbmx5KGZpZWxkKSB8fCB0ZXN0UmVhZE9ubHkoc3ViZmllbGQpXCIgW2hpbnRdPVwic3ViZmllbGQuaGludFwiIFtpbmZvTWVzc2FnZV09XCJzdWJmaWVsZC5pbmZvTWVzc2FnZVwiICBbc3VmZml4XT1cInN1YmZpZWxkLnN1ZmZpeFwiIFtjb3B5Q29udGVudF09XCJzdWJmaWVsZC5jb3B5Q29udGVudFwiIFtjbGVhckNvbnRlbnRdPVwic3ViZmllbGQuY2xlYXJDb250ZW50XCI+PC9zcGEtbnVtYmVyPlxyXG4gIFxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGEtbW9uZXkgKm5nU3dpdGNoQ2FzZT1cIidtb25leSdcIiBbZGlzcGxheV09XCJzdWJmaWVsZC5hbGlhcyA/PyBzdWJmaWVsZC5uYW1lIHwgY2FtZWxUb1dvcmRzXCIgW3dpZHRoXT1cInN1YmZpZWxkLndpZHRoXCIgWyh2YWx1ZSldPVwiZGF0YVtzdWJmaWVsZC5uYW1lXVwiICh2YWx1ZUNoYW5nZSk9XCJpbnB1dENoYW5nZWQoc3ViZmllbGQsICRldmVudClcIiBbcmVxdWlyZWRdPVwidGVzdFJlcXVpcmVkKHN1YmZpZWxkKVwiIFttaW5dPVwic3ViZmllbGQubWluXCIgW21heF09XCJzdWJmaWVsZC5tYXhcIiBbcmVhZG9ubHldPVwidGVzdFJlYWRPbmx5KGZpZWxkKSB8fCB0ZXN0UmVhZE9ubHkoc3ViZmllbGQpXCIgW2hpbnRdPVwic3ViZmllbGQuaGludFwiIFtpbmZvTWVzc2FnZV09XCJzdWJmaWVsZC5pbmZvTWVzc2FnZVwiIFtzdWZmaXhdPVwic3ViZmllbGQuc3VmZml4XCIgW2NvcHlDb250ZW50XT1cImZpZWxkLmNvcHlDb250ZW50XCIgW2NsZWFyQ29udGVudF09XCJmaWVsZC5jbGVhckNvbnRlbnRcIj48L3NwYS1tb25leT5cclxuICBcclxuICAgICAgICAgICAgICAgICAgICA8c3BhLWNoZWNrICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCIgW2Rpc3BsYXldPVwic3ViZmllbGQuYWxpYXMgPz8gc3ViZmllbGQubmFtZSB8IGNhbWVsVG9Xb3Jkc1wiIFsodmFsdWUpXT1cImRhdGFbc3ViZmllbGQubmFtZV1cIiAodmFsdWVDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKHN1YmZpZWxkLCAkZXZlbnQpXCIgW3JlYWRvbmx5XT1cInRlc3RSZWFkT25seShmaWVsZCkgfHwgdGVzdFJlYWRPbmx5KHN1YmZpZWxkKVwiIFtpbmZvTWVzc2FnZV09XCJzdWJmaWVsZC5pbmZvTWVzc2FnZVwiID48L3NwYS1jaGVjaz5cclxuICBcclxuICAgICAgICAgICAgICAgICAgICA8c3BhLWRhdGUgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiIFtkaXNwbGF5XT1cInN1YmZpZWxkLmFsaWFzID8/IHN1YmZpZWxkLm5hbWUgfCBjYW1lbFRvV29yZHNcIiBbd2lkdGhdPVwic3ViZmllbGQud2lkdGhcIiBbKHZhbHVlKV09XCJkYXRhW3N1YmZpZWxkLm5hbWVdXCIgKHZhbHVlQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChzdWJmaWVsZCwgJGV2ZW50KVwiIFttaW5dPVwic3ViZmllbGQubWluXCIgW21heF09XCJzdWJmaWVsZC5tYXhcIiBbcmVhZG9ubHldPVwidGVzdFJlYWRPbmx5KGZpZWxkKSB8fCB0ZXN0UmVhZE9ubHkoc3ViZmllbGQpXCIgW2hpbnRdPVwic3ViZmllbGQuaGludFwiIFtpbmZvTWVzc2FnZV09XCJzdWJmaWVsZC5pbmZvTWVzc2FnZVwiID48L3NwYS1kYXRlPlxyXG4gIFxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGEtZGF0ZXRpbWUgKm5nU3dpdGNoQ2FzZT1cIidkYXRldGltZSdcIiBbZGlzcGxheV09XCJzdWJmaWVsZC5hbGlhcyA/PyBzdWJmaWVsZC5uYW1lIHwgY2FtZWxUb1dvcmRzXCIgWyh2YWx1ZSldPVwiZGF0YVtzdWJmaWVsZC5uYW1lXVwiICh2YWx1ZUNoYW5nZSk9XCJpbnB1dENoYW5nZWQoc3ViZmllbGQsICRldmVudClcIiBbcmVhZG9ubHldPVwidGVzdFJlYWRPbmx5KGZpZWxkKSB8fCB0ZXN0UmVhZE9ubHkoc3ViZmllbGQpXCIgW21pbl09XCJzdWJmaWVsZC5taW5cIiBbbWF4XT1cInN1YmZpZWxkLm1heFwiIFtpbmZvTWVzc2FnZV09XCJzdWJmaWVsZC5pbmZvTWVzc2FnZVwiID48L3NwYS1kYXRldGltZT5cclxuICBcclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VsZWN0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImR5bmFtaWNTZWxlY3RUZW1wbGF0ZTsgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFJlYWRPbmx5OiB0ZXN0UmVhZE9ubHkuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RDaGFuZ2VkOiBzZWxlY3RDaGFuZ2VkLmJpbmQodGhpcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgXHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYS10ZXh0ICpuZ1N3aXRjaERlZmF1bHQgW2Rpc3BsYXldPVwic3ViZmllbGQuYWxpYXMgPz8gc3ViZmllbGQubmFtZSB8IGNhbWVsVG9Xb3Jkc1wiIFt3aWR0aF09XCJzdWJmaWVsZC53aWR0aFwiICBbb3B0aW9uc109XCJzdWJmaWVsZC5vcHRpb25zXCIgW29wdGlvbkRpc3BsYXldPVwic3ViZmllbGQub3B0aW9uRGlzcGxheSA/PyAnbmFtZSdcIiBbb3B0aW9uVmFsdWVdPVwic3ViZmllbGQub3B0aW9uVmFsdWUgPz8gJ3ZhbHVlJ1wiIFtyb3dzXT1cInN1YmZpZWxkLnJvd3NcIiBbKHZhbHVlKV09XCJkYXRhW3N1YmZpZWxkLm5hbWVdXCIgKHZhbHVlQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChzdWJmaWVsZCwgJGV2ZW50KVwiIFtyZXF1aXJlZF09XCJ0ZXN0UmVxdWlyZWQoc3ViZmllbGQpXCIgW21pbl09XCJzdWJmaWVsZC5taW5cIiBbbWF4XT1cInN1YmZpZWxkLm1heFwiIFtyZWFkb25seV09XCJ0ZXN0UmVhZE9ubHkoZmllbGQpIHx8IHRlc3RSZWFkT25seShzdWJmaWVsZClcIiBbaGludF09XCJzdWJmaWVsZC5oaW50XCIgW2luZm9NZXNzYWdlXT1cInN1YmZpZWxkLmluZm9NZXNzYWdlXCIgIFtzdWZmaXhdPVwic3ViZmllbGQuc3VmZml4XCIgW2NvcHlDb250ZW50XT1cInN1YmZpZWxkLmNvcHlDb250ZW50XCIgW2NsZWFyQ29udGVudF09XCJzdWJmaWVsZC5jbGVhckNvbnRlbnRcIiBbbG9hZEFjdGlvbl09XCJzdWJmaWVsZC5sb2FkQWN0aW9uXCI+PC9zcGEtdGV4dD5cclxuICBcclxuICBcclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICBcclxuICBcclxuICAgICAgICAgIDxzcGEtdGV4dCAqbmdTd2l0Y2hEZWZhdWx0IFtkaXNwbGF5XT1cImZpZWxkLmFsaWFzID8/IGZpZWxkLm5hbWUgfCBjYW1lbFRvV29yZHNcIiBbd2lkdGhdPVwiZmllbGQud2lkdGhcIiBbb3B0aW9uc109XCJmaWVsZC5vcHRpb25zXCIgW29wdGlvbkRpc3BsYXldPVwiZmllbGQub3B0aW9uRGlzcGxheSA/PyAnbmFtZSdcIiBbb3B0aW9uVmFsdWVdPVwiZmllbGQub3B0aW9uVmFsdWUgPz8gJ3ZhbHVlJ1wiIFtyb3dzXT1cImZpZWxkLnJvd3NcIiBbKHZhbHVlKV09XCJkYXRhW2ZpZWxkLm5hbWVdXCIgKHZhbHVlQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChmaWVsZCxkYXRhW2ZpZWxkLm5hbWVdKVwiIFtyZXF1aXJlZF09XCJ0ZXN0UmVxdWlyZWQoZmllbGQpXCIgW21pbl09XCJmaWVsZC5taW5cIiBbbWF4XT1cImZpZWxkLm1heFwiIFtyZWFkb25seV09XCJ0ZXN0UmVhZE9ubHkoZmllbGQpXCIgW2hpbnRdPVwiZmllbGQuaGludFwiIFtpbmZvTWVzc2FnZV09XCJmaWVsZC5pbmZvTWVzc2FnZVwiICBbc3VmZml4XT1cImZpZWxkLnN1ZmZpeFwiIFtjb3B5Q29udGVudF09XCJmaWVsZC5jb3B5Q29udGVudFwiIFtjbGVhckNvbnRlbnRdPVwiZmllbGQuY2xlYXJDb250ZW50XCIgW2xvYWRBY3Rpb25dPVwiZmllbGQubG9hZEFjdGlvblwiPjwvc3BhLXRleHQ+XHJcbiAgXHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgXHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gIFxyXG4gICAgPC9kaXY+XHJcbiAgXHJcbiAgXHJcbiAgICA8ZGl2IGNsYXNzPVwic3Bhbi1jb2wtY2VudGVyXCIgKm5nSWY9XCJjb25maWcuYnV0dG9uXCI+XHJcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgIChjbGljayk9XCJidXR0b25DbGlja2VkKClcIiAgY2RrRm9jdXNJbml0aWFsPnt7YnV0dG9uRGlzcGxheX19PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICBcclxuICBcclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwibm90ZXMtc2VjdGlvblwiICpuZ0lmPVwiY29uZmlnLm5vdGVzQ29uZmlnXCI+XHJcbiAgICA8c3BhLW5vdGVzXHJcbiAgICAgIFt0aXRsZV09XCJjb25maWcubm90ZXNDb25maWcudGl0bGUgfHwgJ05vdGVzJ1wiXHJcbiAgICAgIFtub3Rlc109XCJjb25maWcubm90ZXNDb25maWcubm90ZXMgfHwgW11cIlxyXG4gICAgICBbbG9hZEFjdGlvbl09XCJjb25maWcubm90ZXNDb25maWcubG9hZEFjdGlvblwiXHJcbiAgICAgIFtsb2FkSURGaWVsZF09XCJjb25maWcubm90ZXNDb25maWcubG9hZElERmllbGRcIlxyXG4gICAgICBbZGF0YV09XCJkYXRhXCJcclxuICAgICAgW25hbWVGaWVsZF09XCJjb25maWcubm90ZXNDb25maWcubmFtZUZpZWxkIHx8ICdjcmVhdGVkQnlOYW1lJ1wiXHJcbiAgICAgIFtkYXRlRmllbGRdPVwiY29uZmlnLm5vdGVzQ29uZmlnLmRhdGVGaWVsZCB8fCAnY3JlYXRlZERhdGUnXCJcclxuICAgICAgW2NvbW1lbnRGaWVsZF09XCJjb25maWcubm90ZXNDb25maWcuY29tbWVudEZpZWxkIHx8ICdkZXRhaWxzJ1wiPlxyXG4gICAgPC9zcGEtbm90ZXM+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuIl19
@@ -0,0 +1,34 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/platform-browser";
4
+ import * as i2 from "@angular/common";
5
+ export class HtmlComponent {
6
+ constructor(sanitizer) {
7
+ this.sanitizer = sanitizer;
8
+ this.value = '';
9
+ this.maxHeight = '500px'; // Default maximum height
10
+ this.display = ''; // For consistency with other components
11
+ }
12
+ ngOnInit() {
13
+ this.sanitizeHtml();
14
+ }
15
+ ngOnChanges() {
16
+ this.sanitizeHtml();
17
+ }
18
+ sanitizeHtml() {
19
+ this.sanitizedHtml = this.sanitizer.bypassSecurityTrustHtml(this.value);
20
+ }
21
+ }
22
+ HtmlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: HtmlComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
23
+ HtmlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: HtmlComponent, selector: "spa-html", inputs: { value: "value", maxHeight: "maxHeight", display: "display" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"display\" class=\"html-label\">{{display}}</div>\n<div class=\"html-container\" [ngStyle]=\"{'max-height': maxHeight}\">\n <div class=\"html-content\" [innerHTML]=\"sanitizedHtml\"></div>\n</div>", styles: [".html-container{width:100%;overflow-y:auto;border:1px solid #e0e0e0;border-radius:4px;padding:8px;background-color:#fafafa}.html-content{width:100%}.html-label{font-weight:500;margin-bottom:5px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: HtmlComponent, decorators: [{
25
+ type: Component,
26
+ args: [{ selector: 'spa-html', template: "<div *ngIf=\"display\" class=\"html-label\">{{display}}</div>\n<div class=\"html-container\" [ngStyle]=\"{'max-height': maxHeight}\">\n <div class=\"html-content\" [innerHTML]=\"sanitizedHtml\"></div>\n</div>", styles: [".html-container{width:100%;overflow-y:auto;border:1px solid #e0e0e0;border-radius:4px;padding:8px;background-color:#fafafa}.html-content{width:100%}.html-label{font-weight:500;margin-bottom:5px}\n"] }]
27
+ }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { value: [{
28
+ type: Input
29
+ }], maxHeight: [{
30
+ type: Input
31
+ }], display: [{
32
+ type: Input
33
+ }] } });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90aW4tc3BhL3NyYy9saWIvY29tcG9uZW50cy9odG1sL2h0bWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvaHRtbC9odG1sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7O0FBUXpELE1BQU0sT0FBTyxhQUFhO0lBQ3hCLFlBQW9CLFNBQXVCO1FBQXZCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFVbEMsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLGNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQyx5QkFBeUI7UUFDOUMsWUFBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLHdDQUF3QztJQVpoQixDQUFDO0lBRWhELFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQVFPLFlBQVk7UUFDbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxRSxDQUFDOzswR0FuQlUsYUFBYTs4RkFBYixhQUFhLDZJQ1IxQixtTkFHTTsyRkRLTyxhQUFhO2tCQUx6QixTQUFTOytCQUNFLFVBQVU7bUdBZVgsS0FBSztzQkFBYixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NwYS1odG1sJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2h0bWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9odG1sLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBIdG1sQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zYW5pdGl6ZUh0bWwoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuc2FuaXRpemVIdG1sKCk7XG4gIH1cblxuICBASW5wdXQoKSB2YWx1ZSA9ICcnO1xuICBASW5wdXQoKSBtYXhIZWlnaHQgPSAnNTAwcHgnOyAvLyBEZWZhdWx0IG1heGltdW0gaGVpZ2h0XG4gIEBJbnB1dCgpIGRpc3BsYXkgPSAnJzsgLy8gRm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgY29tcG9uZW50c1xuXG4gIHNhbml0aXplZEh0bWw6IFNhZmVIdG1sO1xuXG4gIHByaXZhdGUgc2FuaXRpemVIdG1sKCk6IHZvaWQge1xuICAgIHRoaXMuc2FuaXRpemVkSHRtbCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHRoaXMudmFsdWUpO1xuICB9XG59IiwiPGRpdiAqbmdJZj1cImRpc3BsYXlcIiBjbGFzcz1cImh0bWwtbGFiZWxcIj57e2Rpc3BsYXl9fTwvZGl2PlxuPGRpdiBjbGFzcz1cImh0bWwtY29udGFpbmVyXCIgW25nU3R5bGVdPVwieydtYXgtaGVpZ2h0JzogbWF4SGVpZ2h0fVwiPlxuICA8ZGl2IGNsYXNzPVwiaHRtbC1jb250ZW50XCIgW2lubmVySFRNTF09XCJzYW5pdGl6ZWRIdG1sXCI+PC9kaXY+XG48L2Rpdj4iXX0=