@c8y/ngx-components 1021.13.3 → 1021.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/alarms/alarms-list.component.d.ts +2 -17
  2. package/alarms/alarms-list.component.d.ts.map +1 -1
  3. package/alarms/alarms-view.service.d.ts +1 -0
  4. package/alarms/alarms-view.service.d.ts.map +1 -1
  5. package/alarms/alarms.model.d.ts +30 -0
  6. package/alarms/alarms.model.d.ts.map +1 -1
  7. package/context-dashboard/context-dashboard.model.d.ts +1 -0
  8. package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
  9. package/context-dashboard/context-dashboard.service.d.ts +7 -5
  10. package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
  11. package/context-dashboard/dashboard-detail.component.d.ts +4 -7
  12. package/context-dashboard/dashboard-detail.component.d.ts.map +1 -1
  13. package/context-dashboard/dashboard-detail.service.d.ts +4 -4
  14. package/context-dashboard/dashboard-detail.service.d.ts.map +1 -1
  15. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts +2 -2
  16. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts.map +1 -1
  17. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts +19 -6
  18. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts.map +1 -1
  19. package/core/action-bar/action-bar-item.component.d.ts +1 -1
  20. package/core/action-bar/action-bar-item.component.d.ts.map +1 -1
  21. package/core/action-bar/action-bar.module.d.ts +6 -6
  22. package/core/action-bar/action-bar.module.d.ts.map +1 -1
  23. package/core/bootstrap/bootstrap.component.d.ts +3 -1
  24. package/core/bootstrap/bootstrap.component.d.ts.map +1 -1
  25. package/core/common/aggregation/aggregation.model.d.ts +39 -0
  26. package/core/common/aggregation/aggregation.model.d.ts.map +1 -0
  27. package/core/common/aggregation/aggregation.service.d.ts +17 -0
  28. package/core/common/aggregation/aggregation.service.d.ts.map +1 -0
  29. package/core/common/index.d.ts +4 -0
  30. package/core/common/index.d.ts.map +1 -1
  31. package/core/common/inter-app.service.d.ts +48 -0
  32. package/core/common/inter-app.service.d.ts.map +1 -0
  33. package/core/common/interval-based-reload.abstract.d.ts +120 -0
  34. package/core/common/interval-based-reload.abstract.d.ts.map +1 -0
  35. package/core/dashboard/dashboard.module.d.ts +24 -18
  36. package/core/dashboard/dashboard.module.d.ts.map +1 -1
  37. package/core/dashboard/index.d.ts +3 -0
  38. package/core/dashboard/index.d.ts.map +1 -1
  39. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +31 -0
  40. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -0
  41. package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts +17 -0
  42. package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts.map +1 -0
  43. package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts +4 -0
  44. package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts.map +1 -0
  45. package/core/dashboard/widget-auto-refresh-context/index.d.ts +8 -0
  46. package/core/dashboard/widget-auto-refresh-context/index.d.ts.map +1 -0
  47. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts +7 -0
  48. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts.map +1 -0
  49. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts +29 -0
  50. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -0
  51. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts +15 -0
  52. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts.map +1 -0
  53. package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts +169 -0
  54. package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts.map +1 -0
  55. package/core/dashboard/widgets-dashboard.component.d.ts +6 -3
  56. package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
  57. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +2 -2
  58. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
  59. package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts +1 -1
  60. package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts.map +1 -1
  61. package/core/dashboard/wiget-time-context/widget-time-context-query.service.d.ts.map +1 -1
  62. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +11 -8
  63. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
  64. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts +6 -12
  65. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts.map +1 -1
  66. package/core/header/header.module.d.ts +18 -18
  67. package/core/header/header.module.d.ts.map +1 -1
  68. package/core/header/title/title.component.d.ts +1 -1
  69. package/core/header/title/title.component.d.ts.map +1 -1
  70. package/core/i18n/cached-locale-dictionary.service.d.ts +5 -1
  71. package/core/i18n/cached-locale-dictionary.service.d.ts.map +1 -1
  72. package/core/i18n/i18n.module.d.ts +0 -4
  73. package/core/i18n/i18n.module.d.ts.map +1 -1
  74. package/core/i18n/index.d.ts +2 -1
  75. package/core/i18n/index.d.ts.map +1 -1
  76. package/core/i18n/translation-loader.service.d.ts +50 -0
  77. package/core/i18n/translation-loader.service.d.ts.map +1 -0
  78. package/core/i18n/translation-utils.d.ts +14 -0
  79. package/core/i18n/translation-utils.d.ts.map +1 -0
  80. package/core/plugins/plugins-resolve.service.d.ts +7 -10
  81. package/core/plugins/plugins-resolve.service.d.ts.map +1 -1
  82. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts +2 -1
  83. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts.map +1 -1
  84. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts +11 -2
  85. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts.map +1 -1
  86. package/datapoint-selector/datapoint-selection.model.d.ts +6 -0
  87. package/datapoint-selector/datapoint-selection.model.d.ts.map +1 -1
  88. package/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.d.ts.map +1 -0
  89. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts +117 -0
  90. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -0
  91. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts +90 -0
  92. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts.map +1 -0
  93. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts +160 -0
  94. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts.map +1 -0
  95. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts +89 -0
  96. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts.map +1 -0
  97. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts +11 -0
  98. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts.map +1 -0
  99. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts +27 -0
  100. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts.map +1 -0
  101. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts +12 -0
  102. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts.map +1 -0
  103. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts +22 -0
  104. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts.map +1 -0
  105. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts +3 -0
  106. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts.map +1 -0
  107. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts +9 -0
  108. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts.map +1 -0
  109. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts +56 -0
  110. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts.map +1 -0
  111. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts +21 -0
  112. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts.map +1 -0
  113. package/datapoints-export-selector/datapoints-export-selector.component.d.ts +14 -0
  114. package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -0
  115. package/datapoints-export-selector/datapoints-export-selector.model.d.ts +232 -0
  116. package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -0
  117. package/datapoints-export-selector/index.d.ts +15 -0
  118. package/datapoints-export-selector/index.d.ts.map +1 -0
  119. package/device-list/device-list.module.d.ts +4 -2
  120. package/device-list/device-list.module.d.ts.map +1 -1
  121. package/esm2022/alarms/alarms-list.component.mjs +5 -16
  122. package/esm2022/alarms/alarms-view.service.mjs +2 -1
  123. package/esm2022/alarms/alarms.model.mjs +1 -1
  124. package/esm2022/context-dashboard/context-dashboard.component.mjs +4 -4
  125. package/esm2022/context-dashboard/context-dashboard.model.mjs +1 -1
  126. package/esm2022/context-dashboard/context-dashboard.service.mjs +47 -21
  127. package/esm2022/context-dashboard/dashboard-detail.component.mjs +8 -16
  128. package/esm2022/context-dashboard/dashboard-detail.service.mjs +13 -6
  129. package/esm2022/context-dashboard/dashboard-settings/dashboard-general-settings.component.mjs +3 -3
  130. package/esm2022/context-dashboard/dashboard-settings/typed-dashboard-settings.component.mjs +32 -11
  131. package/esm2022/core/action-bar/action-bar-item.component.mjs +3 -3
  132. package/esm2022/core/action-bar/action-bar.module.mjs +16 -5
  133. package/esm2022/core/bootstrap/bootstrap.component.mjs +21 -16
  134. package/esm2022/core/common/aggregation/aggregation.model.mjs +46 -0
  135. package/esm2022/core/common/aggregation/aggregation.service.mjs +34 -0
  136. package/esm2022/core/common/humanize-app-name.model.mjs +2 -2
  137. package/esm2022/core/common/humanize-app-name.pipe.mjs +2 -2
  138. package/esm2022/core/common/index.mjs +5 -1
  139. package/esm2022/core/common/inter-app.service.mjs +76 -0
  140. package/esm2022/core/common/interval-based-reload.abstract.mjs +110 -0
  141. package/esm2022/core/countdown-interval/countdown-interval.component.mjs +3 -3
  142. package/esm2022/core/dashboard/dashboard-child.component.mjs +6 -5
  143. package/esm2022/core/dashboard/dashboard.module.mjs +18 -1
  144. package/esm2022/core/dashboard/index.mjs +4 -1
  145. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +101 -0
  146. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.mjs +50 -0
  147. package/esm2022/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.mjs +7 -0
  148. package/esm2022/core/dashboard/widget-auto-refresh-context/index.mjs +8 -0
  149. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.mjs +18 -0
  150. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +127 -0
  151. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.mjs +5 -0
  152. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.mjs +233 -0
  153. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +35 -30
  154. package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +4 -4
  155. package/esm2022/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.mjs +2 -2
  156. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +5 -5
  157. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-query.service.mjs +7 -4
  158. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +37 -37
  159. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.model.mjs +1 -28
  160. package/esm2022/core/date-time-picker/date-time-picker.component.mjs +3 -3
  161. package/esm2022/core/header/header.module.mjs +7 -5
  162. package/esm2022/core/header/title/title.component.mjs +3 -3
  163. package/esm2022/core/i18n/cached-locale-dictionary.service.mjs +1 -1
  164. package/esm2022/core/i18n/i18n.module.mjs +7 -14
  165. package/esm2022/core/i18n/index.mjs +3 -2
  166. package/esm2022/core/i18n/translate.parser.mjs +2 -2
  167. package/esm2022/core/i18n/translation-loader.service.mjs +132 -0
  168. package/esm2022/core/i18n/translation-utils.mjs +24 -0
  169. package/esm2022/core/plugins/plugins-resolve.service.mjs +12 -37
  170. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.mjs +13 -6
  171. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +22 -5
  172. package/esm2022/datapoint-selector/datapoint-selection-list/datapoint-selection-list.component.mjs +3 -3
  173. package/esm2022/datapoint-selector/datapoint-selection.model.mjs +1 -1
  174. package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
  175. package/esm2022/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.mjs +5 -0
  176. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +407 -0
  177. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.mjs +207 -0
  178. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.mjs +467 -0
  179. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.mjs +187 -0
  180. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.mjs +27 -0
  181. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.mjs +41 -0
  182. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.mjs +23 -0
  183. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.mjs +42 -0
  184. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.mjs +120 -0
  185. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.mjs +282 -0
  186. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.mjs +76 -0
  187. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.mjs +46 -0
  188. package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +42 -0
  189. package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +43 -0
  190. package/esm2022/datapoints-export-selector/index.mjs +15 -0
  191. package/esm2022/device-list/add-smart-group.component.mjs +4 -3
  192. package/esm2022/device-list/device-list.module.mjs +22 -4
  193. package/esm2022/map/cluster-map.component.mjs +41 -13
  194. package/esm2022/map/map-status.component.mjs +6 -5
  195. package/esm2022/map/map.component.mjs +9 -5
  196. package/esm2022/map/map.model.mjs +1 -1
  197. package/esm2022/translation-editor/c8y-ngx-components-translation-editor.mjs +5 -0
  198. package/esm2022/translation-editor/data/c8y-ngx-components-translation-editor-data.mjs +5 -0
  199. package/esm2022/translation-editor/data/index.mjs +2 -0
  200. package/esm2022/translation-editor/data/translation-store.service.mjs +175 -0
  201. package/esm2022/translation-editor/index.mjs +10 -0
  202. package/esm2022/translation-editor/lazy/add-translation-modal/add-translation-modal.component.mjs +70 -0
  203. package/esm2022/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.mjs +5 -0
  204. package/esm2022/translation-editor/lazy/index.mjs +2 -0
  205. package/esm2022/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.mjs +53 -0
  206. package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +124 -0
  207. package/esm2022/translation-editor/translation-editor-naviagtor-factory.service.mjs +31 -0
  208. package/esm2022/widgets/cockpit/index.mjs +4 -2
  209. package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
  210. package/esm2022/widgets/definitions/alarms/alarm-list/index.mjs +6 -2
  211. package/esm2022/widgets/definitions/alarms/all-critical-alarms/index.mjs +6 -2
  212. package/esm2022/widgets/definitions/alarms/recent-alarms/index.mjs +6 -2
  213. package/esm2022/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +5 -0
  214. package/esm2022/widgets/definitions/datapoints-table/index.mjs +34 -0
  215. package/esm2022/widgets/definitions/index.mjs +2 -1
  216. package/esm2022/widgets/definitions/map/index.mjs +4 -2
  217. package/esm2022/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.mjs +29 -15
  218. package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +57 -25
  219. package/esm2022/widgets/implementations/alarms/alarm-list-widget.model.mjs +2 -1
  220. package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +19 -21
  221. package/esm2022/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +5 -0
  222. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +383 -0
  223. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.mjs +124 -0
  224. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.mjs +191 -0
  225. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.mjs +36 -0
  226. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.mjs +45 -0
  227. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +116 -0
  228. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +116 -0
  229. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.mjs +43 -0
  230. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +282 -0
  231. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.mjs +430 -0
  232. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.mjs +75 -0
  233. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +76 -0
  234. package/esm2022/widgets/implementations/datapoints-table/datapoints-table.service.mjs +52 -0
  235. package/esm2022/widgets/implementations/datapoints-table/date-range-picker.component.mjs +68 -0
  236. package/esm2022/widgets/implementations/datapoints-table/index.mjs +10 -0
  237. package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +19 -11
  238. package/esm2022/widgets/implementations/map/map-widget.component.mjs +20 -2
  239. package/esm2022/widgets/implementations/map/map-widget.model.mjs +1 -1
  240. package/fesm2022/c8y-ngx-components-alarms.mjs +5 -15
  241. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  242. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +135 -91
  243. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  244. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +37 -13
  245. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  246. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +1928 -0
  247. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -0
  248. package/fesm2022/c8y-ngx-components-device-list.mjs +24 -5
  249. package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
  250. package/fesm2022/c8y-ngx-components-map.mjs +52 -19
  251. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  252. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +181 -0
  253. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -0
  254. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +236 -0
  255. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -0
  256. package/fesm2022/c8y-ngx-components-translation-editor.mjs +46 -0
  257. package/fesm2022/c8y-ngx-components-translation-editor.mjs.map +1 -0
  258. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
  259. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
  260. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +3 -1
  261. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
  262. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +5 -1
  263. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
  264. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs +5 -1
  265. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
  266. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs +5 -1
  267. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
  268. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +41 -0
  269. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -0
  270. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +3 -1
  271. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
  272. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
  273. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  274. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +101 -58
  275. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  276. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +1967 -0
  277. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -0
  278. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +37 -11
  279. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  280. package/fesm2022/c8y-ngx-components.mjs +5080 -4272
  281. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  282. package/locales/de.po +289 -18
  283. package/locales/en.po +12 -0
  284. package/locales/en_US.po +3 -0
  285. package/locales/es.po +253 -18
  286. package/locales/fr.po +253 -18
  287. package/locales/ja_JP.po +282 -18
  288. package/locales/locales.pot +257 -18
  289. package/locales/nl.po +253 -18
  290. package/locales/pl.po +253 -18
  291. package/locales/pt_BR.po +253 -18
  292. package/map/cluster-map.component.d.ts +8 -3
  293. package/map/cluster-map.component.d.ts.map +1 -1
  294. package/map/map-status.component.d.ts +0 -3
  295. package/map/map-status.component.d.ts.map +1 -1
  296. package/map/map.component.d.ts +4 -2
  297. package/map/map.component.d.ts.map +1 -1
  298. package/map/map.model.d.ts +2 -1
  299. package/map/map.model.d.ts.map +1 -1
  300. package/package.json +1 -1
  301. package/translation-editor/c8y-ngx-components-translation-editor.d.ts.map +1 -0
  302. package/translation-editor/data/c8y-ngx-components-translation-editor-data.d.ts.map +1 -0
  303. package/translation-editor/data/index.d.ts +2 -0
  304. package/translation-editor/data/index.d.ts.map +1 -0
  305. package/translation-editor/data/translation-store.service.d.ts +61 -0
  306. package/translation-editor/data/translation-store.service.d.ts.map +1 -0
  307. package/translation-editor/index.d.ts +2 -0
  308. package/translation-editor/index.d.ts.map +1 -0
  309. package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts +30 -0
  310. package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts.map +1 -0
  311. package/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.d.ts.map +1 -0
  312. package/translation-editor/lazy/index.d.ts +2 -0
  313. package/translation-editor/lazy/index.d.ts.map +1 -0
  314. package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts +22 -0
  315. package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts.map +1 -0
  316. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts +34 -0
  317. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -0
  318. package/translation-editor/translation-editor-naviagtor-factory.service.d.ts +11 -0
  319. package/translation-editor/translation-editor-naviagtor-factory.service.d.ts.map +1 -0
  320. package/widgets/cockpit/index.d.ts +13 -0
  321. package/widgets/cockpit/index.d.ts.map +1 -1
  322. package/widgets/cockpit-exports/index.d.ts +6 -0
  323. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  324. package/widgets/definitions/alarms/alarm-list/index.d.ts +2 -0
  325. package/widgets/definitions/alarms/alarm-list/index.d.ts.map +1 -1
  326. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +2 -0
  327. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
  328. package/widgets/definitions/alarms/recent-alarms/index.d.ts +2 -0
  329. package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
  330. package/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.d.ts.map +1 -0
  331. package/widgets/definitions/datapoints-table/index.d.ts +14 -0
  332. package/widgets/definitions/datapoints-table/index.d.ts.map +1 -0
  333. package/widgets/definitions/index.d.ts +1 -0
  334. package/widgets/definitions/index.d.ts.map +1 -1
  335. package/widgets/definitions/map/index.d.ts +2 -1
  336. package/widgets/definitions/map/index.d.ts.map +1 -1
  337. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts +5 -9
  338. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts.map +1 -1
  339. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts +17 -10
  340. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts.map +1 -1
  341. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts +5 -1
  342. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts.map +1 -1
  343. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +5 -11
  344. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
  345. package/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.d.ts.map +1 -0
  346. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +129 -0
  347. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -0
  348. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts +56 -0
  349. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts.map +1 -0
  350. package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts +88 -0
  351. package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts.map +1 -0
  352. package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts +19 -0
  353. package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts.map +1 -0
  354. package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts +26 -0
  355. package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts.map +1 -0
  356. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +63 -0
  357. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -0
  358. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts +38 -0
  359. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts.map +1 -0
  360. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts +13 -0
  361. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts.map +1 -0
  362. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +123 -0
  363. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -0
  364. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts +196 -0
  365. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts.map +1 -0
  366. package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts +41 -0
  367. package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts.map +1 -0
  368. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +175 -0
  369. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -0
  370. package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts +12 -0
  371. package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts.map +1 -0
  372. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts +34 -0
  373. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts.map +1 -0
  374. package/widgets/implementations/datapoints-table/index.d.ts +10 -0
  375. package/widgets/implementations/datapoints-table/index.d.ts.map +1 -0
  376. package/widgets/implementations/map/map-widget-config.component.d.ts +4 -4
  377. package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
  378. package/widgets/implementations/map/map-widget.component.d.ts +8 -3
  379. package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
  380. package/widgets/implementations/map/map-widget.model.d.ts +4 -3
  381. package/widgets/implementations/map/map-widget.model.d.ts.map +1 -1
  382. package/core/i18n/translate.loader.d.ts +0 -31
  383. package/core/i18n/translate.loader.d.ts.map +0 -1
  384. package/esm2022/core/i18n/translate.loader.mjs +0 -71
@@ -0,0 +1,383 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { FormBuilder, FormControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';
3
+ import { AGGREGATION_LABELS, AGGREGATION_VALUES, AGGREGATION_VALUES_ARR, CoreModule } from '@c8y/ngx-components';
4
+ import { WidgetConfigComponent } from '@c8y/ngx-components/context-dashboard';
5
+ import { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';
6
+ import { dateRangeValidator, TIME_RANGE_INTERVAL_UNITS_VALUES } from '@c8y/ngx-components/datapoints-export-selector';
7
+ import { PopoverModule } from 'ngx-bootstrap/popover';
8
+ import { merge, Subject, takeUntil } from 'rxjs';
9
+ import { DATE_SELECTION_LABELS, DATE_SELECTION_VALUES, DATE_SELECTION_VALUES_ARR, DEFAULT_COUNTDOWN_VALUE, INTERVAL_VALUES_ARR, REFRESH_INTERVAL_VALUES_ARR, TIME_RANGE_INTERVAL_LABELS } from '../datapoints-table-widget.model';
10
+ import { DatapointsTableService } from '../datapoints-table.service';
11
+ import { DateRangePickerComponent } from '../date-range-picker.component';
12
+ import { DatapointsTableConfigService } from './datapoints-table-config.service';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "../datapoints-table.service";
15
+ import * as i2 from "./datapoints-table-config.service";
16
+ import * as i3 from "@angular/forms";
17
+ import * as i4 from "@c8y/ngx-components/context-dashboard";
18
+ import * as i5 from "@c8y/ngx-components";
19
+ import * as i6 from "@angular/common";
20
+ import * as i7 from "@c8y/ngx-components/datapoint-selector";
21
+ import * as i8 from "ngx-bootstrap/popover";
22
+ export function minOneDatapointActive() {
23
+ return (control) => {
24
+ const datapoints = control.value;
25
+ if (!datapoints || !datapoints.length) {
26
+ return null;
27
+ }
28
+ const activeDatapoints = datapoints.filter(datapoint => datapoint.__active);
29
+ if (activeDatapoints.length >= 1) {
30
+ return null;
31
+ }
32
+ return { exactlyOneDatapointNeedsToBeActive: true };
33
+ };
34
+ }
35
+ export class DatapointsTableWidgetConfigComponent {
36
+ constructor(datapointsTableService, datapointsTableConfigService, formBuilder, form, widgetConfig) {
37
+ this.datapointsTableService = datapointsTableService;
38
+ this.datapointsTableConfigService = datapointsTableConfigService;
39
+ this.formBuilder = formBuilder;
40
+ this.form = form;
41
+ this.widgetConfig = widgetConfig;
42
+ this.AGGREGATION_LABELS = AGGREGATION_LABELS;
43
+ this.DATE_SELECTION_LABELS = DATE_SELECTION_LABELS;
44
+ // Will be uncommented in MTM-61920
45
+ // readonly DEFAULT_DATE_SELECTOR_VALUE = DATE_SELECTION_VALUES.dashboard_context;
46
+ this.DEFAULT_DATE_SELECTOR_VALUE = DATE_SELECTION_VALUES.config;
47
+ this.DEFAULT_INTERVAL_VALUE = TIME_RANGE_INTERVAL_UNITS_VALUES.hours;
48
+ this.TIME_RANGE_INTERVAL_LABELS = TIME_RANGE_INTERVAL_LABELS;
49
+ this.AGGREGATION_VALUES_ARR = AGGREGATION_VALUES_ARR;
50
+ this.DATE_SELECTION_VALUES_ARR = DATE_SELECTION_VALUES_ARR;
51
+ this.INTERVAL_VALUES_ARR = INTERVAL_VALUES_ARR;
52
+ this.REFRESH_INTERVAL_VALUES_ARR = REFRESH_INTERVAL_VALUES_ARR;
53
+ this.datapointSelectionConfig = {};
54
+ this.disabledAggregationOptions = {};
55
+ this.defaultFormOptions = {
56
+ showDisplay: true,
57
+ showRedRange: true,
58
+ showYellowRange: true
59
+ };
60
+ this.decimalLimits = {
61
+ numberOfDecimalPlacesMin: 0,
62
+ numberOfDecimalPlacesMax: 10
63
+ };
64
+ /**
65
+ * Indicate when the time interval selector item has been changed programmatically.
66
+ *
67
+ * This property is used to track changes in the time interval selector
68
+ * that are not triggered by direct user interaction, but by the application itself.
69
+ *
70
+ * In our case, the date selector and the interval selector are linked.
71
+ * So, when one of them changes, it affects the other.
72
+ * For example, selecting "Last hour" in the interval selector should automatically update the date range to the last hour.
73
+ * But without this flag, changing the date range would also update the interval selector, resulting in "Custom date" being selected.
74
+ * This happens because the system would interpret the behavior this way.
75
+ */
76
+ this.isIntervalSelectorChangedProgrammatically = false;
77
+ this.destroy$ = new Subject();
78
+ }
79
+ ngOnInit() {
80
+ // Condition will be removed in MTM-61920
81
+ if (this.config.widgetInstanceGlobalTimeContext) {
82
+ this.config.widgetInstanceGlobalTimeContext = false;
83
+ }
84
+ if (this.widgetConfig.context?.id) {
85
+ this.datapointSelectionConfig.contextAsset = this.widgetConfig?.context;
86
+ }
87
+ this.isWidgetLinkedToGlobalTimeContext = this.config.widgetInstanceGlobalTimeContext;
88
+ this.initForm();
89
+ this.handleAutoRefreshToggleChanges();
90
+ this.handleIntervalSelectorChanges();
91
+ this.handleDateSelectorChanges();
92
+ this.handleGlobalDateSelectorChanges();
93
+ this.disabledAggregationOptions =
94
+ this.datapointsTableConfigService.updateDisabledStateOfAggregationOptionEntries(this.formGroup.controls.dateFrom.value, this.formGroup.controls.dateTo.value, AGGREGATION_VALUES_ARR);
95
+ }
96
+ ngOnDestroy() {
97
+ this.destroy$.next();
98
+ this.destroy$.complete();
99
+ }
100
+ onBeforeSave(config) {
101
+ if (this.formGroup.value.aggregation === AGGREGATION_VALUES.none ||
102
+ (!this.formGroup.value.aggregation && config.aggregation === AGGREGATION_VALUES.none)) {
103
+ // The 'NONE' aggregation type is not handled by a backend, so it simply needs to be deleted to get data without aggregation.
104
+ delete this.formGroup.value.aggregation;
105
+ delete config.aggregation;
106
+ }
107
+ this.updateTimeContext(config, this.formGroup.value.globalDateSelector);
108
+ Object.assign(config, this.formGroup.value);
109
+ }
110
+ toggleRefreshIntervalControl() {
111
+ this.formGroup.controls.isAutoRefreshEnabled.value
112
+ ? this.formGroup.controls.refreshInterval.disable()
113
+ : this.formGroup.controls.refreshInterval.enable();
114
+ }
115
+ updateTimeContext(config, selectedDateContext) {
116
+ switch (selectedDateContext) {
117
+ // Condition will be removed in MTM-61920
118
+ // case DATE_SELECTION_VALUES.dashboard_context:
119
+ // config.displayDateSelection = false;
120
+ // config.widgetInstanceGlobalTimeContext = true;
121
+ // break;
122
+ case DATE_SELECTION_VALUES.view_and_config:
123
+ config.displayDateSelection = true;
124
+ config.widgetInstanceGlobalTimeContext = false;
125
+ break;
126
+ case DATE_SELECTION_VALUES.config:
127
+ default:
128
+ config.displayDateSelection = false;
129
+ config.widgetInstanceGlobalTimeContext = false;
130
+ }
131
+ }
132
+ initForm() {
133
+ this.formGroup = this.createForm();
134
+ // When the 'NONE' aggregation is removed at the 'onBeforeSave' block,
135
+ // and a Global Date Context forces widgets auto refresh to be enabled
136
+ // then, the aggregation selector will be empty on initial load.
137
+ this.config.aggregation = this.config.aggregation ?? AGGREGATION_VALUES.none;
138
+ this.form.form.addControl('config', this.formGroup);
139
+ this.formGroup.patchValue(this.config);
140
+ }
141
+ createForm() {
142
+ const { dateFrom, dateTo } = this.datapointsTableService.calculateDateRange(this.DEFAULT_INTERVAL_VALUE);
143
+ const isLegacyWidget = this.config.realtime !== undefined && !this.config.decimalPlaces;
144
+ return this.formBuilder.group({
145
+ aggregation: new FormControl({
146
+ value: AGGREGATION_VALUES.none,
147
+ disabled: !this.isAutoRefershDisabled()
148
+ }),
149
+ datapoints: this.formBuilder.control(new Array(), [
150
+ Validators.required,
151
+ Validators.minLength(1),
152
+ minOneDatapointActive()
153
+ ]),
154
+ globalDateSelector: new FormControl(isLegacyWidget
155
+ ? this.determineGlobalDateSelectorValue()
156
+ : this.DEFAULT_DATE_SELECTOR_VALUE),
157
+ dateFrom: new FormControl(dateFrom),
158
+ dateTo: new FormControl(dateTo),
159
+ decimalPlaces: [
160
+ 2,
161
+ [
162
+ Validators.required,
163
+ Validators.min(this.decimalLimits.numberOfDecimalPlacesMin),
164
+ Validators.max(this.decimalLimits.numberOfDecimalPlacesMax),
165
+ Validators.pattern('^[0-9]+$')
166
+ ]
167
+ ],
168
+ interval: new FormControl(this.DEFAULT_INTERVAL_VALUE),
169
+ isAutoRefreshEnabled: isLegacyWidget ? this.config.realtime : [true],
170
+ refreshInterval: new FormControl({
171
+ value: DEFAULT_COUNTDOWN_VALUE,
172
+ disabled: this.isAutoRefershDisabled()
173
+ })
174
+ }, { validators: dateRangeValidator });
175
+ }
176
+ determineGlobalDateSelectorValue() {
177
+ if (this.config.displayDateSelection && !this.config.widgetInstanceGlobalTimeContext) {
178
+ return DATE_SELECTION_VALUES.view_and_config;
179
+ }
180
+ if (!this.config.displayDateSelection && !this.config.widgetInstanceGlobalTimeContext) {
181
+ return DATE_SELECTION_VALUES.config;
182
+ }
183
+ }
184
+ isAutoRefershDisabled() {
185
+ const isInitialWidgetCreation = Object.keys(this.config).length === 1 && this.config['settings'];
186
+ if (isInitialWidgetCreation) {
187
+ return false;
188
+ }
189
+ const isLegacyWidgetRealtimeNotActive = !this.config.realtime &&
190
+ !this.config.decimalPlaces &&
191
+ !this.config.refreshInterval &&
192
+ !this.config.isAutoRefreshEnabled;
193
+ if (isLegacyWidgetRealtimeNotActive) {
194
+ return true;
195
+ }
196
+ return !this.config.isAutoRefreshEnabled;
197
+ }
198
+ /**
199
+ * Handles changes to the auto-refresh toggle control and updates the aggregation control accordingly.
200
+ *
201
+ * This method subscribes to the value changes of the auto-refresh toggle form control.
202
+ * When auto-refresh is enabled, the aggregation control's value is set to 'none' and the control is
203
+ * visually disabled (but not programmatically disabled to ensure the value is saved).
204
+ * When auto-refresh is disabled, the aggregation control is enabled.
205
+ */
206
+ handleAutoRefreshToggleChanges() {
207
+ this.formGroup.controls.isAutoRefreshEnabled.valueChanges
208
+ .pipe(takeUntil(this.destroy$))
209
+ .subscribe((isAutoRefreshEnabled) => {
210
+ const aggregationControl = this.formGroup.controls.aggregation;
211
+ if (isAutoRefreshEnabled) {
212
+ aggregationControl.setValue(AGGREGATION_VALUES.none);
213
+ // Do not disable the control programmatically to ensure the value is saved.
214
+ }
215
+ else {
216
+ aggregationControl.enable();
217
+ }
218
+ });
219
+ }
220
+ /**
221
+ * Handles changes in the interval selector form control.
222
+ */
223
+ handleIntervalSelectorChanges() {
224
+ this.formGroup.controls.interval.valueChanges
225
+ .pipe(takeUntil(this.destroy$))
226
+ .subscribe((selectedInterval) => {
227
+ if (selectedInterval === TIME_RANGE_INTERVAL_UNITS_VALUES.custom) {
228
+ this.updateDisabledAggregationOptions();
229
+ return;
230
+ }
231
+ this.handleNonCustomInterval(selectedInterval);
232
+ });
233
+ }
234
+ handleNonCustomInterval(selectedInterval) {
235
+ this.isIntervalSelectorChangedProgrammatically = true;
236
+ this.updateDateRange(selectedInterval);
237
+ this.updateDisabledAggregationOptions();
238
+ this.updateAggregationIfAutoRefreshDisabled(selectedInterval);
239
+ }
240
+ updateDateRange(selectedInterval) {
241
+ const dateRange = this.datapointsTableService.calculateDateRange(selectedInterval);
242
+ this.formGroup.controls.dateTo.setValue(dateRange.dateTo);
243
+ // MTM-61351
244
+ // Use requestAnimationFrame to queue the dateFrom update.
245
+ // This prevents timing issues where rapid setValue calls might
246
+ // cause the view to go out of sync with form control values,
247
+ // especially during the first change after initialization.
248
+ // requestAnimationFrame(() => {
249
+ /**
250
+ * Without this requestAnimationFrame or setTimeout, dateFrom won't change to a correct value after first selector change.
251
+ * When form is saved it saves with a correct value, even without with this fix.
252
+ * How to reproduce:
253
+ * 1. set date values to e.g.: 01.05.2024-30.05.2024 and save it
254
+ * 2. reopen a config and switch interval to last month
255
+ */
256
+ // This fix brakes a logic behind disabling non available aggregations.
257
+ // Form will be still saved with correct date value, only view is out of a sync.
258
+ this.formGroup.controls.dateFrom.setValue(dateRange.dateFrom);
259
+ this.isIntervalSelectorChangedProgrammatically = false;
260
+ // });
261
+ }
262
+ updateDisabledAggregationOptions() {
263
+ this.disabledAggregationOptions =
264
+ this.datapointsTableConfigService.updateDisabledStateOfAggregationOptionEntries(this.formGroup.controls.dateFrom.value, this.formGroup.controls.dateTo.value, AGGREGATION_VALUES_ARR);
265
+ }
266
+ updateAggregationIfAutoRefreshDisabled(selectedInterval) {
267
+ const isAutoRefreshDisabled = !this.formGroup.controls.isAutoRefreshEnabled.value;
268
+ if (isAutoRefreshDisabled) {
269
+ this.setAggregationValue(selectedInterval);
270
+ }
271
+ }
272
+ setAggregationValue(interval) {
273
+ const aggregationControl = this.formGroup.controls.aggregation;
274
+ const newAggregationValue = this.datapointsTableConfigService.determineAggregationValue(interval);
275
+ aggregationControl.setValue(newAggregationValue);
276
+ }
277
+ /**
278
+ * Handles changes in the date selector form control.
279
+ */
280
+ handleDateSelectorChanges() {
281
+ merge(this.formGroup.controls.dateFrom.valueChanges, this.formGroup.controls.dateTo.valueChanges)
282
+ .pipe(takeUntil(this.destroy$))
283
+ .subscribe(() => this.handleDateChange());
284
+ }
285
+ handleDateChange() {
286
+ if (this.isIntervalSelectorChangedProgrammatically) {
287
+ return;
288
+ }
289
+ const intervalControl = this.formGroup.controls.interval;
290
+ if (intervalControl.value === TIME_RANGE_INTERVAL_UNITS_VALUES.custom) {
291
+ this.handleCustomIntervalDateChange();
292
+ }
293
+ else {
294
+ this.setIntervalToCustom(intervalControl);
295
+ }
296
+ this.setToFirstAvailableAggregationOptionIfCurrentAggregationIsDisabled();
297
+ }
298
+ handleCustomIntervalDateChange() {
299
+ this.updateDisabledAggregationOptions();
300
+ }
301
+ setIntervalToCustom(intervalControl) {
302
+ intervalControl.setValue(TIME_RANGE_INTERVAL_UNITS_VALUES.custom);
303
+ }
304
+ /**
305
+ * Handles changes in the global date selector form control.
306
+ */
307
+ handleGlobalDateSelectorChanges() {
308
+ this.formGroup.controls.globalDateSelector.valueChanges
309
+ .pipe(takeUntil(this.destroy$))
310
+ .subscribe(() => {
311
+ // .subscribe((selected: string) => {
312
+ // Condition will be removed in MTM-61920
313
+ // if (selected === DATE_SELECTION_VALUES.dashboard_context) {
314
+ // this.handleDashboardContext();
315
+ // } else {
316
+ this.handleNonDashboardContext();
317
+ // }
318
+ });
319
+ }
320
+ handleDashboardContext() {
321
+ this.isWidgetLinkedToGlobalTimeContext = true;
322
+ }
323
+ handleNonDashboardContext() {
324
+ this.isWidgetLinkedToGlobalTimeContext = false;
325
+ if (this.isConfigSavedWithoutDashboardTimeOption()) {
326
+ return;
327
+ }
328
+ this.updateAggregationIfNecessary();
329
+ this.setIntervalToCustom(this.formGroup.controls.interval);
330
+ }
331
+ isConfigSavedWithoutDashboardTimeOption() {
332
+ return !this.config.widgetInstanceGlobalTimeContext;
333
+ }
334
+ updateAggregationIfNecessary() {
335
+ const aggregationControl = this.formGroup.controls.aggregation;
336
+ const isDashboardTimeOptionSetAggregationToNull = !aggregationControl.value;
337
+ if (isDashboardTimeOptionSetAggregationToNull) {
338
+ aggregationControl.setValue(AGGREGATION_VALUES.none);
339
+ }
340
+ }
341
+ /**
342
+ * Sets the aggregation control to the first available (non-disabled) option if the current option is disabled.
343
+ *
344
+ * This method:
345
+ * - Retrieves the current value of the aggregation control.
346
+ * - Checks if the current aggregation option is disabled.
347
+ * - If the current option is disabled, sets the control to the first available (non-disabled) option based on the following order:
348
+ * - If the current value is `DAILY`, it switches to `HOURLY` if it's not disabled, otherwise to `MINUTELY` if `HOURLY` is also disabled.
349
+ * - If the current value is `HOURLY`, it switches to `MINUTELY` if it's not disabled.
350
+ * - If all options are disabled, it sets the value to `NONE`.
351
+ *
352
+ * The disabled state is stored in the `disabledAggregationOptions` object,
353
+ * where the key is the aggregation value and the value is a boolean indicating whether the option is disabled.
354
+ *
355
+ * The `AGGREGATION_VALUES` object defines the possible aggregation values.
356
+ */
357
+ // TODO same method is in datapoints export component. Consider moving it to a shared service when DPT will be integrating with MTM-59689.
358
+ // TODO 'determineNewAggregationValue' will be a shared method.
359
+ // Integration task: MTM-60221
360
+ setToFirstAvailableAggregationOptionIfCurrentAggregationIsDisabled() {
361
+ const aggregationControl = this.formGroup.controls.aggregation;
362
+ const currentValue = aggregationControl.value;
363
+ const newAggregationValue = this.datapointsTableConfigService.determineNewAggregationValue(currentValue, this.disabledAggregationOptions);
364
+ if (newAggregationValue !== currentValue) {
365
+ aggregationControl.setValue(newAggregationValue);
366
+ }
367
+ }
368
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsTableWidgetConfigComponent, deps: [{ token: i1.DatapointsTableService }, { token: i2.DatapointsTableConfigService }, { token: i3.FormBuilder }, { token: i3.NgForm }, { token: i4.WidgetConfigComponent }], target: i0.ɵɵFactoryTarget.Component }); }
369
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DatapointsTableWidgetConfigComponent, isStandalone: true, selector: "c8y-datapoints-table-view-config", inputs: { config: "config" }, ngImport: i0, template: "<div class=\"p-l-24 p-r-24\">\n <form\n class=\"no-card-context\"\n [formGroup]=\"formGroup\"\n >\n <!-- <datapoints-selector> -->\n <div class=\"col-md-6\">\n <div class=\"row\">\n <!-- global-time-context-selector -->\n <div class=\"form-group m-b-0 p-b-16 separator-bottom\">\n <label\n class=\"d-flex a-i-center p-t-4\"\n for=\"dateSelection\"\n >\n {{ 'Date selection' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"popoverTemplate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </label>\n <ng-template #popoverTemplate>\n <span translate>\n Choose how to select a date range, the available options are:\n <ul class=\"m-l-0 p-l-8 m-t-8 m-b-0\">\n <!-- Will be re-enabled in MTM-61920 -->\n <!-- <li>\n <b>Dashboard time range:</b>\n restricts date selection to the global dashboard configuration only\n </li> -->\n <li>\n <b>Widget configuration:</b>\n restricts the date selection only to the widget configuration\n </li>\n <li>\n <b>Widget and widget configuration:</b>\n restricts the date selection to the widget view and widget configuration only\n </li>\n </ul>\n </span>\n </ng-template>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Date selection' | translate\"\n [attr.aria-label]=\"'Date selection' | translate\"\n id=\"globalDateSelector\"\n formControlName=\"globalDateSelector\"\n >\n <option\n *ngFor=\"let dataSelectionValue of DATE_SELECTION_VALUES_ARR\"\n [ngValue]=\"dataSelectionValue\"\n >\n {{ DATE_SELECTION_LABELS[dataSelectionValue] | translate }}\n </option>\n </select>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top p-t-16 d-block\"\n listTitle=\"{{ 'Data points' | translate }}\"\n name=\"datapoints\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"1\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"row\">\n <ng-container *ngIf=\"!isWidgetLinkedToGlobalTimeContext\">\n <div class=\"col-md-6\">\n <!-- interval selector -->\n <fieldset class=\"c8y-fieldset\">\n <legend class=\"d-flex a-i-center\">\n {{ 'Auto refresh' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Change the state of interval automatic refresh and set the refresh frequency.'\n | translate\n \"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-form-group class=\"m-b-16 form-group-sm\">\n <div class=\"d-flex gap-4 m-t-8 m-b-8 a-i-center\">\n <label class=\"c8y-switch\">\n <input\n id=\"refreshToggle\"\n name=\"isAutoRefreshEnabled\"\n type=\"checkbox\"\n formControlName=\"isAutoRefreshEnabled\"\n (click)=\"toggleRefreshIntervalControl()\"\n />\n <span></span>\n <span class=\"sr-only\">{{ 'Auto refresh' | translate }}</span>\n </label>\n <label\n class=\"m-b-0\"\n for=\"refreshInterval\"\n >\n {{ 'Interval' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Refresh interval in seconds' | translate\"\n id=\"refreshInterval\"\n formControlName=\"refreshInterval\"\n >\n <option\n *ngFor=\"let refreshInterval of REFRESH_INTERVAL_VALUES_ARR\"\n [ngValue]=\"refreshInterval\"\n >\n {{ '{{ seconds }} s' | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n </div>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n </ng-container>\n <!-- decimal input -->\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Decimal places' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <input\n class=\"form-control\"\n name=\"decimalPlaces\"\n type=\"number\"\n formControlName=\"decimalPlaces\"\n step=\"1\"\n />\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n <!-- aggregation selector -->\n <ng-container *ngIf=\"!isWidgetLinkedToGlobalTimeContext\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Aggregation' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <div class=\"c8y-select-wrapper\">\n <!-- Setting below [attr.disabled] ensures that the control is visually disabled and user interaction is prevented,\n while still allowing the value to be updated and saved correctly in the form.\n This solution covers the case where the user enables auto-refresh, in which case aggregation must be set to NONE. -->\n <select\n class=\"form-control text-12\"\n [title]=\"'Aggregation' | translate\"\n id=\"aggregation\"\n formControlName=\"aggregation\"\n [attr.disabled]=\"formGroup.value.isAutoRefreshEnabled ? true : null\"\n >\n <option\n *ngFor=\"let aggregationValue of AGGREGATION_VALUES_ARR\"\n [ngValue]=\"aggregationValue\"\n [disabled]=\"disabledAggregationOptions[aggregationValue]\"\n >\n {{ AGGREGATION_LABELS[aggregationValue] | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n <!-- time interval selector -->\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Time interval' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Interval' | translate\"\n id=\"interval\"\n formControlName=\"interval\"\n >\n <option\n *ngFor=\"let intervalValue of INTERVAL_VALUES_ARR\"\n [ngValue]=\"intervalValue\"\n >\n {{ TIME_RANGE_INTERVAL_LABELS[intervalValue] | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n <!-- date pickers -->\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Date range' | translate }}\n </legend>\n <c8y-date-range-picker></c8y-date-range-picker>\n </fieldset>\n </ng-container>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "pipe", type: i5.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i5.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i5.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i5.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i7.DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle"], outputs: ["isValid", "change"] }, { kind: "component", type: DateRangePickerComponent, selector: "c8y-date-range-picker", inputs: ["isEmittingDateChange", "showLabel"], outputs: ["updatedDate"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i8.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
370
+ }
371
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsTableWidgetConfigComponent, decorators: [{
372
+ type: Component,
373
+ args: [{ selector: 'c8y-datapoints-table-view-config', standalone: true, imports: [
374
+ CoreModule,
375
+ DatapointSelectorModule,
376
+ DateRangePickerComponent,
377
+ PopoverModule,
378
+ ReactiveFormsModule
379
+ ], template: "<div class=\"p-l-24 p-r-24\">\n <form\n class=\"no-card-context\"\n [formGroup]=\"formGroup\"\n >\n <!-- <datapoints-selector> -->\n <div class=\"col-md-6\">\n <div class=\"row\">\n <!-- global-time-context-selector -->\n <div class=\"form-group m-b-0 p-b-16 separator-bottom\">\n <label\n class=\"d-flex a-i-center p-t-4\"\n for=\"dateSelection\"\n >\n {{ 'Date selection' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"popoverTemplate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </label>\n <ng-template #popoverTemplate>\n <span translate>\n Choose how to select a date range, the available options are:\n <ul class=\"m-l-0 p-l-8 m-t-8 m-b-0\">\n <!-- Will be re-enabled in MTM-61920 -->\n <!-- <li>\n <b>Dashboard time range:</b>\n restricts date selection to the global dashboard configuration only\n </li> -->\n <li>\n <b>Widget configuration:</b>\n restricts the date selection only to the widget configuration\n </li>\n <li>\n <b>Widget and widget configuration:</b>\n restricts the date selection to the widget view and widget configuration only\n </li>\n </ul>\n </span>\n </ng-template>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Date selection' | translate\"\n [attr.aria-label]=\"'Date selection' | translate\"\n id=\"globalDateSelector\"\n formControlName=\"globalDateSelector\"\n >\n <option\n *ngFor=\"let dataSelectionValue of DATE_SELECTION_VALUES_ARR\"\n [ngValue]=\"dataSelectionValue\"\n >\n {{ DATE_SELECTION_LABELS[dataSelectionValue] | translate }}\n </option>\n </select>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top p-t-16 d-block\"\n listTitle=\"{{ 'Data points' | translate }}\"\n name=\"datapoints\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"1\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"row\">\n <ng-container *ngIf=\"!isWidgetLinkedToGlobalTimeContext\">\n <div class=\"col-md-6\">\n <!-- interval selector -->\n <fieldset class=\"c8y-fieldset\">\n <legend class=\"d-flex a-i-center\">\n {{ 'Auto refresh' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Change the state of interval automatic refresh and set the refresh frequency.'\n | translate\n \"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-form-group class=\"m-b-16 form-group-sm\">\n <div class=\"d-flex gap-4 m-t-8 m-b-8 a-i-center\">\n <label class=\"c8y-switch\">\n <input\n id=\"refreshToggle\"\n name=\"isAutoRefreshEnabled\"\n type=\"checkbox\"\n formControlName=\"isAutoRefreshEnabled\"\n (click)=\"toggleRefreshIntervalControl()\"\n />\n <span></span>\n <span class=\"sr-only\">{{ 'Auto refresh' | translate }}</span>\n </label>\n <label\n class=\"m-b-0\"\n for=\"refreshInterval\"\n >\n {{ 'Interval' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Refresh interval in seconds' | translate\"\n id=\"refreshInterval\"\n formControlName=\"refreshInterval\"\n >\n <option\n *ngFor=\"let refreshInterval of REFRESH_INTERVAL_VALUES_ARR\"\n [ngValue]=\"refreshInterval\"\n >\n {{ '{{ seconds }} s' | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n </div>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n </ng-container>\n <!-- decimal input -->\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Decimal places' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <input\n class=\"form-control\"\n name=\"decimalPlaces\"\n type=\"number\"\n formControlName=\"decimalPlaces\"\n step=\"1\"\n />\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n <!-- aggregation selector -->\n <ng-container *ngIf=\"!isWidgetLinkedToGlobalTimeContext\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Aggregation' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <div class=\"c8y-select-wrapper\">\n <!-- Setting below [attr.disabled] ensures that the control is visually disabled and user interaction is prevented,\n while still allowing the value to be updated and saved correctly in the form.\n This solution covers the case where the user enables auto-refresh, in which case aggregation must be set to NONE. -->\n <select\n class=\"form-control text-12\"\n [title]=\"'Aggregation' | translate\"\n id=\"aggregation\"\n formControlName=\"aggregation\"\n [attr.disabled]=\"formGroup.value.isAutoRefreshEnabled ? true : null\"\n >\n <option\n *ngFor=\"let aggregationValue of AGGREGATION_VALUES_ARR\"\n [ngValue]=\"aggregationValue\"\n [disabled]=\"disabledAggregationOptions[aggregationValue]\"\n >\n {{ AGGREGATION_LABELS[aggregationValue] | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n <!-- time interval selector -->\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Time interval' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Interval' | translate\"\n id=\"interval\"\n formControlName=\"interval\"\n >\n <option\n *ngFor=\"let intervalValue of INTERVAL_VALUES_ARR\"\n [ngValue]=\"intervalValue\"\n >\n {{ TIME_RANGE_INTERVAL_LABELS[intervalValue] | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n <!-- date pickers -->\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Date range' | translate }}\n </legend>\n <c8y-date-range-picker></c8y-date-range-picker>\n </fieldset>\n </ng-container>\n </div>\n </form>\n</div>\n" }]
380
+ }], ctorParameters: () => [{ type: i1.DatapointsTableService }, { type: i2.DatapointsTableConfigService }, { type: i3.FormBuilder }, { type: i3.NgForm }, { type: i4.WidgetConfigComponent }], propDecorators: { config: [{
381
+ type: Input
382
+ }] } });
383
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy10YWJsZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLWNvbmZpZy9kYXRhcG9pbnRzLXRhYmxlLWNvbmZpZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kYXRhcG9pbnRzLXRhYmxlL2RhdGFwb2ludHMtdGFibGUtY29uZmlnL2RhdGFwb2ludHMtdGFibGUtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBRUwsV0FBVyxFQUNYLFdBQVcsRUFDWCxNQUFNLEVBQ04sbUJBQW1CLEVBR25CLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUd0QixVQUFVLEVBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBR0wsdUJBQXVCLEVBRXhCLE1BQU0sd0NBQXdDLENBQUM7QUFDaEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixnQ0FBZ0MsRUFFakMsTUFBTSxnREFBZ0QsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFFTCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUV6Qix1QkFBdUIsRUFDdkIsbUJB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d0I7d0JBQ3hCLGFBQWE7d0JBQ2IsbUJBQW1CO3FCQUNwQjt5TkFNUSxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQnVpbGRlcixcbiAgRm9ybUNvbnRyb2wsXG4gIE5nRm9ybSxcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yRm4sXG4gIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQUdHUkVHQVRJT05fTEFCRUxTLFxuICBBR0dSRUdBVElPTl9WQUxVRVMsXG4gIEFHR1JFR0FUSU9OX1ZBTFVFU19BUlIsXG4gIEFnZ3JlZ2F0aW9uT3B0aW9uLFxuICBBZ2dyZWdhdGlvbk9wdGlvblN0YXR1cyxcbiAgQ29yZU1vZHVsZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFdpZGdldENvbmZpZ0NvbXBvbmVudCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvY29udGV4dC1kYXNoYm9hcmQnO1xuaW1wb3J0IHtcbiAgRGF0YXBvaW50QXR0cmlidXRlc0Zvcm1Db25maWcsXG4gIERhdGFwb2ludFNlbGVjdG9yTW9kYWxPcHRpb25zLFxuICBEYXRhcG9pbnRTZWxlY3Rvck1vZHVsZSxcbiAgS1BJRGV0YWlsc1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2RhdGFwb2ludC1zZWxlY3Rvcic7XG5pbXBvcnQge1xuICBkYXRlUmFuZ2VWYWxpZGF0b3IsXG4gIFRJTUVfUkFOR0VfSU5URVJWQUxfVU5JVFNfVkFMVUVTLFxuICBUaW1lUmFuZ2VJbnRlcnZhbFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yJztcbmltcG9ydCB7IFBvcG92ZXJNb2R1bGUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL3BvcG92ZXInO1xuaW1wb3J0IHsgbWVyZ2UsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRGF0YXBvaW50c1RhYmxlQ29uZmlnLFxuICBEQVRFX1NFTEVDVElPTl9MQUJFTFMsXG4gIERBVEVfU0VMRUNUSU9OX1ZBTFVFUyxcbiAgREFURV9TRUxFQ1RJT05fVkFMVUVTX0FSUixcbiAgRGF0ZVJhbmdlLFxuICBERUZBVUxUX0NPVU5URE9XTl9WQUxVRSxcbiAgSU5URVJWQUxfVkFMVUVTX0FSUixcbiAgUkVGUkVTSF9JTlRFUlZBTF9WQUxVRVNfQVJSLFxuICBUSU1FX1JBTkdFX0lOVEVSVkFMX0xBQkVMU1xufSBmcm9tICcuLi9kYXRhcG9pbnRzLXRhYmxlLXdpZGdldC5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhcG9pbnRzVGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vZGF0YXBvaW50cy10YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVSYW5nZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhcG9pbnRzVGFibGVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9kYXRhcG9pbnRzLXRhYmxlLWNvbmZpZy5zZXJ2aWNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG1pbk9uZURhdGFwb2ludEFjdGl2ZSgpOiBWYWxpZGF0b3JGbiB7XG4gIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgIGNvbnN0IGRhdGFwb2ludHM6IEtQSURldGFpbHNbXSA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoIWRhdGFwb2ludHMgfHwgIWRhdGFwb2ludHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVEYXRhcG9pbnRzID0gZGF0YXBvaW50cy5maWx0ZXIoZGF0YXBvaW50ID0+IGRhdGFwb2ludC5fX2FjdGl2ZSk7XG5cbiAgICBpZiAoYWN0aXZlRGF0YXBvaW50cy5sZW5ndGggPj0gMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7IGV4YWN0bHlPbmVEYXRhcG9pbnROZWVkc1RvQmVBY3RpdmU6IHRydWUgfTtcbiAgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWRhdGFwb2ludHMtdGFibGUtdmlldy1jb25maWcnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YXBvaW50cy10YWJsZS1jb25maWcuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29yZU1vZHVsZSxcbiAgICBEYXRhcG9pbnRTZWxlY3Rvck1vZHVsZSxcbiAgICBEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQsXG4gICAgUG9wb3Zlck1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YXBvaW50c1RhYmxlV2lkZ2V0Q29uZmlnQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogIERhdGEgcG9pbnRzIHRhYmxlIHdpZGdldCBjb25maWcuXG4gICAqL1xuICBASW5wdXQoKSBjb25maWc6IERhdGFwb2ludHNUYWJsZUNvbmZpZztcblxuICByZWFkb25seSBBR0dSRUdBVElPTl9MQUJFTFMgPSBBR0dSRUdBVElPTl9MQUJFTFM7XG4gIHJlYWRvbmx5IERBVEVfU0VMRUNUSU9OX0xBQkVMUyA9IERBVEVfU0VMRUNUSU9OX0xBQkVMUztcbiAgLy8gV2lsbCBiZSB1bmNvbW1lbnRlZCBpbiBNVE0tNjE5MjBcbiAgLy8gcmVhZG9ubHkgREVGQVVMVF9EQVRFX1NFTEVDVE9SX1ZBTFVFID0gREFURV9TRUxFQ1RJT05fVkFMVUVTLmRhc2hib2FyZF9jb250ZXh0O1xuICByZWFkb25seSBERUZBVUxUX0RBVEVfU0VMRUNUT1JfVkFMVUUgPSBEQVRFX1NFTEVDVElPTl9WQUxVRVMuY29uZmlnO1xuICByZWFkb25seSBERUZBVUxUX0lOVEVSVkFMX1ZBTFVFID0gVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMuaG91cnM7XG4gIHJlYWRvbmx5IFRJTUVfUkFOR0VfSU5URVJWQUxfTEFCRUxTID0gVElNRV9SQU5HRV9JTlRFUlZBTF9MQUJFTFM7XG5cbiAgcmVhZG9ubHkgQUdHUkVHQVRJT05fVkFMVUVTX0FSUiA9IEFHR1JFR0FUSU9OX1ZBTFVFU19BUlI7XG4gIHJlYWRvbmx5IERBVEVfU0VMRUNUSU9OX1ZBTFVFU19BUlIgPSBEQVRFX1NFTEVDVElPTl9WQUxVRVNfQVJSO1xuICByZWFkb25seSBJTlRFUlZBTF9WQUxVRVNfQVJSID0gSU5URVJWQUxfVkFMVUVTX0FSUjtcbiAgcmVhZG9ubHkgUkVGUkVTSF9JTlRFUlZBTF9WQUxVRVNfQVJSID0gUkVGUkVTSF9JTlRFUlZBTF9WQUxVRVNfQVJSO1xuXG4gIGRhdGFwb2ludFNlbGVjdGlvbkNvbmZpZzogUGFydGlhbDxEYXRhcG9pbnRTZWxlY3Rvck1vZGFsT3B0aW9ucz4gPSB7fTtcbiAgZGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnM6IEFnZ3JlZ2F0aW9uT3B0aW9uU3RhdHVzID0ge307XG4gIGRlZmF1bHRGb3JtT3B0aW9uczogUGFydGlhbDxEYXRhcG9pbnRBdHRyaWJ1dGVzRm9ybUNvbmZpZz4gPSB7XG4gICAgc2hvd0Rpc3BsYXk6IHRydWUsXG4gICAgc2hvd1JlZFJhbmdlOiB0cnVlLFxuICAgIHNob3dZZWxsb3dSYW5nZTogdHJ1ZVxuICB9O1xuICBmb3JtR3JvdXA6IFJldHVyblR5cGU8RGF0YXBvaW50c1RhYmxlV2lkZ2V0Q29uZmlnQ29tcG9uZW50WydjcmVhdGVGb3JtJ10+O1xuICBpc1dpZGdldExpbmtlZFRvR2xvYmFsVGltZUNvbnRleHQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBkZWNpbWFsTGltaXRzID0ge1xuICAgIG51bWJlck9mRGVjaW1hbFBsYWNlc01pbjogMCxcbiAgICBudW1iZXJPZkRlY2ltYWxQbGFjZXNNYXg6IDEwXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlIHdoZW4gdGhlIHRpbWUgaW50ZXJ2YWwgc2VsZWN0b3IgaXRlbSBoYXMgYmVlbiBjaGFuZ2VkIHByb2dyYW1tYXRpY2FsbHkuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byB0cmFjayBjaGFuZ2VzIGluIHRoZSB0aW1lIGludGVydmFsIHNlbGVjdG9yXG4gICAqIHRoYXQgYXJlIG5vdCB0cmlnZ2VyZWQgYnkgZGlyZWN0IHVzZXIgaW50ZXJhY3Rpb24sIGJ1dCBieSB0aGUgYXBwbGljYXRpb24gaXRzZWxmLlxuICAgKlxuICAgKiBJbiBvdXIgY2FzZSwgdGhlIGRhdGUgc2VsZWN0b3IgYW5kIHRoZSBpbnRlcnZhbCBzZWxlY3RvciBhcmUgbGlua2VkLlxuICAgKiBTbywgd2hlbiBvbmUgb2YgdGhlbSBjaGFuZ2VzLCBpdCBhZmZlY3RzIHRoZSBvdGhlci5cbiAgICogRm9yIGV4YW1wbGUsIHNlbGVjdGluZyBcIkxhc3QgaG91clwiIGluIHRoZSBpbnRlcnZhbCBzZWxlY3RvciBzaG91bGQgYXV0b21hdGljYWxseSB1cGRhdGUgdGhlIGRhdGUgcmFuZ2UgdG8gdGhlIGxhc3QgaG91ci5cbiAgICogQnV0IHdpdGhvdXQgdGhpcyBmbGFnLCBjaGFuZ2luZyB0aGUgZGF0ZSByYW5nZSB3b3VsZCBhbHNvIHVwZGF0ZSB0aGUgaW50ZXJ2YWwgc2VsZWN0b3IsIHJlc3VsdGluZyBpbiBcIkN1c3RvbSBkYXRlXCIgYmVpbmcgc2VsZWN0ZWQuXG4gICAqIFRoaXMgaGFwcGVucyBiZWNhdXNlIHRoZSBzeXN0ZW0gd291bGQgaW50ZXJwcmV0IHRoZSBiZWhhdmlvciB0aGlzIHdheS5cbiAgICovXG4gIHByaXZhdGUgaXNJbnRlcnZhbFNlbGVjdG9yQ2hhbmdlZFByb2dyYW1tYXRpY2FsbHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkYXRhcG9pbnRzVGFibGVTZXJ2aWNlOiBEYXRhcG9pbnRzVGFibGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0YXBvaW50c1RhYmxlQ29uZmlnU2VydmljZTogRGF0YXBvaW50c1RhYmxlQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGZvcm06IE5nRm9ybSxcbiAgICBwcml2YXRlIHdpZGdldENvbmZpZzogV2lkZ2V0Q29uZmlnQ29tcG9uZW50XG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBDb25kaXRpb24gd2lsbCBiZSByZW1vdmVkIGluIE1UTS02MTkyMFxuICAgIGlmICh0aGlzLmNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0KSB7XG4gICAgICB0aGlzLmNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMud2lkZ2V0Q29uZmlnLmNvbnRleHQ/LmlkKSB7XG4gICAgICB0aGlzLmRhdGFwb2ludFNlbGVjdGlvbkNvbmZpZy5jb250ZXh0QXNzZXQgPSB0aGlzLndpZGdldENvbmZpZz8uY29udGV4dDtcbiAgICB9XG4gICAgdGhpcy5pc1dpZGdldExpbmtlZFRvR2xvYmFsVGltZUNvbnRleHQgPSB0aGlzLmNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0O1xuICAgIHRoaXMuaW5pdEZvcm0oKTtcblxuICAgIHRoaXMuaGFuZGxlQXV0b1JlZnJlc2hUb2dnbGVDaGFuZ2VzKCk7XG4gICAgdGhpcy5oYW5kbGVJbnRlcnZhbFNlbGVjdG9yQ2hhbmdlcygpO1xuICAgIHRoaXMuaGFuZGxlRGF0ZVNlbGVjdG9yQ2hhbmdlcygpO1xuICAgIHRoaXMuaGFuZGxlR2xvYmFsRGF0ZVNlbGVjdG9yQ2hhbmdlcygpO1xuXG4gICAgdGhpcy5kaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucyA9XG4gICAgICB0aGlzLmRhdGFwb2ludHNUYWJsZUNvbmZpZ1NlcnZpY2UudXBkYXRlRGlzYWJsZWRTdGF0ZU9mQWdncmVnYXRpb25PcHRpb25FbnRyaWVzKFxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlRnJvbS52YWx1ZSxcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZVRvLnZhbHVlLFxuICAgICAgICBBR0dSRUdBVElPTl9WQUxVRVNfQVJSXG4gICAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgb25CZWZvcmVTYXZlKGNvbmZpZz86IERhdGFwb2ludHNUYWJsZUNvbmZpZyk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlLmFnZ3JlZ2F0aW9uID09PSBBR0dSRUdBVElPTl9WQUxVRVMubm9uZSB8fFxuICAgICAgKCF0aGlzLmZvcm1Hcm91cC52YWx1ZS5hZ2dyZWdhdGlvbiAmJiBjb25maWcuYWdncmVnYXRpb24gPT09IEFHR1JFR0FUSU9OX1ZBTFVFUy5ub25lKVxuICAgICkge1xuICAgICAgLy8gVGhlICdOT05FJyBhZ2dyZWdhdGlvbiB0eXBlIGlzIG5vdCBoYW5kbGVkIGJ5IGEgYmFja2VuZCwgc28gaXQgc2ltcGx5IG5lZWRzIHRvIGJlIGRlbGV0ZWQgdG8gZ2V0IGRhdGEgd2l0aG91dCBhZ2dyZWdhdGlvbi5cbiAgICAgIGRlbGV0ZSB0aGlzLmZvcm1Hcm91cC52YWx1ZS5hZ2dyZWdhdGlvbjtcbiAgICAgIGRlbGV0ZSBjb25maWcuYWdncmVnYXRpb247XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVGltZUNvbnRleHQoY29uZmlnLCB0aGlzLmZvcm1Hcm91cC52YWx1ZS5nbG9iYWxEYXRlU2VsZWN0b3IpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCB0aGlzLmZvcm1Hcm91cC52YWx1ZSk7XG4gIH1cblxuICB0b2dnbGVSZWZyZXNoSW50ZXJ2YWxDb250cm9sKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmlzQXV0b1JlZnJlc2hFbmFibGVkLnZhbHVlXG4gICAgICA/IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLnJlZnJlc2hJbnRlcnZhbC5kaXNhYmxlKClcbiAgICAgIDogdGhpcy5mb3JtR3JvdXAuY29udHJvbHMucmVmcmVzaEludGVydmFsLmVuYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUaW1lQ29udGV4dChjb25maWc6IERhdGFwb2ludHNUYWJsZUNvbmZpZywgc2VsZWN0ZWREYXRlQ29udGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgc3dpdGNoIChzZWxlY3RlZERhdGVDb250ZXh0KSB7XG4gICAgICAvLyBDb25kaXRpb24gd2lsbCBiZSByZW1vdmVkIGluIE1UTS02MTkyMFxuICAgICAgLy8gY2FzZSBEQVRFX1NFTEVDVElPTl9WQUxVRVMuZGFzaGJvYXJkX2NvbnRleHQ6XG4gICAgICAvLyAgIGNvbmZpZy5kaXNwbGF5RGF0ZVNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgLy8gICBjb25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dCA9IHRydWU7XG4gICAgICAvLyAgIGJyZWFrO1xuICAgICAgY2FzZSBEQVRFX1NFTEVDVElPTl9WQUxVRVMudmlld19hbmRfY29uZmlnOlxuICAgICAgICBjb25maWcuZGlzcGxheURhdGVTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICBjb25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgREFURV9TRUxFQ1RJT05fVkFMVUVTLmNvbmZpZzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbmZpZy5kaXNwbGF5RGF0ZVNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICBjb25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgICAvLyBXaGVuIHRoZSAnTk9ORScgYWdncmVnYXRpb24gaXMgcmVtb3ZlZCBhdCB0aGUgJ29uQmVmb3JlU2F2ZScgYmxvY2ssXG4gICAgLy8gYW5kIGEgR2xvYmFsIERhdGUgQ29udGV4dCBmb3JjZXMgd2lkZ2V0cyBhdXRvIHJlZnJlc2ggdG8gYmUgZW5hYmxlZFxuICAgIC8vIHRoZW4sIHRoZSBhZ2dyZWdhdGlvbiBzZWxlY3RvciB3aWxsIGJlIGVtcHR5IG9uIGluaXRpYWwgbG9hZC5cbiAgICB0aGlzLmNvbmZpZy5hZ2dyZWdhdGlvbiA9IHRoaXMuY29uZmlnLmFnZ3JlZ2F0aW9uID8/IEFHR1JFR0FUSU9OX1ZBTFVFUy5ub25lO1xuXG4gICAgdGhpcy5mb3JtLmZvcm0uYWRkQ29udHJvbCgnY29uZmlnJywgdGhpcy5mb3JtR3JvdXApO1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUodGhpcy5jb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCkge1xuICAgIGNvbnN0IHsgZGF0ZUZyb20sIGRhdGVUbyB9ID0gdGhpcy5kYXRhcG9pbnRzVGFibGVTZXJ2aWNlLmNhbGN1bGF0ZURhdGVSYW5nZShcbiAgICAgIHRoaXMuREVGQVVMVF9JTlRFUlZBTF9WQUxVRVxuICAgICk7XG4gICAgY29uc3QgaXNMZWdhY3lXaWRnZXQgPSB0aGlzLmNvbmZpZy5yZWFsdGltZSAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmNvbmZpZy5kZWNpbWFsUGxhY2VzO1xuXG4gICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoXG4gICAgICB7XG4gICAgICAgIGFnZ3JlZ2F0aW9uOiBuZXcgRm9ybUNvbnRyb2woe1xuICAgICAgICAgIHZhbHVlOiBBR0dSRUdBVElPTl9WQUxVRVMubm9uZSBhcyBBZ2dyZWdhdGlvbk9wdGlvbixcbiAgICAgICAgICBkaXNhYmxlZDogIXRoaXMuaXNBdXRvUmVmZXJzaERpc2FibGVkKClcbiAgICAgICAgfSksXG4gICAgICAgIGRhdGFwb2ludHM6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChuZXcgQXJyYXk8S1BJRGV0YWlscz4oKSwgW1xuICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgICAgVmFsaWRhdG9ycy5taW5MZW5ndGgoMSksXG4gICAgICAgICAgbWluT25lRGF0YXBvaW50QWN0aXZlKClcbiAgICAgICAgXSksXG4gICAgICAgIGdsb2JhbERhdGVTZWxlY3RvcjogbmV3IEZvcm1Db250cm9sKFxuICAgICAgICAgIGlzTGVnYWN5V2lkZ2V0XG4gICAgICAgICAgICA/IHRoaXMuZGV0ZXJtaW5lR2xvYmFsRGF0ZVNlbGVjdG9yVmFsdWUoKVxuICAgICAgICAgICAgOiB0aGlzLkRFRkFVTFRfREFURV9TRUxFQ1RPUl9WQUxVRVxuICAgICAgICApLFxuICAgICAgICBkYXRlRnJvbTogbmV3IEZvcm1Db250cm9sKGRhdGVGcm9tKSxcbiAgICAgICAgZGF0ZVRvOiBuZXcgRm9ybUNvbnRyb2woZGF0ZVRvKSxcbiAgICAgICAgZGVjaW1hbFBsYWNlczogW1xuICAgICAgICAgIDIsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgICAgIFZhbGlkYXRvcnMubWluKHRoaXMuZGVjaW1hbExpbWl0cy5udW1iZXJPZkRlY2ltYWxQbGFjZXNNaW4pLFxuICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXgodGhpcy5kZWNpbWFsTGltaXRzLm51bWJlck9mRGVjaW1hbFBsYWNlc01heCksXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oJ15bMC05XSskJylcbiAgICAgICAgICBdXG4gICAgICAgIF0sXG4gICAgICAgIGludGVydmFsOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5ERUZBVUxUX0lOVEVSVkFMX1ZBTFVFIGFzIFRpbWVSYW5nZUludGVydmFsKSxcbiAgICAgICAgaXNBdXRvUmVmcmVzaEVuYWJsZWQ6IGlzTGVnYWN5V2lkZ2V0ID8gdGhpcy5jb25maWcucmVhbHRpbWUgOiBbdHJ1ZV0sXG4gICAgICAgIHJlZnJlc2hJbnRlcnZhbDogbmV3IEZvcm1Db250cm9sKHtcbiAgICAgICAgICB2YWx1ZTogREVGQVVMVF9DT1VOVERPV05fVkFMVUUsXG4gICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNBdXRvUmVmZXJzaERpc2FibGVkKClcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICB7IHZhbGlkYXRvcnM6IGRhdGVSYW5nZVZhbGlkYXRvciB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZXJtaW5lR2xvYmFsRGF0ZVNlbGVjdG9yVmFsdWUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jb25maWcuZGlzcGxheURhdGVTZWxlY3Rpb24gJiYgIXRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHJldHVybiBEQVRFX1NFTEVDVElPTl9WQUxVRVMudmlld19hbmRfY29uZmlnO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25maWcuZGlzcGxheURhdGVTZWxlY3Rpb24gJiYgIXRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHJldHVybiBEQVRFX1NFTEVDVElPTl9WQUxVRVMuY29uZmlnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNBdXRvUmVmZXJzaERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlzSW5pdGlhbFdpZGdldENyZWF0aW9uID1cbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuY29uZmlnKS5sZW5ndGggPT09IDEgJiYgdGhpcy5jb25maWdbJ3NldHRpbmdzJ107XG5cbiAgICBpZiAoaXNJbml0aWFsV2lkZ2V0Q3JlYXRpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0xlZ2FjeVdpZGdldFJlYWx0aW1lTm90QWN0aXZlID1cbiAgICAgICF0aGlzLmNvbmZpZy5yZWFsdGltZSAmJlxuICAgICAgIXRoaXMuY29uZmlnLmRlY2ltYWxQbGFjZXMgJiZcbiAgICAgICF0aGlzLmNvbmZpZy5yZWZyZXNoSW50ZXJ2YWwgJiZcbiAgICAgICF0aGlzLmNvbmZpZy5pc0F1dG9SZWZyZXNoRW5hYmxlZDtcblxuICAgIGlmIChpc0xlZ2FjeVdpZGdldFJlYWx0aW1lTm90QWN0aXZlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gIXRoaXMuY29uZmlnLmlzQXV0b1JlZnJlc2hFbmFibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgY2hhbmdlcyB0byB0aGUgYXV0by1yZWZyZXNoIHRvZ2dsZSBjb250cm9sIGFuZCB1cGRhdGVzIHRoZSBhZ2dyZWdhdGlvbiBjb250cm9sIGFjY29yZGluZ2x5LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzdWJzY3JpYmVzIHRvIHRoZSB2YWx1ZSBjaGFuZ2VzIG9mIHRoZSBhdXRvLXJlZnJlc2ggdG9nZ2xlIGZvcm0gY29udHJvbC5cbiAgICogV2hlbiBhdXRvLXJlZnJlc2ggaXMgZW5hYmxlZCwgdGhlIGFnZ3JlZ2F0aW9uIGNvbnRyb2wncyB2YWx1ZSBpcyBzZXQgdG8gJ25vbmUnIGFuZCB0aGUgY29udHJvbCBpc1xuICAgKiB2aXN1YWxseSBkaXNhYmxlZCAoYnV0IG5vdCBwcm9ncmFtbWF0aWNhbGx5IGRpc2FibGVkIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2F2ZWQpLlxuICAgKiBXaGVuIGF1dG8tcmVmcmVzaCBpcyBkaXNhYmxlZCwgdGhlIGFnZ3JlZ2F0aW9uIGNvbnRyb2wgaXMgZW5hYmxlZC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQXV0b1JlZnJlc2hUb2dnbGVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmlzQXV0b1JlZnJlc2hFbmFibGVkLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoaXNBdXRvUmVmcmVzaEVuYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgY29uc3QgYWdncmVnYXRpb25Db250cm9sID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuYWdncmVnYXRpb247XG4gICAgICAgIGlmIChpc0F1dG9SZWZyZXNoRW5hYmxlZCkge1xuICAgICAgICAgIGFnZ3JlZ2F0aW9uQ29udHJvbC5zZXRWYWx1ZShBR0dSRUdBVElPTl9WQUxVRVMubm9uZSk7XG4gICAgICAgICAgLy8gRG8gbm90IGRpc2FibGUgdGhlIGNvbnRyb2wgcHJvZ3JhbW1hdGljYWxseSB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHNhdmVkLlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFnZ3JlZ2F0aW9uQ29udHJvbC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBjaGFuZ2VzIGluIHRoZSBpbnRlcnZhbCBzZWxlY3RvciBmb3JtIGNvbnRyb2wuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUludGVydmFsU2VsZWN0b3JDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmludGVydmFsLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoc2VsZWN0ZWRJbnRlcnZhbDogVGltZVJhbmdlSW50ZXJ2YWwpID0+IHtcbiAgICAgICAgaWYgKHNlbGVjdGVkSW50ZXJ2YWwgPT09IFRJTUVfUkFOR0VfSU5URVJWQUxfVU5JVFNfVkFMVUVTLmN1c3RvbSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlRGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnMoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZU5vbkN1c3RvbUludGVydmFsKHNlbGVjdGVkSW50ZXJ2YWwpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5vbkN1c3RvbUludGVydmFsKHNlbGVjdGVkSW50ZXJ2YWw6IFRpbWVSYW5nZUludGVydmFsKTogdm9pZCB7XG4gICAgdGhpcy5pc0ludGVydmFsU2VsZWN0b3JDaGFuZ2VkUHJvZ3JhbW1hdGljYWxseSA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVEYXRlUmFuZ2Uoc2VsZWN0ZWRJbnRlcnZhbCk7XG4gICAgdGhpcy51cGRhdGVEaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucygpO1xuICAgIHRoaXMudXBkYXRlQWdncmVnYXRpb25JZkF1dG9SZWZyZXNoRGlzYWJsZWQoc2VsZWN0ZWRJbnRlcnZhbCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURhdGVSYW5nZShzZWxlY3RlZEludGVydmFsOiBUaW1lUmFuZ2VJbnRlcnZhbCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGVSYW5nZTogRGF0ZVJhbmdlID0gdGhpcy5kYXRhcG9pbnRzVGFibGVTZXJ2aWNlLmNhbGN1bGF0ZURhdGVSYW5nZShzZWxlY3RlZEludGVydmFsKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlVG8uc2V0VmFsdWUoZGF0ZVJhbmdlLmRhdGVUbyk7XG5cbiAgICAvLyBNVE0tNjEzNTFcbiAgICAvLyBVc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHRvIHF1ZXVlIHRoZSBkYXRlRnJvbSB1cGRhdGUuXG4gICAgLy8gVGhpcyBwcmV2ZW50cyB0aW1pbmcgaXNzdWVzIHdoZXJlIHJhcGlkIHNldFZhbHVlIGNhbGxzIG1pZ2h0XG4gICAgLy8gY2F1c2UgdGhlIHZpZXcgdG8gZ28gb3V0IG9mIHN5bmMgd2l0aCBmb3JtIGNvbnRyb2wgdmFsdWVzLFxuICAgIC8vIGVzcGVjaWFsbHkgZHVyaW5nIHRoZSBmaXJzdCBjaGFuZ2UgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAvKipcbiAgICAgKiBXaXRob3V0IHRoaXMgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIG9yIHNldFRpbWVvdXQsIGRhdGVGcm9tIHdvbid0IGNoYW5nZSB0byBhIGNvcnJlY3QgdmFsdWUgYWZ0ZXIgZmlyc3Qgc2VsZWN0b3IgY2hhbmdlLlxuICAgICAqIFdoZW4gZm9ybSBpcyBzYXZlZCBpdCBzYXZlcyB3aXRoIGEgY29ycmVjdCB2YWx1ZSwgZXZlbiB3aXRob3V0IHdpdGggdGhpcyBmaXguXG4gICAgICogSG93IHRvIHJlcHJvZHVjZTpcbiAgICAgKiAxLiBzZXQgZGF0ZSB2YWx1ZXMgdG8gZS5nLjogMDEuMDUuMjAyNC0zMC4wNS4yMDI0IGFuZCBzYXZlIGl0XG4gICAgICogMi4gcmVvcGVuIGEgY29uZmlnIGFuZCBzd2l0Y2ggaW50ZXJ2YWwgdG8gbGFzdCBtb250aFxuICAgICAqL1xuICAgIC8vIFRoaXMgZml4IGJyYWtlcyBhIGxvZ2ljIGJlaGluZCBkaXNhYmxpbmcgbm9uIGF2YWlsYWJsZSBhZ2dyZWdhdGlvbnMuXG4gICAgLy8gRm9ybSB3aWxsIGJlIHN0aWxsIHNhdmVkIHdpdGggY29ycmVjdCBkYXRlIHZhbHVlLCBvbmx5IHZpZXcgaXMgb3V0IG9mIGEgc3luYy5cbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlRnJvbS5zZXRWYWx1ZShkYXRlUmFuZ2UuZGF0ZUZyb20pO1xuICAgIHRoaXMuaXNJbnRlcnZhbFNlbGVjdG9yQ2hhbmdlZFByb2dyYW1tYXRpY2FsbHkgPSBmYWxzZTtcbiAgICAvLyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucyA9XG4gICAgICB0aGlzLmRhdGFwb2ludHNUYWJsZUNvbmZpZ1NlcnZpY2UudXBkYXRlRGlzYWJsZWRTdGF0ZU9mQWdncmVnYXRpb25PcHRpb25FbnRyaWVzKFxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlRnJvbS52YWx1ZSxcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZVRvLnZhbHVlLFxuICAgICAgICBBR0dSRUdBVElPTl9WQUxVRVNfQVJSXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBZ2dyZWdhdGlvbklmQXV0b1JlZnJlc2hEaXNhYmxlZChzZWxlY3RlZEludGVydmFsOiBUaW1lUmFuZ2VJbnRlcnZhbCk6IHZvaWQge1xuICAgIGNvbnN0IGlzQXV0b1JlZnJlc2hEaXNhYmxlZCA9ICF0aGlzLmZvcm1Hcm91cC5jb250cm9scy5pc0F1dG9SZWZyZXNoRW5hYmxlZC52YWx1ZTtcbiAgICBpZiAoaXNBdXRvUmVmcmVzaERpc2FibGVkKSB7XG4gICAgICB0aGlzLnNldEFnZ3JlZ2F0aW9uVmFsdWUoc2VsZWN0ZWRJbnRlcnZhbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRBZ2dyZWdhdGlvblZhbHVlKGludGVydmFsOiBUaW1lUmFuZ2VJbnRlcnZhbCk6IHZvaWQge1xuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uQ29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmFnZ3JlZ2F0aW9uO1xuXG4gICAgY29uc3QgbmV3QWdncmVnYXRpb25WYWx1ZSA9XG4gICAgICB0aGlzLmRhdGFwb2ludHNUYWJsZUNvbmZpZ1NlcnZpY2UuZGV0ZXJtaW5lQWdncmVnYXRpb25WYWx1ZShpbnRlcnZhbCk7XG4gICAgYWdncmVnYXRpb25Db250cm9sLnNldFZhbHVlKG5ld0FnZ3JlZ2F0aW9uVmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgY2hhbmdlcyBpbiB0aGUgZGF0ZSBzZWxlY3RvciBmb3JtIGNvbnRyb2wuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZURhdGVTZWxlY3RvckNoYW5nZXMoKTogdm9pZCB7XG4gICAgbWVyZ2UoXG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlRnJvbS52YWx1ZUNoYW5nZXMsXG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlVG8udmFsdWVDaGFuZ2VzXG4gICAgKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhhbmRsZURhdGVDaGFuZ2UoKSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNJbnRlcnZhbFNlbGVjdG9yQ2hhbmdlZFByb2dyYW1tYXRpY2FsbHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcnZhbENvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5pbnRlcnZhbDtcbiAgICBpZiAoaW50ZXJ2YWxDb250cm9sLnZhbHVlID09PSBUSU1FX1JBTkdFX0lOVEVSVkFMX1VOSVRTX1ZBTFVFUy5jdXN0b20pIHtcbiAgICAgIHRoaXMuaGFuZGxlQ3VzdG9tSW50ZXJ2YWxEYXRlQ2hhbmdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0SW50ZXJ2YWxUb0N1c3RvbShpbnRlcnZhbENvbnRyb2wpO1xuICAgIH1cbiAgICB0aGlzLnNldFRvRmlyc3RBdmFpbGFibGVBZ2dyZWdhdGlvbk9wdGlvbklmQ3VycmVudEFnZ3JlZ2F0aW9uSXNEaXNhYmxlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDdXN0b21JbnRlcnZhbERhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVEaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbnRlcnZhbFRvQ3VzdG9tKGludGVydmFsQ29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZCB7XG4gICAgaW50ZXJ2YWxDb250cm9sLnNldFZhbHVlKFRJTUVfUkFOR0VfSU5URVJWQUxfVU5JVFNfVkFMVUVTLmN1c3RvbSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBjaGFuZ2VzIGluIHRoZSBnbG9iYWwgZGF0ZSBzZWxlY3RvciBmb3JtIGNvbnRyb2wuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUdsb2JhbERhdGVTZWxlY3RvckNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZ2xvYmFsRGF0ZVNlbGVjdG9yLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIC5zdWJzY3JpYmUoKHNlbGVjdGVkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gQ29uZGl0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiBNVE0tNjE5MjBcbiAgICAgICAgLy8gaWYgKHNlbGVjdGVkID09PSBEQVRFX1NFTEVDVElPTl9WQUxVRVMuZGFzaGJvYXJkX2NvbnRleHQpIHtcbiAgICAgICAgLy8gdGhpcy5oYW5kbGVEYXNoYm9hcmRDb250ZXh0KCk7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGFuZGxlTm9uRGFzaGJvYXJkQ29udGV4dCgpO1xuICAgICAgICAvLyB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGFzaGJvYXJkQ29udGV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzV2lkZ2V0TGlua2VkVG9HbG9iYWxUaW1lQ29udGV4dCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5vbkRhc2hib2FyZENvbnRleHQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1dpZGdldExpbmtlZFRvR2xvYmFsVGltZUNvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmlzQ29uZmlnU2F2ZWRXaXRob3V0RGFzaGJvYXJkVGltZU9wdGlvbigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVBZ2dyZWdhdGlvbklmTmVjZXNzYXJ5KCk7XG4gICAgdGhpcy5zZXRJbnRlcnZhbFRvQ3VzdG9tKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmludGVydmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNDb25maWdTYXZlZFdpdGhvdXREYXNoYm9hcmRUaW1lT3B0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5jb25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQWdncmVnYXRpb25JZk5lY2Vzc2FyeSgpOiB2b2lkIHtcbiAgICBjb25zdCBhZ2dyZWdhdGlvbkNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5hZ2dyZWdhdGlvbjtcbiAgICBjb25zdCBpc0Rhc2hib2FyZFRpbWVPcHRpb25TZXRBZ2dyZWdhdGlvblRvTnVsbCA9ICFhZ2dyZWdhdGlvbkNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoaXNEYXNoYm9hcmRUaW1lT3B0aW9uU2V0QWdncmVnYXRpb25Ub051bGwpIHtcbiAgICAgIGFnZ3JlZ2F0aW9uQ29udHJvbC5zZXRWYWx1ZShBR0dSRUdBVElPTl9WQUxVRVMubm9uZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFnZ3JlZ2F0aW9uIGNvbnRyb2wgdG8gdGhlIGZpcnN0IGF2YWlsYWJsZSAobm9uLWRpc2FibGVkKSBvcHRpb24gaWYgdGhlIGN1cnJlbnQgb3B0aW9uIGlzIGRpc2FibGVkLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZDpcbiAgICogLSBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGFnZ3JlZ2F0aW9uIGNvbnRyb2wuXG4gICAqIC0gQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGFnZ3JlZ2F0aW9uIG9wdGlvbiBpcyBkaXNhYmxlZC5cbiAgICogLSBJZiB0aGUgY3VycmVudCBvcHRpb24gaXMgZGlzYWJsZWQsIHNldHMgdGhlIGNvbnRyb2wgdG8gdGhlIGZpcnN0IGF2YWlsYWJsZSAobm9uLWRpc2FibGVkKSBvcHRpb24gYmFzZWQgb24gdGhlIGZvbGxvd2luZyBvcmRlcjpcbiAgICogICAtIElmIHRoZSBjdXJyZW50IHZhbHVlIGlzIGBEQUlMWWAsIGl0IHN3aXRjaGVzIHRvIGBIT1VSTFlgIGlmIGl0J3Mgbm90IGRpc2FibGVkLCBvdGhlcndpc2UgdG8gYE1JTlVURUxZYCBpZiBgSE9VUkxZYCBpcyBhbHNvIGRpc2FibGVkLlxuICAgKiAgIC0gSWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgYEhPVVJMWWAsIGl0IHN3aXRjaGVzIHRvIGBNSU5VVEVMWWAgaWYgaXQncyBub3QgZGlzYWJsZWQuXG4gICAqICAgLSBJZiBhbGwgb3B0aW9ucyBhcmUgZGlzYWJsZWQsIGl0IHNldHMgdGhlIHZhbHVlIHRvIGBOT05FYC5cbiAgICpcbiAgICogVGhlIGRpc2FibGVkIHN0YXRlIGlzIHN0b3JlZCBpbiB0aGUgYGRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zYCBvYmplY3QsXG4gICAqIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGFnZ3JlZ2F0aW9uIHZhbHVlIGFuZCB0aGUgdmFsdWUgaXMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgb3B0aW9uIGlzIGRpc2FibGVkLlxuICAgKlxuICAgKiBUaGUgYEFHR1JFR0FUSU9OX1ZBTFVFU2Agb2JqZWN0IGRlZmluZXMgdGhlIHBvc3NpYmxlIGFnZ3JlZ2F0aW9uIHZhbHVlcy5cbiAgICovXG4gIC8vIFRPRE8gc2FtZSBtZXRob2QgaXMgaW4gZGF0YXBvaW50cyBleHBvcnQgY29tcG9uZW50LiBDb25zaWRlciBtb3ZpbmcgaXQgdG8gYSBzaGFyZWQgc2VydmljZSB3aGVuIERQVCB3aWxsIGJlIGludGVncmF0aW5nIHdpdGggTVRNLTU5Njg5LlxuICAvLyBUT0RPICdkZXRlcm1pbmVOZXdBZ2dyZWdhdGlvblZhbHVlJyB3aWxsIGJlIGEgc2hhcmVkIG1ldGhvZC5cbiAgLy8gSW50ZWdyYXRpb24gdGFzazogTVRNLTYwMjIxXG4gIHByaXZhdGUgc2V0VG9GaXJzdEF2YWlsYWJsZUFnZ3JlZ2F0aW9uT3B0aW9uSWZDdXJyZW50QWdncmVnYXRpb25Jc0Rpc2FibGVkKCk6IHZvaWQge1xuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uQ29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmFnZ3JlZ2F0aW9uO1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGFnZ3JlZ2F0aW9uQ29udHJvbC52YWx1ZTtcblxuICAgIGNvbnN0IG5ld0FnZ3JlZ2F0aW9uVmFsdWUgPSB0aGlzLmRhdGFwb2ludHNUYWJsZUNvbmZpZ1NlcnZpY2UuZGV0ZXJtaW5lTmV3QWdncmVnYXRpb25WYWx1ZShcbiAgICAgIGN1cnJlbnRWYWx1ZSxcbiAgICAgIHRoaXMuZGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnNcbiAgICApO1xuXG4gICAgaWYgKG5ld0FnZ3JlZ2F0aW9uVmFsdWUgIT09IGN1cnJlbnRWYWx1ZSkge1xuICAgICAgYWdncmVnYXRpb25Db250cm9sLnNldFZhbHVlKG5ld0FnZ3JlZ2F0aW9uVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInAtbC0yNCBwLXItMjRcIj5cbiAgPGZvcm1cbiAgICBjbGFzcz1cIm5vLWNhcmQtY29udGV4dFwiXG4gICAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIlxuICA+XG4gICAgPCEtLSA8ZGF0YXBvaW50cy1zZWxlY3Rvcj4gLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDwhLS0gZ2xvYmFsLXRpbWUtY29udGV4dC1zZWxlY3RvciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbS1iLTAgcC1iLTE2IHNlcGFyYXRvci1ib3R0b21cIj5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGEtaS1jZW50ZXIgcC10LTRcIlxuICAgICAgICAgICAgZm9yPVwiZGF0ZVNlbGVjdGlvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ0RhdGUgc2VsZWN0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW3BvcG92ZXJdPVwicG9wb3ZlclRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcG9wb3ZlclRlbXBsYXRlPlxuICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlxuICAgICAgICAgICAgICBDaG9vc2UgaG93IHRvIHNlbGVjdCBhIGRhdGUgcmFuZ2UsIHRoZSBhdmFpbGFibGUgb3B0aW9ucyBhcmU6XG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm0tbC0wIHAtbC04IG0tdC04IG0tYi0wXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBXaWxsIGJlIHJlLWVuYWJsZWQgaW4gTVRNLTYxOTIwIC0tPlxuICAgICAgICAgICAgICAgIDwhLS0gPGxpPlxuICAgICAgICAgICAgICAgICAgPGI+RGFzaGJvYXJkIHRpbWUgcmFuZ2U6PC9iPlxuICAgICAgICAgICAgICAgICAgcmVzdHJpY3RzIGRhdGUgc2VsZWN0aW9uIHRvIHRoZSBnbG9iYWwgZGFzaGJvYXJkIGNvbmZpZ3VyYXRpb24gb25seVxuICAgICAgICAgICAgICAgIDwvbGk+IC0tPlxuICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgIDxiPldpZGdldCBjb25maWd1cmF0aW9uOjwvYj5cbiAgICAgICAgICAgICAgICAgIHJlc3RyaWN0cyB0aGUgZGF0ZSBzZWxlY3Rpb24gb25seSB0byB0aGUgd2lkZ2V0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgIDxiPldpZGdldCBhbmQgd2lkZ2V0IGNvbmZpZ3VyYXRpb246PC9iPlxuICAgICAgICAgICAgICAgICAgcmVzdHJpY3RzIHRoZSBkYXRlIHNlbGVjdGlvbiB0byB0aGUgd2lkZ2V0IHZpZXcgYW5kIHdpZGdldCBjb25maWd1cmF0aW9uIG9ubHlcbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LTEyXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidEYXRlIHNlbGVjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEYXRlIHNlbGVjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBpZD1cImdsb2JhbERhdGVTZWxlY3RvclwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImdsb2JhbERhdGVTZWxlY3RvclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF0YVNlbGVjdGlvblZhbHVlIG9mIERBVEVfU0VMRUNUSU9OX1ZBTFVFU19BUlJcIlxuICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cImRhdGFTZWxlY3Rpb25WYWx1ZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBEQVRFX1NFTEVDVElPTl9MQUJFTFNbZGF0YVNlbGVjdGlvblZhbHVlXSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8Yzh5LWRhdGFwb2ludC1zZWxlY3Rpb24tbGlzdFxuICAgICAgICAgIGNsYXNzPVwiYmctaW5oZXJpdCBzZXBhcmF0b3ItdG9wIHAtdC0xNiBkLWJsb2NrXCJcbiAgICAgICAgICBsaXN0VGl0bGU9XCJ7eyAnRGF0YSBwb2ludHMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICBuYW1lPVwiZGF0YXBvaW50c1wiXG4gICAgICAgICAgW2RlZmF1bHRGb3JtT3B0aW9uc109XCJkZWZhdWx0Rm9ybU9wdGlvbnNcIlxuICAgICAgICAgIFtjb25maWddPVwiZGF0YXBvaW50U2VsZWN0aW9uQ29uZmlnXCJcbiAgICAgICAgICBbbWluQWN0aXZlQ291bnRdPVwiMVwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGF0YXBvaW50c1wiXG4gICAgICAgID48L2M4eS1kYXRhcG9pbnQtc2VsZWN0aW9uLWxpc3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1dpZGdldExpbmtlZFRvR2xvYmFsVGltZUNvbnRleHRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICAgIDwhLS0gaW50ZXJ2YWwgc2VsZWN0b3IgLS0+XG4gICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJjOHktZmllbGRzZXRcIj5cbiAgICAgICAgICAgICAgPGxlZ2VuZCBjbGFzcz1cImQtZmxleCBhLWktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAge3sgJ0F1dG8gcmVmcmVzaCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgJ0NoYW5nZSB0aGUgc3RhdGUgb2YgaW50ZXJ2YWwgYXV0b21hdGljIHJlZnJlc2ggYW5kIHNldCB0aGUgcmVmcmVzaCBmcmVxdWVuY3kuJ1xuICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIFthZGFwdGl2ZVBvc2l0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9sZWdlbmQ+XG4gICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cIm0tYi0xNiBmb3JtLWdyb3VwLXNtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtNCBtLXQtOCBtLWItOCBhLWktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktc3dpdGNoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwicmVmcmVzaFRvZ2dsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImlzQXV0b1JlZnJlc2hFbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImlzQXV0b1JlZnJlc2hFbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUmVmcmVzaEludGVydmFsQ29udHJvbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj57eyAnQXV0byByZWZyZXNoJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtLWItMFwiXG4gICAgICAgICAgICAgICAgICAgIGZvcj1cInJlZnJlc2hJbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdJbnRlcnZhbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LTEyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1JlZnJlc2ggaW50ZXJ2YWwgaW4gc2Vjb25kcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwicmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHJlZnJlc2hJbnRlcnZhbCBvZiBSRUZSRVNIX0lOVEVSVkFMX1ZBTFVFU19BUlJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwicmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAne3sgc2Vjb25kcyB9fSBzJyB8IHRyYW5zbGF0ZTogeyBzZWNvbmRzOiByZWZyZXNoSW50ZXJ2YWwgLyAxMDAwIH0gfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIGRlY2ltYWwgaW5wdXQgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldFwiPlxuICAgICAgICAgICAgPGxlZ2VuZD5cbiAgICAgICAgICAgICAge3sgJ0RlY2ltYWwgcGxhY2VzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9sZWdlbmQ+XG4gICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLXQtOFwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImRlY2ltYWxQbGFjZXNcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlY2ltYWxQbGFjZXNcIlxuICAgICAgICAgICAgICAgIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gYWdncmVnYXRpb24gc2VsZWN0b3IgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzV2lkZ2V0TGlua2VkVG9HbG9iYWxUaW1lQ29udGV4dFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJjOHktZmllbGRzZXRcIj5cbiAgICAgICAgICAgICAgPGxlZ2VuZD5cbiAgICAgICAgICAgICAgICB7eyAnQWdncmVnYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvbGVnZW5kPlxuICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLXQtOFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gU2V0dGluZyBiZWxvdyBbYXR0ci5kaXNhYmxlZF0gZW5zdXJlcyB0aGF0IHRoZSBjb250cm9sIGlzIHZpc3VhbGx5IGRpc2FibGVkIGFuZCB1c2VyIGludGVyYWN0aW9uIGlzIHByZXZlbnRlZCxcbiAgICAgICAgICAgICAgIHdoaWxlIHN0aWxsIGFsbG93aW5nIHRoZSB2YWx1ZSB0byBiZSB1cGRhdGVkIGFuZCBzYXZlZCBjb3JyZWN0bHkgaW4gdGhlIGZvcm0uXG4gICAgICAgICAgICAgICBUaGlzIHNvbHV0aW9uIGNvdmVycyB0aGUgY2FzZSB3aGVyZSB0aGUgdXNlciBlbmFibGVzIGF1dG8tcmVmcmVzaCwgaW4gd2hpY2ggY2FzZSBhZ2dyZWdhdGlvbiBtdXN0IGJlIHNldCB0byBOT05FLiAtLT5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC0xMlwiXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQWdncmVnYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJhZ2dyZWdhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFnZ3JlZ2F0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiZm9ybUdyb3VwLnZhbHVlLmlzQXV0b1JlZnJlc2hFbmFibGVkID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGFnZ3JlZ2F0aW9uVmFsdWUgb2YgQUdHUkVHQVRJT05fVkFMVUVTX0FSUlwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiYWdncmVnYXRpb25WYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zW2FnZ3JlZ2F0aW9uVmFsdWVdXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IEFHR1JFR0FUSU9OX0xBQkVMU1thZ2dyZWdhdGlvblZhbHVlXSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIHRpbWUgaW50ZXJ2YWwgc2VsZWN0b3IgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJjOHktZmllbGRzZXRcIj5cbiAgICAgICAgICAgICAgPGxlZ2VuZD5cbiAgICAgICAgICAgICAgICB7eyAnVGltZSBpbnRlcnZhbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9sZWdlbmQ+XG4gICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cInAtdC04XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LTEyXCJcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidJbnRlcnZhbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBpZD1cImludGVydmFsXCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaW50ZXJ2YWxcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGludGVydmFsVmFsdWUgb2YgSU5URVJWQUxfVkFMVUVTX0FSUlwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiaW50ZXJ2YWxWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBUSU1FX1JBTkdFX0lOVEVSVkFMX0xBQkVMU1tpbnRlcnZhbFZhbHVlXSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gZGF0ZSBwaWNrZXJzIC0tPlxuICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJjOHktZmllbGRzZXRcIj5cbiAgICAgICAgICA8bGVnZW5kPlxuICAgICAgICAgICAge3sgJ0RhdGUgcmFuZ2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9sZWdlbmQ+XG4gICAgICAgICAgPGM4eS1kYXRlLXJhbmdlLXBpY2tlcj48L2M4eS1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L2Rpdj5cbiJdfQ==