@c8y/ngx-components 1021.55.2 → 1021.56.4

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 (229) hide show
  1. package/context-dashboard/context-dashboard.model.d.ts +22 -22
  2. package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
  3. package/core/common/interval-based-reload.abstract.d.ts +13 -3
  4. package/core/common/interval-based-reload.abstract.d.ts.map +1 -1
  5. package/core/dashboard/dashboard.model.d.ts +3 -1
  6. package/core/dashboard/dashboard.model.d.ts.map +1 -1
  7. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +3 -4
  8. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -1
  9. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts +1 -0
  10. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -1
  11. package/core/dashboard/widgets-dashboard-event.service.d.ts +7 -0
  12. package/core/dashboard/widgets-dashboard-event.service.d.ts.map +1 -1
  13. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +6 -2
  14. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
  15. package/core/dynamic-component/dynamic-component.model.d.ts +15 -1
  16. package/core/dynamic-component/dynamic-component.model.d.ts.map +1 -1
  17. package/core/login/login.component.d.ts.map +1 -1
  18. package/core/login/login.model.d.ts +8 -0
  19. package/core/login/login.model.d.ts.map +1 -1
  20. package/core/login/login.service.d.ts +2 -1
  21. package/core/login/login.service.d.ts.map +1 -1
  22. package/datapoint-selector/datapoint-selection.model.d.ts +18 -18
  23. package/datapoint-selector/datapoint-selection.model.d.ts.map +1 -1
  24. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -1
  25. package/datapoints-export-selector/datapoints-export-selector.component.d.ts +3 -1
  26. package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -1
  27. package/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.d.ts +5 -1
  28. package/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.d.ts.map +1 -1
  29. package/esm2022/context-dashboard/context-dashboard.model.mjs +1 -1
  30. package/esm2022/core/aggregation/aggregation.model.mjs +2 -2
  31. package/esm2022/core/common/interval-based-reload.abstract.mjs +13 -13
  32. package/esm2022/core/dashboard/dashboard-child.component.mjs +3 -3
  33. package/esm2022/core/dashboard/dashboard.model.mjs +1 -1
  34. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +6 -8
  35. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +9 -1
  36. package/esm2022/core/dashboard/widgets-dashboard-event.service.mjs +19 -2
  37. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +3 -3
  38. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +3 -3
  39. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +48 -23
  40. package/esm2022/core/dynamic-component/dynamic-component.model.mjs +1 -1
  41. package/esm2022/core/login/login.component.mjs +4 -4
  42. package/esm2022/core/login/login.model.mjs +1 -1
  43. package/esm2022/core/login/login.service.mjs +7 -3
  44. package/esm2022/datapoint-explorer/view/datapoint-explorer.component.mjs +2 -2
  45. package/esm2022/datapoint-selector/datapoint-selection.model.mjs +1 -1
  46. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +1 -3
  47. package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +9 -5
  48. package/esm2022/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.mjs +23 -9
  49. package/esm2022/map/map.model.mjs +1 -1
  50. package/esm2022/widgets/definitions/alarms/alarm-list/index.mjs +2 -1
  51. package/esm2022/widgets/definitions/alarms/all-critical-alarms/index.mjs +2 -1
  52. package/esm2022/widgets/definitions/alarms/recent-alarms/index.mjs +2 -1
  53. package/esm2022/widgets/definitions/applications/index.mjs +1 -1
  54. package/esm2022/widgets/definitions/asset-notes/index.mjs +2 -1
  55. package/esm2022/widgets/definitions/cockpit-legacy-welcome/index.mjs +1 -1
  56. package/esm2022/widgets/definitions/cockpit-welcome/index.mjs +1 -1
  57. package/esm2022/widgets/definitions/datapoints-graph/index.mjs +1 -1
  58. package/esm2022/widgets/definitions/datapoints-table/index.mjs +6 -4
  59. package/esm2022/widgets/definitions/device-control-message/index.mjs +2 -1
  60. package/esm2022/widgets/definitions/device-management-welcome/index.mjs +1 -1
  61. package/esm2022/widgets/definitions/help-and-service/index.mjs +1 -1
  62. package/esm2022/widgets/definitions/image/index.mjs +2 -1
  63. package/esm2022/widgets/definitions/info-gauge/index.mjs +2 -1
  64. package/esm2022/widgets/definitions/kpi/index.mjs +2 -1
  65. package/esm2022/widgets/definitions/linear-gauge/index.mjs +4 -3
  66. package/esm2022/widgets/definitions/map/index.mjs +2 -1
  67. package/esm2022/widgets/definitions/markdown/index.mjs +2 -1
  68. package/esm2022/widgets/definitions/silo/index.mjs +4 -3
  69. package/esm2022/widgets/definitions/three-d-rotation/index.mjs +2 -1
  70. package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +3 -3
  71. package/esm2022/widgets/implementations/alarms/alarm-list-widget.model.mjs +1 -1
  72. package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +17 -100
  73. package/esm2022/widgets/implementations/asset-notes/asset-notes-widget.component.mjs +1 -1
  74. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +47 -34
  75. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +35 -13
  76. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +3 -3
  77. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +75 -35
  78. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +3 -5
  79. package/esm2022/widgets/implementations/device-control-message/device-control-message-widget-view/device-control-message-widget-view.component.mjs +1 -1
  80. package/esm2022/widgets/implementations/info-gauge/index.mjs +2 -1
  81. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.mjs +1 -1
  82. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.mjs +1 -1
  83. package/esm2022/widgets/implementations/info-gauge/info-gauge.model.mjs +2 -0
  84. package/esm2022/widgets/implementations/kpi/kpi-widget.model.mjs +1 -1
  85. package/esm2022/widgets/implementations/linear-gauge/index.mjs +2 -1
  86. package/esm2022/widgets/implementations/linear-gauge/linear-gauge-widget-config/linear-gauge-widget-config.component.mjs +1 -1
  87. package/esm2022/widgets/implementations/linear-gauge/linear-gauge-widget-view/linear-gauge-widget-view.component.mjs +1 -1
  88. package/esm2022/widgets/implementations/linear-gauge/linear-gauge.model.mjs +2 -0
  89. package/esm2022/widgets/implementations/map/map-widget.model.mjs +1 -1
  90. package/esm2022/widgets/implementations/markdown/markdown-widget.model.mjs +1 -1
  91. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  92. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +1 -1
  93. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  94. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  95. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +7 -6
  96. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  97. package/fesm2022/c8y-ngx-components-ecosystem.mjs +16 -4
  98. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  99. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  100. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +1 -0
  101. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
  102. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs +1 -0
  103. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
  104. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs +1 -0
  105. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
  106. package/fesm2022/c8y-ngx-components-widgets-definitions-applications.mjs.map +1 -1
  107. package/fesm2022/c8y-ngx-components-widgets-definitions-asset-notes.mjs +1 -0
  108. package/fesm2022/c8y-ngx-components-widgets-definitions-asset-notes.mjs.map +1 -1
  109. package/fesm2022/c8y-ngx-components-widgets-definitions-cockpit-legacy-welcome.mjs.map +1 -1
  110. package/fesm2022/c8y-ngx-components-widgets-definitions-cockpit-welcome.mjs.map +1 -1
  111. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -1
  112. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +5 -3
  113. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -1
  114. package/fesm2022/c8y-ngx-components-widgets-definitions-device-control-message.mjs +1 -0
  115. package/fesm2022/c8y-ngx-components-widgets-definitions-device-control-message.mjs.map +1 -1
  116. package/fesm2022/c8y-ngx-components-widgets-definitions-device-management-welcome.mjs.map +1 -1
  117. package/fesm2022/c8y-ngx-components-widgets-definitions-help-and-service.mjs.map +1 -1
  118. package/fesm2022/c8y-ngx-components-widgets-definitions-image.mjs +1 -0
  119. package/fesm2022/c8y-ngx-components-widgets-definitions-image.mjs.map +1 -1
  120. package/fesm2022/c8y-ngx-components-widgets-definitions-info-gauge.mjs +1 -0
  121. package/fesm2022/c8y-ngx-components-widgets-definitions-info-gauge.mjs.map +1 -1
  122. package/fesm2022/c8y-ngx-components-widgets-definitions-kpi.mjs +1 -0
  123. package/fesm2022/c8y-ngx-components-widgets-definitions-kpi.mjs.map +1 -1
  124. package/fesm2022/c8y-ngx-components-widgets-definitions-linear-gauge.mjs +3 -2
  125. package/fesm2022/c8y-ngx-components-widgets-definitions-linear-gauge.mjs.map +1 -1
  126. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +1 -0
  127. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
  128. package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs +1 -0
  129. package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs.map +1 -1
  130. package/fesm2022/c8y-ngx-components-widgets-definitions-silo.mjs +3 -2
  131. package/fesm2022/c8y-ngx-components-widgets-definitions-silo.mjs.map +1 -1
  132. package/fesm2022/c8y-ngx-components-widgets-definitions-three-d-rotation.mjs +1 -0
  133. package/fesm2022/c8y-ngx-components-widgets-definitions-three-d-rotation.mjs.map +1 -1
  134. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +18 -101
  135. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  136. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-notes.mjs.map +1 -1
  137. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +147 -76
  138. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
  139. package/fesm2022/c8y-ngx-components-widgets-implementations-device-control-message.mjs.map +1 -1
  140. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
  141. package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs.map +1 -1
  142. package/fesm2022/c8y-ngx-components.mjs +218 -167
  143. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  144. package/locales/locales.pot +7 -8
  145. package/map/map.model.d.ts +1 -1
  146. package/map/map.model.d.ts.map +1 -1
  147. package/package.json +1 -1
  148. package/widgets/cockpit/index.d.ts +327 -17
  149. package/widgets/cockpit/index.d.ts.map +1 -1
  150. package/widgets/definitions/alarms/alarm-list/index.d.ts +25 -2
  151. package/widgets/definitions/alarms/alarm-list/index.d.ts.map +1 -1
  152. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +24 -2
  153. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
  154. package/widgets/definitions/alarms/recent-alarms/index.d.ts +24 -2
  155. package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
  156. package/widgets/definitions/applications/index.d.ts +11 -2
  157. package/widgets/definitions/applications/index.d.ts.map +1 -1
  158. package/widgets/definitions/asset-notes/index.d.ts +18 -2
  159. package/widgets/definitions/asset-notes/index.d.ts.map +1 -1
  160. package/widgets/definitions/cockpit-legacy-welcome/index.d.ts +11 -2
  161. package/widgets/definitions/cockpit-legacy-welcome/index.d.ts.map +1 -1
  162. package/widgets/definitions/cockpit-welcome/index.d.ts +15 -2
  163. package/widgets/definitions/cockpit-welcome/index.d.ts.map +1 -1
  164. package/widgets/definitions/datapoints-graph/index.d.ts +16 -2
  165. package/widgets/definitions/datapoints-graph/index.d.ts.map +1 -1
  166. package/widgets/definitions/datapoints-table/index.d.ts +26 -2
  167. package/widgets/definitions/datapoints-table/index.d.ts.map +1 -1
  168. package/widgets/definitions/device-control-message/index.d.ts +18 -2
  169. package/widgets/definitions/device-control-message/index.d.ts.map +1 -1
  170. package/widgets/definitions/device-management-welcome/index.d.ts +15 -2
  171. package/widgets/definitions/device-management-welcome/index.d.ts.map +1 -1
  172. package/widgets/definitions/help-and-service/index.d.ts +15 -2
  173. package/widgets/definitions/help-and-service/index.d.ts.map +1 -1
  174. package/widgets/definitions/image/index.d.ts +19 -2
  175. package/widgets/definitions/image/index.d.ts.map +1 -1
  176. package/widgets/definitions/info-gauge/index.d.ts +19 -2
  177. package/widgets/definitions/info-gauge/index.d.ts.map +1 -1
  178. package/widgets/definitions/kpi/index.d.ts +19 -2
  179. package/widgets/definitions/kpi/index.d.ts.map +1 -1
  180. package/widgets/definitions/linear-gauge/index.d.ts +19 -2
  181. package/widgets/definitions/linear-gauge/index.d.ts.map +1 -1
  182. package/widgets/definitions/map/index.d.ts +25 -2
  183. package/widgets/definitions/map/index.d.ts.map +1 -1
  184. package/widgets/definitions/markdown/index.d.ts +19 -2
  185. package/widgets/definitions/markdown/index.d.ts.map +1 -1
  186. package/widgets/definitions/silo/index.d.ts +19 -2
  187. package/widgets/definitions/silo/index.d.ts.map +1 -1
  188. package/widgets/definitions/three-d-rotation/index.d.ts +19 -2
  189. package/widgets/definitions/three-d-rotation/index.d.ts.map +1 -1
  190. package/widgets/device-management/index.d.ts +15 -1
  191. package/widgets/device-management/index.d.ts.map +1 -1
  192. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts +4 -0
  193. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts.map +1 -1
  194. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +18 -63
  195. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
  196. package/widgets/implementations/asset-notes/asset-notes-widget.component.d.ts +4 -3
  197. package/widgets/implementations/asset-notes/asset-notes-widget.component.d.ts.map +1 -1
  198. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +4 -2
  199. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -1
  200. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +16 -8
  201. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -1
  202. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +21 -4
  203. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -1
  204. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +8 -4
  205. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -1
  206. package/widgets/implementations/device-control-message/device-control-message-widget-view/device-control-message-widget-view.component.d.ts +4 -3
  207. package/widgets/implementations/device-control-message/device-control-message-widget-view/device-control-message-widget-view.component.d.ts.map +1 -1
  208. package/widgets/implementations/info-gauge/index.d.ts +1 -0
  209. package/widgets/implementations/info-gauge/index.d.ts.map +1 -1
  210. package/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.d.ts +3 -6
  211. package/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.d.ts.map +1 -1
  212. package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts +2 -5
  213. package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts.map +1 -1
  214. package/widgets/implementations/info-gauge/info-gauge.model.d.ts +7 -0
  215. package/widgets/implementations/info-gauge/info-gauge.model.d.ts.map +1 -0
  216. package/widgets/implementations/kpi/kpi-widget.model.d.ts +6 -6
  217. package/widgets/implementations/kpi/kpi-widget.model.d.ts.map +1 -1
  218. package/widgets/implementations/linear-gauge/index.d.ts +1 -0
  219. package/widgets/implementations/linear-gauge/index.d.ts.map +1 -1
  220. package/widgets/implementations/linear-gauge/linear-gauge-widget-config/linear-gauge-widget-config.component.d.ts +3 -5
  221. package/widgets/implementations/linear-gauge/linear-gauge-widget-config/linear-gauge-widget-config.component.d.ts.map +1 -1
  222. package/widgets/implementations/linear-gauge/linear-gauge-widget-view/linear-gauge-widget-view.component.d.ts +2 -6
  223. package/widgets/implementations/linear-gauge/linear-gauge-widget-view/linear-gauge-widget-view.component.d.ts.map +1 -1
  224. package/widgets/implementations/linear-gauge/linear-gauge.model.d.ts +7 -0
  225. package/widgets/implementations/linear-gauge/linear-gauge.model.d.ts.map +1 -0
  226. package/widgets/implementations/map/map-widget.model.d.ts +5 -0
  227. package/widgets/implementations/map/map-widget.model.d.ts.map +1 -1
  228. package/widgets/implementations/markdown/markdown-widget.model.d.ts +2 -2
  229. package/widgets/implementations/markdown/markdown-widget.model.d.ts.map +1 -1
@@ -1,18 +1,23 @@
1
- import { ChangeDetectorRef, Component, EventEmitter, Injector, Input, Output, ViewChild } from '@angular/core';
2
- import { CommonModule, CountdownIntervalComponent, CountdownIntervalModule, IntervalBasedReload, ListGroupModule, gettext } from '@c8y/ngx-components';
1
+ import { ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { CommonModule, CountdownIntervalComponent, CountdownIntervalModule, IntervalBasedReload, ListGroupModule, WidgetGlobalAutoRefreshService, gettext } from '@c8y/ngx-components';
3
3
  import { TranslateService } from '@ngx-translate/core';
4
4
  import { TooltipModule } from 'ngx-bootstrap/tooltip';
5
+ import { BehaviorSubject, Subject, takeUntil, tap } from 'rxjs';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "@ngx-translate/core";
7
8
  import * as i2 from "@c8y/ngx-components";
8
9
  import * as i3 from "@angular/common";
9
10
  import * as i4 from "ngx-bootstrap/tooltip";
10
11
  export class DatapointsReloadComponent extends IntervalBasedReload {
11
- constructor(cdRef, injector, translateService) {
12
+ constructor(cdRef, translateService, widgetGlobalAutoRefreshService) {
12
13
  super();
13
14
  this.cdRef = cdRef;
14
- this.injector = injector;
15
15
  this.translateService = translateService;
16
+ this.widgetGlobalAutoRefreshService = widgetGlobalAutoRefreshService;
17
+ /**
18
+ * @inheritdoc
19
+ */
20
+ this.isRefreshDisabled = false;
16
21
  /**
17
22
  * @inheritdoc
18
23
  */
@@ -21,9 +26,17 @@ export class DatapointsReloadComponent extends IntervalBasedReload {
21
26
  * @inheritdoc
22
27
  */
23
28
  this.manuallyDisabledCountdown = false;
29
+ this.destroy$ = new Subject();
30
+ }
31
+ ngAfterViewInit() {
32
+ if (this.widgetInstanceGlobalAutoRefreshContext) {
33
+ this.widgetGlobalAutoRefreshService.countdownActions.countdownEnded$
34
+ .pipe(takeUntil(this.destroy$), tap(() => this.onCountdownEnded.emit()))
35
+ .subscribe();
36
+ }
24
37
  }
25
38
  ngOnChanges(changes) {
26
- if (this.isDisabled && this.isAutoRefreshEnabled) {
39
+ if (this.isRefreshDisabled && this.isAutoRefreshEnabled) {
27
40
  this.isIntervalRefreshToggleOn = false;
28
41
  this.disableCountdown();
29
42
  return;
@@ -35,13 +48,20 @@ export class DatapointsReloadComponent extends IntervalBasedReload {
35
48
  else {
36
49
  if (this.canStartCountdown(changes)) {
37
50
  this.isIntervalRefreshToggleOn = true;
38
- this.startCountdown(this.injector);
51
+ this.startCountdown();
39
52
  }
40
53
  if (this.canHandleScrolling()) {
41
54
  this.handleScrolling();
42
55
  }
43
56
  }
44
57
  }
58
+ ngOnDestroy() {
59
+ if (this.countdownSubscription) {
60
+ this.countdownSubscription.unsubscribe();
61
+ }
62
+ this.destroy$.next();
63
+ this.destroy$.complete();
64
+ }
45
65
  /**
46
66
  * @inheritdoc
47
67
  */
@@ -64,7 +84,7 @@ export class DatapointsReloadComponent extends IntervalBasedReload {
64
84
  this.hideCountdown = false;
65
85
  // Prevents the countdown from getting stuck on an initial value.
66
86
  this.cdRef.detectChanges();
67
- this.startCountdown(this.injector);
87
+ this.startCountdown();
68
88
  }
69
89
  /**
70
90
  * @inheritdoc
@@ -89,18 +109,18 @@ export class DatapointsReloadComponent extends IntervalBasedReload {
89
109
  !this.isScrolling &&
90
110
  !this.hideCountdown);
91
111
  }
92
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointsReloadComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Injector }, { token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
93
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatapointsReloadComponent, isStandalone: true, selector: "c8y-datapoints-reload", inputs: { isAutoRefreshEnabled: "isAutoRefreshEnabled", isDisabled: "isDisabled", isLoading: "isLoading", isScrolling: "isScrolling", isExportModalOpen: "isExportModalOpen", refreshInterval: "refreshInterval" }, outputs: { onCountdownEnded: "onCountdownEnded" }, viewQueries: [{ propertyName: "countdownIntervalComponent", first: true, predicate: CountdownIntervalComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"a-i-center input-group p-t-4 p-b-4 max-width-fit m-l-auto\">\n <label\n class=\"m-b-0 m-r-8 text-label-small text-truncate flex-no-shrink\"\n title=\" {{ 'Auto refresh' | translate }}\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n >\n {{ 'Auto refresh' | translate }}\n </label>\n <div class=\"input-group\">\n <label\n class=\"toggle-countdown\"\n [class.toggle-countdown-disabled]=\"isDisabled\"\n [attr.aria-label]=\"toggleCountdownButtonTooltipText\"\n [tooltip]=\"toggleCountdownButtonTooltipText\"\n placement=\"bottom\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isIntervalRefreshToggleOn\"\n [disabled]=\"isDisabled\"\n data-cy=\"c8y-data-points-table-widget--interval-toggle-button\"\n (click)=\"onToggleCountdownButtonState($event)\"\n />\n\n <c8y-countdown-interval\n *ngIf=\"isIntervalRefreshToggleOn\"\n [countdownInterval]=\"refreshInterval\"\n (countdownEnded)=\"countdownEnded()\"\n ></c8y-countdown-interval>\n <i\n c8yIcon=\"pause\"\n *ngIf=\"!isIntervalRefreshToggleOn\"\n ></i>\n </label>\n\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n [disabled]=\"isLoading()\"\n (click)=\"reload()\"\n data-cy=\"c8y-data-points-table-widget--reload-button\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading() }\"\n ></i>\n </button>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: CountdownIntervalModule }, { kind: "component", type: i2.CountdownIntervalComponent, selector: "c8y-countdown-interval", inputs: ["countdownInterval"], outputs: ["countdownEnded"] }, { kind: "ngmodule", type: ListGroupModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }] }); }
112
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointsReloadComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.TranslateService }, { token: i2.WidgetGlobalAutoRefreshService }], target: i0.ɵɵFactoryTarget.Component }); }
113
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatapointsReloadComponent, isStandalone: true, selector: "c8y-datapoints-reload", inputs: { isAutoRefreshEnabled: "isAutoRefreshEnabled", isRefreshDisabled: "isRefreshDisabled", isLoading: "isLoading", isScrolling: "isScrolling", isExportModalOpen: "isExportModalOpen", refreshInterval: "refreshInterval", widgetInstanceGlobalAutoRefreshContext: "widgetInstanceGlobalAutoRefreshContext" }, outputs: { onCountdownEnded: "onCountdownEnded" }, viewQueries: [{ propertyName: "countdownIntervalComponent", first: true, predicate: CountdownIntervalComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"!widgetInstanceGlobalAutoRefreshContext\">\n <div class=\"a-i-center input-group p-t-4 p-b-4 max-width-fit m-l-auto\">\n <label\n class=\"m-b-0 m-r-8 text-label-small text-truncate flex-no-shrink\"\n title=\" {{ 'Auto refresh' | translate }}\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n >\n {{ 'Auto refresh' | translate }}\n </label>\n <div class=\"input-group\">\n <label\n class=\"toggle-countdown\"\n [class.toggle-countdown-disabled]=\"isRefreshDisabled\"\n [attr.aria-label]=\"toggleCountdownButtonTooltipText\"\n [tooltip]=\"toggleCountdownButtonTooltipText\"\n placement=\"bottom\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isIntervalRefreshToggleOn\"\n [disabled]=\"isRefreshDisabled\"\n data-cy=\"c8y-data-points-table-widget--interval-toggle-button\"\n (click)=\"onToggleCountdownButtonState($event)\"\n />\n\n <c8y-countdown-interval\n *ngIf=\"isIntervalRefreshToggleOn\"\n [countdownInterval]=\"refreshInterval\"\n (countdownEnded)=\"countdownEnded()\"\n ></c8y-countdown-interval>\n <i\n c8yIcon=\"pause\"\n *ngIf=\"!isIntervalRefreshToggleOn\"\n ></i>\n </label>\n\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n [disabled]=\"isRefreshDisabled || (isLoading | async)\"\n (click)=\"reload()\"\n data-cy=\"c8y-data-points-table-widget--reload-button\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading | async }\"\n ></i>\n </button>\n </div>\n </div>\n </div>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: CountdownIntervalModule }, { kind: "component", type: i2.CountdownIntervalComponent, selector: "c8y-countdown-interval", inputs: ["countdownInterval"], outputs: ["countdownEnded"] }, { kind: "ngmodule", type: ListGroupModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }] }); }
94
114
  }
95
115
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointsReloadComponent, decorators: [{
96
116
  type: Component,
97
- args: [{ selector: 'c8y-datapoints-reload', standalone: true, imports: [CommonModule, CountdownIntervalModule, ListGroupModule, TooltipModule], template: "<div class=\"a-i-center input-group p-t-4 p-b-4 max-width-fit m-l-auto\">\n <label\n class=\"m-b-0 m-r-8 text-label-small text-truncate flex-no-shrink\"\n title=\" {{ 'Auto refresh' | translate }}\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n >\n {{ 'Auto refresh' | translate }}\n </label>\n <div class=\"input-group\">\n <label\n class=\"toggle-countdown\"\n [class.toggle-countdown-disabled]=\"isDisabled\"\n [attr.aria-label]=\"toggleCountdownButtonTooltipText\"\n [tooltip]=\"toggleCountdownButtonTooltipText\"\n placement=\"bottom\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isIntervalRefreshToggleOn\"\n [disabled]=\"isDisabled\"\n data-cy=\"c8y-data-points-table-widget--interval-toggle-button\"\n (click)=\"onToggleCountdownButtonState($event)\"\n />\n\n <c8y-countdown-interval\n *ngIf=\"isIntervalRefreshToggleOn\"\n [countdownInterval]=\"refreshInterval\"\n (countdownEnded)=\"countdownEnded()\"\n ></c8y-countdown-interval>\n <i\n c8yIcon=\"pause\"\n *ngIf=\"!isIntervalRefreshToggleOn\"\n ></i>\n </label>\n\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n [disabled]=\"isLoading()\"\n (click)=\"reload()\"\n data-cy=\"c8y-data-points-table-widget--reload-button\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading() }\"\n ></i>\n </button>\n </div>\n </div>\n</div>\n" }]
98
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Injector }, { type: i1.TranslateService }], propDecorators: { countdownIntervalComponent: [{
117
+ args: [{ selector: 'c8y-datapoints-reload', standalone: true, imports: [CommonModule, CountdownIntervalModule, ListGroupModule, TooltipModule], template: "<ng-container *ngIf=\"!widgetInstanceGlobalAutoRefreshContext\">\n <div class=\"a-i-center input-group p-t-4 p-b-4 max-width-fit m-l-auto\">\n <label\n class=\"m-b-0 m-r-8 text-label-small text-truncate flex-no-shrink\"\n title=\" {{ 'Auto refresh' | translate }}\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n >\n {{ 'Auto refresh' | translate }}\n </label>\n <div class=\"input-group\">\n <label\n class=\"toggle-countdown\"\n [class.toggle-countdown-disabled]=\"isRefreshDisabled\"\n [attr.aria-label]=\"toggleCountdownButtonTooltipText\"\n [tooltip]=\"toggleCountdownButtonTooltipText\"\n placement=\"bottom\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isIntervalRefreshToggleOn\"\n [disabled]=\"isRefreshDisabled\"\n data-cy=\"c8y-data-points-table-widget--interval-toggle-button\"\n (click)=\"onToggleCountdownButtonState($event)\"\n />\n\n <c8y-countdown-interval\n *ngIf=\"isIntervalRefreshToggleOn\"\n [countdownInterval]=\"refreshInterval\"\n (countdownEnded)=\"countdownEnded()\"\n ></c8y-countdown-interval>\n <i\n c8yIcon=\"pause\"\n *ngIf=\"!isIntervalRefreshToggleOn\"\n ></i>\n </label>\n\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n [disabled]=\"isRefreshDisabled || (isLoading | async)\"\n (click)=\"reload()\"\n data-cy=\"c8y-data-points-table-widget--reload-button\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading | async }\"\n ></i>\n </button>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
118
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.TranslateService }, { type: i2.WidgetGlobalAutoRefreshService }], propDecorators: { countdownIntervalComponent: [{
99
119
  type: ViewChild,
100
120
  args: [CountdownIntervalComponent, { static: false }]
101
121
  }], isAutoRefreshEnabled: [{
102
122
  type: Input
103
- }], isDisabled: [{
123
+ }], isRefreshDisabled: [{
104
124
  type: Input
105
125
  }], isLoading: [{
106
126
  type: Input
@@ -110,7 +130,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
110
130
  type: Input
111
131
  }], refreshInterval: [{
112
132
  type: Input
133
+ }], widgetInstanceGlobalAutoRefreshContext: [{
134
+ type: Input
113
135
  }], onCountdownEnded: [{
114
136
  type: Output
115
137
  }] } });
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy1yZWxvYWQvZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy1yZWxvYWQvZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBRUwsTUFBTSxFQUdOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsWUFBWSxFQUNaLDBCQUEwQixFQUMxQix1QkFBdUIsRUFDdkIsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7OztBQVF0RCxNQUFNLE9BQU8seUJBQTBCLFNBQVEsbUJBQW1CO0lBd0NoRSxZQUNVLEtBQXdCLEVBQ3hCLFFBQWtCLEVBQ2xCLGdCQUFrQztRQUUxQyxLQUFLLEVBQUUsQ0FBQztRQUpBLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQXRCNUM7O1dBRUc7UUFDTyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFB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RSx1QkFBdUIsY0FFckIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLHVCQUF1QixFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUM7NElBSWhGLDBCQUEwQjtzQkFEekIsU0FBUzt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSy9DLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBSUcsZUFBZTtzQkFBdkIsS0FBSztnQkFJSSxnQkFBZ0I7c0JBQXpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpZ25hbCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29tbW9uTW9kdWxlLFxuICBDb3VudGRvd25JbnRlcnZhbENvbXBvbmVudCxcbiAgQ291bnRkb3duSW50ZXJ2YWxNb2R1bGUsXG4gIEludGVydmFsQmFzZWRSZWxvYWQsXG4gIExpc3RHcm91cE1vZHVsZSxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL3Rvb2x0aXAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGF0YXBvaW50cy1yZWxvYWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBDb3VudGRvd25JbnRlcnZhbE1vZHVsZSwgTGlzdEdyb3VwTW9kdWxlLCBUb29sdGlwTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhcG9pbnRzUmVsb2FkQ29tcG9uZW50IGV4dGVuZHMgSW50ZXJ2YWxCYXNlZFJlbG9hZCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBWaWV3Q2hpbGQoQ291bnRkb3duSW50ZXJ2YWxDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBjb3VudGRvd25JbnRlcnZhbENvbXBvbmVudDogQ291bnRkb3duSW50ZXJ2YWxDb21wb25lbnQ7XG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKi9cbiAgQElucHV0KCkgaXNBdXRvUmVmcmVzaEVuYWJsZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgaXNEaXNhYmxlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmc6IFNpZ25hbDxib29sZWFuPjtcblxuICBASW5wdXQoKSBpc1Njcm9sbGluZzogYm9vbGVhbjtcblxuICBASW5wdXQoKSBpc0V4cG9ydE1vZGFsT3BlbjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBASW5wdXQoKSByZWZyZXNoSW50ZXJ2YWw6IG51bWJlcjtcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBAT3V0cHV0KCkgb25Db3VudGRvd25FbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBpc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uOiBib29sZWFuO1xuXG4gIHRvZ2dsZUNvdW50ZG93bkJ1dHRvblRvb2x0aXBUZXh0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKi9cbiAgcHJvdGVjdGVkIG1hbnVhbGx5RGlzYWJsZWRDb3VudGRvd24gPSBmYWxzZTtcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBwcm90ZWN0ZWQgaGlkZUNvdW50ZG93bjogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkICYmIHRoaXMuaXNBdXRvUmVmcmVzaEVuYWJsZWQpIHtcbiAgICAgIHRoaXMuaXNJbnRlcnZhbFJlZnJlc2hUb2dnbGVPbiA9IGZhbHNlO1xuICAgICAgdGhpcy5kaXNhYmxlQ291bnRkb3duKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNFeHBvcnRNb2RhbE9wZW4gJiYgdGhpcy5jYW5EaXNhYmxlQ291bnRkb3duV2hlbk1vZGFsSXNPcGVuKCkpIHtcbiAgICAgIHRoaXMuaXNJbnRlcnZhbFJlZnJlc2hUb2dnbGVPbiA9ICF0aGlzLmlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT247XG4gICAgICB0aGlzLmRpc2FibGVDb3VudGRvd24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuY2FuU3RhcnRDb3VudGRvd24oY2hhbmdlcykpIHtcbiAgICAgICAgdGhpcy5pc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGFydENvdW50ZG93bih0aGlzLmluamVjdG9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2FuSGFuZGxlU2Nyb2xsaW5nKCkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGxpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGNvdW50ZG93bkVuZGVkKCk6IHZvaWQge1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0ZG9jXG4gICAgICovXG4gICAgdGhpcy5hdXRvUmVmcmVzaExpc3QoKTtcbiAgfVxuXG4gIHJlbG9hZCgpOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdGRvY1xuICAgICAqL1xuICAgIHRoaXMuYXV0b1JlZnJlc2hMaXN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGVuYWJsZUNvdW50ZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmhpZGVDb3VudGRvd24gPSBmYWxzZTtcbiAgICAvLyBQcmV2ZW50cyB0aGUgY291bnRkb3duIGZyb20gZ2V0dGluZyBzdHVjayBvbiBhbiBpbml0aWFsIHZhbHVlLlxuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuc3RhcnRDb3VudGRvd24odGhpcy5pbmplY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVDb3VudGRvd25CdXR0b25Ub29sdGlwVGV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZUNvdW50ZG93bkJ1dHRvblRvb2x0aXBUZXh0ID0gdGhpcy5pc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uXG4gICAgICA/IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGdldHRleHQoJ0Rpc2FibGUgYXV0byByZWZyZXNoJykpXG4gICAgICA6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGdldHRleHQoJ0VuYWJsZSBhdXRvIHJlZnJlc2gnKSk7XG4gIH1cblxuICBwcml2YXRlIGNhblN0YXJ0Q291bnRkb3duKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGlzQXV0b1JlZnJlc2hFbmFibGVkLCByZWZyZXNoSW50ZXJ2YWwgfSA9IGNoYW5nZXM7XG4gICAgcmV0dXJuIChcbiAgICAgIChpc0F1dG9SZWZyZXNoRW5hYmxlZCB8fCByZWZyZXNoSW50ZXJ2YWwpICYmXG4gICAgICAodGhpcy5pc0F1dG9SZWZyZXNoRW5hYmxlZCB8fCAhIXRoaXMucmVmcmVzaEludGVydmFsKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNhbkhhbmRsZVNjcm9sbGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMubWFudWFsbHlEaXNhYmxlZENvdW50ZG93biAmJiB0aGlzLmlzQXV0b1JlZnJlc2hFbmFibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5EaXNhYmxlQ291bnRkb3duV2hlbk1vZGFsSXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzQXV0b1JlZnJlc2hFbmFibGVkICYmXG4gICAgICAhIXRoaXMucmVmcmVzaEludGVydmFsICYmXG4gICAgICAhdGhpcy5tYW51YWxseURpc2FibGVkQ291bnRkb3duICYmXG4gICAgICAhdGhpcy5pc1Njcm9sbGluZyAmJlxuICAgICAgIXRoaXMuaGlkZUNvdW50ZG93blxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhLWktY2VudGVyIGlucHV0LWdyb3VwIHAtdC00IHAtYi00IG1heC13aWR0aC1maXQgbS1sLWF1dG9cIj5cbiAgPGxhYmVsXG4gICAgY2xhc3M9XCJtLWItMCBtLXItOCB0ZXh0LWxhYmVsLXNtYWxsIHRleHQtdHJ1bmNhdGUgZmxleC1uby1zaHJpbmtcIlxuICAgIHRpdGxlPVwiIHt7ICdBdXRvIHJlZnJlc2gnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAqbmdJZj1cInJlZnJlc2hJbnRlcnZhbCAmJiBpc0F1dG9SZWZyZXNoRW5hYmxlZFwiXG4gID5cbiAgICB7eyAnQXV0byByZWZyZXNoJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2xhYmVsPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICA8bGFiZWxcbiAgICAgIGNsYXNzPVwidG9nZ2xlLWNvdW50ZG93blwiXG4gICAgICBbY2xhc3MudG9nZ2xlLWNvdW50ZG93bi1kaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidG9nZ2xlQ291bnRkb3duQnV0dG9uVG9vbHRpcFRleHRcIlxuICAgICAgW3Rvb2x0aXBdPVwidG9nZ2xlQ291bnRkb3duQnV0dG9uVG9vbHRpcFRleHRcIlxuICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICpuZ0lmPVwicmVmcmVzaEludGVydmFsICYmIGlzQXV0b1JlZnJlc2hFbmFibGVkXCJcbiAgICAgIFthZGFwdGl2ZVBvc2l0aW9uXT1cImZhbHNlXCJcbiAgICAgIFtjb250YWluZXJdPVwiJ2JvZHknXCJcbiAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgID5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICBbY2hlY2tlZF09XCJpc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxuICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtcG9pbnRzLXRhYmxlLXdpZGdldC0taW50ZXJ2YWwtdG9nZ2xlLWJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJvblRvZ2dsZUNvdW50ZG93bkJ1dHRvblN0YXRlKCRldmVudClcIlxuICAgICAgLz5cblxuICAgICAgPGM4eS1jb3VudGRvd24taW50ZXJ2YWxcbiAgICAgICAgKm5nSWY9XCJpc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uXCJcbiAgICAgICAgW2NvdW50ZG93bkludGVydmFsXT1cInJlZnJlc2hJbnRlcnZhbFwiXG4gICAgICAgIChjb3VudGRvd25FbmRlZCk9XCJjb3VudGRvd25FbmRlZCgpXCJcbiAgICAgID48L2M4eS1jb3VudGRvd24taW50ZXJ2YWw+XG4gICAgICA8aVxuICAgICAgICBjOHlJY29uPVwicGF1c2VcIlxuICAgICAgICAqbmdJZj1cIiFpc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uXCJcbiAgICAgID48L2k+XG4gICAgPC9sYWJlbD5cblxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZWZyZXNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFt0b29sdGlwXT1cIidSZWZyZXNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJmYWxzZVwiXG4gICAgICAgIFtjb250YWluZXJdPVwiJ2JvZHknXCJcbiAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0xvYWRpbmcoKVwiXG4gICAgICAgIChjbGljayk9XCJyZWxvYWQoKVwiXG4gICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1wb2ludHMtdGFibGUtd2lkZ2V0LS1yZWxvYWQtYnV0dG9uXCJcbiAgICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICBjOHlJY29uPVwicmVmcmVzaFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogaXNMb2FkaW5nKCkgfVwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy1yZWxvYWQvZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy1yZWxvYWQvZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxZQUFZLEVBQ1osMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLDhCQUE4QixFQUM5QixPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBUWhFLE1BQU0sT0FBTyx5QkFDWCxTQUFRLG1CQUFtQjtJQWdEM0IsWUFDVSxLQUF3QixFQUN4QixnQkFBa0MsRUFDbEMsOEJBQThEO1FBRXRFLEtBQUssRUFBRSxDQUFDO1FBSkEsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIscUJBQWdCLEdBQWhCLGdCQUFnQixD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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29tbW9uTW9kdWxlLFxuICBDb3VudGRvd25JbnRlcnZhbENvbXBvbmVudCxcbiAgQ291bnRkb3duSW50ZXJ2YWxNb2R1bGUsXG4gIEludGVydmFsQmFzZWRSZWxvYWQsXG4gIExpc3RHcm91cE1vZHVsZSxcbiAgV2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2hTZXJ2aWNlLFxuICBnZXR0ZXh0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvdG9vbHRpcCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhcG9pbnRzLXJlbG9hZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhcG9pbnRzLXJlbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENvdW50ZG93bkludGVydmFsTW9kdWxlLCBMaXN0R3JvdXBNb2R1bGUsIFRvb2x0aXBNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIERhdGFwb2ludHNSZWxvYWRDb21wb25lbnRcbiAgZXh0ZW5kcyBJbnRlcnZhbEJhc2VkUmVsb2FkXG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgQFZpZXdDaGlsZChDb3VudGRvd25JbnRlcnZhbENvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGNvdW50ZG93bkludGVydmFsQ29tcG9uZW50OiBDb3VudGRvd25JbnRlcnZhbENvbXBvbmVudDtcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBASW5wdXQoKSBpc0F1dG9SZWZyZXNoRW5hYmxlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBASW5wdXQoKSBpc1JlZnJlc2hEaXNhYmxlZCA9IGZhbHNlO1xuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuXG4gIEBJbnB1dCgpIGlzU2Nyb2xsaW5nOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIGlzRXhwb3J0TW9kYWxPcGVuOiBib29sZWFuO1xuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIEBJbnB1dCgpIHJlZnJlc2hJbnRlcnZhbDogbnVtYmVyO1xuXG4gIEBJbnB1dCgpIHdpZGdldEluc3RhbmNlR2xvYmFsQXV0b1JlZnJlc2hDb250ZXh0OiBib29sZWFuO1xuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIEBPdXRwdXQoKSBvbkNvdW50ZG93bkVuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT246IGJvb2xlYW47XG5cbiAgdG9nZ2xlQ291bnRkb3duQnV0dG9uVG9vbHRpcFRleHQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBwcm90ZWN0ZWQgbWFudWFsbHlEaXNhYmxlZENvdW50ZG93biA9IGZhbHNlO1xuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIHByb3RlY3RlZCBoaWRlQ291bnRkb3duOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgd2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2hTZXJ2aWNlOiBXaWRnZXRHbG9iYWxBdXRvUmVmcmVzaFNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZUdsb2JhbEF1dG9SZWZyZXNoQ29udGV4dCkge1xuICAgICAgdGhpcy53aWRnZXRHbG9iYWxBdXRvUmVmcmVzaFNlcnZpY2UuY291bnRkb3duQWN0aW9ucy5jb3VudGRvd25FbmRlZCRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLm9uQ291bnRkb3duRW5kZWQuZW1pdCgpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSZWZyZXNoRGlzYWJsZWQgJiYgdGhpcy5pc0F1dG9SZWZyZXNoRW5hYmxlZCkge1xuICAgICAgdGhpcy5pc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uID0gZmFsc2U7XG4gICAgICB0aGlzLmRpc2FibGVDb3VudGRvd24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0V4cG9ydE1vZGFsT3BlbiAmJiB0aGlzLmNhbkRpc2FibGVDb3VudGRvd25XaGVuTW9kYWxJc09wZW4oKSkge1xuICAgICAgdGhpcy5pc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uID0gIXRoaXMuaXNJbnRlcnZhbFJlZnJlc2hUb2dnbGVPbjtcbiAgICAgIHRoaXMuZGlzYWJsZUNvdW50ZG93bigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5jYW5TdGFydENvdW50ZG93bihjaGFuZ2VzKSkge1xuICAgICAgICB0aGlzLmlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT24gPSB0cnVlO1xuICAgICAgICB0aGlzLnN0YXJ0Q291bnRkb3duKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNhbkhhbmRsZVNjcm9sbGluZygpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsaW5nKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY291bnRkb3duU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmNvdW50ZG93blN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGNvdW50ZG93bkVuZGVkKCk6IHZvaWQge1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0ZG9jXG4gICAgICovXG4gICAgdGhpcy5hdXRvUmVmcmVzaExpc3QoKTtcbiAgfVxuXG4gIHJlbG9hZCgpOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdGRvY1xuICAgICAqL1xuICAgIHRoaXMuYXV0b1JlZnJlc2hMaXN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGVuYWJsZUNvdW50ZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmhpZGVDb3VudGRvd24gPSBmYWxzZTtcbiAgICAvLyBQcmV2ZW50cyB0aGUgY291bnRkb3duIGZyb20gZ2V0dGluZyBzdHVjayBvbiBhbiBpbml0aWFsIHZhbHVlLlxuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuc3RhcnRDb3VudGRvd24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUNvdW50ZG93bkJ1dHRvblRvb2x0aXBUZXh0KCk6IHZvaWQge1xuICAgIHRoaXMudG9nZ2xlQ291bnRkb3duQnV0dG9uVG9vbHRpcFRleHQgPSB0aGlzLmlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT25cbiAgICAgID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnRGlzYWJsZSBhdXRvIHJlZnJlc2gnKSlcbiAgICAgIDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnRW5hYmxlIGF1dG8gcmVmcmVzaCcpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuU3RhcnRDb3VudGRvd24oY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgaXNBdXRvUmVmcmVzaEVuYWJsZWQsIHJlZnJlc2hJbnRlcnZhbCB9ID0gY2hhbmdlcztcbiAgICByZXR1cm4gKFxuICAgICAgKGlzQXV0b1JlZnJlc2hFbmFibGVkIHx8IHJlZnJlc2hJbnRlcnZhbCkgJiZcbiAgICAgICh0aGlzLmlzQXV0b1JlZnJlc2hFbmFibGVkIHx8ICEhdGhpcy5yZWZyZXNoSW50ZXJ2YWwpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuSGFuZGxlU2Nyb2xsaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5tYW51YWxseURpc2FibGVkQ291bnRkb3duICYmIHRoaXMuaXNBdXRvUmVmcmVzaEVuYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIGNhbkRpc2FibGVDb3VudGRvd25XaGVuTW9kYWxJc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNBdXRvUmVmcmVzaEVuYWJsZWQgJiZcbiAgICAgICEhdGhpcy5yZWZyZXNoSW50ZXJ2YWwgJiZcbiAgICAgICF0aGlzLm1hbnVhbGx5RGlzYWJsZWRDb3VudGRvd24gJiZcbiAgICAgICF0aGlzLmlzU2Nyb2xsaW5nICYmXG4gICAgICAhdGhpcy5oaWRlQ291bnRkb3duXG4gICAgKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZUdsb2JhbEF1dG9SZWZyZXNoQ29udGV4dFwiPlxuICA8ZGl2IGNsYXNzPVwiYS1pLWNlbnRlciBpbnB1dC1ncm91cCBwLXQtNCBwLWItNCBtYXgtd2lkdGgtZml0IG0tbC1hdXRvXCI+XG4gICAgPGxhYmVsXG4gICAgICBjbGFzcz1cIm0tYi0wIG0tci04IHRleHQtbGFiZWwtc21hbGwgdGV4dC10cnVuY2F0ZSBmbGV4LW5vLXNocmlua1wiXG4gICAgICB0aXRsZT1cIiB7eyAnQXV0byByZWZyZXNoJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAqbmdJZj1cInJlZnJlc2hJbnRlcnZhbCAmJiBpc0F1dG9SZWZyZXNoRW5hYmxlZFwiXG4gICAgPlxuICAgICAge3sgJ0F1dG8gcmVmcmVzaCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2xhYmVsPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgPGxhYmVsXG4gICAgICAgIGNsYXNzPVwidG9nZ2xlLWNvdW50ZG93blwiXG4gICAgICAgIFtjbGFzcy50b2dnbGUtY291bnRkb3duLWRpc2FibGVkXT1cImlzUmVmcmVzaERpc2FibGVkXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0b2dnbGVDb3VudGRvd25CdXR0b25Ub29sdGlwVGV4dFwiXG4gICAgICAgIFt0b29sdGlwXT1cInRvZ2dsZUNvdW50ZG93bkJ1dHRvblRvb2x0aXBUZXh0XCJcbiAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgKm5nSWY9XCJyZWZyZXNoSW50ZXJ2YWwgJiYgaXNBdXRvUmVmcmVzaEVuYWJsZWRcIlxuICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJmYWxzZVwiXG4gICAgICAgIFtjb250YWluZXJdPVwiJ2JvZHknXCJcbiAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICA+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgW2NoZWNrZWRdPVwiaXNJbnRlcnZhbFJlZnJlc2hUb2dnbGVPblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVmcmVzaERpc2FibGVkXCJcbiAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtcG9pbnRzLXRhYmxlLXdpZGdldC0taW50ZXJ2YWwtdG9nZ2xlLWJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uVG9nZ2xlQ291bnRkb3duQnV0dG9uU3RhdGUoJGV2ZW50KVwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPGM4eS1jb3VudGRvd24taW50ZXJ2YWxcbiAgICAgICAgICAqbmdJZj1cImlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT25cIlxuICAgICAgICAgIFtjb3VudGRvd25JbnRlcnZhbF09XCJyZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgIChjb3VudGRvd25FbmRlZCk9XCJjb3VudGRvd25FbmRlZCgpXCJcbiAgICAgICAgPjwvYzh5LWNvdW50ZG93bi1pbnRlcnZhbD5cbiAgICAgICAgPGlcbiAgICAgICAgICBjOHlJY29uPVwicGF1c2VcIlxuICAgICAgICAgICpuZ0lmPVwiIWlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT25cIlxuICAgICAgICA+PC9pPlxuICAgICAgPC9sYWJlbD5cblxuICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlZnJlc2gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInUmVmcmVzaCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgIFtjb250YWluZXJdPVwiJ2JvZHknXCJcbiAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWZyZXNoRGlzYWJsZWQgfHwgKGlzTG9hZGluZyB8IGFzeW5jKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInJlbG9hZCgpXCJcbiAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtcG9pbnRzLXRhYmxlLXdpZGdldC0tcmVsb2FkLWJ1dHRvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8aVxuICAgICAgICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogaXNMb2FkaW5nIHwgYXN5bmMgfVwiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
@@ -81,7 +81,7 @@ export class DatapointsTableComponent {
81
81
  }));
82
82
  }
83
83
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointsTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
84
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatapointsTableComponent, isStandalone: true, selector: "c8y-datapoints-table", inputs: { aggregationType: "aggregationType", datapointsTableItems: "datapointsTableItems", devicesColumnHeaders: "devicesColumnHeaders", decimalPlaces: "decimalPlaces", hasMultipleDatapoints: "hasMultipleDatapoints", isLoading: "isLoading", seriesWithoutPermissionToReadCount: "seriesWithoutPermissionToReadCount" }, outputs: { isScrolling: "isScrolling" }, host: { classAttribute: "d-col flex-grow" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"c8y-cq-440\">\n <div\n class=\"hidden-xs c8y-list__item c8y-list--timeline hidden-cq\"\n [ngClass]=\"{ 'separator-top-bottom': devicesColumnHeaders.length > 0 }\"\n >\n <div class=\"d-flex container-fluid\">\n <div class=\"c8y-list--timeline__item__date\"></div>\n <div class=\"c8y-list__item__block flex-grow min-width-0\">\n <div class=\"c8y-list__item__body\">\n <div class=\"d-flex row\">\n <ng-container *ngIf=\"hasMultipleDatapoints\">\n <div\n class=\"min-width-0\"\n [title]=\"'Device' | translate\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">\n {{ 'Device' | translate }}\n </span>\n </div>\n </ng-container>\n <!-- Data points column headers -->\n <ng-container *ngFor=\"let header of devicesColumnHeaders\">\n <div\n class=\"min-width-0\"\n title=\"{{ header | columnTitle }}\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">{{ header.label }} {{ header.unit }}</span>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<!-- The record list -->\n<ng-container *ngIf=\"!isLoading; else loading\">\n <ng-container *ngIf=\"!hasNoPermissionsToReadAnyMeasurement; else missingAllPermissions\">\n <ng-container *ngIf=\"datapointsTableItems.length; else emptyState\">\n <c8y-list-group\n class=\"p-t-8 flex-grow c8y-cq-440\"\n c8yVirtualScrollListener\n (scrolled)=\"onListScrolled()\"\n (scrolledToTop)=\"onListScrolledToTop()\"\n >\n <c8y-li-timeline\n *c8yFor=\"\n let tableItem of { data: datapointsTableItems, res: null };\n enableVirtualScroll: true;\n virtualScrollElementSize: 40;\n virtualScrollStrategy: 'fixed'\n \"\n >\n {{ tableItem.dateAndTime | c8yDate: 'mediumDate' }}\n {{\n tableItem.dateAndTime\n | c8yDate: 'mediumTime'\n | adjustAggregatedTimeRange: aggregationType\n }}\n <c8y-li>\n <c8y-li-body>\n <div class=\"d-flex row\">\n <div\n class=\"min-width-0\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngIf=\"devicesColumnHeaders.length > 1\"\n [attr.data-label]=\"'Device' | translate\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ tableItem.deviceName }}\"\n >\n {{ tableItem.deviceName }}\n </div>\n </div>\n <!-- Data point value row cells -->\n <ng-container *ngFor=\"let row of tableItem.rowItems\">\n <ng-container *ngIf=\"row !== null; else emptyRowContent\">\n <ng-container [ngSwitch]=\"row.renderType\">\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'min'\"\n [attr.data-label]=\"row.label\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </div>\n </div>\n <div\n class=\"col-md-4\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'max'\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </div>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchCase=\"'area'\"\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n ...\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.max ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchDefault\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #emptyRowContent>\n <div [c8yDynamicColumn]=\"devicesColumnHeaders.length\"></div>\n </ng-template>\n </ng-container>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n</ng-container>\n<ng-template #loading>\n <c8y-loading></c8y-loading>\n</ng-template>\n<ng-template #emptyState>\n <div class=\"p-relative p-l-24\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-alert-idle'\"\n [title]=\"'No data to display.' | translate\"\n [horizontal]=\"true\"\n data-cy=\"datapoints-table-list--empty-state\"\n >\n <p c8y-guide-docs>\n <small translate>\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#data-point-table\">\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n</ng-template>\n<ng-template #missingAllPermissions>\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div class=\"center-block\">\n <c8y-dynamic-component-alerts\n [alerts]=\"missingAllPermissionsAlert\"\n ></c8y-dynamic-component-alerts>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "pipe", type: AdjustAggregatedTimeRangePipe, name: "adjustAggregatedTimeRange" }, { kind: "pipe", type: ApplyRangeClassPipe, name: "applyRangeClass" }, { kind: "pipe", type: ColumnTitlePipe, name: "columnTitle" }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: i1.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }, { kind: "directive", type: i1.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "pipe", type: i1.DatePipe, name: "c8yDate" }, { kind: "component", type: i1.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "ngmodule", type: DocsModule }, { kind: "directive", type: i1.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i1.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "directive", type: DynamicColumnDirective, selector: "[c8yDynamicColumn]", inputs: ["c8yDynamicColumn"] }, { kind: "ngmodule", type: DynamicComponentModule }, { kind: "component", type: i1.DynamicComponentAlertsComponent, selector: "c8y-dynamic-component-alerts", inputs: ["alerts"] }, { kind: "ngmodule", type: ListGroupModule }, { kind: "component", type: i1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i1.ListItemTimelineComponent, selector: "c8y-list-item-timeline, c8y-li-timeline" }, { kind: "directive", type: VirtualScrollListenerDirective, selector: "[c8yVirtualScrollListener]", inputs: ["scrollThreshold"], outputs: ["scrolled", "scrolledToTop"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
84
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatapointsTableComponent, isStandalone: true, selector: "c8y-datapoints-table", inputs: { aggregationType: "aggregationType", datapointsTableItems: "datapointsTableItems", devicesColumnHeaders: "devicesColumnHeaders", decimalPlaces: "decimalPlaces", hasMultipleDatapoints: "hasMultipleDatapoints", isLoading: "isLoading", seriesWithoutPermissionToReadCount: "seriesWithoutPermissionToReadCount" }, outputs: { isScrolling: "isScrolling" }, host: { classAttribute: "d-col flex-grow" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"!hasNoPermissionsToReadAnyMeasurement; else missingAllPermissions\">\n <div class=\"c8y-cq-440\">\n <div\n class=\"hidden-xs c8y-list__item c8y-list--timeline hidden-cq\"\n [ngClass]=\"{ 'separator-top-bottom': devicesColumnHeaders.length > 0 }\"\n >\n <div class=\"d-flex container-fluid\">\n <div class=\"c8y-list--timeline__item__date\"></div>\n <div class=\"c8y-list__item__block flex-grow min-width-0\">\n <div class=\"c8y-list__item__body\">\n <div class=\"d-flex row\">\n <ng-container *ngIf=\"hasMultipleDatapoints\">\n <div\n class=\"min-width-0\"\n [title]=\"'Device' | translate\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">\n {{ 'Device' | translate }}\n </span>\n </div>\n </ng-container>\n <!-- Data points column headers -->\n <ng-container *ngFor=\"let header of devicesColumnHeaders\">\n <div\n class=\"min-width-0\"\n title=\"{{ header | columnTitle }}\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">\n {{ header.label }} {{ header.unit }}\n </span>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- The record list -->\n <ng-container *ngIf=\"!isLoading; else loading\">\n <ng-container *ngIf=\"datapointsTableItems.length; else emptyState\">\n <c8y-list-group\n class=\"p-t-8 flex-grow c8y-cq-440\"\n c8yVirtualScrollListener\n (scrolled)=\"onListScrolled()\"\n (scrolledToTop)=\"onListScrolledToTop()\"\n >\n <c8y-li-timeline\n *c8yFor=\"\n let tableItem of { data: datapointsTableItems, res: null };\n enableVirtualScroll: true;\n virtualScrollElementSize: 40;\n virtualScrollStrategy: 'fixed'\n \"\n >\n {{ tableItem.dateAndTime | c8yDate: 'mediumDate' }}\n {{\n tableItem.dateAndTime\n | c8yDate: 'mediumTime'\n | adjustAggregatedTimeRange: aggregationType\n }}\n <c8y-li>\n <c8y-li-body>\n <div class=\"d-flex row\">\n <div\n class=\"min-width-0\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngIf=\"devicesColumnHeaders.length > 1\"\n [attr.data-label]=\"'Device' | translate\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ tableItem.deviceName }}\"\n >\n {{ tableItem.deviceName }}\n </div>\n </div>\n <!-- Data point value row cells -->\n <ng-container *ngFor=\"let row of tableItem.rowItems\">\n <ng-container *ngIf=\"row !== null; else emptyRowContent\">\n <ng-container [ngSwitch]=\"row.renderType\">\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'min'\"\n [attr.data-label]=\"row.label\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </div>\n </div>\n <div\n class=\"col-md-4\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'max'\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </div>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchCase=\"'area'\"\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n ...\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.max ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchDefault\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #emptyRowContent>\n <div [c8yDynamicColumn]=\"devicesColumnHeaders.length\"></div>\n </ng-template>\n </ng-container>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n</ng-container>\n<ng-template #loading>\n <c8y-loading></c8y-loading>\n</ng-template>\n<ng-template #emptyState>\n <div class=\"p-relative p-l-24\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-alert-idle'\"\n [title]=\"'No data to display.' | translate\"\n [horizontal]=\"true\"\n data-cy=\"datapoints-table-list--empty-state\"\n >\n <p c8y-guide-docs>\n <small translate>\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#data-point-table\">\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n</ng-template>\n<ng-template #missingAllPermissions>\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div class=\"center-block\">\n <c8y-dynamic-component-alerts\n [alerts]=\"missingAllPermissionsAlert\"\n ></c8y-dynamic-component-alerts>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "pipe", type: AdjustAggregatedTimeRangePipe, name: "adjustAggregatedTimeRange" }, { kind: "pipe", type: ApplyRangeClassPipe, name: "applyRangeClass" }, { kind: "pipe", type: ColumnTitlePipe, name: "columnTitle" }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: i1.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }, { kind: "directive", type: i1.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "pipe", type: i1.DatePipe, name: "c8yDate" }, { kind: "component", type: i1.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "ngmodule", type: DocsModule }, { kind: "directive", type: i1.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i1.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "directive", type: DynamicColumnDirective, selector: "[c8yDynamicColumn]", inputs: ["c8yDynamicColumn"] }, { kind: "ngmodule", type: DynamicComponentModule }, { kind: "component", type: i1.DynamicComponentAlertsComponent, selector: "c8y-dynamic-component-alerts", inputs: ["alerts"] }, { kind: "ngmodule", type: ListGroupModule }, { kind: "component", type: i1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i1.ListItemTimelineComponent, selector: "c8y-list-item-timeline, c8y-li-timeline" }, { kind: "directive", type: VirtualScrollListenerDirective, selector: "[c8yVirtualScrollListener]", inputs: ["scrollThreshold"], outputs: ["scrolled", "scrolledToTop"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
85
85
  }
86
86
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointsTableComponent, decorators: [{
87
87
  type: Component,
@@ -95,7 +95,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
95
95
  DynamicComponentModule,
96
96
  ListGroupModule,
97
97
  VirtualScrollListenerDirective
98
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"c8y-cq-440\">\n <div\n class=\"hidden-xs c8y-list__item c8y-list--timeline hidden-cq\"\n [ngClass]=\"{ 'separator-top-bottom': devicesColumnHeaders.length > 0 }\"\n >\n <div class=\"d-flex container-fluid\">\n <div class=\"c8y-list--timeline__item__date\"></div>\n <div class=\"c8y-list__item__block flex-grow min-width-0\">\n <div class=\"c8y-list__item__body\">\n <div class=\"d-flex row\">\n <ng-container *ngIf=\"hasMultipleDatapoints\">\n <div\n class=\"min-width-0\"\n [title]=\"'Device' | translate\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">\n {{ 'Device' | translate }}\n </span>\n </div>\n </ng-container>\n <!-- Data points column headers -->\n <ng-container *ngFor=\"let header of devicesColumnHeaders\">\n <div\n class=\"min-width-0\"\n title=\"{{ header | columnTitle }}\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">{{ header.label }} {{ header.unit }}</span>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<!-- The record list -->\n<ng-container *ngIf=\"!isLoading; else loading\">\n <ng-container *ngIf=\"!hasNoPermissionsToReadAnyMeasurement; else missingAllPermissions\">\n <ng-container *ngIf=\"datapointsTableItems.length; else emptyState\">\n <c8y-list-group\n class=\"p-t-8 flex-grow c8y-cq-440\"\n c8yVirtualScrollListener\n (scrolled)=\"onListScrolled()\"\n (scrolledToTop)=\"onListScrolledToTop()\"\n >\n <c8y-li-timeline\n *c8yFor=\"\n let tableItem of { data: datapointsTableItems, res: null };\n enableVirtualScroll: true;\n virtualScrollElementSize: 40;\n virtualScrollStrategy: 'fixed'\n \"\n >\n {{ tableItem.dateAndTime | c8yDate: 'mediumDate' }}\n {{\n tableItem.dateAndTime\n | c8yDate: 'mediumTime'\n | adjustAggregatedTimeRange: aggregationType\n }}\n <c8y-li>\n <c8y-li-body>\n <div class=\"d-flex row\">\n <div\n class=\"min-width-0\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngIf=\"devicesColumnHeaders.length > 1\"\n [attr.data-label]=\"'Device' | translate\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ tableItem.deviceName }}\"\n >\n {{ tableItem.deviceName }}\n </div>\n </div>\n <!-- Data point value row cells -->\n <ng-container *ngFor=\"let row of tableItem.rowItems\">\n <ng-container *ngIf=\"row !== null; else emptyRowContent\">\n <ng-container [ngSwitch]=\"row.renderType\">\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'min'\"\n [attr.data-label]=\"row.label\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </div>\n </div>\n <div\n class=\"col-md-4\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'max'\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </div>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchCase=\"'area'\"\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n ...\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.max ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchDefault\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #emptyRowContent>\n <div [c8yDynamicColumn]=\"devicesColumnHeaders.length\"></div>\n </ng-template>\n </ng-container>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n</ng-container>\n<ng-template #loading>\n <c8y-loading></c8y-loading>\n</ng-template>\n<ng-template #emptyState>\n <div class=\"p-relative p-l-24\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-alert-idle'\"\n [title]=\"'No data to display.' | translate\"\n [horizontal]=\"true\"\n data-cy=\"datapoints-table-list--empty-state\"\n >\n <p c8y-guide-docs>\n <small translate>\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#data-point-table\">\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n</ng-template>\n<ng-template #missingAllPermissions>\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div class=\"center-block\">\n <c8y-dynamic-component-alerts\n [alerts]=\"missingAllPermissionsAlert\"\n ></c8y-dynamic-component-alerts>\n </div>\n </div>\n</ng-template>\n" }]
98
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"!hasNoPermissionsToReadAnyMeasurement; else missingAllPermissions\">\n <div class=\"c8y-cq-440\">\n <div\n class=\"hidden-xs c8y-list__item c8y-list--timeline hidden-cq\"\n [ngClass]=\"{ 'separator-top-bottom': devicesColumnHeaders.length > 0 }\"\n >\n <div class=\"d-flex container-fluid\">\n <div class=\"c8y-list--timeline__item__date\"></div>\n <div class=\"c8y-list__item__block flex-grow min-width-0\">\n <div class=\"c8y-list__item__body\">\n <div class=\"d-flex row\">\n <ng-container *ngIf=\"hasMultipleDatapoints\">\n <div\n class=\"min-width-0\"\n [title]=\"'Device' | translate\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">\n {{ 'Device' | translate }}\n </span>\n </div>\n </ng-container>\n <!-- Data points column headers -->\n <ng-container *ngFor=\"let header of devicesColumnHeaders\">\n <div\n class=\"min-width-0\"\n title=\"{{ header | columnTitle }}\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n >\n <span class=\"text-medium text-truncate\">\n {{ header.label }} {{ header.unit }}\n </span>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- The record list -->\n <ng-container *ngIf=\"!isLoading; else loading\">\n <ng-container *ngIf=\"datapointsTableItems.length; else emptyState\">\n <c8y-list-group\n class=\"p-t-8 flex-grow c8y-cq-440\"\n c8yVirtualScrollListener\n (scrolled)=\"onListScrolled()\"\n (scrolledToTop)=\"onListScrolledToTop()\"\n >\n <c8y-li-timeline\n *c8yFor=\"\n let tableItem of { data: datapointsTableItems, res: null };\n enableVirtualScroll: true;\n virtualScrollElementSize: 40;\n virtualScrollStrategy: 'fixed'\n \"\n >\n {{ tableItem.dateAndTime | c8yDate: 'mediumDate' }}\n {{\n tableItem.dateAndTime\n | c8yDate: 'mediumTime'\n | adjustAggregatedTimeRange: aggregationType\n }}\n <c8y-li>\n <c8y-li-body>\n <div class=\"d-flex row\">\n <div\n class=\"min-width-0\"\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngIf=\"devicesColumnHeaders.length > 1\"\n [attr.data-label]=\"'Device' | translate\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ tableItem.deviceName }}\"\n >\n {{ tableItem.deviceName }}\n </div>\n </div>\n <!-- Data point value row cells -->\n <ng-container *ngFor=\"let row of tableItem.rowItems\">\n <ng-container *ngIf=\"row !== null; else emptyRowContent\">\n <ng-container [ngSwitch]=\"row.renderType\">\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'min'\"\n [attr.data-label]=\"row.label\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </div>\n </div>\n <div\n class=\"col-md-4\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n *ngSwitchCase=\"'max'\"\n >\n <div\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </div>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchCase=\"'area'\"\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n ...\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.max ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n </div>\n <div\n [c8yDynamicColumn]=\"devicesColumnHeaders.length\"\n *ngSwitchDefault\n >\n <span\n class=\"text-truncate\"\n title=\"{{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\"\n [ngClass]=\"row.value.min ?? null | applyRangeClass: getRangeValues(row)\"\n >\n {{ row.value.min ?? '' | number: getFractionSize(row.value.min) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #emptyRowContent>\n <div [c8yDynamicColumn]=\"devicesColumnHeaders.length\"></div>\n </ng-template>\n </ng-container>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n </ng-container>\n </ng-container>\n</ng-container>\n<ng-template #loading>\n <c8y-loading></c8y-loading>\n</ng-template>\n<ng-template #emptyState>\n <div class=\"p-relative p-l-24\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-alert-idle'\"\n [title]=\"'No data to display.' | translate\"\n [horizontal]=\"true\"\n data-cy=\"datapoints-table-list--empty-state\"\n >\n <p c8y-guide-docs>\n <small translate>\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#data-point-table\">\n user documentation\n </a>\n .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n</ng-template>\n<ng-template #missingAllPermissions>\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div class=\"center-block\">\n <c8y-dynamic-component-alerts\n [alerts]=\"missingAllPermissionsAlert\"\n ></c8y-dynamic-component-alerts>\n </div>\n </div>\n</ng-template>\n" }]
99
99
  }], propDecorators: { aggregationType: [{
100
100
  type: Input
101
101
  }], datapointsTableItems: [{
@@ -113,4 +113,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
113
113
  }], isScrolling: [{
114
114
  type: Output
115
115
  }] } });
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kYXRhcG9pbnRzLXRhYmxlL2RhdGFwb2ludHMtdGFibGUtdmlldy9kYXRhcG9pbnRzLXRhYmxlL2RhdGFwb2ludHMtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxZQUFZLEVBQ1osVUFBVSxFQUNWLHFCQUFxQixFQUNyQiwrQkFBK0IsRUFDL0Isc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZixPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQU83QixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUF1QnBFLE1BQU0sT0FBTyx3QkFBd0I7SUFyQnJDO1FBNkJZLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVwRCx5Q0FBb0MsR0FBRyxLQUFLLENBQUM7UUFDN0MsK0JBQTBC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QkFBakIsS0FBSztnQkFDRyxrQ0FBa0M7c0JBQTFDLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBZ2dyZWdhdGlvbk9wdGlvbixcbiAgQ29tbW9uTW9kdWxlLFxuICBEb2NzTW9kdWxlLFxuICBEeW5hbWljQ29tcG9uZW50QWxlcnQsXG4gIER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3IsXG4gIER5bmFtaWNDb21wb25lbnRNb2R1bGUsXG4gIExpc3RHcm91cE1vZHVsZSxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEtQSURldGFpbHMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2RhdGFwb2ludC1zZWxlY3Rvcic7XG5pbXBvcnQge1xuICBDb2xvclJhbmdlQm91bmRhcmllcyxcbiAgVGFibGVDb2x1bW5IZWFkZXIsXG4gIEdyb3VwZWREYXRhcG9pbnRUYWJsZUl0ZW1cbn0gZnJvbSAnLi4vLi4vZGF0YXBvaW50cy10YWJsZS13aWRnZXQubW9kZWwnO1xuaW1wb3J0IHsgQWRqdXN0QWdncmVnYXRlZFRpbWVSYW5nZVBpcGUgfSBmcm9tICcuLi9hZGp1c3QtYWdncmVnYXRlZC10aW1lLXJhbmdlLnBpcGUnO1xuaW1wb3J0IHsgQXBwbHlSYW5nZUNsYXNzUGlwZSB9IGZyb20gJy4uL2FwcGx5LXJhbmdlLWNsYXNzLnBpcGUnO1xuaW1wb3J0IHsgQ29sdW1uVGl0bGVQaXBlIH0gZnJvbSAnLi4vY29sdW1uLXRpdGxlLnBpcGUnO1xuaW1wb3J0IHsgVmlydHVhbFNjcm9sbExpc3RlbmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vdmlydHVhbC1zY3JvbGwtbGlzdGVuZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IER5bmFtaWNDb2x1bW5EaXJlY3RpdmUgfSBmcm9tICcuL2R5bmFtaWMtY29sdW1uLmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhcG9pbnRzLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGFwb2ludHMtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnZC1jb2wgZmxleC1ncm93JyB9LFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQWRqdXN0QWdncmVnYXRlZFRpbWVSYW5nZVBpcGUsXG4gICAgQXBwbHlSYW5nZUNsYXNzUGlwZSxcbiAgICBDb2x1bW5UaXRsZVBpcGUsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIERvY3NNb2R1bGUsXG4gICAgRHluYW1pY0NvbHVtbkRpcmVjdGl2ZSxcbiAgICBEeW5hbWljQ29tcG9uZW50TW9kdWxlLFxuICAgIExpc3RHcm91cE1vZHVsZSxcbiAgICBWaXJ0dWFsU2Nyb2xsTGlzdGVuZXJEaXJlY3RpdmVcbiAgXSxcbiAgLyoqXG4gICAqIFVzZWQgdG8gcHJldmVudCAnZ2V0UmFuZ2VWYWx1ZXMnIGZyb20gYmVpbmcgY2FsbGVkIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUuXG4gICAqL1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhcG9pbnRzVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGFnZ3JlZ2F0aW9uVHlwZTogQWdncmVnYXRpb25PcHRpb247XG4gIEBJbnB1dCgpIGRhdGFwb2ludHNUYWJsZUl0ZW1zOiBHcm91cGVkRGF0YXBvaW50VGFibGVJdGVtW107XG4gIEBJbnB1dCgpIGRldmljZXNDb2x1bW5IZWFkZXJzOiBUYWJsZUNvbHVtbkhlYWRlcltdO1xuICBASW5wdXQoKSBkZWNpbWFsUGxhY2VzOiBudW1iZXI7XG4gIEBJbnB1dCgpIGhhc011bHRpcGxlRGF0YXBvaW50czogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNMb2FkaW5nOiBib29sZWFuO1xuICBASW5wdXQoKSBzZXJpZXNXaXRob3V0UGVybWlzc2lvblRvUmVhZENvdW50OiBudW1iZXI7XG4gIEBPdXRwdXQoKSBpc1Njcm9sbGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBoYXNOb1Blcm1pc3Npb25zVG9SZWFkQW55TWVhc3VyZW1lbnQgPSBmYWxzZTtcbiAgbWlzc2luZ0FsbFBlcm1pc3Npb25zQWxlcnQgPSBuZXcgRHluYW1pY0NvbXBvbmVudEFsZXJ0QWdncmVnYXRvcigpO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGZyYWN0aW9uIHNpemUgZm9ybWF0IGZvciBudW1iZXJzIHdpdGggZGVjaW1hbCBwbGFjZXMuXG4gICAqL1xuICBwcml2YXRlIGZyYWN0aW9uU2l6ZSA9ICcxLjItMic7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmRlY2ltYWxQbGFjZXMgPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4odGhpcy5kZWNpbWFsUGxhY2VzKSkge1xuICAgICAgdGhpcy5mcmFjdGlvblNpemUgPSBgMS4ke3RoaXMuZGVjaW1hbFBsYWNlc30tJHt0aGlzLmRlY2ltYWxQbGFjZXN9YDtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VyaWVzV2l0aG91dFBlcm1pc3Npb25Ub1JlYWRDb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWlzc2luZ0FsbFBlcm1pc3Npb25zQWxlcnQuY2xlYXIoKTtcbiAgICB0aGlzLmhhbmRsZU5vUGVybWlzc2lvbkVycm9yTWVzc2FnZSgpO1xuICB9XG5cbiAgb25MaXN0U2Nyb2xsZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1Njcm9sbGluZy5lbWl0KHRydWUpO1xuICB9XG5cbiAgb25MaXN0U2Nyb2xsZWRUb1RvcCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzU2Nyb2xsaW5nLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgZ2V0UmFuZ2VWYWx1ZXMocm93OiBLUElEZXRhaWxzKTogQ29sb3JSYW5nZUJvdW5kYXJpZXMge1xuICAgIHJldHVybiB7XG4gICAgICB5ZWxsb3dSYW5nZU1pbjogcm93LnllbGxvd1JhbmdlTWluLFxuICAgICAgeWVsbG93UmFuZ2VNYXg6IHJvdy55ZWxsb3dSYW5nZU1heCxcbiAgICAgIHJlZFJhbmdlTWluOiByb3cucmVkUmFuZ2VNaW4sXG4gICAgICByZWRSYW5nZU1heDogcm93LnJlZFJhbmdlTWF4XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBmcmFjdGlvbiBzaXplIGZvcm1hdCBiYXNlZCBvbiB3aGV0aGVyIHRoZSBudW1iZXIgaXMgYW4gaW50ZWdlciBvciBoYXMgZGVjaW1hbCBwbGFjZXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBudW1iZXIgdG8gYmUgZm9ybWF0dGVkLlxuICAgKiBAcmV0dXJucyBSZXR1cm5zICcxLjAtMCcgaWYgdGhlIG51bWJlciBpcyBhbiBpbnRlZ2VyLCBvdGhlcndpc2UgcmV0dXJucyB0aGUgY3VycmVudCBmcmFjdGlvbiBzaXplLlxuICAgKi9cbiAgZ2V0RnJhY3Rpb25TaXplKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZSAlIDEgPT09IDAgPyAnMS4wLTAnIDogdGhpcy5mcmFjdGlvblNpemU7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5vUGVybWlzc2lvbkVycm9yTWVzc2FnZSgpOiB2b2lkIHtcbiAgICB0aGlzLmhhc05vUGVybWlzc2lvbnNUb1JlYWRBbnlNZWFzdXJlbWVudCA9XG4gICAgICB0aGlzLnNlcmllc1dpdGhvdXRQZXJtaXNzaW9uVG9SZWFkQ291bnQgPT09IHRoaXMuZGV2aWNlc0NvbHVtbkhlYWRlcnMubGVuZ3RoO1xuXG4gICAgaWYgKHRoaXMuaGFzTm9QZXJtaXNzaW9uc1RvUmVhZEFueU1lYXN1cmVtZW50KSB7XG4gICAgICB0aGlzLnNob3dNZXNzYWdlRm9yTWlzc2luZ1Blcm1pc3Npb25zRm9yQWxsU2VyaWVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93TWVzc2FnZUZvck1pc3NpbmdQZXJtaXNzaW9uc0ZvckFsbFNlcmllcygpOiB2b2lkIHtcbiAgICB0aGlzLm1pc3NpbmdBbGxQZXJtaXNzaW9uc0FsZXJ0LmFkZEFsZXJ0cyhcbiAgICAgIG5ldyBEeW5hbWljQ29tcG9uZW50QWxlcnQoe1xuICAgICAgICBhbGxvd0h0bWw6IHRydWUsXG4gICAgICAgIHRleHQ6IGdldHRleHQoYDxwPlRvIHZpZXcgZGF0YSwgeW91IG11c3QgbWVldCBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgY3JpdGVyaWE6PC9wPlxuICAgICAgICA8dWw+XG4gICAgICAgICAgPGxpPlxuICAgICAgICAgICAgSGF2ZVxuICAgICAgICAgICAgPGI+UkVBRCBwZXJtaXNzaW9uIGZvciBcIk1lYXN1cmVtZW50c1wiIHBlcm1pc3Npb24gdHlwZTwvYj5cbiAgICAgICAgICAgIChlaXRoZXIgYXMgYSBnbG9iYWwgcm9sZSBvciBmb3IgdGhlIHNwZWNpZmljIHNvdXJjZSlcbiAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgIEJlIHRoZVxuICAgICAgICAgICAgPGI+b3duZXIgb2YgdGhlIHNvdXJjZTwvYj5cbiAgICAgICAgICAgIHlvdSB3YW50IHRvIGV4cG9ydCBkYXRhIGZyb21cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgICA8cD5Eb24ndCBtZWV0IHRoZXNlIHJlcXVpcmVtZW50cz8gQ29udGFjdCB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGZvciBhc3Npc3RhbmNlLjwvcD5gKSxcbiAgICAgICAgdHlwZTogJ3N5c3RlbSdcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImM4eS1jcS00NDBcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiaGlkZGVuLXhzIGM4eS1saXN0X19pdGVtIGM4eS1saXN0LS10aW1lbGluZSBoaWRkZW4tY3FcIlxuICAgIFtuZ0NsYXNzXT1cInsgJ3NlcGFyYXRvci10b3AtYm90dG9tJzogZGV2aWNlc0NvbHVtbkhlYWRlcnMubGVuZ3RoID4gMCB9XCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggY29udGFpbmVyLWZsdWlkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3QtLXRpbWVsaW5lX19pdGVtX19kYXRlXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2Jsb2NrIGZsZXgtZ3JvdyBtaW4td2lkdGgtMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2JvZHlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHJvd1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc011bHRpcGxlRGF0YXBvaW50c1wiPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtaW4td2lkdGgtMFwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIidEZXZpY2UnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYzh5RHluYW1pY0NvbHVtbl09XCJkZXZpY2VzQ29sdW1uSGVhZGVycy5sZW5ndGhcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW1lZGl1bSB0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnRGV2aWNlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwhLS0gRGF0YSBwb2ludHMgY29sdW1uIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBoZWFkZXIgb2YgZGV2aWNlc0NvbHVtbkhlYWRlcnNcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWluLXdpZHRoLTBcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgaGVhZGVyIHwgY29sdW1uVGl0bGUgfX1cIlxuICAgICAgICAgICAgICAgIFtjOHlEeW5hbWljQ29sdW1uXT1cImRldmljZXNDb2x1bW5IZWFkZXJzLmxlbmd0aFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbWVkaXVtIHRleHQtdHJ1bmNhdGVcIj57eyBoZWFkZXIubGFiZWwgfX0ge3sgaGVhZGVyLnVuaXQgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48IS0tIFRoZSByZWNvcmQgbGlzdCAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nOyBlbHNlIGxvYWRpbmdcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoYXNOb1Blcm1pc3Npb25zVG9SZWFkQW55TWVhc3VyZW1lbnQ7IGVsc2UgbWlzc2luZ0FsbFBlcm1pc3Npb25zXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGFwb2ludHNUYWJsZUl0ZW1zLmxlbmd0aDsgZWxzZSBlbXB0eVN0YXRlXCI+XG4gICAgICA8Yzh5LWxpc3QtZ3JvdXBcbiAgICAgICAgY2xhc3M9XCJwLXQtOCBmbGV4LWdyb3cgYzh5LWNxLTQ0MFwiXG4gICAgICAgIGM4eVZpcnR1YWxTY3JvbGxMaXN0ZW5lclxuICAgICAgICAoc2Nyb2xsZWQpPVwib25MaXN0U2Nyb2xsZWQoKVwiXG4gICAgICAgIChzY3JvbGxlZFRvVG9wKT1cIm9uTGlzdFNjcm9sbGVkVG9Ub3AoKVwiXG4gICAgICA+XG4gICAgICAgIDxjOHktbGktdGltZWxpbmVcbiAgICAgICAgICAqYzh5Rm9yPVwiXG4gICAgICAgICAgICBsZXQgdGFibGVJdGVtIG9mIHsgZGF0YTogZGF0YXBvaW50c1RhYmxlSXRlbXMsIHJlczogbnVsbCB9O1xuICAgICAgICAgICAgZW5hYmxlVmlydHVhbFNjcm9sbDogdHJ1ZTtcbiAgICAgICAgICAgIHZpcnR1YWxTY3JvbGxFbGVtZW50U2l6ZTogNDA7XG4gICAgICAgICAgICB2aXJ0dWFsU2Nyb2xsU3RyYXRlZ3k6ICdmaXhlZCdcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgdGFibGVJdGVtLmRhdGVBbmRUaW1lIHwgYzh5RGF0ZTogJ21lZGl1bURhdGUnIH19XG4gICAgICAgICAge3tcbiAgICAgICAgICAgIHRhYmxlSXRlbS5kYXRlQW5kVGltZVxuICAgICAgICAgICAgICB8IGM4eURhdGU6ICdtZWRpdW1UaW1lJ1xuICAgICAgICAgICAgICB8IGFkanVzdEFnZ3JlZ2F0ZWRUaW1lUmFuZ2U6IGFnZ3JlZ2F0aW9uVHlwZVxuICAgICAgICAgIH19XG4gICAgICAgICAgPGM4eS1saT5cbiAgICAgICAgICAgIDxjOHktbGktYm9keT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCByb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm1pbi13aWR0aC0wXCJcbiAgICAgICAgICAgICAgICAgIFtjOHlEeW5hbWljQ29sdW1uXT1cImRldmljZXNDb2x1bW5IZWFkZXJzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImRldmljZXNDb2x1bW5IZWFkZXJzLmxlbmd0aCA+IDFcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1sYWJlbF09XCInRGV2aWNlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IHRhYmxlSXRlbS5kZXZpY2VOYW1lIH19XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgdGFibGVJdGVtLmRldmljZU5hbWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gRGF0YSBwb2ludCB2YWx1ZSByb3cgY2VsbHMgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93IG9mIHRhYmxlSXRlbS5yb3dJdGVtc1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvdyAhPT0gbnVsbDsgZWxzZSBlbXB0eVJvd0NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicm93LnJlbmRlclR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBbYzh5RHluYW1pY0NvbHVtbl09XCJkZXZpY2VzQ29sdW1uSGVhZGVycy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LnZhbHVlLm1pbiA/PyBudWxsIHwgYXBwbHlSYW5nZUNsYXNzOiBnZXRSYW5nZVZhbHVlcyhyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInbWluJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWxhYmVsXT1cInJvdy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IHJvdy52YWx1ZS5taW4gPz8gJycgfCBudW1iZXI6IGdldEZyYWN0aW9uU2l6ZShyb3cudmFsdWUubWluKSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJvdy52YWx1ZS5taW4gPz8gJycgfCBudW1iZXI6IGdldEZyYWN0aW9uU2l6ZShyb3cudmFsdWUubWluKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbWQtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3cudmFsdWUubWluID8/IG51bGwgfCBhcHBseVJhbmdlQ2xhc3M6IGdldFJhbmdlVmFsdWVzKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidtYXgnXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgcm93LnZhbHVlLm1pbiA/PyAnJyB8IG51bWJlcjogZ2V0RnJhY3Rpb25TaXplKHJvdy52YWx1ZS5taW4pIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcm93LnZhbHVlLm1pbiA/PyAnJyB8IG51bWJlcjogZ2V0RnJhY3Rpb25TaXplKHJvdy52YWx1ZS5taW4pIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBbYzh5RHluYW1pY0NvbHVtbl09XCJkZXZpY2VzQ29sdW1uSGVhZGVycy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidhcmVhJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyByb3cudmFsdWUubWluID8/ICcnIHwgbnVtYmVyOiBnZXRGcmFjdGlvblNpemUocm93LnZhbHVlLm1pbikgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3cudmFsdWUubWluID8/IG51bGwgfCBhcHBseVJhbmdlQ2xhc3M6IGdldFJhbmdlVmFsdWVzKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByb3cudmFsdWUubWluID8/ICcnIHwgbnVtYmVyOiBnZXRGcmFjdGlvblNpemUocm93LnZhbHVlLm1pbikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyByb3cudmFsdWUubWluID8/ICcnIHwgbnVtYmVyOiBnZXRGcmFjdGlvblNpemUocm93LnZhbHVlLm1pbikgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3cudmFsdWUubWF4ID8/IG51bGwgfCBhcHBseVJhbmdlQ2xhc3M6IGdldFJhbmdlVmFsdWVzKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByb3cudmFsdWUubWluID8/ICcnIHwgbnVtYmVyOiBnZXRGcmFjdGlvblNpemUocm93LnZhbHVlLm1pbikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBbYzh5RHluYW1pY0NvbHVtbl09XCJkZXZpY2VzQ29sdW1uSGVhZGVycy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgcm93LnZhbHVlLm1pbiA/PyAnJyB8IG51bWJlcjogZ2V0RnJhY3Rpb25TaXplKHJvdy52YWx1ZS5taW4pIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LnZhbHVlLm1pbiA/PyBudWxsIHwgYXBwbHlSYW5nZUNsYXNzOiBnZXRSYW5nZVZhbHVlcyhyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcm93LnZhbHVlLm1pbiA/PyAnJyB8IG51bWJlcjogZ2V0RnJhY3Rpb25TaXplKHJvdy52YWx1ZS5taW4pIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VtcHR5Um93Q29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbYzh5RHluYW1pY0NvbHVtbl09XCJkZXZpY2VzQ29sdW1uSGVhZGVycy5sZW5ndGhcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9jOHktbGktYm9keT5cbiAgICAgICAgICA8L2M4eS1saT5cbiAgICAgICAgPC9jOHktbGktdGltZWxpbmU+XG4gICAgICA8L2M4eS1saXN0LWdyb3VwPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICA8Yzh5LWxvYWRpbmc+PC9jOHktbG9hZGluZz5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2VtcHR5U3RhdGU+XG4gIDxkaXYgY2xhc3M9XCJwLXJlbGF0aXZlIHAtbC0yNFwiPlxuICAgIDxjOHktdWktZW1wdHktc3RhdGVcbiAgICAgIFtpY29uXT1cIidjOHktYWxlcnQtaWRsZSdcIlxuICAgICAgW3RpdGxlXT1cIidObyBkYXRhIHRvIGRpc3BsYXkuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbaG9yaXpvbnRhbF09XCJ0cnVlXCJcbiAgICAgIGRhdGEtY3k9XCJkYXRhcG9pbnRzLXRhYmxlLWxpc3QtLWVtcHR5LXN0YXRlXCJcbiAgICA+XG4gICAgICA8cCBjOHktZ3VpZGUtZG9jcz5cbiAgICAgICAgPHNtYWxsIHRyYW5zbGF0ZT5cbiAgICAgICAgICBGaW5kIG91dCBtb3JlIGluIHRoZVxuICAgICAgICAgIDxhIGM4eS1ndWlkZS1ocmVmPVwiL2RvY3MvY29ja3BpdC93aWRnZXRzLWNvbGxlY3Rpb24vI2RhdGEtcG9pbnQtdGFibGVcIj5cbiAgICAgICAgICAgIHVzZXIgZG9jdW1lbnRhdGlvblxuICAgICAgICAgIDwvYT5cbiAgICAgICAgICAuXG4gICAgICAgIDwvc21hbGw+XG4gICAgICA8L3A+XG4gICAgPC9jOHktdWktZW1wdHktc3RhdGU+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjbWlzc2luZ0FsbFBlcm1pc3Npb25zPlxuICA8ZGl2IGNsYXNzPVwicC10LTI0IHAtci0xNiBwLWwtMTYgcC1iLTE2IGQtZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjZW50ZXItYmxvY2tcIj5cbiAgICAgIDxjOHktZHluYW1pYy1jb21wb25lbnQtYWxlcnRzXG4gICAgICAgIFthbGVydHNdPVwibWlzc2luZ0FsbFBlcm1pc3Npb25zQWxlcnRcIlxuICAgICAgPjwvYzh5LWR5bmFtaWMtY29tcG9uZW50LWFsZXJ0cz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kYXRhcG9pbnRzLXRhYmxlL2RhdGFwb2ludHMtdGFibGUtdmlldy9kYXRhcG9pbnRzLXRhYmxlL2RhdGFwb2ludHMtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxZQUFZLEVBQ1osVUFBVSxFQUNWLHFCQUFxQixFQUNyQiwrQkFBK0IsRUFDL0Isc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZixPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQU83QixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUF1QnBFLE1BQU0sT0FBTyx3QkFBd0I7SUFyQnJDO1FBNkJZLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVwRCx5Q0FBb0MsR0FBRyxLQUFLLENBQUM7UUFDN0MsK0JBQTBC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QkFBakIsS0FBSztnQkFDRyxrQ0FBa0M7c0JBQTFDLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBZ2dyZWdhdGlvbk9wdGlvbixcbiAgQ29tbW9uTW9kdWxlLFxuICBEb2NzTW9kdWxlLFxuICBEeW5hbWljQ29tcG9uZW50QWxlcnQsXG4gIER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3IsXG4gIER5bmFtaWNDb21wb25lbnRNb2R1bGUsXG4gIExpc3RHcm91cE1vZHVsZSxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEtQSURldGFpbHMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2RhdGFwb2ludC1zZWxlY3Rvcic7XG5pbXBvcnQge1xuICBDb2xvclJhbmdlQm91bmRhcmllcyxcbiAgVGFibGVDb2x1bW5IZWFkZXIsXG4gIEdyb3VwZWREYXRhcG9pbnRUYWJsZUl0ZW1cbn0gZnJvbSAnLi4vLi4vZGF0YXBvaW50cy10YWJsZS13aWRnZXQubW9kZWwnO1xuaW1wb3J0IHsgQWRqdXN0QWdncmVnYXRlZFRpbWVSYW5nZVBpcGUgfSBmcm9tICcuLi9hZGp1c3QtYWdncmVnYXRlZC10aW1lLXJhbmdlLnBpcGUnO1xuaW1wb3J0IHsgQXBwbHlSYW5nZUNsYXNzUGlwZSB9IGZyb20gJy4uL2FwcGx5LXJhbmdlLWNsYXNzLnBpcGUnO1xuaW1wb3J0IHsgQ29sdW1uVGl0bGVQaXBlIH0gZnJvbSAnLi4vY29sdW1uLXRpdGxlLnBpcGUnO1xuaW1wb3J0IHsgVmlydHVhbFNjcm9sbExpc3RlbmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vdmlydHVhbC1zY3JvbGwtbGlzdGVuZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IER5bmFtaWNDb2x1bW5EaXJlY3RpdmUgfSBmcm9tICcuL2R5bmFtaWMtY29sdW1uLmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhcG9pbnRzLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGFwb2ludHMtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnZC1jb2wgZmxleC1ncm93JyB9LFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQWRqdXN0QWdncmVnYXRlZFRpbWVSYW5nZVBpcGUsXG4gICAgQXBwbHlSYW5nZUNsYXNzUGlwZSxcbiAgICBDb2x1bW5UaXRsZVBpcGUsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIERvY3NNb2R1bGUsXG4gICAgRHluYW1pY0NvbHVtbkRpcmVjdGl2ZSxcbiAgICBEeW5hbWljQ29tcG9uZW50TW9kdWxlLFxuICAgIExpc3RHcm91cE1vZHVsZSxcbiAgICBWaXJ0dWFsU2Nyb2xsTGlzdGVuZXJEaXJlY3RpdmVcbiAgXSxcbiAgLyoqXG4gICAqIFVzZWQgdG8gcHJldmVudCAnZ2V0UmFuZ2VWYWx1ZXMnIGZyb20gYmVpbmcgY2FsbGVkIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUuXG4gICAqL1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhcG9pbnRzVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGFnZ3JlZ2F0aW9uVHlwZTogQWdncmVnYXRpb25PcHRpb247XG4gIEBJbnB1dCgpIGRhdGFwb2ludHNUYWJsZUl0ZW1zOiBHcm91cGVkRGF0YXBvaW50VGFibGVJdGVtW107XG4gIEBJbnB1dCgpIGRldmljZXNDb2x1bW5IZWFkZXJzOiBUYWJsZUNvbHVtbkhlYWRlcltdO1xuICBASW5wdXQoKSBkZWNpbWFsUGxhY2VzOiBudW1iZXI7XG4gIEBJbnB1dCgpIGhhc011bHRpcGxlRGF0YXBvaW50czogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNMb2FkaW5nOiBib29sZWFuO1xuICBASW5wdXQoKSBzZXJpZXNXaXRob3V0UGVybWlzc2lvblRvUmVhZENvdW50OiBudW1iZXI7XG4gIEBPdXRwdXQoKSBpc1Njcm9sbGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBoYXNOb1Blcm1pc3Npb25zVG9SZWFkQW55TWVhc3VyZW1lbnQgPSBmYWxzZTtcbiAgbWlzc2luZ0FsbFBlcm1pc3Npb25zQWxlcnQgPSBuZXcgRHluYW1pY0NvbXBvbmVudEFsZXJ0QWdncmVnYXRvcigpO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGZyYWN0aW9uIHNpemUgZm9ybWF0IGZvciBudW1iZXJzIHdpdGggZGVjaW1hbCBwbGFjZXMuXG4gICAqL1xuICBwcml2YXRlIGZyYWN0aW9uU2l6ZSA9ICcxLjItMic7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmRlY2ltYWxQbGFjZXMgPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4odGhpcy5kZWNpbWFsUGxhY2VzKSkge1xuICAgICAgdGhpcy5mcmFjdGlvblNpemUgPSBgMS4ke3RoaXMuZGVjaW1hbFBsYWNlc30tJHt0aGlzLmRlY2ltYWxQbGFjZXN9YDtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VyaWVzV2l0aG91dFBlcm1pc3Npb25Ub1JlYWRDb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWlzc2luZ0FsbFBlcm1pc3Npb25zQWxlcnQuY2xlYXIoKTtcbiAgICB0aGlzLmhhbmRsZU5vUGVybWlzc2lvbkVycm9yTWVzc2FnZSgpO1xuICB9XG5cbiAgb25MaXN0U2Nyb2xsZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1Njcm9sbGluZy5lbWl0KHRydWUpO1xuICB9XG5cbiAgb25MaXN0U2Nyb2xsZWRUb1RvcCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzU2Nyb2xsaW5nLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgZ2V0UmFuZ2VWYWx1ZXMocm93OiBLUElEZXRhaWxzKTogQ29sb3JSYW5nZUJvdW5kYXJpZXMge1xuICAgIHJldHVybiB7XG4gICAgICB5ZWxsb3dSYW5nZU1pbjogcm93LnllbGxvd1JhbmdlTWluLFxuICAgICAgeWVsbG93UmFuZ2VNYXg6IHJvdy55ZWxsb3dSYW5nZU1heCxcbiAgICAgIHJlZFJhbmdlTWluOiByb3cucmVkUmFuZ2VNaW4sXG4gICAgICByZWRSYW5nZU1heDogcm93LnJlZFJhbmdlTWF4XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBmcmFjdGlvbiBzaXplIGZvcm1hdCBiYXNlZCBvbiB3aGV0aGVyIHRoZSBudW1iZXIgaXMgYW4gaW50ZWdlciBvciBoYXMgZGVjaW1hbCBwbGFjZXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBudW1iZXIgdG8gYmUgZm9ybWF0dGVkLlxuICAgKiBAcmV0dXJucyBSZXR1cm5zICcxLjAtMCcgaWYgdGhlIG51bWJlciBpcyBhbiBpbnRlZ2VyLCBvdGhlcndpc2UgcmV0dXJucyB0aGUgY3VycmVudCBmcmFjdGlvbiBzaXplLlxuICAgKi9cbiAgZ2V0RnJhY3Rpb25TaXplKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZSAlIDEgPT09IDAgPyAnMS4wLTAnIDogdGhpcy5mcmFjdGlvblNpemU7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5vUGVybWlzc2lvbkVycm9yTWVzc2FnZSgpOiB2b2lkIHtcbiAgICB0aGlzLmhhc05vUGVybWlzc2lvbnNUb1JlYWRBbnlNZWFzdXJlbWVudCA9XG4gICAgICB0aGlzLnNlcmllc1dpdGhvdXRQZXJtaXNzaW9uVG9SZWFkQ291bnQgPT09IHRoaXMuZGV2aWNlc0NvbHVtbkhlYWRlcnMubGVuZ3RoO1xuXG4gICAgaWYgKHRoaXMuaGFzTm9QZXJtaXNzaW9uc1RvUmVhZEFueU1lYXN1cmVtZW50KSB7XG4gICAgICB0aGlzLnNob3dNZXNzYWdlRm9yTWlzc2luZ1Blcm1pc3Npb25zRm9yQWxsU2VyaWVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93TWVzc2FnZUZvck1pc3NpbmdQZXJtaXNzaW9uc0ZvckFsbFNlcmllcygpOiB2b2lkIHtcbiAgICB0aGlzLm1pc3NpbmdBbGxQZXJtaXNzaW9uc0FsZXJ0LmFkZEFsZXJ0cyhcbiAgICAgIG5ldyBEeW5hbWljQ29tcG9uZW50QWxlcnQoe1xuICAgICAgICBhbGxvd0h0bWw6IHRydWUsXG4gICAgICAgIHRleHQ6IGdldHRleHQoYDxwPlRvIHZpZXcgZGF0YSwgeW91IG11c3QgbWVldCBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgY3JpdGVyaWE6PC9wPlxuICAgICAgICA8dWw+XG4gICAgICAgICAgPGxpPlxuICAgICAgICAgICAgSGF2ZVxuICAgICAgICAgICAgPGI+UkVBRCBwZXJtaXNzaW9uIGZvciBcIk1lYXN1cmVtZW50c1wiIHBlcm1pc3Npb24gdHlwZTwvYj5cbiAgICAgICAgICAgIChlaXRoZXIgYXMgYSBnbG9iYWwgcm9sZSBvciBmb3IgdGhlIHNwZWNpZmljIHNvdXJjZSlcbiAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgIEJlIHRoZVxuICAgICAgICAgICAgPGI+b3duZXIgb2YgdGhlIHNvdXJjZTwvYj5cbiAgICAgICAgICAgIHlvdSB3YW50IHRvIGV4cG9ydCBkYXRhIGZyb21cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgICA8cD5Eb24ndCBtZWV0IHRoZXNlIHJlcXVpcmVtZW50cz8gQ29udGFjdCB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGZvciBhc3Npc3RhbmNlLjwvcD5gKSxcbiAgICAgICAgdHlwZTogJ3N5c3RlbSdcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoYXNOb1Blcm1pc3Npb25zVG9SZWFkQW55TWVhc3VyZW1lbnQ7IGVsc2UgbWlzc2luZ0FsbFBlcm1pc3Npb25zXCI+XG4gIDxkaXYgY2xhc3M9XCJjOHktY3EtNDQwXCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJoaWRkZW4teHMgYzh5LWxpc3RfX2l0ZW0gYzh5LWxpc3QtLXRpbWVsaW5lIGhpZGRlbi1jcVwiXG4gICAgICBbbmdDbGFzc109XCJ7ICdzZXBhcmF0b3ItdG9wLWJvdHRvbSc6IGRldmljZXNDb2x1bW5IZWFkZXJzLmxlbmd0aCA+IDAgfVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1saXN0LS10aW1lbGluZV9faXRlbV9fZGF0ZVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2Jsb2NrIGZsZXgtZ3JvdyBtaW4td2lkdGgtMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjOHktbGlzdF9faXRlbV9fYm9keVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCByb3dcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc011bHRpcGxlRGF0YXBvaW50c1wiPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWluLXdpZHRoLTBcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidEZXZpY2UnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFtjOHlEeW5hbWljQ29sdW1uXT1cImRldmljZXNDb2x1bW5IZWFkZXJzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW1lZGl1bSB0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdEZXZpY2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8IS0tIERhdGEgcG9pbnRzIGNvbHVtbiBoZWFkZXJzIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBoZWFkZXIgb2YgZGV2aWNlc0NvbHVtbkhlYWRlcnNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm1pbi13aWR0aC0wXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgaGVhZGVyIHwgY29sdW1uVGl0bGUgfX1cIlxuICAgICAgICAgICAgICAgICAgW2M4eUR5bmFtaWNDb2x1bW5dPVwiZGV2aWNlc0NvbHVtbkhlYWRlcnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbWVkaXVtIHRleHQtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgaGVhZGVyLmxhYmVsIH19IHt7IGhlYWRlci51bml0IH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8IS0tIFRoZSByZWNvcmQgbGlzdCAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmc7IGVsc2UgbG9hZGluZ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhcG9pbnRzVGFibGVJdGVtcy5sZW5ndGg7IGVsc2UgZW1wdHlTdGF0ZVwiPlxuICAgICAgPGM4eS1saXN0LWdyb3VwXG4gICAgICAgIGNsYXNzPVwicC10LTggZmxleC1ncm93IGM4eS1jcS00NDBcIlxuICAgICAgICBjOHlWaXJ0dWFsU2Nyb2xsTGlzdGVuZXJcbiAgICAgICAgKHNjcm9sbGVkKT1cIm9uTGlzdFNjcm9sbGVkKClcIlxuICAgICAgICAoc2Nyb2xsZWRUb1RvcCk9XCJvbkxpc3RTY3JvbGxlZFRvVG9wKClcIlxuICAgICAgPlxuICAgICAgICA8Yzh5LWxpLXRpbWVsaW5lXG4gICAgICAgICAgKmM4eUZvcj1cIlxuICAgICAgICAgICAgbGV0IHRhYmxlSXRlbSBvZiB7IGRhdGE6IGRhdGFwb2ludHNUYWJsZUl0ZW1zLCByZXM6IG51bGwgfTtcbiAgICAgICAgICAgIGVuYWJsZVZpcnR1YWxTY3JvbGw6IHRydWU7XG4gICAgICAgICAgICB2aXJ0dWFsU2Nyb2xsRWxlbWVudFNpemU6IDQwO1xuICAgICAgICAgICAgdmlydHVhbFNjcm9sbFN0cmF0ZWd5OiAnZml4ZWQnXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHRhYmxlSXRlbS5kYXRlQW5kVGltZSB8IGM4eURhdGU6ICdtZWRpdW1EYXRlJyB9fVxuICAgICAgICAgIHt7XG4gICAgICAgICAgICB0YWJsZUl0ZW0uZGF0ZUFuZFRpbWVcbiAgICAgICAgICAgICAgfCBjOHlEYXRlOiAnbWVkaXVtVGltZSdcbiAgICAgICAgICAgICAgfCBhZGp1c3RBZ2dyZWdhdGVkVGltZVJhbmdlOiBhZ2dyZWdhdGlvblR5cGVcbiAgICAgICAgICB9fVxuICAgICAgICAgIDxjOHktbGk+XG4gICAgICAgICAgICA8Yzh5LWxpLWJvZHk+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtaW4td2lkdGgtMFwiXG4gICAgICAgICAgICAgICAgICBbYzh5RHluYW1pY0NvbHVtbl09XCJkZXZpY2VzQ29sdW1uSGVhZGVycy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkZXZpY2VzQ29sdW1uSGVhZGVycy5sZW5ndGggPiAxXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtbGFiZWxdPVwiJ0RldmljZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyB0YWJsZUl0ZW0uZGV2aWNlTmFtZSB9fVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRhYmxlSXRlbS5kZXZpY2VOYW1lIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIERhdGEgcG9pbnQgdmFsdWUgcm93IGNlbGxzIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvdyBvZiB0YWJsZUl0ZW0ucm93SXRlbXNcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3cgIT09IG51bGw7IGVsc2UgZW1wdHlSb3dDb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInJvdy5yZW5kZXJUeXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgW2M4eUR5bmFtaWNDb2x1bW5dPVwiZGV2aWNlc0NvbHVtbkhlYWRlcnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvdy52YWx1ZS5taW4gPz8gbnVsbCB8IGFwcGx5UmFuZ2VDbGFzczogZ2V0UmFuZ2VWYWx1ZXMocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ21pbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1sYWJlbF09XCJyb3cubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyByb3cudmFsdWUubWluID8/ICcnIHwgbnVtYmVyOiBnZXRGcmFjdGlvblNpemUocm93LnZhbHVlLm1pbikgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByb3cudmFsdWUubWluID8/ICcnIHwgbnVtYmVyOiBnZXRGcmFjdGlvblNpemUocm93LnZhbHVlLm1pbikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1kLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LnZhbHVlLm1pbiA/PyBudWxsIHwgYXBwbHlSYW5nZUNsYXNzOiBnZXRSYW5nZVZhbHVlcyhyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInbWF4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IHJvdy52YWx1ZS5taW4gPz8gJycgfCBudW1iZXI6IGdldEZyYWN0aW9uU2l6ZShyb3cudmFsdWUubWluKSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJvdy52YWx1ZS5taW4gPz8gJycgfCBudW1iZXI6IGdldEZyYWN0aW9uU2l6ZShyb3cudmFsdWUubWluKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgW2M4eUR5bmFtaWNDb2x1bW5dPVwiZGV2aWNlc0NvbHVtbkhlYWRlcnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInYXJlYSdcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgcm93LnZhbHVlLm1pbiA/PyAnJyB8IG51bWJlcjogZ2V0RnJhY3Rpb25TaXplKHJvdy52YWx1ZS5taW4pIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LnZhbHVlLm1pbiA/PyBudWxsIHwgYXBwbHlSYW5nZUNsYXNzOiBnZXRSYW5nZVZhbHVlcyhyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcm93LnZhbHVlLm1pbiA/PyAnJyB8IG51bWJlcjogZ2V0RnJhY3Rpb25TaXplKHJvdy52YWx1ZS5taW4pIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgcm93LnZhbHVlLm1pbiA/PyAnJyB8IG51bWJlcjogZ2V0RnJhY3Rpb25TaXplKHJvdy52YWx1ZS5taW4pIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LnZhbHVlLm1heCA/PyBudWxsIHwgYXBwbHlSYW5nZUNsYXNzOiBnZXRSYW5nZVZhbHVlcyhyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcm93LnZhbHVlLm1pbiA/PyAnJyB8IG51bWJlcjogZ2V0RnJhY3Rpb25TaXplKHJvdy52YWx1ZS5taW4pIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgW2M4eUR5bmFtaWNDb2x1bW5dPVwiZGV2aWNlc0NvbHVtbkhlYWRlcnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaERlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IHJvdy52YWx1ZS5taW4gPz8gJycgfCBudW1iZXI6IGdldEZyYWN0aW9uU2l6ZShyb3cudmFsdWUubWluKSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvdy52YWx1ZS5taW4gPz8gbnVsbCB8IGFwcGx5UmFuZ2VDbGFzczogZ2V0UmFuZ2VWYWx1ZXMocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJvdy52YWx1ZS5taW4gPz8gJycgfCBudW1iZXI6IGdldEZyYWN0aW9uU2l6ZShyb3cudmFsdWUubWluKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eVJvd0NvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2M4eUR5bmFtaWNDb2x1bW5dPVwiZGV2aWNlc0NvbHVtbkhlYWRlcnMubGVuZ3RoXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYzh5LWxpLWJvZHk+XG4gICAgICAgICAgPC9jOHktbGk+XG4gICAgICAgIDwvYzh5LWxpLXRpbWVsaW5lPlxuICAgICAgPC9jOHktbGlzdC1ncm91cD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZz5cbiAgPGM4eS1sb2FkaW5nPjwvYzh5LWxvYWRpbmc+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNlbXB0eVN0YXRlPlxuICA8ZGl2IGNsYXNzPVwicC1yZWxhdGl2ZSBwLWwtMjRcIj5cbiAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICBbaWNvbl09XCInYzh5LWFsZXJ0LWlkbGUnXCJcbiAgICAgIFt0aXRsZV09XCInTm8gZGF0YSB0byBkaXNwbGF5LicgfCB0cmFuc2xhdGVcIlxuICAgICAgW2hvcml6b250YWxdPVwidHJ1ZVwiXG4gICAgICBkYXRhLWN5PVwiZGF0YXBvaW50cy10YWJsZS1saXN0LS1lbXB0eS1zdGF0ZVwiXG4gICAgPlxuICAgICAgPHAgYzh5LWd1aWRlLWRvY3M+XG4gICAgICAgIDxzbWFsbCB0cmFuc2xhdGU+XG4gICAgICAgICAgRmluZCBvdXQgbW9yZSBpbiB0aGVcbiAgICAgICAgICA8YSBjOHktZ3VpZGUtaHJlZj1cIi9kb2NzL2NvY2twaXQvd2lkZ2V0cy1jb2xsZWN0aW9uLyNkYXRhLXBvaW50LXRhYmxlXCI+XG4gICAgICAgICAgICB1c2VyIGRvY3VtZW50YXRpb25cbiAgICAgICAgICA8L2E+XG4gICAgICAgICAgLlxuICAgICAgICA8L3NtYWxsPlxuICAgICAgPC9wPlxuICAgIDwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI21pc3NpbmdBbGxQZXJtaXNzaW9ucz5cbiAgPGRpdiBjbGFzcz1cInAtdC0yNCBwLXItMTYgcC1sLTE2IHAtYi0xNiBkLWZsZXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2VudGVyLWJsb2NrXCI+XG4gICAgICA8Yzh5LWR5bmFtaWMtY29tcG9uZW50LWFsZXJ0c1xuICAgICAgICBbYWxlcnRzXT1cIm1pc3NpbmdBbGxQZXJtaXNzaW9uc0FsZXJ0XCJcbiAgICAgID48L2M4eS1keW5hbWljLWNvbXBvbmVudC1hbGVydHM+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==