@c8y/ngx-components 1021.11.1 → 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 (434) hide show
  1. package/alarms/alarms-date-filter.component.d.ts +34 -0
  2. package/alarms/alarms-date-filter.component.d.ts.map +1 -0
  3. package/alarms/alarms-filter.component.d.ts +2 -1
  4. package/alarms/alarms-filter.component.d.ts.map +1 -1
  5. package/alarms/alarms-list.component.d.ts +2 -17
  6. package/alarms/alarms-list.component.d.ts.map +1 -1
  7. package/alarms/alarms-view.service.d.ts +5 -2
  8. package/alarms/alarms-view.service.d.ts.map +1 -1
  9. package/alarms/alarms.component.d.ts +3 -1
  10. package/alarms/alarms.component.d.ts.map +1 -1
  11. package/alarms/alarms.model.d.ts +47 -1
  12. package/alarms/alarms.model.d.ts.map +1 -1
  13. package/alarms/alarms.module.d.ts +15 -13
  14. package/alarms/alarms.module.d.ts.map +1 -1
  15. package/branding/shared/data/store-branding.service.d.ts +5 -0
  16. package/branding/shared/data/store-branding.service.d.ts.map +1 -1
  17. package/branding/shared/lazy/branding/branding.component.d.ts.map +1 -1
  18. package/context-dashboard/context-dashboard.model.d.ts +1 -0
  19. package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
  20. package/context-dashboard/context-dashboard.service.d.ts +7 -5
  21. package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
  22. package/context-dashboard/dashboard-detail.component.d.ts +4 -7
  23. package/context-dashboard/dashboard-detail.component.d.ts.map +1 -1
  24. package/context-dashboard/dashboard-detail.service.d.ts +4 -4
  25. package/context-dashboard/dashboard-detail.service.d.ts.map +1 -1
  26. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts +2 -2
  27. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts.map +1 -1
  28. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts +19 -6
  29. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts.map +1 -1
  30. package/core/action-bar/action-bar-item.component.d.ts +1 -1
  31. package/core/action-bar/action-bar-item.component.d.ts.map +1 -1
  32. package/core/action-bar/action-bar.module.d.ts +6 -6
  33. package/core/action-bar/action-bar.module.d.ts.map +1 -1
  34. package/core/bootstrap/bootstrap.component.d.ts +3 -1
  35. package/core/bootstrap/bootstrap.component.d.ts.map +1 -1
  36. package/core/common/aggregation/aggregation.model.d.ts +39 -0
  37. package/core/common/aggregation/aggregation.model.d.ts.map +1 -0
  38. package/core/common/aggregation/aggregation.service.d.ts +17 -0
  39. package/core/common/aggregation/aggregation.service.d.ts.map +1 -0
  40. package/core/common/index.d.ts +4 -0
  41. package/core/common/index.d.ts.map +1 -1
  42. package/core/common/inter-app.service.d.ts +48 -0
  43. package/core/common/inter-app.service.d.ts.map +1 -0
  44. package/core/common/interval-based-reload.abstract.d.ts +120 -0
  45. package/core/common/interval-based-reload.abstract.d.ts.map +1 -0
  46. package/core/dashboard/dashboard.module.d.ts +26 -20
  47. package/core/dashboard/dashboard.module.d.ts.map +1 -1
  48. package/core/dashboard/index.d.ts +3 -0
  49. package/core/dashboard/index.d.ts.map +1 -1
  50. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +31 -0
  51. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -0
  52. package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts +17 -0
  53. package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts.map +1 -0
  54. package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts +4 -0
  55. package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts.map +1 -0
  56. package/core/dashboard/widget-auto-refresh-context/index.d.ts +8 -0
  57. package/core/dashboard/widget-auto-refresh-context/index.d.ts.map +1 -0
  58. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts +7 -0
  59. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts.map +1 -0
  60. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts +29 -0
  61. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -0
  62. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts +15 -0
  63. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts.map +1 -0
  64. package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts +169 -0
  65. package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts.map +1 -0
  66. package/core/dashboard/widget-change-event.model.d.ts +1 -1
  67. package/core/dashboard/widget-change-event.model.d.ts.map +1 -1
  68. package/core/dashboard/widgets-dashboard.component.d.ts +6 -3
  69. package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
  70. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +2 -2
  71. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
  72. package/core/dashboard/wiget-time-context/widget-time-context-helper.service.d.ts +2 -1
  73. package/core/dashboard/wiget-time-context/widget-time-context-helper.service.d.ts.map +1 -1
  74. package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts +1 -1
  75. package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts.map +1 -1
  76. package/core/dashboard/wiget-time-context/widget-time-context-query.service.d.ts.map +1 -1
  77. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +12 -8
  78. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
  79. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts +7 -26
  80. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts.map +1 -1
  81. package/core/date-time-picker/date-time-picker.component.d.ts.map +1 -1
  82. package/core/header/header.module.d.ts +18 -18
  83. package/core/header/header.module.d.ts.map +1 -1
  84. package/core/header/title/title.component.d.ts +1 -1
  85. package/core/header/title/title.component.d.ts.map +1 -1
  86. package/core/i18n/cached-locale-dictionary.service.d.ts +5 -1
  87. package/core/i18n/cached-locale-dictionary.service.d.ts.map +1 -1
  88. package/core/i18n/i18n.module.d.ts +0 -4
  89. package/core/i18n/i18n.module.d.ts.map +1 -1
  90. package/core/i18n/index.d.ts +2 -1
  91. package/core/i18n/index.d.ts.map +1 -1
  92. package/core/i18n/translation-loader.service.d.ts +50 -0
  93. package/core/i18n/translation-loader.service.d.ts.map +1 -0
  94. package/core/i18n/translation-utils.d.ts +14 -0
  95. package/core/i18n/translation-utils.d.ts.map +1 -0
  96. package/core/plugins/plugins-resolve.service.d.ts +7 -10
  97. package/core/plugins/plugins-resolve.service.d.ts.map +1 -1
  98. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts +2 -1
  99. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts.map +1 -1
  100. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts +11 -2
  101. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts.map +1 -1
  102. package/datapoint-selector/datapoint-selection.model.d.ts +6 -0
  103. package/datapoint-selector/datapoint-selection.model.d.ts.map +1 -1
  104. package/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.d.ts.map +1 -0
  105. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts +117 -0
  106. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -0
  107. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts +90 -0
  108. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts.map +1 -0
  109. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts +160 -0
  110. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts.map +1 -0
  111. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts +89 -0
  112. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts.map +1 -0
  113. 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
  114. 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
  115. 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
  116. 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
  117. 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
  118. 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
  119. 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
  120. 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
  121. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts +3 -0
  122. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts.map +1 -0
  123. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts +9 -0
  124. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts.map +1 -0
  125. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts +56 -0
  126. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts.map +1 -0
  127. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts +21 -0
  128. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts.map +1 -0
  129. package/datapoints-export-selector/datapoints-export-selector.component.d.ts +14 -0
  130. package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -0
  131. package/datapoints-export-selector/datapoints-export-selector.model.d.ts +232 -0
  132. package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -0
  133. package/datapoints-export-selector/index.d.ts +15 -0
  134. package/datapoints-export-selector/index.d.ts.map +1 -0
  135. package/device-list/device-list.module.d.ts +4 -2
  136. package/device-list/device-list.module.d.ts.map +1 -1
  137. package/esm2022/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.mjs +4 -4
  138. package/esm2022/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.mjs +3 -3
  139. package/esm2022/alarms/alarms-date-filter.component.mjs +139 -0
  140. package/esm2022/alarms/alarms-filter.component.mjs +11 -5
  141. package/esm2022/alarms/alarms-list.component.mjs +5 -16
  142. package/esm2022/alarms/alarms-type-filter.component.mjs +3 -3
  143. package/esm2022/alarms/alarms-view.service.mjs +16 -2
  144. package/esm2022/alarms/alarms.component.mjs +12 -6
  145. package/esm2022/alarms/alarms.model.mjs +17 -1
  146. package/esm2022/alarms/alarms.module.mjs +11 -4
  147. package/esm2022/branding/shared/data/store-branding.service.mjs +24 -1
  148. package/esm2022/branding/shared/lazy/branding/branding.component.mjs +3 -1
  149. package/esm2022/context-dashboard/context-dashboard.component.mjs +4 -4
  150. package/esm2022/context-dashboard/context-dashboard.model.mjs +1 -1
  151. package/esm2022/context-dashboard/context-dashboard.service.mjs +47 -21
  152. package/esm2022/context-dashboard/dashboard-detail.component.mjs +8 -16
  153. package/esm2022/context-dashboard/dashboard-detail.service.mjs +13 -6
  154. package/esm2022/context-dashboard/dashboard-settings/dashboard-general-settings.component.mjs +3 -3
  155. package/esm2022/context-dashboard/dashboard-settings/typed-dashboard-settings.component.mjs +32 -11
  156. package/esm2022/core/action-bar/action-bar-item.component.mjs +3 -3
  157. package/esm2022/core/action-bar/action-bar.component.mjs +3 -3
  158. package/esm2022/core/action-bar/action-bar.module.mjs +16 -5
  159. package/esm2022/core/bootstrap/bootstrap.component.mjs +21 -16
  160. package/esm2022/core/common/aggregation/aggregation.model.mjs +46 -0
  161. package/esm2022/core/common/aggregation/aggregation.service.mjs +34 -0
  162. package/esm2022/core/common/humanize-app-name.model.mjs +2 -2
  163. package/esm2022/core/common/humanize-app-name.pipe.mjs +2 -2
  164. package/esm2022/core/common/index.mjs +5 -1
  165. package/esm2022/core/common/inter-app.service.mjs +76 -0
  166. package/esm2022/core/common/interval-based-reload.abstract.mjs +110 -0
  167. package/esm2022/core/countdown-interval/countdown-interval.component.mjs +3 -3
  168. package/esm2022/core/dashboard/dashboard-child.component.mjs +6 -5
  169. package/esm2022/core/dashboard/dashboard.module.mjs +22 -4
  170. package/esm2022/core/dashboard/index.mjs +4 -1
  171. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +101 -0
  172. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.mjs +50 -0
  173. package/esm2022/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.mjs +7 -0
  174. package/esm2022/core/dashboard/widget-auto-refresh-context/index.mjs +8 -0
  175. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.mjs +18 -0
  176. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +127 -0
  177. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.mjs +5 -0
  178. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.mjs +233 -0
  179. package/esm2022/core/dashboard/widget-change-event.model.mjs +1 -1
  180. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +35 -30
  181. package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +4 -4
  182. package/esm2022/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.mjs +2 -2
  183. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-helper.service.mjs +3 -2
  184. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +5 -5
  185. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-query.service.mjs +7 -4
  186. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +37 -36
  187. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.model.mjs +1 -72
  188. package/esm2022/core/date-time-picker/date-time-picker.component.mjs +9 -3
  189. package/esm2022/core/header/header.module.mjs +7 -5
  190. package/esm2022/core/header/title/title.component.mjs +3 -3
  191. package/esm2022/core/i18n/cached-locale-dictionary.service.mjs +1 -1
  192. package/esm2022/core/i18n/i18n.module.mjs +7 -14
  193. package/esm2022/core/i18n/index.mjs +3 -2
  194. package/esm2022/core/i18n/translate.parser.mjs +2 -2
  195. package/esm2022/core/i18n/translation-loader.service.mjs +132 -0
  196. package/esm2022/core/i18n/translation-utils.mjs +24 -0
  197. package/esm2022/core/list-display-switch/list-display-switch.component.mjs +3 -3
  198. package/esm2022/core/plugins/plugins-resolve.service.mjs +12 -37
  199. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.mjs +13 -6
  200. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +22 -5
  201. package/esm2022/datapoint-selector/datapoint-selection-list/datapoint-selection-list.component.mjs +3 -3
  202. package/esm2022/datapoint-selector/datapoint-selection.model.mjs +1 -1
  203. package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
  204. package/esm2022/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.mjs +5 -0
  205. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +407 -0
  206. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.mjs +207 -0
  207. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.mjs +467 -0
  208. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.mjs +187 -0
  209. 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
  210. 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
  211. 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
  212. 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
  213. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.mjs +120 -0
  214. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.mjs +282 -0
  215. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.mjs +76 -0
  216. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.mjs +46 -0
  217. package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +42 -0
  218. package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +43 -0
  219. package/esm2022/datapoints-export-selector/index.mjs +15 -0
  220. package/esm2022/device-list/add-smart-group.component.mjs +4 -3
  221. package/esm2022/device-list/device-list.module.mjs +22 -4
  222. package/esm2022/interval-picker/c8y-ngx-components-interval-picker.mjs +5 -0
  223. package/esm2022/interval-picker/index.mjs +3 -0
  224. package/esm2022/interval-picker/interval-picker.component.mjs +68 -0
  225. package/esm2022/interval-picker/interval-picker.model.mjs +47 -0
  226. package/esm2022/map/cluster-map.component.mjs +41 -13
  227. package/esm2022/map/map-status.component.mjs +6 -5
  228. package/esm2022/map/map.component.mjs +9 -5
  229. package/esm2022/map/map.model.mjs +1 -1
  230. package/esm2022/translation-editor/c8y-ngx-components-translation-editor.mjs +5 -0
  231. package/esm2022/translation-editor/data/c8y-ngx-components-translation-editor-data.mjs +5 -0
  232. package/esm2022/translation-editor/data/index.mjs +2 -0
  233. package/esm2022/translation-editor/data/translation-store.service.mjs +175 -0
  234. package/esm2022/translation-editor/index.mjs +10 -0
  235. package/esm2022/translation-editor/lazy/add-translation-modal/add-translation-modal.component.mjs +70 -0
  236. package/esm2022/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.mjs +5 -0
  237. package/esm2022/translation-editor/lazy/index.mjs +2 -0
  238. package/esm2022/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.mjs +53 -0
  239. package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +124 -0
  240. package/esm2022/translation-editor/translation-editor-naviagtor-factory.service.mjs +31 -0
  241. package/esm2022/widgets/cockpit/index.mjs +4 -2
  242. package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
  243. package/esm2022/widgets/definitions/alarms/alarm-list/index.mjs +6 -2
  244. package/esm2022/widgets/definitions/alarms/all-critical-alarms/index.mjs +6 -2
  245. package/esm2022/widgets/definitions/alarms/recent-alarms/index.mjs +6 -2
  246. package/esm2022/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +5 -0
  247. package/esm2022/widgets/definitions/datapoints-table/index.mjs +34 -0
  248. package/esm2022/widgets/definitions/index.mjs +2 -1
  249. package/esm2022/widgets/definitions/map/index.mjs +4 -2
  250. package/esm2022/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.mjs +29 -15
  251. package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +57 -25
  252. package/esm2022/widgets/implementations/alarms/alarm-list-widget.model.mjs +2 -1
  253. package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +19 -21
  254. package/esm2022/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +5 -0
  255. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +383 -0
  256. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.mjs +124 -0
  257. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.mjs +191 -0
  258. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.mjs +36 -0
  259. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.mjs +45 -0
  260. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +116 -0
  261. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +116 -0
  262. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.mjs +43 -0
  263. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +282 -0
  264. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.mjs +430 -0
  265. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.mjs +75 -0
  266. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +76 -0
  267. package/esm2022/widgets/implementations/datapoints-table/datapoints-table.service.mjs +52 -0
  268. package/esm2022/widgets/implementations/datapoints-table/date-range-picker.component.mjs +68 -0
  269. package/esm2022/widgets/implementations/datapoints-table/index.mjs +10 -0
  270. package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +19 -11
  271. package/esm2022/widgets/implementations/map/map-widget.component.mjs +20 -2
  272. package/esm2022/widgets/implementations/map/map-widget.model.mjs +1 -1
  273. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +5 -5
  274. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
  275. package/fesm2022/c8y-ngx-components-alarms.mjs +189 -31
  276. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  277. package/fesm2022/c8y-ngx-components-branding-shared-data.mjs +23 -0
  278. package/fesm2022/c8y-ngx-components-branding-shared-data.mjs.map +1 -1
  279. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +2 -0
  280. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  281. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +135 -91
  282. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  283. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +37 -13
  284. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  285. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +1928 -0
  286. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -0
  287. package/fesm2022/c8y-ngx-components-device-list.mjs +24 -5
  288. package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
  289. package/fesm2022/c8y-ngx-components-interval-picker.mjs +120 -0
  290. package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -0
  291. package/fesm2022/c8y-ngx-components-map.mjs +52 -19
  292. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  293. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +181 -0
  294. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -0
  295. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +236 -0
  296. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -0
  297. package/fesm2022/c8y-ngx-components-translation-editor.mjs +46 -0
  298. package/fesm2022/c8y-ngx-components-translation-editor.mjs.map +1 -0
  299. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
  300. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
  301. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +3 -1
  302. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
  303. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +5 -1
  304. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
  305. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs +5 -1
  306. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
  307. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs +5 -1
  308. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
  309. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +41 -0
  310. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -0
  311. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +3 -1
  312. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
  313. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
  314. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  315. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +101 -58
  316. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  317. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +1967 -0
  318. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -0
  319. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +37 -11
  320. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  321. package/fesm2022/c8y-ngx-components.mjs +5093 -4369
  322. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  323. package/interval-picker/c8y-ngx-components-interval-picker.d.ts.map +1 -0
  324. package/interval-picker/index.d.ts +3 -0
  325. package/interval-picker/index.d.ts.map +1 -0
  326. package/{core/dashboard/wiget-time-context/interval-picker → interval-picker}/interval-picker.component.d.ts +10 -2
  327. package/interval-picker/interval-picker.component.d.ts.map +1 -0
  328. package/interval-picker/interval-picker.model.d.ts +15 -0
  329. package/interval-picker/interval-picker.model.d.ts.map +1 -0
  330. package/locales/de.po +289 -18
  331. package/locales/en.po +12 -0
  332. package/locales/en_US.po +3 -0
  333. package/locales/es.po +253 -18
  334. package/locales/fr.po +253 -18
  335. package/locales/ja_JP.po +282 -18
  336. package/locales/locales.pot +266 -21
  337. package/locales/nl.po +253 -18
  338. package/locales/pl.po +253 -18
  339. package/locales/pt_BR.po +253 -18
  340. package/map/cluster-map.component.d.ts +8 -3
  341. package/map/cluster-map.component.d.ts.map +1 -1
  342. package/map/map-status.component.d.ts +0 -3
  343. package/map/map-status.component.d.ts.map +1 -1
  344. package/map/map.component.d.ts +4 -2
  345. package/map/map.component.d.ts.map +1 -1
  346. package/map/map.model.d.ts +2 -1
  347. package/map/map.model.d.ts.map +1 -1
  348. package/package.json +1 -1
  349. package/translation-editor/c8y-ngx-components-translation-editor.d.ts.map +1 -0
  350. package/translation-editor/data/c8y-ngx-components-translation-editor-data.d.ts.map +1 -0
  351. package/translation-editor/data/index.d.ts +2 -0
  352. package/translation-editor/data/index.d.ts.map +1 -0
  353. package/translation-editor/data/translation-store.service.d.ts +61 -0
  354. package/translation-editor/data/translation-store.service.d.ts.map +1 -0
  355. package/translation-editor/index.d.ts +2 -0
  356. package/translation-editor/index.d.ts.map +1 -0
  357. package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts +30 -0
  358. package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts.map +1 -0
  359. package/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.d.ts.map +1 -0
  360. package/translation-editor/lazy/index.d.ts +2 -0
  361. package/translation-editor/lazy/index.d.ts.map +1 -0
  362. package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts +22 -0
  363. package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts.map +1 -0
  364. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts +34 -0
  365. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -0
  366. package/translation-editor/translation-editor-naviagtor-factory.service.d.ts +11 -0
  367. package/translation-editor/translation-editor-naviagtor-factory.service.d.ts.map +1 -0
  368. package/widgets/cockpit/index.d.ts +13 -0
  369. package/widgets/cockpit/index.d.ts.map +1 -1
  370. package/widgets/cockpit-exports/index.d.ts +6 -0
  371. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  372. package/widgets/definitions/alarms/alarm-list/index.d.ts +2 -0
  373. package/widgets/definitions/alarms/alarm-list/index.d.ts.map +1 -1
  374. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +2 -0
  375. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
  376. package/widgets/definitions/alarms/recent-alarms/index.d.ts +2 -0
  377. package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
  378. package/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.d.ts.map +1 -0
  379. package/widgets/definitions/datapoints-table/index.d.ts +14 -0
  380. package/widgets/definitions/datapoints-table/index.d.ts.map +1 -0
  381. package/widgets/definitions/index.d.ts +1 -0
  382. package/widgets/definitions/index.d.ts.map +1 -1
  383. package/widgets/definitions/map/index.d.ts +2 -1
  384. package/widgets/definitions/map/index.d.ts.map +1 -1
  385. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts +5 -9
  386. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts.map +1 -1
  387. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts +17 -10
  388. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts.map +1 -1
  389. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts +5 -1
  390. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts.map +1 -1
  391. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +5 -11
  392. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
  393. package/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.d.ts.map +1 -0
  394. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +129 -0
  395. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -0
  396. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts +56 -0
  397. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts.map +1 -0
  398. package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts +88 -0
  399. package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts.map +1 -0
  400. package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts +19 -0
  401. package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts.map +1 -0
  402. package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts +26 -0
  403. package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts.map +1 -0
  404. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +63 -0
  405. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -0
  406. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts +38 -0
  407. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts.map +1 -0
  408. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts +13 -0
  409. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts.map +1 -0
  410. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +123 -0
  411. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -0
  412. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts +196 -0
  413. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts.map +1 -0
  414. package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts +41 -0
  415. package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts.map +1 -0
  416. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +175 -0
  417. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -0
  418. package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts +12 -0
  419. package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts.map +1 -0
  420. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts +34 -0
  421. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts.map +1 -0
  422. package/widgets/implementations/datapoints-table/index.d.ts +10 -0
  423. package/widgets/implementations/datapoints-table/index.d.ts.map +1 -0
  424. package/widgets/implementations/map/map-widget-config.component.d.ts +4 -4
  425. package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
  426. package/widgets/implementations/map/map-widget.component.d.ts +8 -3
  427. package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
  428. package/widgets/implementations/map/map-widget.model.d.ts +4 -3
  429. package/widgets/implementations/map/map-widget.model.d.ts.map +1 -1
  430. package/core/dashboard/wiget-time-context/interval-picker/interval-picker.component.d.ts.map +0 -1
  431. package/core/i18n/translate.loader.d.ts +0 -31
  432. package/core/i18n/translate.loader.d.ts.map +0 -1
  433. package/esm2022/core/dashboard/wiget-time-context/interval-picker/interval-picker.component.mjs +0 -55
  434. package/esm2022/core/i18n/translate.loader.mjs +0 -71
@@ -0,0 +1,467 @@
1
+ import { KeyValuePipe } from '@angular/common';
2
+ import { Component, EventEmitter, Inject, InjectionToken, Input, Output } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
+ import { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';
5
+ import { AGGREGATION_VALUES, CoreModule } from '@c8y/ngx-components';
6
+ import saveAs from 'file-saver';
7
+ import { debounceTime, merge, Subject, takeUntil } from 'rxjs';
8
+ import { EXPORT_MODE_VALUES, SERIES_DATA_MERGED_FILE_NAME } from '../../datapoints-export-selector.model';
9
+ import { DataFetchingService } from './data-fetching.service';
10
+ import { DataProcessingService } from './data-processing.service';
11
+ import { DatapointsExportSelectorFileExporterService } from './datapoints-export-selector-file-exporter.service';
12
+ import { DataPointsExportSelectorPreviewComponent } from './datapoints-export-selector-preview/datapoints-export-selector-preview.component';
13
+ import { DataPointsExportSelectorDataScopeComponent } from './datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component';
14
+ import { DataPointsExportSelectorFileTypesComponent } from './datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component';
15
+ import { DataPointsExportSelectorTimeRangeComponent } from './datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component';
16
+ import { CSVGeneratorAdapter } from './generators/csv-generator';
17
+ import { ExcelGeneratorAdapter } from './generators/excel-generator';
18
+ import * as i0 from "@angular/core";
19
+ import * as i1 from "./data-processing.service";
20
+ import * as i2 from "./data-fetching.service";
21
+ import * as i3 from "./datapoints-export-selector-file-exporter.service";
22
+ import * as i4 from "@angular/forms";
23
+ import * as i5 from "@c8y/ngx-components";
24
+ import * as i6 from "@angular/common";
25
+ export const FILE_GENERATORS = new InjectionToken('FILE_GENERATORS', {
26
+ providedIn: 'root',
27
+ factory: () => [ExcelGeneratorAdapter, CSVGeneratorAdapter]
28
+ });
29
+ export const dateRangeValidator = (control) => {
30
+ const dateFrom = control.get('dateFrom');
31
+ const dateTo = control.get('dateTo');
32
+ if (!dateFrom || !dateTo) {
33
+ return null;
34
+ }
35
+ const dateFromValue = dateFrom.value;
36
+ const dateToValue = dateTo.value;
37
+ if (dateFromValue && dateToValue) {
38
+ if (new Date(dateFromValue) > new Date(dateToValue)) {
39
+ dateFrom.setErrors({ dateAfterRangeMax: true });
40
+ dateTo.setErrors({ dateBeforeRangeMin: true });
41
+ }
42
+ else {
43
+ dateFrom.setErrors(null);
44
+ dateTo.setErrors(null);
45
+ }
46
+ }
47
+ return null;
48
+ };
49
+ export class DatapointsExportSelectorFileExporterComponent {
50
+ constructor(datapointsExportModalService, datapointsExportSelectorService, datapointsExportSelectorFileExporterService, formBuilder, generators) {
51
+ this.datapointsExportModalService = datapointsExportModalService;
52
+ this.datapointsExportSelectorService = datapointsExportSelectorService;
53
+ this.datapointsExportSelectorFileExporterService = datapointsExportSelectorFileExporterService;
54
+ this.formBuilder = formBuilder;
55
+ this.generators = generators;
56
+ this.onDownloadButtonStateChange = new EventEmitter();
57
+ /**
58
+ * Represents aggregation selector options that are disabled.
59
+ * This state is determined based on the current date range.
60
+ */
61
+ this.disabledAggregationOptions = {};
62
+ /**
63
+ * Contains all datapoints that number of records exceeds a threshold, where data for these datapoints will be processed by the backend.
64
+ * Applies only to measurement API which can return processed CSV, Excel or XML data.
65
+ */
66
+ this.datapointsExceedingBrowserDownloadLimit = [];
67
+ /**
68
+ * Indicates whether any of DataToExport objects timeValueMap property is not undefined (series data)
69
+ * or dataPointToExport is not undefined at all (measurement data).
70
+ */
71
+ this.hasFetchedDataAnyValuesToExport = false;
72
+ this.hasPermissionToReadAnyMeasurements = false;
73
+ this.isPreviewLoading = true;
74
+ /**
75
+ * Indicates whether the full or compact type of export is selected.
76
+ * Full type of export is based on measurement API data.
77
+ * Compact type of export is based on series API data.
78
+ */
79
+ this.isFullTypeOfExport = false;
80
+ /**
81
+ * Indicates whether the aggregation value was changed programmatically.
82
+ * It prevents a case where fetching may be triggered twice when export type is changed.
83
+ * Both options alone can trigger fetching data.
84
+ */
85
+ this.isAggregationChangedProgrammatically = false;
86
+ /**
87
+ * Indicates whether any of the export file types (CSV, Excel) are checked.
88
+ */
89
+ this.isAnyOfExportFileTypeChecked = false;
90
+ this.dateFromSubject = new Subject();
91
+ this.dateToSubject = new Subject();
92
+ this.destroy$ = new Subject();
93
+ this.dynamicFilesTypeMetadata = {};
94
+ this.setFilesType(this.generators);
95
+ this.dateFromSubject
96
+ .pipe(debounceTime(300), takeUntilDestroyed())
97
+ .subscribe(async (updatedDate) => {
98
+ await this.updateDateAndFetchData('dateFrom', updatedDate);
99
+ });
100
+ this.dateToSubject
101
+ .pipe(debounceTime(300), takeUntilDestroyed())
102
+ .subscribe(async (updatedDate) => {
103
+ await this.updateDateAndFetchData('dateTo', updatedDate);
104
+ });
105
+ }
106
+ setFilesType(generators) {
107
+ generators.forEach(g => {
108
+ this.dynamicFilesTypeMetadata[g.getType()] = {
109
+ label: g.getLabel(),
110
+ icon: g.getIcon(),
111
+ title: g.getTitle(),
112
+ extension: g.getFileExtension(),
113
+ zipName: g.getZipName(),
114
+ type: g.getType()
115
+ };
116
+ });
117
+ }
118
+ async ngOnInit() {
119
+ const sourcesPermittedToRead = await this.datapointsExportSelectorService.getSourcesWithPermissionsToRead(this.exportConfig.datapointDetails);
120
+ if (sourcesPermittedToRead.length === 0) {
121
+ return;
122
+ }
123
+ if (sourcesPermittedToRead.length !== this.exportConfig.datapointDetails.length) {
124
+ this.exportConfig.datapointDetails = this.exportConfig.datapointDetails.filter(dataPoint => sourcesPermittedToRead.includes(String(dataPoint.source)));
125
+ }
126
+ this.hasPermissionToReadAnyMeasurements = true;
127
+ this.storeInitialChangeableConfig();
128
+ this.fileTypeSelectionState = this.getInitialSelection(this.dynamicFilesTypeMetadata, [0]);
129
+ this.formGroup = this.createForm();
130
+ this.dataToExport = await this.datapointsExportSelectorService.fetchAndPrepareDataToExport(this.exportConfig, this.isFullTypeOfExport);
131
+ this.handleDateSelectorChanges();
132
+ this.determineShowingPreviewOrEmptyState();
133
+ this.handleExportModeChanges();
134
+ this.handleFileTypeSelectionChanges();
135
+ this.handleFormValidationChanges();
136
+ this.updateFileTypeControl();
137
+ this.updateDisabledAggregationOptionsState();
138
+ }
139
+ ngOnDestroy() {
140
+ this.destroy$.next();
141
+ this.destroy$.complete();
142
+ this.loadInitialChangeableConfig();
143
+ }
144
+ async exportAndDownload() {
145
+ const fileExports = Object.entries(this.dynamicFilesTypeMetadata).map(([_, value]) => ({
146
+ fileType: value.type,
147
+ zipName: value.zipName
148
+ }));
149
+ const selectedFileExports = this.getOnlySelectedFileExports(fileExports);
150
+ await Promise.all(selectedFileExports.map(async ({ fileType, zipName }) => {
151
+ const blob = await this.exportFile(fileType);
152
+ await this.downloadFile(blob, fileType, zipName);
153
+ }));
154
+ this.datapointsExportSelectorFileExporterService.cleanupCachedData();
155
+ }
156
+ getOnlySelectedFileExports(fileExports) {
157
+ return fileExports.filter(f => this.fileTypeSelectionState[f.fileType] === true);
158
+ }
159
+ async exportFile(fileType) {
160
+ return this.isFullTypeOfExport
161
+ ? await this.exportMeasurementFile(fileType)
162
+ : await this.exportSeriesFile(fileType);
163
+ }
164
+ async downloadFile(blob, fileType, measurementsZipFileName) {
165
+ this.datapointsExceedingBrowserDownloadLimit =
166
+ this.datapointsExceedingBrowserDownloadLimit.filter(datapoint => !this.dataPointsExceedingOneMillionLimit.includes(datapoint));
167
+ const shouldShowAlert = this.datapointsExceedingBrowserDownloadLimit.length > 0;
168
+ // Handles a case where all files are sent by email.
169
+ if (!blob && shouldShowAlert) {
170
+ this.datapointsExportSelectorService.showSendViaEmailInfoAlert(fileType, this.datapointsExceedingBrowserDownloadLimit);
171
+ return;
172
+ }
173
+ if (blob) {
174
+ // Handles the case where some of the files are sent by email.
175
+ if (shouldShowAlert) {
176
+ this.datapointsExportSelectorService.showSendViaEmailInfoAlert(fileType, this.datapointsExceedingBrowserDownloadLimit);
177
+ }
178
+ this.isFullTypeOfExport
179
+ ? saveAs(blob, measurementsZipFileName)
180
+ : saveAs(blob, blob[SERIES_DATA_MERGED_FILE_NAME]);
181
+ }
182
+ }
183
+ /**
184
+ * Exports a measurement file of the specified type.
185
+ *
186
+ * Measurements API does provide a way to fetch a preprocessed CSV/Excel file.
187
+ *
188
+ * At this point a backed file needs to be fetched.
189
+ * Measurement data used for a preview contains just 5 first records
190
+ * and it's not fetched with CSV/Excel headers.
191
+ *
192
+ * @param fileType - The type of file to export.
193
+ * @returns A Promise that resolves to a Blob representing the exported file or null when no data to export or it's sent via email.
194
+ */
195
+ async exportMeasurementFile(fileType) {
196
+ const { acceptType, extension } = this.datapointsExportModalService.fileTypesConfigs[fileType];
197
+ const updatedExportConfig = this.excludeDatapointsThatExceedsApiLimit(this.exportConfig);
198
+ const dataToExport = await this.datapointsExportSelectorService.fetchMeasurementDataFilesAndPairWithSourceDetails(acceptType, updatedExportConfig);
199
+ const isAllUndefined = dataToExport.every(data => data === undefined);
200
+ if (isAllUndefined) {
201
+ return null;
202
+ }
203
+ return this.datapointsExportSelectorFileExporterService.getMeasurementExportedDataBlob(extension, dataToExport);
204
+ }
205
+ excludeDatapointsThatExceedsApiLimit(exportConfig) {
206
+ const skippedDatapointsSource = this.dataPointsExceedingOneMillionLimit.map(datapoint => datapoint.datapointDetail.source.toString());
207
+ const filteredDatapoints = exportConfig.datapointDetails.filter(datapoint => !skippedDatapointsSource.includes(String(datapoint.source)));
208
+ exportConfig.datapointDetails = filteredDatapoints;
209
+ return exportConfig;
210
+ }
211
+ /**
212
+ * Exports the series data to a file of the specified type.
213
+ *
214
+ * Series API does not provide a way to fetch a preprocessed CSV/Excel file.
215
+ *
216
+ * Series data used for exporting a file is already fetched for a preview
217
+ * and can be reused for exporting.
218
+ *
219
+ * @param fileType - The type of file to export (e.g., CSV, Excel).
220
+ * @returns A Promise that resolves to a Blob representing the exported file.
221
+ */
222
+ async exportSeriesFile(fileType) {
223
+ const mergedExportDetails = {
224
+ aggregation: this.exportConfig.aggregation,
225
+ dateFrom: this.exportConfig.dateFrom,
226
+ dateTo: this.exportConfig.dateTo
227
+ };
228
+ return this.datapointsExportSelectorFileExporterService.getSeriesExportedDataBlob(fileType, this.dataToExport, mergedExportDetails);
229
+ }
230
+ async onAggregationChange(aggregation) {
231
+ this.exportConfig.aggregation = aggregation;
232
+ if (!this.isAggregationChangedProgrammatically) {
233
+ await this.updateExportConfigAndFetchData();
234
+ this.updateDownloadButtonState();
235
+ }
236
+ }
237
+ onDateFromChange(updatedDate) {
238
+ this.dateFromSubject.next(updatedDate);
239
+ }
240
+ onDateToChange(updatedDate) {
241
+ this.dateToSubject.next(updatedDate);
242
+ }
243
+ async updateDateAndFetchData(dateType, updatedDate) {
244
+ this.exportConfig[dateType] = updatedDate;
245
+ await this.updateExportConfigAndFetchData();
246
+ if (this.isFullTypeOfExport) {
247
+ await this.determineIfMeasurementResponseWillBeProcessedByBackend();
248
+ }
249
+ else {
250
+ this.updateDownloadButtonState();
251
+ }
252
+ }
253
+ async onExportTypeChange(exportType) {
254
+ if (exportType === EXPORT_MODE_VALUES.full) {
255
+ this.isAggregationChangedProgrammatically = true;
256
+ this.formGroup.controls.aggregation.setValue(AGGREGATION_VALUES.none);
257
+ this.isAggregationChangedProgrammatically = false;
258
+ this.isFullTypeOfExport = true;
259
+ await this.updateExportConfigAndFetchData();
260
+ await this.determineIfMeasurementResponseWillBeProcessedByBackend();
261
+ return;
262
+ }
263
+ this.resetFullExportRelatedProperties();
264
+ this.isFullTypeOfExport = false;
265
+ await this.updateExportConfigAndFetchData();
266
+ this.updateDisabledAggregationOptionsState();
267
+ this.updateDownloadButtonState();
268
+ }
269
+ updateDisabledAggregationOptionsState() {
270
+ this.disabledAggregationOptions =
271
+ this.datapointsExportSelectorFileExporterService.updateDisabledStateOfAggregationOptionEntries(this.formGroup.controls.dateFrom.value, this.formGroup.controls.dateTo.value, this.disabledAggregationOptions);
272
+ }
273
+ createForm() {
274
+ return this.formBuilder.group({
275
+ dateFrom: new FormControl(this.exportConfig.dateFrom),
276
+ dateTo: new FormControl(this.exportConfig.dateTo),
277
+ aggregation: new FormControl(this.exportConfig.aggregation ? this.exportConfig.aggregation : AGGREGATION_VALUES.none),
278
+ exportMode: new FormControl(EXPORT_MODE_VALUES.compact),
279
+ fileTypes: this.formBuilder.group(this.generators.reduce((a, c) => {
280
+ a[c.getType()] = false;
281
+ return a;
282
+ }, {}))
283
+ }, {
284
+ validators: [dateRangeValidator]
285
+ });
286
+ }
287
+ preparePreview() {
288
+ this.isPreviewLoading = true;
289
+ this.previewTableData =
290
+ this.datapointsExportModalService.transformToExportFileStructureForPreview(this.dataToExport);
291
+ this.isPreviewLoading = false;
292
+ }
293
+ handleDateSelectorChanges() {
294
+ const aggregationControl = this.formGroup.controls.aggregation;
295
+ const dateFromSelector = this.formGroup.controls.dateFrom;
296
+ const dateToSelector = this.formGroup.controls.dateTo;
297
+ const updateAggregationOptions = () => {
298
+ if (!this.isFullTypeOfExport) {
299
+ this.updateDisabledAggregationOptionsState();
300
+ const firstAvailableAggregationValue = this.datapointsExportSelectorFileExporterService.setToFirstAvailableAggregationOptionIfCurrentIsDisabled(aggregationControl.value, this.disabledAggregationOptions);
301
+ if (firstAvailableAggregationValue) {
302
+ aggregationControl.setValue(firstAvailableAggregationValue);
303
+ }
304
+ }
305
+ };
306
+ merge(dateFromSelector.valueChanges, dateToSelector.valueChanges)
307
+ .pipe(takeUntil(this.destroy$))
308
+ .subscribe(updateAggregationOptions);
309
+ }
310
+ handleExportModeChanges() {
311
+ const aggregationControl = this.formGroup.controls.aggregation;
312
+ this.formGroup.controls.exportMode.valueChanges
313
+ .pipe(takeUntil(this.destroy$))
314
+ .subscribe(exportModeValue => {
315
+ if (exportModeValue.toString() === EXPORT_MODE_VALUES.full) {
316
+ aggregationControl.disable();
317
+ }
318
+ else {
319
+ aggregationControl.enable();
320
+ }
321
+ });
322
+ }
323
+ handleFileTypeSelectionChanges() {
324
+ this.formGroup.controls.fileTypes.valueChanges
325
+ .pipe(takeUntil(this.destroy$))
326
+ .subscribe(fileTypesSelectionState => {
327
+ this.updateFileTypeSelectionState(fileTypesSelectionState);
328
+ });
329
+ }
330
+ updateFileTypeSelectionState(checkboxesState) {
331
+ this.isAnyOfExportFileTypeChecked = Object.values(checkboxesState).some(value => value === true);
332
+ this.fileTypeSelectionState = checkboxesState;
333
+ this.updateDownloadButtonState();
334
+ }
335
+ handleFormValidationChanges() {
336
+ this.formGroup.statusChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {
337
+ this.updateDownloadButtonState();
338
+ });
339
+ }
340
+ updateFileTypeControl() {
341
+ const fileTypesControl = this.formGroup.controls.fileTypes;
342
+ if (fileTypesControl) {
343
+ const currentValue = fileTypesControl.value || {};
344
+ const updatedValue = { ...currentValue };
345
+ Object.entries(this.fileTypeSelectionState).forEach(([fileType, isSelected]) => {
346
+ if (fileType in currentValue) {
347
+ updatedValue[fileType] = isSelected;
348
+ }
349
+ });
350
+ fileTypesControl.patchValue(updatedValue);
351
+ }
352
+ }
353
+ determineShowingPreviewOrEmptyState() {
354
+ const hasDataToShow = this.dataToExport.some(dataToExportItem => this.isFullTypeOfExport
355
+ ? !!dataToExportItem
356
+ : dataToExportItem.timeValueMap && Object.keys(dataToExportItem.timeValueMap).length > 0);
357
+ this.hasFetchedDataAnyValuesToExport = hasDataToShow;
358
+ if (hasDataToShow) {
359
+ this.preparePreview();
360
+ }
361
+ else {
362
+ this.isPreviewLoading = false;
363
+ }
364
+ }
365
+ async determineIfMeasurementResponseWillBeProcessedByBackend() {
366
+ this.isPreviewLoading = true;
367
+ this.datapointsExceedingBrowserDownloadLimit =
368
+ await this.datapointsExportSelectorService.getDatapointsExceedingLimit(this.exportConfig);
369
+ const { browserDownloadableCount, emailDeliverableCount, nonRetrievableCount } = this.calculateDatapointCounts();
370
+ this.hasNoExportableData =
371
+ browserDownloadableCount === 0 && emailDeliverableCount === 0 && nonRetrievableCount > 0;
372
+ if (this.datapointsExceedingBrowserDownloadLimit.length > 0 && !this.hasNoExportableData) {
373
+ this.limitExceededMessage = this.datapointsExportSelectorService.getLimitExceededMessage(this.hasNoExportableData, emailDeliverableCount, browserDownloadableCount, nonRetrievableCount, this.exportConfig.datapointDetails.length);
374
+ }
375
+ if (this.datapointsExceedingBrowserDownloadLimit.length > 0 && this.hasNoExportableData) {
376
+ this.limitExceededMessage = this.datapointsExportSelectorService.getLimitExceededMessage(this.hasNoExportableData);
377
+ }
378
+ this.updateDownloadButtonState();
379
+ this.isPreviewLoading = false;
380
+ }
381
+ calculateDatapointCounts() {
382
+ const RECORD_API_LIMIT = 1_000_000;
383
+ this.dataPointsExceedingOneMillionLimit = this.datapointsExceedingBrowserDownloadLimit.filter(datapointsExceedingBrowserDownloadLimit => datapointsExceedingBrowserDownloadLimit.totalElements > RECORD_API_LIMIT);
384
+ const nonRetrievableCount = this.dataPointsExceedingOneMillionLimit.length;
385
+ const emailDeliverableCount = this.datapointsExceedingBrowserDownloadLimit.length - nonRetrievableCount;
386
+ const browserDownloadableCount = this.exportConfig.datapointDetails.length - emailDeliverableCount - nonRetrievableCount;
387
+ return {
388
+ browserDownloadableCount,
389
+ emailDeliverableCount,
390
+ nonRetrievableCount
391
+ };
392
+ }
393
+ storeInitialChangeableConfig() {
394
+ this.initialDateFrom = this.exportConfig.dateFrom;
395
+ this.initialDateTo = this.exportConfig.dateTo;
396
+ this.initialDatapointDetails = this.exportConfig.datapointDetails;
397
+ if (!this.isFullTypeOfExport) {
398
+ this.initialAggregation = this.exportConfig.aggregation;
399
+ }
400
+ }
401
+ loadInitialChangeableConfig() {
402
+ this.exportConfig.dateFrom = this.initialDateFrom;
403
+ this.exportConfig.dateTo = this.initialDateTo;
404
+ this.exportConfig.datapointDetails = this.initialDatapointDetails;
405
+ if (!this.isFullTypeOfExport) {
406
+ this.exportConfig.aggregation = this.initialAggregation;
407
+ }
408
+ }
409
+ async updateExportConfigAndFetchData() {
410
+ if (this.formGroup.invalid) {
411
+ return;
412
+ }
413
+ this.isPreviewLoading = true;
414
+ this.onDownloadButtonStateChange.emit(false);
415
+ this.dataToExport = await this.datapointsExportSelectorService.fetchAndPrepareDataToExport(this.exportConfig, this.isFullTypeOfExport);
416
+ this.determineShowingPreviewOrEmptyState();
417
+ }
418
+ updateDownloadButtonState() {
419
+ const canEnableDownloadButton = this.hasFetchedDataAnyValuesToExport &&
420
+ !this.formGroup.invalid &&
421
+ this.isAnyOfExportFileTypeChecked &&
422
+ !this.hasNoExportableData;
423
+ this.onDownloadButtonStateChange.emit(canEnableDownloadButton);
424
+ }
425
+ resetFullExportRelatedProperties() {
426
+ this.hasNoExportableData = false;
427
+ this.datapointsExceedingBrowserDownloadLimit = [];
428
+ }
429
+ getInitialSelection(fileType, selectByDefault) {
430
+ const keys = Object.keys(fileType);
431
+ if (keys.length === 0) {
432
+ return {};
433
+ }
434
+ const initialSelection = keys.reduce((acc, key) => {
435
+ acc[key] = false;
436
+ return acc;
437
+ }, {});
438
+ selectByDefault.forEach(index => {
439
+ if (index >= 0 && index < keys.length) {
440
+ initialSelection[keys[index]] = true;
441
+ }
442
+ });
443
+ return initialSelection;
444
+ }
445
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsExportSelectorFileExporterComponent, deps: [{ token: i1.DataProcessingService }, { token: i2.DataFetchingService }, { token: i3.DatapointsExportSelectorFileExporterService }, { token: i4.FormBuilder }, { token: FILE_GENERATORS }], target: i0.ɵɵFactoryTarget.Component }); }
446
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DatapointsExportSelectorFileExporterComponent, isStandalone: true, selector: "c8y-datapoints-export-selector-file-exporter", inputs: { exportConfig: "exportConfig" }, outputs: { onDownloadButtonStateChange: "onDownloadButtonStateChange" }, ngImport: i0, template: "<div class=\"p-b-16\">\n <ng-container *ngIf=\"hasPermissionToReadAnyMeasurements; else hasNoRoleToReadAnyMeasurements\">\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium text-16\">\n {{ 'Configure export' | translate }}\n </p>\n </div>\n <div\n class=\"p-t-24 p-r-16 p-l-16 gap-8 p-b-16 flex-wrap\"\n [ngClass]=\"{ 'separator-bottom': isFullTypeOfExport }\"\n >\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-time-range\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [formGroup]=\"formGroup\"\n (onDateFromChange)=\"onDateFromChange($event)\"\n (onDateToChange)=\"onDateToChange($event)\"\n ></c8y-datapoints-export-selector-time-range>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-data-scope\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [disabledAggregationOptions]=\"disabledAggregationOptions\"\n [formGroup]=\"formGroup\"\n (onAggregationChange)=\"onAggregationChange($event)\"\n (onExportTypeChange)=\"onExportTypeChange($event)\"\n ></c8y-datapoints-export-selector-data-scope>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-file-types\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [dynamicFilesTypeMetadata]=\"dynamicFilesTypeMetadata\"\n [formGroup]=\"formGroup\"\n ></c8y-datapoints-export-selector-file-types>\n </div>\n </div>\n </div>\n <ng-container\n *ngIf=\"!isFullTypeOfExport && !hasFetchedDataAnyValuesToExport && !isPreviewLoading\"\n >\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 separator-bottom d-flex\">\n <div\n class=\"alert alert-warning center-block\"\n role=\"alert\"\n data-cy=\"file-exporter--no-data-available\"\n translate\n >\n No data available.\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"datapointsExceedingBrowserDownloadLimit.length > 0\">\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 separator-bottom d-flex\">\n <div\n [class]=\"\n hasNoExportableData\n ? 'alert alert-warning center-block'\n : 'alert alert-info center-block'\n \"\n role=\"alert\"\n [innerHTML]=\"limitExceededMessage\"\n ></div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isFullTypeOfExport\">\n <c8y-datapoints-export-selector-preview\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [hasFetchedDataAnyValuesToExport]=\"hasFetchedDataAnyValuesToExport\"\n [isPreviewLoading]=\"isPreviewLoading\"\n [previewTableData]=\"previewTableData\"\n ></c8y-datapoints-export-selector-preview>\n </ng-container>\n </ng-container>\n <ng-template #hasNoRoleToReadAnyMeasurements>\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div\n class=\"alert alert-info center-block\"\n role=\"alert\"\n translate\n >\n <p>To export data, you must meet at least one of these criteria:</p>\n <ul>\n <li>\n Have\n <b>READ permission for \"Measurements\" permission type</b>\n (either as a global role or for the specific source)\n </li>\n <li>\n Be the\n <b>owner of the source</b>\n you want to export data from\n </li>\n </ul>\n <p>Don't meet these requirements? Contact your system administrator for assistance.</p>\n </div>\n </div>\n </ng-template>\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.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DataPointsExportSelectorDataScopeComponent, selector: "c8y-datapoints-export-selector-data-scope", inputs: ["disabledAggregationOptions", "formGroup"], outputs: ["onAggregationChange", "onExportTypeChange"] }, { kind: "component", type: DataPointsExportSelectorFileTypesComponent, selector: "c8y-datapoints-export-selector-file-types", inputs: ["dynamicFilesTypeMetadata", "formGroup"] }, { kind: "component", type: DataPointsExportSelectorPreviewComponent, selector: "c8y-datapoints-export-selector-preview", inputs: ["hasFetchedDataAnyValuesToExport", "isPreviewLoading", "previewTableData"] }, { kind: "component", type: DataPointsExportSelectorTimeRangeComponent, selector: "c8y-datapoints-export-selector-time-range", inputs: ["formGroup"], outputs: ["onDateFromChange", "onDateToChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
447
+ }
448
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsExportSelectorFileExporterComponent, decorators: [{
449
+ type: Component,
450
+ args: [{ selector: 'c8y-datapoints-export-selector-file-exporter', standalone: true, imports: [
451
+ CoreModule,
452
+ DataPointsExportSelectorDataScopeComponent,
453
+ DataPointsExportSelectorFileTypesComponent,
454
+ DataPointsExportSelectorPreviewComponent,
455
+ DataPointsExportSelectorTimeRangeComponent,
456
+ KeyValuePipe,
457
+ ReactiveFormsModule
458
+ ], template: "<div class=\"p-b-16\">\n <ng-container *ngIf=\"hasPermissionToReadAnyMeasurements; else hasNoRoleToReadAnyMeasurements\">\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium text-16\">\n {{ 'Configure export' | translate }}\n </p>\n </div>\n <div\n class=\"p-t-24 p-r-16 p-l-16 gap-8 p-b-16 flex-wrap\"\n [ngClass]=\"{ 'separator-bottom': isFullTypeOfExport }\"\n >\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-time-range\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [formGroup]=\"formGroup\"\n (onDateFromChange)=\"onDateFromChange($event)\"\n (onDateToChange)=\"onDateToChange($event)\"\n ></c8y-datapoints-export-selector-time-range>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-data-scope\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [disabledAggregationOptions]=\"disabledAggregationOptions\"\n [formGroup]=\"formGroup\"\n (onAggregationChange)=\"onAggregationChange($event)\"\n (onExportTypeChange)=\"onExportTypeChange($event)\"\n ></c8y-datapoints-export-selector-data-scope>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-file-types\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [dynamicFilesTypeMetadata]=\"dynamicFilesTypeMetadata\"\n [formGroup]=\"formGroup\"\n ></c8y-datapoints-export-selector-file-types>\n </div>\n </div>\n </div>\n <ng-container\n *ngIf=\"!isFullTypeOfExport && !hasFetchedDataAnyValuesToExport && !isPreviewLoading\"\n >\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 separator-bottom d-flex\">\n <div\n class=\"alert alert-warning center-block\"\n role=\"alert\"\n data-cy=\"file-exporter--no-data-available\"\n translate\n >\n No data available.\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"datapointsExceedingBrowserDownloadLimit.length > 0\">\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 separator-bottom d-flex\">\n <div\n [class]=\"\n hasNoExportableData\n ? 'alert alert-warning center-block'\n : 'alert alert-info center-block'\n \"\n role=\"alert\"\n [innerHTML]=\"limitExceededMessage\"\n ></div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isFullTypeOfExport\">\n <c8y-datapoints-export-selector-preview\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [hasFetchedDataAnyValuesToExport]=\"hasFetchedDataAnyValuesToExport\"\n [isPreviewLoading]=\"isPreviewLoading\"\n [previewTableData]=\"previewTableData\"\n ></c8y-datapoints-export-selector-preview>\n </ng-container>\n </ng-container>\n <ng-template #hasNoRoleToReadAnyMeasurements>\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div\n class=\"alert alert-info center-block\"\n role=\"alert\"\n translate\n >\n <p>To export data, you must meet at least one of these criteria:</p>\n <ul>\n <li>\n Have\n <b>READ permission for \"Measurements\" permission type</b>\n (either as a global role or for the specific source)\n </li>\n <li>\n Be the\n <b>owner of the source</b>\n you want to export data from\n </li>\n </ul>\n <p>Don't meet these requirements? Contact your system administrator for assistance.</p>\n </div>\n </div>\n </ng-template>\n</div>\n" }]
459
+ }], ctorParameters: () => [{ type: i1.DataProcessingService }, { type: i2.DataFetchingService }, { type: i3.DatapointsExportSelectorFileExporterService }, { type: i4.FormBuilder }, { type: undefined, decorators: [{
460
+ type: Inject,
461
+ args: [FILE_GENERATORS]
462
+ }] }], propDecorators: { exportConfig: [{
463
+ type: Input
464
+ }], onDownloadButtonStateChange: [{
465
+ type: Output
466
+ }] } });
467
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1tb2RhbC9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLWV4cG9ydGVyL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWZpbGUtZXhwb3J0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3IvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItbW9kYWwvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLWV4cG9ydGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sY0FBYyxFQUNkLEtBQUssRUFHTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUVMLFdBQVcsRUFDWCxXQUFXLEVBQ1gsbUJBQW1CLEVBR3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLGtCQUFrQixFQUdsQixVQUFVLEVBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLE1BQU0sTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBTUwsa0JBQWtCLEVB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Q29udGVudCI6WyJpbXBvcnQgeyBLZXlWYWx1ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQnVpbGRlcixcbiAgRm9ybUNvbnRyb2wsXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvckZuXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEFHR1JFR0FUSU9OX1ZBTFVFUyxcbiAgQWdncmVnYXRpb25PcHRpb24sXG4gIEFnZ3JlZ2F0aW9uT3B0aW9uU3RhdHVzLFxuICBDb3JlTW9kdWxlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHNhdmVBcyBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgbWVyZ2UsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRGF0YXBvaW50Q291bnRzLFxuICBEYXRhcG9pbnREZXRhaWxzLFxuICBEYXRhcG9pbnRzRXhjZWVkaW5nTGltaXQsXG4gIERhdGFUb0V4cG9ydCxcbiAgRGF0YVRvRXhwb3J0V2l0aEJhY2tlbmRDcmVhdGVkRmlsZSxcbiAgRVhQT1JUX01PREVfVkFMVUVTLFxuICBFeHBvcnRDb25maWcsXG4gIEV4cG9ydERhdGEsXG4gIEZpbGVFeHBvcnRDb25maWcsXG4gIEZpbGVHZW5lcmF0b3IsXG4gIEZpbGVUeXBlTWV0YWRhdGEsXG4gIE1lcmdlZEV4cG9ydERldGFpbHMsXG4gIFNFUklFU19EQVRBX01FUkdFRF9GSUxFX05BTUVcbn0gZnJvbSAnLi4vLi4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3IubW9kZWwnO1xuaW1wb3J0IHsgRGF0YUZldGNoaW5nU2VydmljZSB9IGZyb20gJy4vZGF0YS1mZXRjaGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGFQcm9jZXNzaW5nU2VydmljZSB9IGZyb20gJy4vZGF0YS1wcm9jZXNzaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yRmlsZUV4cG9ydGVyU2VydmljZSB9IGZyb20gJy4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGFQb2ludHNFeHBvcnRTZWxlY3RvclByZXZpZXdDb21wb25lbnQgfSBmcm9tICcuL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLXByZXZpZXcvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItcHJldmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yRGF0YVNjb3BlQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItZGF0YS1zY29wZS9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItZGF0YS1zY29wZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yRmlsZVR5cGVzQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItZmlsZS10eXBlcy9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItZmlsZS10eXBlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yVGltZVJhbmdlQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItdGltZS1yYW5nZS9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItdGltZS1yYW5nZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ1NWR2VuZXJhdG9yQWRhcHRlciB9IGZyb20gJy4vZ2VuZXJhdG9ycy9jc3YtZ2VuZXJhdG9yJztcbmltcG9ydCB7IEV4Y2VsR2VuZXJhdG9yQWRhcHRlciB9IGZyb20gJy4vZ2VuZXJhdG9ycy9leGNlbC1nZW5lcmF0b3InO1xuXG5leHBvcnQgY29uc3QgRklMRV9HRU5FUkFUT1JTID0gbmV3IEluamVjdGlvblRva2VuPEZpbGVHZW5lcmF0b3JbXT4oJ0ZJTEVfR0VORVJBVE9SUycsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBbRXhjZWxHZW5lcmF0b3JBZGFwdGVyLCBDU1ZHZW5lcmF0b3JBZGFwdGVyXVxufSk7XG5cbmV4cG9ydCBjb25zdCBkYXRlUmFuZ2VWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKFxuICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcbik6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgY29uc3QgZGF0ZUZyb20gPSBjb250cm9sLmdldCgnZGF0ZUZyb20nKTtcbiAgY29uc3QgZGF0ZVRvID0gY29udHJvbC5nZXQoJ2RhdGVUbycpO1xuXG4gIGlmICghZGF0ZUZyb20gfHwgIWRhdGVUbykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGF0ZUZyb21WYWx1ZSA9IGRhdGVGcm9tLnZhbHVlO1xuICBjb25zdCBkYXRlVG9WYWx1ZSA9IGRhdGVUby52YWx1ZTtcbiAgaWYgKGRhdGVGcm9tVmFsdWUgJiYgZGF0ZVRvVmFsdWUpIHtcbiAgICBpZiAobmV3IERhdGUoZGF0ZUZyb21WYWx1ZSkgPiBuZXcgRGF0ZShkYXRlVG9WYWx1ZSkpIHtcbiAgICAgIGRhdGVGcm9tLnNldEVycm9ycyh7IGRhdGVBZnRlclJhbmdlTWF4OiB0cnVlIH0pO1xuICAgICAgZGF0ZVRvLnNldEVycm9ycyh7IGRhdGVCZWZvcmVSYW5nZU1pbjogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0ZUZyb20uc2V0RXJyb3JzKG51bGwpO1xuICAgICAgZGF0ZVRvLnNldEVycm9ycyhudWxsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLWV4cG9ydGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvcmVNb2R1bGUsXG4gICAgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yRGF0YVNjb3BlQ29tcG9uZW50LFxuICAgIERhdGFQb2ludHNFeHBvcnRTZWxlY3RvckZpbGVUeXBlc0NvbXBvbmVudCxcbiAgICBEYXRhUG9pbnRzRXhwb3J0U2VsZWN0b3JQcmV2aWV3Q29tcG9uZW50LFxuICAgIERhdGFQb2ludHNFeHBvcnRTZWxlY3RvclRpbWVSYW5nZUNvbXBvbmVudCxcbiAgICBLZXlWYWx1ZVBpcGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIERhdGFwb2ludHNFeHBvcnRTZWxlY3RvckZpbGVFeHBvcnRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgZXhwb3J0Q29uZmlnOiBFeHBvcnRDb25maWc7XG4gIEBPdXRwdXQoKSBvbkRvd25sb2FkQnV0dG9uU3RhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhZ2dyZWdhdGlvbiBzZWxlY3RvciBvcHRpb25zIHRoYXQgYXJlIGRpc2FibGVkLlxuICAgKiBUaGlzIHN0YXRlIGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgZGF0ZSByYW5nZS5cbiAgICovXG4gIGRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zOiBBZ2dyZWdhdGlvbk9wdGlvblN0YXR1cyA9IHt9O1xuXG4gIGZvcm1Hcm91cDogUmV0dXJuVHlwZTxEYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJDb21wb25lbnRbJ2NyZWF0ZUZvcm0nXT47XG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGFsbCBkYXRhcG9pbnRzIHRoYXQgbnVtYmVyIG9mIHJlY29yZHMgZXhjZWVkcyBhIHRocmVzaG9sZCwgd2hlcmUgZGF0YSBmb3IgdGhlc2UgZGF0YXBvaW50cyB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgYmFja2VuZC5cbiAgICogQXBwbGllcyBvbmx5IHRvIG1lYXN1cmVtZW50IEFQSSB3aGljaCBjYW4gcmV0dXJuIHByb2Nlc3NlZCBDU1YsIEV4Y2VsIG9yIFhNTCBkYXRhLlxuICAgKi9cbiAgZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0OiBEYXRhcG9pbnRzRXhjZWVkaW5nTGltaXRbXSA9IFtdO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW55IG9mIERhdGFUb0V4cG9ydCBvYmplY3RzIHRpbWVWYWx1ZU1hcCBwcm9wZXJ0eSBpcyBub3QgdW5kZWZpbmVkIChzZXJpZXMgZGF0YSlcbiAgICogb3IgZGF0YVBvaW50VG9FeHBvcnQgaXMgbm90IHVuZGVmaW5lZCBhdCBhbGwgKG1lYXN1cmVtZW50IGRhdGEpLlxuICAgKi9cblxuICBoYXNGZXRjaGVkRGF0YUFueVZhbHVlc1RvRXhwb3J0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGVyZSBpcyBubyBleHBvcnRhYmxlIGRhdGEgYmVjYXVzZSB0aGUgZGF0ZSByYW5nZSBvZiBhbGwgc2VsZWN0ZWQgZGF0YXBvaW50cyBleGNlZWRzIDEsMDAwLDAwMCByZWNvcmRzLlxuICAgKi9cbiAgaGFzTm9FeHBvcnRhYmxlRGF0YTogYm9vbGVhbjtcblxuICBoYXNQZXJtaXNzaW9uVG9SZWFkQW55TWVhc3VyZW1lbnRzID0gZmFsc2U7XG5cbiAgaXNQcmV2aWV3TG9hZGluZyA9IHRydWU7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZnVsbCBvciBjb21wYWN0IHR5cGUgb2YgZXhwb3J0IGlzIHNlbGVjdGVkLlxuICAgKiBGdWxsIHR5cGUgb2YgZXhwb3J0IGlzIGJhc2VkIG9uIG1lYXN1cmVtZW50IEFQSSBkYXRhLlxuICAgKiBDb21wYWN0IHR5cGUgb2YgZXhwb3J0IGlzIGJhc2VkIG9uIHNlcmllcyBBUEkgZGF0YS5cbiAgICovXG4gIGlzRnVsbFR5cGVPZkV4cG9ydCA9IGZhbHNlO1xuXG4gIHByZXZpZXdUYWJsZURhdGE6IEV4cG9ydERhdGFbXTtcblxuICBsaW1pdEV4Y2VlZGVkTWVzc2FnZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb250YWlucyBwcm9jZXNzZWQgZGF0YSB0aGF0IGlzIHByZXBhcmVkIHRvIGJlIGV4cG9ydGVkIGlmIHNlcmllcyBkYXRhIHdhcyBmZXRjaGVkXG4gICAqIG9yIHNob3duIGluIHRoZSBwcmV2aWV3IHRhYmxlIGluIGNhc2Ugb2YgbWVhc3VyZW1lbnRzIGRhdGEuXG4gICAqL1xuICBwcml2YXRlIGRhdGFUb0V4cG9ydDogRGF0YVRvRXhwb3J0W107XG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgZGF0YXBvaW50cyB0aGF0IHNlbGVjdGVkIGRhdGUgcmFuZ2UgZXhjZWVkcyBBUEkgbGltaXQgb2YgMV8wMDBfMDAwIHJlY29yZHMuXG4gICAqL1xuICBwcml2YXRlIGRhdGFQb2ludHNFeGNlZWRpbmdPbmVNaWxsaW9uTGltaXQ6IERhdGFwb2ludHNFeGNlZWRpbmdMaW1pdFtdO1xuICAvKipcbiAgICogUmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgZmlsZSB0eXBlIHNlbGVjdGlvbiBjaGVja2JveGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWxlVHlwZVNlbGVjdGlvblN0YXRlOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgLyoqXG4gICAqIEhvbGQgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGFnZ3JlZ2F0aW9uIGZyb20gdGhlIGV4cG9ydCBjb25maWcuXG4gICAqIFZhbHVlIHdpbGwgYmUgbG9hZGVkIG9uIGNvbXBvbmVudCBkZXN0cm95LlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsQWdncmVnYXRpb246IEFnZ3JlZ2F0aW9uT3B0aW9uO1xuICAvKipcbiAgICogSG9sZCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgZGF0ZUZyb20gZnJvbSB0aGUgZXhwb3J0IGNvbmZpZy5cbiAgICogVmFsdWUgd2lsbCBiZSBsb2FkZWQgb24gY29tcG9uZW50IGRlc3Ryb3kuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxEYXRlRnJvbTogc3RyaW5nO1xuICAvKipcbiAgICogSG9sZCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgZGF0ZVRvIGZyb20gdGhlIGV4cG9ydCBjb25maWcuXG4gICAqIFZhbHVlIHdpbGwgYmUgbG9hZGVkIG9uIGNvbXBvbmVudCBkZXN0cm95LlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsRGF0ZVRvOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIb2xkIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBkYXRhcG9pbnREZXRhaWxzIGZyb20gdGhlIGV4cG9ydCBjb25maWcuXG4gICAqIFNvbWUgbG9naWMgbWF5IGZpbHRlciBvdXQgZGF0YXBvaW50cyBpbiBkYXRhcG9pbnREZXRhaWxzIGFycmF5LCB0aGF0IGV4Y2VlZHMgMV8wMDBfMDAwIGxpbWl0IGZvciBtZWFzdXJlbWVudHMgQVBJLFxuICAgKiBidXQgZnVsbCBsaXN0IGlzIHN0aWxsIG5lZWRlZCB3aGVuIGNvbXBvbmVudCBpcyByZW9wZW5lZC5cbiAgICogVmFsdWUgd2lsbCBiZSBsb2FkZWQgb24gY29tcG9uZW50IGRlc3Ryb3kuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxEYXRhcG9pbnREZXRhaWxzOiBEYXRhcG9pbnREZXRhaWxzW107XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWdncmVnYXRpb24gdmFsdWUgd2FzIGNoYW5nZWQgcHJvZ3JhbW1hdGljYWxseS5cbiAgICogSXQgcHJldmVudHMgYSBjYXNlIHdoZXJlIGZldGNoaW5nIG1heSBiZSB0cmlnZ2VyZWQgdHdpY2Ugd2hlbiBleHBvcnQgdHlwZSBpcyBjaGFuZ2VkLlxuICAgKiBCb3RoIG9wdGlvbnMgYWxvbmUgY2FuIHRyaWdnZXIgZmV0Y2hpbmcgZGF0YS5cbiAgICovXG4gIHByaXZhdGUgaXNBZ2dyZWdhdGlvbkNoYW5nZWRQcm9ncmFtbWF0aWNhbGx5ID0gZmFsc2U7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhbnkgb2YgdGhlIGV4cG9ydCBmaWxlIHR5cGVzIChDU1YsIEV4Y2VsKSBhcmUgY2hlY2tlZC5cbiAgICovXG4gIHByaXZhdGUgaXNBbnlPZkV4cG9ydEZpbGVUeXBlQ2hlY2tlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZGF0ZUZyb21TdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBwcml2YXRlIGRhdGVUb1N1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGR5bmFtaWNGaWxlc1R5cGVNZXRhZGF0YTogeyBba2V5OiBzdHJpbmddOiBGaWxlVHlwZU1ldGFkYXRhIH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRhdGFwb2ludHNFeHBvcnRNb2RhbFNlcnZpY2U6IERhdGFQcm9jZXNzaW5nU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGFwb2ludHNFeHBvcnRTZWxlY3RvclNlcnZpY2U6IERhdGFGZXRjaGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJTZXJ2aWNlOiBEYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIEBJbmplY3QoRklMRV9HRU5FUkFUT1JTKSBwcml2YXRlIGdlbmVyYXRvcnM6IEZpbGVHZW5lcmF0b3JbXVxuICApIHtcbiAgICB0aGlzLnNldEZpbGVzVHlwZSh0aGlzLmdlbmVyYXRvcnMpO1xuXG4gICAgdGhpcy5kYXRlRnJvbVN1YmplY3RcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgzMDApLCB0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKHVwZGF0ZWREYXRlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVEYXRlQW5kRmV0Y2hEYXRhKCdkYXRlRnJvbScsIHVwZGF0ZWREYXRlKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5kYXRlVG9TdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMzAwKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jICh1cGRhdGVkRGF0ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlRGF0ZUFuZEZldGNoRGF0YSgnZGF0ZVRvJywgdXBkYXRlZERhdGUpO1xuICAgICAgfSk7XG4gIH1cblxuICBzZXRGaWxlc1R5cGUoZ2VuZXJhdG9yczogRmlsZUdlbmVyYXRvcltdKSB7XG4gICAgZ2VuZXJhdG9ycy5mb3JFYWNoKGcgPT4ge1xuICAgICAgdGhpcy5keW5hbWljRmlsZXNUeXBlTWV0YWRhdGFbZy5nZXRUeXBlKCldID0ge1xuICAgICAgICBsYWJlbDogZy5nZXRMYWJlbCgpLFxuICAgICAgICBpY29uOiBnLmdldEljb24oKSxcbiAgICAgICAgdGl0bGU6IGcuZ2V0VGl0bGUoKSxcbiAgICAgICAgZXh0ZW5zaW9uOiBnLmdldEZpbGVFeHRlbnNpb24oKSxcbiAgICAgICAgemlwTmFtZTogZy5nZXRaaXBOYW1lKCksXG4gICAgICAgIHR5cGU6IGcuZ2V0VHlwZSgpXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc291cmNlc1Blcm1pdHRlZFRvUmVhZDogc3RyaW5nW10gPVxuICAgICAgYXdhaXQgdGhpcy5kYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JTZXJ2aWNlLmdldFNvdXJjZXNXaXRoUGVybWlzc2lvbnNUb1JlYWQoXG4gICAgICAgIHRoaXMuZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHNcbiAgICAgICk7XG5cbiAgICBpZiAoc291cmNlc1Blcm1pdHRlZFRvUmVhZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlc1Blcm1pdHRlZFRvUmVhZC5sZW5ndGggIT09IHRoaXMuZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzID0gdGhpcy5leHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscy5maWx0ZXIoZGF0YVBvaW50ID0+XG4gICAgICAgIHNvdXJjZXNQZXJtaXR0ZWRUb1JlYWQuaW5jbHVkZXMoU3RyaW5nKGRhdGFQb2ludC5zb3VyY2UpKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmhhc1Blcm1pc3Npb25Ub1JlYWRBbnlNZWFzdXJlbWVudHMgPSB0cnVlO1xuXG4gICAgdGhpcy5zdG9yZUluaXRpYWxDaGFuZ2VhYmxlQ29uZmlnKCk7XG5cbiAgICB0aGlzLmZpbGVUeXBlU2VsZWN0aW9uU3RhdGUgPSB0aGlzLmdldEluaXRpYWxTZWxlY3Rpb24odGhpcy5keW5hbWljRmlsZXNUeXBlTWV0YWRhdGEsIFswXSk7XG5cbiAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuY3JlYXRlRm9ybSgpO1xuICAgIHRoaXMuZGF0YVRvRXhwb3J0ID0gYXdhaXQgdGhpcy5kYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JTZXJ2aWNlLmZldGNoQW5kUHJlcGFyZURhdGFUb0V4cG9ydChcbiAgICAgIHRoaXMuZXhwb3J0Q29uZmlnLFxuICAgICAgdGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnRcbiAgICApO1xuXG4gICAgdGhpcy5oYW5kbGVEYXRlU2VsZWN0b3JDaGFuZ2VzKCk7XG4gICAgdGhpcy5kZXRlcm1pbmVTaG93aW5nUHJldmlld09yRW1wdHlTdGF0ZSgpO1xuICAgIHRoaXMuaGFuZGxlRXhwb3J0TW9kZUNoYW5nZXMoKTtcbiAgICB0aGlzLmhhbmRsZUZpbGVUeXBlU2VsZWN0aW9uQ2hhbmdlcygpO1xuICAgIHRoaXMuaGFuZGxlRm9ybVZhbGlkYXRpb25DaGFuZ2VzKCk7XG5cbiAgICB0aGlzLnVwZGF0ZUZpbGVUeXBlQ29udHJvbCgpO1xuXG4gICAgdGhpcy51cGRhdGVEaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9uc1N0YXRlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5sb2FkSW5pdGlhbENoYW5nZWFibGVDb25maWcoKTtcbiAgfVxuXG4gIGFzeW5jIGV4cG9ydEFuZERvd25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpbGVFeHBvcnRzOiBGaWxlRXhwb3J0Q29uZmlnW10gPSBPYmplY3QuZW50cmllcyh0aGlzLmR5bmFtaWNGaWxlc1R5cGVNZXRhZGF0YSkubWFwKFxuICAgICAgKFtfLCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGZpbGVUeXBlOiB2YWx1ZS50eXBlIGFzIHN0cmluZyxcbiAgICAgICAgemlwTmFtZTogdmFsdWUuemlwTmFtZVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRGaWxlRXhwb3J0cyA9IHRoaXMuZ2V0T25seVNlbGVjdGVkRmlsZUV4cG9ydHMoZmlsZUV4cG9ydHMpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzZWxlY3RlZEZpbGVFeHBvcnRzLm1hcChhc3luYyAoeyBmaWxlVHlwZSwgemlwTmFtZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCB0aGlzLmV4cG9ydEZpbGUoZmlsZVR5cGUpO1xuICAgICAgICBhd2FpdCB0aGlzLmRvd25sb2FkRmlsZShibG9iLCBmaWxlVHlwZSwgemlwTmFtZSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvckZpbGVFeHBvcnRlclNlcnZpY2UuY2xlYW51cENhY2hlZERhdGEoKTtcbiAgfVxuXG4gIGdldE9ubHlTZWxlY3RlZEZpbGVFeHBvcnRzKGZpbGVFeHBvcnRzOiBGaWxlRXhwb3J0Q29uZmlnW10pOiBGaWxlRXhwb3J0Q29uZmlnW10ge1xuICAgIHJldHVybiBmaWxlRXhwb3J0cy5maWx0ZXIoZiA9PiB0aGlzLmZpbGVUeXBlU2VsZWN0aW9uU3RhdGVbZi5maWxlVHlwZV0gPT09IHRydWUpO1xuICB9XG5cbiAgYXN5bmMgZXhwb3J0RmlsZShmaWxlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxCbG9iIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmlzRnVsbFR5cGVPZkV4cG9ydFxuICAgICAgPyBhd2FpdCB0aGlzLmV4cG9ydE1lYXN1cmVtZW50RmlsZShmaWxlVHlwZSlcbiAgICAgIDogYXdhaXQgdGhpcy5leHBvcnRTZXJpZXNGaWxlKGZpbGVUeXBlKTtcbiAgfVxuXG4gIGFzeW5jIGRvd25sb2FkRmlsZShcbiAgICBibG9iOiBCbG9iIHwgbnVsbCxcbiAgICBmaWxlVHlwZTogc3RyaW5nLFxuICAgIG1lYXN1cmVtZW50c1ppcEZpbGVOYW1lOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQgPVxuICAgICAgdGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQuZmlsdGVyKFxuICAgICAgICBkYXRhcG9pbnQgPT4gIXRoaXMuZGF0YVBvaW50c0V4Y2VlZGluZ09uZU1pbGxpb25MaW1pdC5pbmNsdWRlcyhkYXRhcG9pbnQpXG4gICAgICApO1xuXG4gICAgY29uc3Qgc2hvdWxkU2hvd0FsZXJ0ID0gdGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQubGVuZ3RoID4gMDtcblxuICAgIC8vIEhhbmRsZXMgYSBjYXNlIHdoZXJlIGFsbCBmaWxlcyBhcmUgc2VudCBieSBlbWFpbC5cbiAgICBpZiAoIWJsb2IgJiYgc2hvdWxkU2hvd0FsZXJ0KSB7XG4gICAgICB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvclNlcnZpY2Uuc2hvd1NlbmRWaWFFbWFpbEluZm9BbGVydChcbiAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgIHRoaXMuZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChibG9iKSB7XG4gICAgICAvLyBIYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHNvbWUgb2YgdGhlIGZpbGVzIGFyZSBzZW50IGJ5IGVtYWlsLlxuICAgICAgaWYgKHNob3VsZFNob3dBbGVydCkge1xuICAgICAgICB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvclNlcnZpY2Uuc2hvd1NlbmRWaWFFbWFpbEluZm9BbGVydChcbiAgICAgICAgICBmaWxlVHlwZSxcbiAgICAgICAgICB0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzRnVsbFR5cGVPZkV4cG9ydFxuICAgICAgICA/IHNhdmVBcyhibG9iLCBtZWFzdXJlbWVudHNaaXBGaWxlTmFtZSlcbiAgICAgICAgOiBzYXZlQXMoYmxvYiwgYmxvYltTRVJJRVNfREFUQV9NRVJHRURfRklMRV9OQU1FXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgYSBtZWFzdXJlbWVudCBmaWxlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICpcbiAgICogTWVhc3VyZW1lbnRzIEFQSSBkb2VzIHByb3ZpZGUgYSB3YXkgdG8gZmV0Y2ggYSBwcmVwcm9jZXNzZWQgQ1NWL0V4Y2VsIGZpbGUuXG4gICAqXG4gICAqIEF0IHRoaXMgcG9pbnQgYSBiYWNrZWQgZmlsZSBuZWVkcyB0byBiZSBmZXRjaGVkLlxuICAgKiBNZWFzdXJlbWVudCBkYXRhIHVzZWQgZm9yIGEgcHJldmlldyBjb250YWlucyBqdXN0IDUgZmlyc3QgcmVjb3Jkc1xuICAgKiBhbmQgaXQncyBub3QgZmV0Y2hlZCB3aXRoIENTVi9FeGNlbCBoZWFkZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZVR5cGUgLSBUaGUgdHlwZSBvZiBmaWxlIHRvIGV4cG9ydC5cbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBCbG9iIHJlcHJlc2VudGluZyB0aGUgZXhwb3J0ZWQgZmlsZSBvciBudWxsIHdoZW4gbm8gZGF0YSB0byBleHBvcnQgb3IgaXQncyBzZW50IHZpYSBlbWFpbC5cbiAgICovXG4gIGFzeW5jIGV4cG9ydE1lYXN1cmVtZW50RmlsZShmaWxlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxCbG9iPiB8IG51bGwge1xuICAgIGNvbnN0IHsgYWNjZXB0VHlwZSwgZXh0ZW5zaW9uIH0gPSB0aGlzLmRhdGFwb2ludHNFeHBvcnRNb2RhbFNlcnZpY2UuZmlsZVR5cGVzQ29uZmlnc1tmaWxlVHlwZV07XG5cbiAgICBjb25zdCB1cGRhdGVkRXhwb3J0Q29uZmlnOiBFeHBvcnRDb25maWcgPSB0aGlzLmV4Y2x1ZGVEYXRhcG9pbnRzVGhhdEV4Y2VlZHNBcGlMaW1pdChcbiAgICAgIHRoaXMuZXhwb3J0Q29uZmlnXG4gICAgKTtcblxuICAgIGNvbnN0IGRhdGFUb0V4cG9ydDogRGF0YVRvRXhwb3J0V2l0aEJhY2tlbmRDcmVhdGVkRmlsZVtdID1cbiAgICAgIGF3YWl0IHRoaXMuZGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yU2VydmljZS5mZXRjaE1lYXN1cmVtZW50RGF0YUZpbGVzQW5kUGFpcldpdGhTb3VyY2VEZXRhaWxzKFxuICAgICAgICBhY2NlcHRUeXBlLFxuICAgICAgICB1cGRhdGVkRXhwb3J0Q29uZmlnXG4gICAgICApO1xuXG4gICAgY29uc3QgaXNBbGxVbmRlZmluZWQgPSBkYXRhVG9FeHBvcnQuZXZlcnkoZGF0YSA9PiBkYXRhID09PSB1bmRlZmluZWQpO1xuICAgIGlmIChpc0FsbFVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yRmlsZUV4cG9ydGVyU2VydmljZS5nZXRNZWFzdXJlbWVudEV4cG9ydGVkRGF0YUJsb2IoXG4gICAgICBleHRlbnNpb24sXG4gICAgICBkYXRhVG9FeHBvcnRcbiAgICApO1xuICB9XG5cbiAgZXhjbHVkZURhdGFwb2ludHNUaGF0RXhjZWVkc0FwaUxpbWl0KGV4cG9ydENvbmZpZzogRXhwb3J0Q29uZmlnKTogRXhwb3J0Q29uZmlnIHtcbiAgICBjb25zdCBza2lwcGVkRGF0YXBvaW50c1NvdXJjZTogc3RyaW5nW10gPSB0aGlzLmRhdGFQb2ludHNFeGNlZWRpbmdPbmVNaWxsaW9uTGltaXQubWFwKFxuICAgICAgZGF0YXBvaW50ID0+IGRhdGFwb2ludC5kYXRhcG9pbnREZXRhaWwuc291cmNlLnRvU3RyaW5nKClcbiAgICApO1xuXG4gICAgY29uc3QgZmlsdGVyZWREYXRhcG9pbnRzOiBEYXRhcG9pbnREZXRhaWxzW10gPSBleHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscy5maWx0ZXIoXG4gICAgICBkYXRhcG9pbnQgPT4gIXNraXBwZWREYXRhcG9pbnRzU291cmNlLmluY2x1ZGVzKFN0cmluZyhkYXRhcG9pbnQuc291cmNlKSlcbiAgICApO1xuXG4gICAgZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMgPSBmaWx0ZXJlZERhdGFwb2ludHM7XG4gICAgcmV0dXJuIGV4cG9ydENvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBzZXJpZXMgZGF0YSB0byBhIGZpbGUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgKlxuICAgKiBTZXJpZXMgQVBJIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gZmV0Y2ggYSBwcmVwcm9jZXNzZWQgQ1NWL0V4Y2VsIGZpbGUuXG4gICAqXG4gICAqIFNlcmllcyBkYXRhIHVzZWQgZm9yIGV4cG9ydGluZyBhIGZpbGUgaXMgYWxyZWFkeSBmZXRjaGVkIGZvciBhIHByZXZpZXdcbiAgICogYW5kIGNhbiBiZSByZXVzZWQgZm9yIGV4cG9ydGluZy5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVUeXBlIC0gVGhlIHR5cGUgb2YgZmlsZSB0byBleHBvcnQgKGUuZy4sIENTViwgRXhjZWwpLlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIEJsb2IgcmVwcmVzZW50aW5nIHRoZSBleHBvcnRlZCBmaWxlLlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0U2VyaWVzRmlsZShmaWxlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgY29uc3QgbWVyZ2VkRXhwb3J0RGV0YWlsczogTWVyZ2VkRXhwb3J0RGV0YWlscyA9IHtcbiAgICAgIGFnZ3JlZ2F0aW9uOiB0aGlzLmV4cG9ydENvbmZpZy5hZ2dyZWdhdGlvbixcbiAgICAgIGRhdGVGcm9tOiB0aGlzLmV4cG9ydENvbmZpZy5kYXRlRnJvbSxcbiAgICAgIGRhdGVUbzogdGhpcy5leHBvcnRDb25maWcuZGF0ZVRvXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvckZpbGVFeHBvcnRlclNlcnZpY2UuZ2V0U2VyaWVzRXhwb3J0ZWREYXRhQmxvYihcbiAgICAgIGZpbGVUeXBlLFxuICAgICAgdGhpcy5kYXRhVG9FeHBvcnQsXG4gICAgICBtZXJnZWRFeHBvcnREZXRhaWxzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIG9uQWdncmVnYXRpb25DaGFuZ2UoYWdncmVnYXRpb246IEFnZ3JlZ2F0aW9uT3B0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5leHBvcnRDb25maWcuYWdncmVnYXRpb24gPSBhZ2dyZWdhdGlvbjtcbiAgICBpZiAoIXRoaXMuaXNBZ2dyZWdhdGlvbkNoYW5nZWRQcm9ncmFtbWF0aWNhbGx5KSB7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZUV4cG9ydENvbmZpZ0FuZEZldGNoRGF0YSgpO1xuICAgICAgdGhpcy51cGRhdGVEb3dubG9hZEJ1dHRvblN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgb25EYXRlRnJvbUNoYW5nZSh1cGRhdGVkRGF0ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlRnJvbVN1YmplY3QubmV4dCh1cGRhdGVkRGF0ZSk7XG4gIH1cblxuICBvbkRhdGVUb0NoYW5nZSh1cGRhdGVkRGF0ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlVG9TdWJqZWN0Lm5leHQodXBkYXRlZERhdGUpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRGF0ZUFuZEZldGNoRGF0YShcbiAgICBkYXRlVHlwZTogJ2RhdGVGcm9tJyB8ICdkYXRlVG8nLFxuICAgIHVwZGF0ZWREYXRlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5leHBvcnRDb25maWdbZGF0ZVR5cGVdID0gdXBkYXRlZERhdGU7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVFeHBvcnRDb25maWdBbmRGZXRjaERhdGEoKTtcblxuICAgIGlmICh0aGlzLmlzRnVsbFR5cGVPZkV4cG9ydCkge1xuICAgICAgYXdhaXQgdGhpcy5kZXRlcm1pbmVJZk1lYXN1cmVtZW50UmVzcG9uc2VXaWxsQmVQcm9jZXNzZWRCeUJhY2tlbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVEb3dubG9hZEJ1dHRvblN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25FeHBvcnRUeXBlQ2hhbmdlKGV4cG9ydFR5cGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChleHBvcnRUeXBlID09PSBFWFBPUlRfTU9ERV9WQUxVRVMuZnVsbCkge1xuICAgICAgdGhpcy5pc0FnZ3JlZ2F0aW9uQ2hhbmdlZFByb2dyYW1tYXRpY2FsbHkgPSB0cnVlO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuYWdncmVnYXRpb24uc2V0VmFsdWUoQUdHUkVHQVRJT05fVkFMVUVTLm5vbmUpO1xuICAgICAgdGhpcy5pc0FnZ3JlZ2F0aW9uQ2hhbmdlZFByb2dyYW1tYXRpY2FsbHkgPSBmYWxzZTtcblxuICAgICAgdGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnQgPSB0cnVlO1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVFeHBvcnRDb25maWdBbmRGZXRjaERhdGEoKTtcbiAgICAgIGF3YWl0IHRoaXMuZGV0ZXJtaW5lSWZNZWFzdXJlbWVudFJlc3BvbnNlV2lsbEJlUHJvY2Vzc2VkQnlCYWNrZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldEZ1bGxFeHBvcnRSZWxhdGVkUHJvcGVydGllcygpO1xuICAgIHRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0ID0gZmFsc2U7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVFeHBvcnRDb25maWdBbmRGZXRjaERhdGEoKTtcblxuICAgIHRoaXMudXBkYXRlRGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnNTdGF0ZSgpO1xuXG4gICAgdGhpcy51cGRhdGVEb3dubG9hZEJ1dHRvblN0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURpc2FibGVkQWdncmVnYXRpb25PcHRpb25zU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucyA9XG4gICAgICB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvckZpbGVFeHBvcnRlclNlcnZpY2UudXBkYXRlRGlzYWJsZWRTdGF0ZU9mQWdncmVnYXRpb25PcHRpb25FbnRyaWVzKFxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlRnJvbS52YWx1ZSxcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZVRvLnZhbHVlLFxuICAgICAgICB0aGlzLmRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKFxuICAgICAge1xuICAgICAgICBkYXRlRnJvbTogbmV3IEZvcm1Db250cm9sKHRoaXMuZXhwb3J0Q29uZmlnLmRhdGVGcm9tKSxcbiAgICAgICAgZGF0ZVRvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5leHBvcnRDb25maWcuZGF0ZVRvKSxcbiAgICAgICAgYWdncmVnYXRpb246IG5ldyBGb3JtQ29udHJvbChcbiAgICAgICAgICB0aGlzLmV4cG9ydENvbmZpZy5hZ2dyZWdhdGlvbiA/IHRoaXMuZXhwb3J0Q29uZmlnLmFnZ3JlZ2F0aW9uIDogQUdHUkVHQVRJT05fVkFMVUVTLm5vbmVcbiAgICAgICAgKSxcbiAgICAgICAgZXhwb3J0TW9kZTogbmV3IEZvcm1Db250cm9sKEVYUE9SVF9NT0RFX1ZBTFVFUy5jb21wYWN0KSxcbiAgICAgICAgZmlsZVR5cGVzOiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKFxuICAgICAgICAgIHRoaXMuZ2VuZXJhdG9ycy5yZWR1Y2UoKGEsIGMpID0+IHtcbiAgICAgICAgICAgIGFbYy5nZXRUeXBlKCldID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgICB9LCB7fSlcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsaWRhdG9yczogW2RhdGVSYW5nZVZhbGlkYXRvcl1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlUHJldmlldygpOiB2b2lkIHtcbiAgICB0aGlzLmlzUHJldmlld0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMucHJldmlld1RhYmxlRGF0YSA9XG4gICAgICB0aGlzLmRhdGFwb2ludHNFeHBvcnRNb2RhbFNlcnZpY2UudHJhbnNmb3JtVG9FeHBvcnRGaWxlU3RydWN0dXJlRm9yUHJldmlldyh0aGlzLmRhdGFUb0V4cG9ydCk7XG4gICAgdGhpcy5pc1ByZXZpZXdMb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURhdGVTZWxlY3RvckNoYW5nZXMoKTogdm9pZCB7XG4gICAgY29uc3QgYWdncmVnYXRpb25Db250cm9sID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuYWdncmVnYXRpb247XG4gICAgY29uc3QgZGF0ZUZyb21TZWxlY3RvciA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRhdGVGcm9tO1xuICAgIGNvbnN0IGRhdGVUb1NlbGVjdG9yID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZVRvO1xuXG4gICAgY29uc3QgdXBkYXRlQWdncmVnYXRpb25PcHRpb25zID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzRnVsbFR5cGVPZkV4cG9ydCkge1xuICAgICAgICB0aGlzLnVwZGF0ZURpc2FibGVkQWdncmVnYXRpb25PcHRpb25zU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBmaXJzdEF2YWlsYWJsZUFnZ3JlZ2F0aW9uVmFsdWU6IEFnZ3JlZ2F0aW9uT3B0aW9uID1cbiAgICAgICAgICB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvckZpbGVFeHBvcnRlclNlcnZpY2Uuc2V0VG9GaXJzdEF2YWlsYWJsZUFnZ3JlZ2F0aW9uT3B0aW9uSWZDdXJyZW50SXNEaXNhYmxlZChcbiAgICAgICAgICAgIGFnZ3JlZ2F0aW9uQ29udHJvbC52YWx1ZSxcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnNcbiAgICAgICAgICApO1xuXG4gICAgICAgIGlmIChmaXJzdEF2YWlsYWJsZUFnZ3JlZ2F0aW9uVmFsdWUpIHtcbiAgICAgICAgICBhZ2dyZWdhdGlvbkNvbnRyb2wuc2V0VmFsdWUoZmlyc3RBdmFpbGFibGVBZ2dyZWdhdGlvblZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBtZXJnZShkYXRlRnJvbVNlbGVjdG9yLnZhbHVlQ2hhbmdlcywgZGF0ZVRvU2VsZWN0b3IudmFsdWVDaGFuZ2VzKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSh1cGRhdGVBZ2dyZWdhdGlvbk9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFeHBvcnRNb2RlQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBjb25zdCBhZ2dyZWdhdGlvbkNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5hZ2dyZWdhdGlvbjtcblxuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmV4cG9ydE1vZGUudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKGV4cG9ydE1vZGVWYWx1ZSA9PiB7XG4gICAgICAgIGlmIChleHBvcnRNb2RlVmFsdWUudG9TdHJpbmcoKSA9PT0gRVhQT1JUX01PREVfVkFMVUVTLmZ1bGwpIHtcbiAgICAgICAgICBhZ2dyZWdhdGlvbkNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFnZ3JlZ2F0aW9uQ29udHJvbC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZpbGVUeXBlU2VsZWN0aW9uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5maWxlVHlwZXMudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKGZpbGVUeXBlc1NlbGVjdGlvblN0YXRlID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVGaWxlVHlwZVNlbGVjdGlvblN0YXRlKGZpbGVUeXBlc1NlbGVjdGlvblN0YXRlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWxlVHlwZVNlbGVjdGlvblN0YXRlKGNoZWNrYm94ZXNTdGF0ZTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICB0aGlzLmlzQW55T2ZFeHBvcnRGaWxlVHlwZUNoZWNrZWQgPSBPYmplY3QudmFsdWVzKGNoZWNrYm94ZXNTdGF0ZSkuc29tZShcbiAgICAgIHZhbHVlID0+IHZhbHVlID09PSB0cnVlXG4gICAgKTtcbiAgICB0aGlzLmZpbGVUeXBlU2VsZWN0aW9uU3RhdGUgPSBjaGVja2JveGVzU3RhdGU7XG4gICAgdGhpcy51cGRhdGVEb3dubG9hZEJ1dHRvblN0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZvcm1WYWxpZGF0aW9uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5zdGF0dXNDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVEb3dubG9hZEJ1dHRvblN0YXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbGVUeXBlQ29udHJvbCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlVHlwZXNDb250cm9sID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZmlsZVR5cGVzO1xuICAgIGlmIChmaWxlVHlwZXNDb250cm9sKSB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBmaWxlVHlwZXNDb250cm9sLnZhbHVlIHx8IHt9O1xuICAgICAgY29uc3QgdXBkYXRlZFZhbHVlID0geyAuLi5jdXJyZW50VmFsdWUgfTtcblxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5maWxlVHlwZVNlbGVjdGlvblN0YXRlKS5mb3JFYWNoKChbZmlsZVR5cGUsIGlzU2VsZWN0ZWRdKSA9PiB7XG4gICAgICAgIGlmIChmaWxlVHlwZSBpbiBjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICB1cGRhdGVkVmFsdWVbZmlsZVR5cGVdID0gaXNTZWxlY3RlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZpbGVUeXBlc0NvbnRyb2wucGF0Y2hWYWx1ZSh1cGRhdGVkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGV0ZXJtaW5lU2hvd2luZ1ByZXZpZXdPckVtcHR5U3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzRGF0YVRvU2hvdyA9IHRoaXMuZGF0YVRvRXhwb3J0LnNvbWUoZGF0YVRvRXhwb3J0SXRlbSA9PlxuICAgICAgdGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnRcbiAgICAgICAgPyAhIWRhdGFUb0V4cG9ydEl0ZW1cbiAgICAgICAgOiBkYXRhVG9FeHBvcnRJdGVtLnRpbWVWYWx1ZU1hcCAmJiBPYmplY3Qua2V5cyhkYXRhVG9FeHBvcnRJdGVtLnRpbWVWYWx1ZU1hcCkubGVuZ3RoID4gMFxuICAgICk7XG5cbiAgICB0aGlzLmhhc0ZldGNoZWREYXRhQW55VmFsdWVzVG9FeHBvcnQgPSBoYXNEYXRhVG9TaG93O1xuXG4gICAgaWYgKGhhc0RhdGFUb1Nob3cpIHtcbiAgICAgIHRoaXMucHJlcGFyZVByZXZpZXcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc1ByZXZpZXdMb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZXRlcm1pbmVJZk1lYXN1cmVtZW50UmVzcG9uc2VXaWxsQmVQcm9jZXNzZWRCeUJhY2tlbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pc1ByZXZpZXdMb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0ID1cbiAgICAgIGF3YWl0IHRoaXMuZGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yU2VydmljZS5nZXREYXRhcG9pbnRzRXhjZWVkaW5nTGltaXQodGhpcy5leHBvcnRDb25maWcpO1xuXG4gICAgY29uc3QgeyBicm93c2VyRG93bmxvYWRhYmxlQ291bnQsIGVtYWlsRGVsaXZlcmFibGVDb3VudCwgbm9uUmV0cmlldmFibGVDb3VudCB9ID1cbiAgICAgIHRoaXMuY2FsY3VsYXRlRGF0YXBvaW50Q291bnRzKCk7XG5cbiAgICB0aGlzLmhhc05vRXhwb3J0YWJsZURhdGEgPVxuICAgICAgYnJvd3NlckRvd25sb2FkYWJsZUNvdW50ID09PSAwICYmIGVtYWlsRGVsaXZlcmFibGVDb3VudCA9PT0gMCAmJiBub25SZXRyaWV2YWJsZUNvdW50ID4gMDtcblxuICAgIGlmICh0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdC5sZW5ndGggPiAwICYmICF0aGlzLmhhc05vRXhwb3J0YWJsZURhdGEpIHtcbiAgICAgIHRoaXMubGltaXRFeGNlZWRlZE1lc3NhZ2UgPSB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvclNlcnZpY2UuZ2V0TGltaXRFeGNlZWRlZE1lc3NhZ2UoXG4gICAgICAgIHRoaXMuaGFzTm9FeHBvcnRhYmxlRGF0YSxcbiAgICAgICAgZW1haWxEZWxpdmVyYWJsZUNvdW50LFxuICAgICAgICBicm93c2VyRG93bmxvYWRhYmxlQ291bnQsXG4gICAgICAgIG5vblJldHJpZXZhYmxlQ291bnQsXG4gICAgICAgIHRoaXMuZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMubGVuZ3RoXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdC5sZW5ndGggPiAwICYmIHRoaXMuaGFzTm9FeHBvcnRhYmxlRGF0YSkge1xuICAgICAgdGhpcy5saW1pdEV4Y2VlZGVkTWVzc2FnZSA9IHRoaXMuZGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yU2VydmljZS5nZXRMaW1pdEV4Y2VlZGVkTWVzc2FnZShcbiAgICAgICAgdGhpcy5oYXNOb0V4cG9ydGFibGVEYXRhXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlRG93bmxvYWRCdXR0b25TdGF0ZSgpO1xuXG4gICAgdGhpcy5pc1ByZXZpZXdMb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZURhdGFwb2ludENvdW50cygpOiBEYXRhcG9pbnRDb3VudHMge1xuICAgIGNvbnN0IFJFQ09SRF9BUElfTElNSVQgPSAxXzAwMF8wMDA7XG5cbiAgICB0aGlzLmRhdGFQb2ludHNFeGNlZWRpbmdPbmVNaWxsaW9uTGltaXQgPSB0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdC5maWx0ZXIoXG4gICAgICBkYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQgPT5cbiAgICAgICAgZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0LnRvdGFsRWxlbWVudHMgPiBSRUNPUkRfQVBJX0xJTUlUXG4gICAgKTtcblxuICAgIGNvbnN0IG5vblJldHJpZXZhYmxlQ291bnQgPSB0aGlzLmRhdGFQb2ludHNFeGNlZWRpbmdPbmVNaWxsaW9uTGltaXQubGVuZ3RoO1xuXG4gICAgY29uc3QgZW1haWxEZWxpdmVyYWJsZUNvdW50ID1cbiAgICAgIHRoaXMuZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0Lmxlbmd0aCAtIG5vblJldHJpZXZhYmxlQ291bnQ7XG5cbiAgICBjb25zdCBicm93c2VyRG93bmxvYWRhYmxlQ291bnQgPVxuICAgICAgdGhpcy5leHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscy5sZW5ndGggLSBlbWFpbERlbGl2ZXJhYmxlQ291bnQgLSBub25SZXRyaWV2YWJsZUNvdW50O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJyb3dzZXJEb3dubG9hZGFibGVDb3VudCxcbiAgICAgIGVtYWlsRGVsaXZlcmFibGVDb3VudCxcbiAgICAgIG5vblJldHJpZXZhYmxlQ291bnRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9yZUluaXRpYWxDaGFuZ2VhYmxlQ29uZmlnKCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbERhdGVGcm9tID0gdGhpcy5leHBvcnRDb25maWcuZGF0ZUZyb207XG4gICAgdGhpcy5pbml0aWFsRGF0ZVRvID0gdGhpcy5leHBvcnRDb25maWcuZGF0ZVRvO1xuICAgIHRoaXMuaW5pdGlhbERhdGFwb2ludERldGFpbHMgPSB0aGlzLmV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzO1xuICAgIGlmICghdGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnQpIHtcbiAgICAgIHRoaXMuaW5pdGlhbEFnZ3JlZ2F0aW9uID0gdGhpcy5leHBvcnRDb25maWcuYWdncmVnYXRpb247XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkSW5pdGlhbENoYW5nZWFibGVDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy5leHBvcnRDb25maWcuZGF0ZUZyb20gPSB0aGlzLmluaXRpYWxEYXRlRnJvbTtcbiAgICB0aGlzLmV4cG9ydENvbmZpZy5kYXRlVG8gPSB0aGlzLmluaXRpYWxEYXRlVG87XG4gICAgdGhpcy5leHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscyA9IHRoaXMuaW5pdGlhbERhdGFwb2ludERldGFpbHM7XG4gICAgaWYgKCF0aGlzLmlzRnVsbFR5cGVPZkV4cG9ydCkge1xuICAgICAgdGhpcy5leHBvcnRDb25maWcuYWdncmVnYXRpb24gPSB0aGlzLmluaXRpYWxBZ2dyZWdhdGlvbjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUV4cG9ydENvbmZpZ0FuZEZldGNoRGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAuaW52YWxpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcmV2aWV3TG9hZGluZyA9IHRydWU7XG5cbiAgICB0aGlzLm9uRG93bmxvYWRCdXR0b25TdGF0ZUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB0aGlzLmRhdGFUb0V4cG9ydCA9IGF3YWl0IHRoaXMuZGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yU2VydmljZS5mZXRjaEFuZFByZXBhcmVEYXRhVG9FeHBvcnQoXG4gICAgICB0aGlzLmV4cG9ydENvbmZpZyxcbiAgICAgIHRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0XG4gICAgKTtcblxuICAgIHRoaXMuZGV0ZXJtaW5lU2hvd2luZ1ByZXZpZXdPckVtcHR5U3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRG93bmxvYWRCdXR0b25TdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjYW5FbmFibGVEb3dubG9hZEJ1dHRvbiA9XG4gICAgICB0aGlzLmhhc0ZldGNoZWREYXRhQW55VmFsdWVzVG9FeHBvcnQgJiZcbiAgICAgICF0aGlzLmZvcm1Hcm91cC5pbnZhbGlkICYmXG4gICAgICB0aGlzLmlzQW55T2ZFeHBvcnRGaWxlVHlwZUNoZWNrZWQgJiZcbiAgICAgICF0aGlzLmhhc05vRXhwb3J0YWJsZURhdGE7XG5cbiAgICB0aGlzLm9uRG93bmxvYWRCdXR0b25TdGF0ZUNoYW5nZS5lbWl0KGNhbkVuYWJsZURvd25sb2FkQnV0dG9uKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGdWxsRXhwb3J0UmVsYXRlZFByb3BlcnRpZXMoKTogdm9pZCB7XG4gICAgdGhpcy5oYXNOb0V4cG9ydGFibGVEYXRhID0gZmFsc2U7XG4gICAgdGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5pdGlhbFNlbGVjdGlvbihcbiAgICBmaWxlVHlwZTogeyBba2V5OiBzdHJpbmddOiBGaWxlVHlwZU1ldGFkYXRhIH0sXG4gICAgc2VsZWN0QnlEZWZhdWx0OiBudW1iZXJbXVxuICApIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmlsZVR5cGUpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxTZWxlY3Rpb24gPSBrZXlzLnJlZHVjZTx7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfT4oKGFjYywga2V5KSA9PiB7XG4gICAgICBhY2Nba2V5XSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICBzZWxlY3RCeURlZmF1bHQuZm9yRWFjaChpbmRleCA9PiB7XG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGtleXMubGVuZ3RoKSB7XG4gICAgICAgIGluaXRpYWxTZWxlY3Rpb25ba2V5c1tpbmRleF1dID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpbml0aWFsU2VsZWN0aW9uO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicC1iLTE2XCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNQZXJtaXNzaW9uVG9SZWFkQW55TWVhc3VyZW1lbnRzOyBlbHNlIGhhc05vUm9sZVRvUmVhZEFueU1lYXN1cmVtZW50c1wiPlxuICAgIDxkaXYgY2xhc3M9XCJwLTE2IHRleHQtY2VudGVyIHNlcGFyYXRvci1ib3R0b20gc3RpY2t5LXRvcCBiZy1jb21wb25lbnRcIj5cbiAgICAgIDxwIGNsYXNzPVwidGV4dC1tZWRpdW0gdGV4dC0xNlwiPlxuICAgICAgICB7eyAnQ29uZmlndXJlIGV4cG9ydCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInAtdC0yNCBwLXItMTYgcC1sLTE2IGdhcC04IHAtYi0xNiBmbGV4LXdyYXBcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnc2VwYXJhdG9yLWJvdHRvbSc6IGlzRnVsbFR5cGVPZkV4cG9ydCB9XCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgIDxjOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItdGltZS1yYW5nZVxuICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLmhhc1Blcm1pc3Npb25Ub1JlYWRBbnlNZWFzdXJlbWVudHNcIlxuICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIlxuICAgICAgICAgICAgKG9uRGF0ZUZyb21DaGFuZ2UpPVwib25EYXRlRnJvbUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkRhdGVUb0NoYW5nZSk9XCJvbkRhdGVUb0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9jOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItdGltZS1yYW5nZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgIDxjOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZGF0YS1zY29wZVxuICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLmhhc1Blcm1pc3Npb25Ub1JlYWRBbnlNZWFzdXJlbWVudHNcIlxuICAgICAgICAgICAgW2Rpc2FibGVkQWdncmVnYXRpb25PcHRpb25zXT1cImRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zXCJcbiAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbiAgICAgICAgICAgIChvbkFnZ3JlZ2F0aW9uQ2hhbmdlKT1cIm9uQWdncmVnYXRpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25FeHBvcnRUeXBlQ2hhbmdlKT1cIm9uRXhwb3J0VHlwZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9jOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZGF0YS1zY29wZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgIDxjOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS10eXBlc1xuICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLmhhc1Blcm1pc3Npb25Ub1JlYWRBbnlNZWFzdXJlbWVudHNcIlxuICAgICAgICAgICAgW2R5bmFtaWNGaWxlc1R5cGVNZXRhZGF0YV09XCJkeW5hbWljRmlsZXNUeXBlTWV0YWRhdGFcIlxuICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIlxuICAgICAgICAgID48L2M4eS1kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLXR5cGVzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ0lmPVwiIWlzRnVsbFR5cGVPZkV4cG9ydCAmJiAhaGFzRmV0Y2hlZERhdGFBbnlWYWx1ZXNUb0V4cG9ydCAmJiAhaXNQcmV2aWV3TG9hZGluZ1wiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInAtdC0yNCBwLXItMTYgcC1sLTE2IHAtYi0xNiBzZXBhcmF0b3ItYm90dG9tIGQtZmxleFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nIGNlbnRlci1ibG9ja1wiXG4gICAgICAgICAgcm9sZT1cImFsZXJ0XCJcbiAgICAgICAgICBkYXRhLWN5PVwiZmlsZS1leHBvcnRlci0tbm8tZGF0YS1hdmFpbGFibGVcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgTm8gZGF0YSBhdmFpbGFibGUuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdC5sZW5ndGggPiAwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicC10LTI0IHAtci0xNiBwLWwtMTYgcC1iLTE2IHNlcGFyYXRvci1ib3R0b20gZC1mbGV4XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBbY2xhc3NdPVwiXG4gICAgICAgICAgICBoYXNOb0V4cG9ydGFibGVEYXRhXG4gICAgICAgICAgICAgID8gJ2FsZXJ0IGFsZXJ0LXdhcm5pbmcgY2VudGVyLWJsb2NrJ1xuICAgICAgICAgICAgICA6ICdhbGVydCBhbGVydC1pbmZvIGNlbnRlci1ibG9jaydcbiAgICAgICAgICBcIlxuICAgICAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJsaW1pdEV4Y2VlZGVkTWVzc2FnZVwiXG4gICAgICAgID48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0Z1bGxUeXBlT2ZFeHBvcnRcIj5cbiAgICAgIDxjOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItcHJldmlld1xuICAgICAgICAqbmdJZj1cInRoaXMuaGFzUGVybWlzc2lvblRvUmVhZEFueU1lYXN1cmVtZW50c1wiXG4gICAgICAgIFtoYXNGZXRjaGVkRGF0YUFueVZhbHVlc1RvRXhwb3J0XT1cImhhc0ZldGNoZWREYXRhQW55VmFsdWVzVG9FeHBvcnRcIlxuICAgICAgICBbaXNQcmV2aWV3TG9hZGluZ109XCJpc1ByZXZpZXdMb2FkaW5nXCJcbiAgICAgICAgW3ByZXZpZXdUYWJsZURhdGFdPVwicHJldmlld1RhYmxlRGF0YVwiXG4gICAgICA+PC9jOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItcHJldmlldz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy10ZW1wbGF0ZSAjaGFzTm9Sb2xlVG9SZWFkQW55TWVhc3VyZW1lbnRzPlxuICAgIDxkaXYgY2xhc3M9XCJwLXQtMjQgcC1yLTE2IHAtbC0xNiBwLWItMTYgZC1mbGV4XCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBjZW50ZXItYmxvY2tcIlxuICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgID5cbiAgICAgICAgPHA+VG8gZXhwb3J0IGRhdGEsIHlvdSBtdXN0IG1lZXQgYXQgbGVhc3Qgb25lIG9mIHRoZXNlIGNyaXRlcmlhOjwvcD5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgIEhhdmVcbiAgICAgICAgICAgIDxiPlJFQUQgcGVybWlzc2lvbiBmb3IgXCJNZWFzdXJlbWVudHNcIiBwZXJtaXNzaW9uIHR5cGU8L2I+XG4gICAgICAgICAgICAoZWl0aGVyIGFzIGEgZ2xvYmFsIHJvbGUgb3IgZm9yIHRoZSBzcGVjaWZpYyBzb3VyY2UpXG4gICAgICAgICAgPC9saT5cbiAgICAgICAgICA8bGk+XG4gICAgICAgICAgICBCZSB0aGVcbiAgICAgICAgICAgIDxiPm93bmVyIG9mIHRoZSBzb3VyY2U8L2I+XG4gICAgICAgICAgICB5b3Ugd2FudCB0byBleHBvcnQgZGF0YSBmcm9tXG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgICAgPHA+RG9uJ3QgbWVldCB0aGVzZSByZXF1aXJlbWVudHM/IENvbnRhY3QgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBmb3IgYXNzaXN0YW5jZS48L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19