ngx-hana-nameserver-history-viewer 1.1.3 → 1.1.9-3.beta

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 (417) hide show
  1. package/README.md +5 -4
  2. package/esm2020/ngx-hana-nameserver-history-viewer.mjs +5 -0
  3. package/esm2020/public-api.mjs +2 -0
  4. package/esm2020/src/nameserver-history-viewer/components/alert/alert.component.mjs +68 -0
  5. package/esm2020/src/nameserver-history-viewer/components/alert/alert.module.mjs +22 -0
  6. package/esm2020/src/nameserver-history-viewer/components/alert/index.mjs +3 -0
  7. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.mjs +112 -0
  8. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/index.mjs +2 -0
  9. package/esm2020/src/nameserver-history-viewer/components/index.mjs +9 -0
  10. package/esm2020/src/nameserver-history-viewer/components/instruction/index.mjs +2 -0
  11. package/esm2020/src/nameserver-history-viewer/components/instruction/instruction.component.mjs +42 -0
  12. package/esm2020/src/nameserver-history-viewer/components/nameserver-history.component.mjs +550 -0
  13. package/esm2020/src/nameserver-history-viewer/components/port-selector/index.mjs +2 -0
  14. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.component.mjs +69 -0
  15. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.service.mjs +41 -0
  16. package/esm2020/src/nameserver-history-viewer/components/progress-bar/index.mjs +2 -0
  17. package/esm2020/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.mjs +40 -0
  18. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/index.mjs +2 -0
  19. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.mjs +70 -0
  20. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/index.mjs +2 -0
  21. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.mjs +90 -0
  22. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.mjs +49 -0
  23. package/esm2020/src/nameserver-history-viewer/index.mjs +3 -0
  24. package/esm2020/src/nameserver-history-viewer/nameserver-history.module.mjs +63 -0
  25. package/esm2020/src/nameserver-history-viewer/services/chart.service.mjs +323 -0
  26. package/esm2020/src/nameserver-history-viewer/services/file.service.mjs +390 -0
  27. package/esm2020/src/nameserver-history-viewer/services/index.mjs +4 -0
  28. package/esm2020/src/nameserver-history-viewer/services/ui.service.mjs +557 -0
  29. package/esm2020/src/nameserver-history-viewer/types/abort.types.mjs +6 -0
  30. package/esm2020/src/nameserver-history-viewer/types/alert.types.mjs +8 -0
  31. package/esm2020/src/nameserver-history-viewer/types/chart-content-data-item.types.mjs +2 -0
  32. package/esm2020/src/nameserver-history-viewer/types/chart-content-data.types.mjs +2 -0
  33. package/esm2020/src/nameserver-history-viewer/types/chart-content-header.types.mjs +2 -0
  34. package/esm2020/src/nameserver-history-viewer/types/chart-content-time.types.mjs +2 -0
  35. package/esm2020/src/nameserver-history-viewer/types/chart-content.types.mjs +2 -0
  36. package/esm2020/src/nameserver-history-viewer/types/color-rgba.types.mjs +2 -0
  37. package/esm2020/src/nameserver-history-viewer/types/html-element.type.mjs +9 -0
  38. package/esm2020/src/nameserver-history-viewer/types/index.mjs +28 -0
  39. package/esm2020/src/nameserver-history-viewer/types/item.types.mjs +14 -0
  40. package/esm2020/src/nameserver-history-viewer/types/legend-color.types.mjs +2 -0
  41. package/esm2020/src/nameserver-history-viewer/types/load-history-info-backup.types.mjs +2 -0
  42. package/esm2020/src/nameserver-history-viewer/types/load-history-info-columnstore.types.mjs +2 -0
  43. package/esm2020/src/nameserver-history-viewer/types/load-history-info-host.types.mjs +2 -0
  44. package/esm2020/src/nameserver-history-viewer/types/load-history-info-item.types.mjs +2 -0
  45. package/esm2020/src/nameserver-history-viewer/types/load-history-info-persistence.types.mjs +2 -0
  46. package/esm2020/src/nameserver-history-viewer/types/load-history-info-rowstore.types.mjs +2 -0
  47. package/esm2020/src/nameserver-history-viewer/types/load-history-info-server.types.mjs +2 -0
  48. package/esm2020/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.mjs +2 -0
  49. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sql.types.mjs +2 -0
  50. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.mjs +2 -0
  51. package/esm2020/src/nameserver-history-viewer/types/load-history-info-threads.types.mjs +2 -0
  52. package/esm2020/src/nameserver-history-viewer/types/load-history-info.types.mjs +2 -0
  53. package/esm2020/src/nameserver-history-viewer/types/port.types.mjs +2 -0
  54. package/esm2020/src/nameserver-history-viewer/types/scale-group.types.mjs +17 -0
  55. package/esm2020/src/nameserver-history-viewer/types/unit-category.types.mjs +10 -0
  56. package/esm2020/src/nameserver-history-viewer/types/unit.types.mjs +14 -0
  57. package/esm2020/src/nameserver-history-viewer/utils/chart-util.mjs +25 -0
  58. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.mjs +2 -0
  59. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.mjs +57 -0
  60. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.mjs +139 -0
  61. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/index.mjs +41 -0
  62. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.mjs +106 -0
  63. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.mjs +168 -0
  64. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/utils.mjs +114 -0
  65. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.mjs +527 -0
  66. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/index.mjs +2 -0
  67. package/esm2020/src/nameserver-history-viewer/utils/file-util.mjs +154 -0
  68. package/esm2020/src/nameserver-history-viewer/utils/index.mjs +5 -0
  69. package/esm2020/src/nameserver-history-viewer/utils/time-util.mjs +101 -0
  70. package/esm2020/src/nameserver-history-viewer/utils/ui-util.mjs +162 -0
  71. package/{dist/fesm2015/ngx-hana-nameserver-history-viewer.js → fesm2015/ngx-hana-nameserver-history-viewer.mjs} +829 -2561
  72. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
  73. package/fesm2020/ngx-hana-nameserver-history-viewer.mjs +4081 -0
  74. package/fesm2020/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
  75. package/ngx-hana-nameserver-history-viewer.d.ts +5 -0
  76. package/package.json +66 -88
  77. package/{dist/public-api.d.ts → public-api.d.ts} +0 -0
  78. package/{dist/src → src}/nameserver-history-viewer/components/alert/alert.component.d.ts +4 -1
  79. package/src/nameserver-history-viewer/components/alert/alert.module.d.ts +8 -0
  80. package/{dist/src → src}/nameserver-history-viewer/components/alert/index.d.ts +0 -0
  81. package/{dist/src → src}/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.d.ts +3 -0
  82. package/{dist/src → src}/nameserver-history-viewer/components/file-drop-input/index.d.ts +0 -0
  83. package/{dist/src → src}/nameserver-history-viewer/components/index.d.ts +0 -0
  84. package/{dist/src → src}/nameserver-history-viewer/components/instruction/index.d.ts +0 -0
  85. package/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +17 -0
  86. package/{dist/src → src}/nameserver-history-viewer/components/nameserver-history.component.d.ts +33 -14
  87. package/{dist/src → src}/nameserver-history-viewer/components/port-selector/index.d.ts +0 -0
  88. package/{dist/src → src}/nameserver-history-viewer/components/port-selector/port-selector.component.d.ts +4 -1
  89. package/{dist/src → src}/nameserver-history-viewer/components/port-selector/port-selector.service.d.ts +3 -0
  90. package/{dist/src → src}/nameserver-history-viewer/components/progress-bar/index.d.ts +0 -0
  91. package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +6 -0
  92. package/{dist/src → src}/nameserver-history-viewer/components/time-range-selector/index.d.ts +0 -0
  93. package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +19 -0
  94. package/{dist/src → src}/nameserver-history-viewer/components/timezone-selector/index.d.ts +0 -0
  95. package/{dist/src → src}/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.d.ts +3 -0
  96. package/{dist/src → src}/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.d.ts +3 -0
  97. package/src/nameserver-history-viewer/index.d.ts +2 -0
  98. package/src/nameserver-history-viewer/nameserver-history.module.d.ts +19 -0
  99. package/{dist/src → src}/nameserver-history-viewer/services/chart.service.d.ts +4 -1
  100. package/{dist/src → src}/nameserver-history-viewer/services/file.service.d.ts +3 -0
  101. package/{dist/src → src}/nameserver-history-viewer/services/index.d.ts +0 -0
  102. package/{dist/src → src}/nameserver-history-viewer/services/ui.service.d.ts +5 -2
  103. package/{dist/src → src}/nameserver-history-viewer/types/abort.types.d.ts +0 -0
  104. package/{dist/src → src}/nameserver-history-viewer/types/alert.types.d.ts +0 -0
  105. package/{dist/src → src}/nameserver-history-viewer/types/chart-content-data-item.types.d.ts +0 -0
  106. package/{dist/src → src}/nameserver-history-viewer/types/chart-content-data.types.d.ts +0 -0
  107. package/{dist/src → src}/nameserver-history-viewer/types/chart-content-header.types.d.ts +0 -0
  108. package/{dist/src → src}/nameserver-history-viewer/types/chart-content-time.types.d.ts +0 -0
  109. package/{dist/src → src}/nameserver-history-viewer/types/chart-content.types.d.ts +0 -0
  110. package/{dist/src → src}/nameserver-history-viewer/types/color-rgba.types.d.ts +0 -0
  111. package/{dist/src → src}/nameserver-history-viewer/types/html-element.type.d.ts +0 -0
  112. package/{dist/src → src}/nameserver-history-viewer/types/index.d.ts +0 -0
  113. package/{dist/src → src}/nameserver-history-viewer/types/item.types.d.ts +0 -0
  114. package/{dist/src → src}/nameserver-history-viewer/types/legend-color.types.d.ts +0 -0
  115. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-backup.types.d.ts +0 -0
  116. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-columnstore.types.d.ts +0 -0
  117. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-host.types.d.ts +0 -0
  118. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-item.types.d.ts +0 -0
  119. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-persistence.types.d.ts +0 -0
  120. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-rowstore.types.d.ts +0 -0
  121. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-server.types.d.ts +0 -0
  122. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-session-admission-control.types.d.ts +0 -0
  123. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-sql.types.d.ts +0 -0
  124. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-sync-primitives.types.d.ts +0 -0
  125. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-threads.types.d.ts +0 -0
  126. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info.types.d.ts +0 -0
  127. package/{dist/src → src}/nameserver-history-viewer/types/port.types.d.ts +0 -0
  128. package/{dist/src → src}/nameserver-history-viewer/types/scale-group.types.d.ts +0 -0
  129. package/{dist/src → src}/nameserver-history-viewer/types/unit-category.types.d.ts +0 -0
  130. package/{dist/src → src}/nameserver-history-viewer/types/unit.types.d.ts +0 -0
  131. package/{dist/src → src}/nameserver-history-viewer/utils/chart-util.d.ts +0 -0
  132. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.d.ts +0 -0
  133. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/data_culling.d.ts +0 -0
  134. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.d.ts +0 -0
  135. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/index.d.ts +0 -0
  136. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.d.ts +1 -1
  137. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.d.ts +0 -0
  138. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/utils.d.ts +0 -0
  139. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.d.ts +0 -0
  140. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-zoom/index.d.ts +0 -0
  141. package/{dist/src → src}/nameserver-history-viewer/utils/file-util.d.ts +6 -0
  142. package/{dist/src → src}/nameserver-history-viewer/utils/index.d.ts +0 -0
  143. package/{dist/src → src}/nameserver-history-viewer/utils/time-util.d.ts +0 -0
  144. package/{dist/src → src}/nameserver-history-viewer/utils/ui-util.d.ts +0 -0
  145. package/.idea/codeStyles/Project.xml +0 -17
  146. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  147. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  148. package/.idea/modules.xml +0 -8
  149. package/.idea/ngx-hana-nameserver-history-viewer.iml +0 -13
  150. package/.idea/vcs.xml +0 -6
  151. package/.travis.yml +0 -35
  152. package/angular.json +0 -125
  153. package/dist/LICENSE +0 -21
  154. package/dist/README.md +0 -93
  155. package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.js +0 -6761
  156. package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.js.map +0 -1
  157. package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.min.js +0 -2
  158. package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.min.js.map +0 -1
  159. package/dist/esm2015/ngx-hana-nameserver-history-viewer.js +0 -10
  160. package/dist/esm2015/public-api.js +0 -6
  161. package/dist/esm2015/src/nameserver-history-viewer/components/alert/alert.component.js +0 -114
  162. package/dist/esm2015/src/nameserver-history-viewer/components/alert/alert.module.js +0 -21
  163. package/dist/esm2015/src/nameserver-history-viewer/components/alert/index.js +0 -7
  164. package/dist/esm2015/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -141
  165. package/dist/esm2015/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
  166. package/dist/esm2015/src/nameserver-history-viewer/components/index.js +0 -13
  167. package/dist/esm2015/src/nameserver-history-viewer/components/instruction/index.js +0 -6
  168. package/dist/esm2015/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -62
  169. package/dist/esm2015/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -868
  170. package/dist/esm2015/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
  171. package/dist/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
  172. package/dist/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -60
  173. package/dist/esm2015/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
  174. package/dist/esm2015/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -35
  175. package/dist/esm2015/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
  176. package/dist/esm2015/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -68
  177. package/dist/esm2015/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
  178. package/dist/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -151
  179. package/dist/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -80
  180. package/dist/esm2015/src/nameserver-history-viewer/index.js +0 -6
  181. package/dist/esm2015/src/nameserver-history-viewer/nameserver-history.module.js +0 -42
  182. package/dist/esm2015/src/nameserver-history-viewer/services/chart.service.js +0 -504
  183. package/dist/esm2015/src/nameserver-history-viewer/services/file.service.js +0 -488
  184. package/dist/esm2015/src/nameserver-history-viewer/services/index.js +0 -8
  185. package/dist/esm2015/src/nameserver-history-viewer/services/ui.service.js +0 -922
  186. package/dist/esm2015/src/nameserver-history-viewer/types/abort.types.js +0 -13
  187. package/dist/esm2015/src/nameserver-history-viewer/types/alert.types.js +0 -13
  188. package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
  189. package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
  190. package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
  191. package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
  192. package/dist/esm2015/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
  193. package/dist/esm2015/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
  194. package/dist/esm2015/src/nameserver-history-viewer/types/html-element.type.js +0 -19
  195. package/dist/esm2015/src/nameserver-history-viewer/types/index.js +0 -32
  196. package/dist/esm2015/src/nameserver-history-viewer/types/item.types.js +0 -19
  197. package/dist/esm2015/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
  198. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
  199. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
  200. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
  201. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
  202. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
  203. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
  204. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
  205. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -25
  206. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
  207. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
  208. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
  209. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
  210. package/dist/esm2015/src/nameserver-history-viewer/types/port.types.js +0 -17
  211. package/dist/esm2015/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
  212. package/dist/esm2015/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
  213. package/dist/esm2015/src/nameserver-history-viewer/types/unit.types.js +0 -19
  214. package/dist/esm2015/src/nameserver-history-viewer/utils/chart-util.js +0 -38
  215. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
  216. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
  217. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -222
  218. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
  219. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -166
  220. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -311
  221. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -130
  222. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -827
  223. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
  224. package/dist/esm2015/src/nameserver-history-viewer/utils/file-util.js +0 -186
  225. package/dist/esm2015/src/nameserver-history-viewer/utils/index.js +0 -9
  226. package/dist/esm2015/src/nameserver-history-viewer/utils/time-util.js +0 -139
  227. package/dist/esm2015/src/nameserver-history-viewer/utils/ui-util.js +0 -239
  228. package/dist/esm5/ngx-hana-nameserver-history-viewer.js +0 -10
  229. package/dist/esm5/public-api.js +0 -6
  230. package/dist/esm5/src/nameserver-history-viewer/components/alert/alert.component.js +0 -146
  231. package/dist/esm5/src/nameserver-history-viewer/components/alert/alert.module.js +0 -25
  232. package/dist/esm5/src/nameserver-history-viewer/components/alert/index.js +0 -7
  233. package/dist/esm5/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -155
  234. package/dist/esm5/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
  235. package/dist/esm5/src/nameserver-history-viewer/components/index.js +0 -13
  236. package/dist/esm5/src/nameserver-history-viewer/components/instruction/index.js +0 -6
  237. package/dist/esm5/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -67
  238. package/dist/esm5/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -1116
  239. package/dist/esm5/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
  240. package/dist/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
  241. package/dist/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -85
  242. package/dist/esm5/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
  243. package/dist/esm5/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -26
  244. package/dist/esm5/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
  245. package/dist/esm5/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -58
  246. package/dist/esm5/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
  247. package/dist/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -180
  248. package/dist/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -110
  249. package/dist/esm5/src/nameserver-history-viewer/index.js +0 -6
  250. package/dist/esm5/src/nameserver-history-viewer/nameserver-history.module.js +0 -46
  251. package/dist/esm5/src/nameserver-history-viewer/services/chart.service.js +0 -659
  252. package/dist/esm5/src/nameserver-history-viewer/services/file.service.js +0 -609
  253. package/dist/esm5/src/nameserver-history-viewer/services/index.js +0 -8
  254. package/dist/esm5/src/nameserver-history-viewer/services/ui.service.js +0 -1141
  255. package/dist/esm5/src/nameserver-history-viewer/types/abort.types.js +0 -13
  256. package/dist/esm5/src/nameserver-history-viewer/types/alert.types.js +0 -13
  257. package/dist/esm5/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
  258. package/dist/esm5/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
  259. package/dist/esm5/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
  260. package/dist/esm5/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
  261. package/dist/esm5/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
  262. package/dist/esm5/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
  263. package/dist/esm5/src/nameserver-history-viewer/types/html-element.type.js +0 -19
  264. package/dist/esm5/src/nameserver-history-viewer/types/index.js +0 -32
  265. package/dist/esm5/src/nameserver-history-viewer/types/item.types.js +0 -19
  266. package/dist/esm5/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
  267. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
  268. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
  269. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
  270. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
  271. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
  272. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
  273. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
  274. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -25
  275. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
  276. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
  277. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
  278. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
  279. package/dist/esm5/src/nameserver-history-viewer/types/port.types.js +0 -17
  280. package/dist/esm5/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
  281. package/dist/esm5/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
  282. package/dist/esm5/src/nameserver-history-viewer/types/unit.types.js +0 -19
  283. package/dist/esm5/src/nameserver-history-viewer/utils/chart-util.js +0 -39
  284. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
  285. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
  286. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -316
  287. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
  288. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -240
  289. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -366
  290. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -142
  291. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -827
  292. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
  293. package/dist/esm5/src/nameserver-history-viewer/utils/file-util.js +0 -187
  294. package/dist/esm5/src/nameserver-history-viewer/utils/index.js +0 -9
  295. package/dist/esm5/src/nameserver-history-viewer/utils/time-util.js +0 -139
  296. package/dist/esm5/src/nameserver-history-viewer/utils/ui-util.js +0 -241
  297. package/dist/fesm2015/ngx-hana-nameserver-history-viewer.js.map +0 -1
  298. package/dist/fesm5/ngx-hana-nameserver-history-viewer.js +0 -6887
  299. package/dist/fesm5/ngx-hana-nameserver-history-viewer.js.map +0 -1
  300. package/dist/ngx-hana-nameserver-history-viewer.d.ts +0 -5
  301. package/dist/ngx-hana-nameserver-history-viewer.metadata.json +0 -1
  302. package/dist/package.json +0 -90
  303. package/dist/src/nameserver-history-viewer/components/alert/alert.module.d.ts +0 -2
  304. package/dist/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +0 -14
  305. package/dist/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +0 -3
  306. package/dist/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +0 -16
  307. package/dist/src/nameserver-history-viewer/index.d.ts +0 -1
  308. package/dist/src/nameserver-history-viewer/nameserver-history.module.d.ts +0 -2
  309. package/ng-package.json +0 -7
  310. package/public-api.ts +0 -1
  311. package/src/assets/GitHub-Mark-32px.png +0 -0
  312. package/src/demo/app.component.html +0 -42
  313. package/src/demo/app.component.scss +0 -155
  314. package/src/demo/app.component.ts +0 -157
  315. package/src/demo/app.module.ts +0 -30
  316. package/src/demo/demo-service.ts +0 -479
  317. package/src/demo/demo-util.spec.ts +0 -112
  318. package/src/demo/demo-util.ts +0 -121
  319. package/src/demo/index.html +0 -13
  320. package/src/demo/main.ts +0 -12
  321. package/src/demo/small-demo.gif +0 -0
  322. package/src/demo/styles.css +0 -5
  323. package/src/environments/environment.prod.ts +0 -3
  324. package/src/environments/environment.ts +0 -15
  325. package/src/karma.conf.js +0 -31
  326. package/src/nameserver-history-viewer/components/alert/alert.component.html +0 -10
  327. package/src/nameserver-history-viewer/components/alert/alert.component.scss +0 -78
  328. package/src/nameserver-history-viewer/components/alert/alert.component.ts +0 -67
  329. package/src/nameserver-history-viewer/components/alert/alert.module.ts +0 -14
  330. package/src/nameserver-history-viewer/components/alert/index.ts +0 -6
  331. package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.scss +0 -37
  332. package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.spec.ts +0 -47
  333. package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.ts +0 -101
  334. package/src/nameserver-history-viewer/components/file-drop-input/index.ts +0 -1
  335. package/src/nameserver-history-viewer/components/index.ts +0 -8
  336. package/src/nameserver-history-viewer/components/instruction/index.ts +0 -1
  337. package/src/nameserver-history-viewer/components/instruction/instruction.component.html +0 -33
  338. package/src/nameserver-history-viewer/components/instruction/instruction.component.scss +0 -49
  339. package/src/nameserver-history-viewer/components/instruction/instruction.component.ts +0 -30
  340. package/src/nameserver-history-viewer/components/nameserver-history.component.html +0 -70
  341. package/src/nameserver-history-viewer/components/nameserver-history.component.scss +0 -191
  342. package/src/nameserver-history-viewer/components/nameserver-history.component.spec.ts +0 -193
  343. package/src/nameserver-history-viewer/components/nameserver-history.component.ts +0 -666
  344. package/src/nameserver-history-viewer/components/port-selector/index.ts +0 -1
  345. package/src/nameserver-history-viewer/components/port-selector/port-selector.component.ts +0 -55
  346. package/src/nameserver-history-viewer/components/port-selector/port-selector.service.spec.ts +0 -16
  347. package/src/nameserver-history-viewer/components/port-selector/port-selector.service.ts +0 -40
  348. package/src/nameserver-history-viewer/components/progress-bar/index.ts +0 -1
  349. package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.scss +0 -47
  350. package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.ts +0 -27
  351. package/src/nameserver-history-viewer/components/time-range-selector/index.ts +0 -1
  352. package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.scss +0 -31
  353. package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.ts +0 -46
  354. package/src/nameserver-history-viewer/components/timezone-selector/index.ts +0 -1
  355. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.ts +0 -82
  356. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.spec.ts +0 -12
  357. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.ts +0 -53
  358. package/src/nameserver-history-viewer/index.ts +0 -1
  359. package/src/nameserver-history-viewer/nameserver-history.module.ts +0 -45
  360. package/src/nameserver-history-viewer/services/chart.service.ts +0 -343
  361. package/src/nameserver-history-viewer/services/file.service.spec.ts +0 -3364
  362. package/src/nameserver-history-viewer/services/file.service.ts +0 -450
  363. package/src/nameserver-history-viewer/services/index.ts +0 -3
  364. package/src/nameserver-history-viewer/services/ui.service.spec.ts +0 -43
  365. package/src/nameserver-history-viewer/services/ui.service.ts +0 -601
  366. package/src/nameserver-history-viewer/types/abort.types.ts +0 -4
  367. package/src/nameserver-history-viewer/types/alert.types.ts +0 -6
  368. package/src/nameserver-history-viewer/types/chart-content-data-item.types.ts +0 -4
  369. package/src/nameserver-history-viewer/types/chart-content-data.types.ts +0 -6
  370. package/src/nameserver-history-viewer/types/chart-content-header.types.ts +0 -4
  371. package/src/nameserver-history-viewer/types/chart-content-time.types.ts +0 -3
  372. package/src/nameserver-history-viewer/types/chart-content.types.ts +0 -10
  373. package/src/nameserver-history-viewer/types/color-rgba.types.ts +0 -6
  374. package/src/nameserver-history-viewer/types/html-element.type.ts +0 -7
  375. package/src/nameserver-history-viewer/types/index.ts +0 -27
  376. package/src/nameserver-history-viewer/types/item.types.ts +0 -12
  377. package/src/nameserver-history-viewer/types/legend-color.types.ts +0 -5
  378. package/src/nameserver-history-viewer/types/load-history-info-backup.types.ts +0 -8
  379. package/src/nameserver-history-viewer/types/load-history-info-columnstore.types.ts +0 -9
  380. package/src/nameserver-history-viewer/types/load-history-info-host.types.ts +0 -17
  381. package/src/nameserver-history-viewer/types/load-history-info-item.types.ts +0 -14
  382. package/src/nameserver-history-viewer/types/load-history-info-persistence.types.ts +0 -12
  383. package/src/nameserver-history-viewer/types/load-history-info-rowstore.types.ts +0 -7
  384. package/src/nameserver-history-viewer/types/load-history-info-server.types.ts +0 -11
  385. package/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.ts +0 -11
  386. package/src/nameserver-history-viewer/types/load-history-info-sql.types.ts +0 -17
  387. package/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.ts +0 -6
  388. package/src/nameserver-history-viewer/types/load-history-info-threads.types.ts +0 -10
  389. package/src/nameserver-history-viewer/types/load-history-info.types.ts +0 -24
  390. package/src/nameserver-history-viewer/types/port.types.ts +0 -5
  391. package/src/nameserver-history-viewer/types/scale-group.types.ts +0 -15
  392. package/src/nameserver-history-viewer/types/unit-category.types.ts +0 -8
  393. package/src/nameserver-history-viewer/types/unit.types.ts +0 -12
  394. package/src/nameserver-history-viewer/utils/chart-util.spec.ts +0 -22
  395. package/src/nameserver-history-viewer/utils/chart-util.ts +0 -30
  396. package/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.ts +0 -104
  397. package/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.ts +0 -95
  398. package/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.ts +0 -196
  399. package/src/nameserver-history-viewer/utils/chartjs-downsample/index.ts +0 -44
  400. package/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.ts +0 -158
  401. package/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.ts +0 -249
  402. package/src/nameserver-history-viewer/utils/chartjs-downsample/utils.ts +0 -122
  403. package/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.ts +0 -602
  404. package/src/nameserver-history-viewer/utils/chartjs-zoom/index.ts +0 -1
  405. package/src/nameserver-history-viewer/utils/file-util.spec.ts +0 -108
  406. package/src/nameserver-history-viewer/utils/file-util.ts +0 -149
  407. package/src/nameserver-history-viewer/utils/index.ts +0 -4
  408. package/src/nameserver-history-viewer/utils/time-util.spec.ts +0 -21
  409. package/src/nameserver-history-viewer/utils/time-util.ts +0 -113
  410. package/src/nameserver-history-viewer/utils/ui-util.spec.ts +0 -87
  411. package/src/nameserver-history-viewer/utils/ui-util.ts +0 -171
  412. package/src/polyfills.ts +0 -80
  413. package/src/test.ts +0 -20
  414. package/src/tsconfig.app.json +0 -12
  415. package/src/tsconfig.spec.json +0 -19
  416. package/tsconfig.json +0 -22
  417. package/tslint.json +0 -130
@@ -0,0 +1,390 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { calculateValue, calculateValue4Time, getDefaultPort, getPort, getTimeFromTimeZone, isSamePort, isValidPort, printProcessedTime, validateData } from '../utils';
3
+ import { parse } from 'papaparse';
4
+ import { Abort } from '../types';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * prevent browser from crashing, set the max rows limitation.
8
+ * This could be overwritten by the input:maxRowsLimitation of the component.
9
+ */
10
+ const _DEFAULT_MAX_ROWS_IN_MEMORY = 100000;
11
+ export class FileService {
12
+ /**
13
+ * prevent browser from crashing, set the max rows limitation.
14
+ * @param limitation if this parameter is not null, the default value will be overwritten by this one.
15
+ */
16
+ static _getMaxRowsLimitation(limitation = null) {
17
+ if (limitation == null || isNaN(limitation) || limitation.length === 0) {
18
+ return _DEFAULT_MAX_ROWS_IN_MEMORY;
19
+ }
20
+ return Number(limitation);
21
+ }
22
+ /**
23
+ * get all available ports from data
24
+ */
25
+ static _getPorts(data, firstChunk, ports) {
26
+ let line = 0;
27
+ if (firstChunk) {
28
+ // start from line 3
29
+ line = 2;
30
+ }
31
+ for (; line < data.length; line++) {
32
+ const dataItem = data[line][1];
33
+ if (dataItem != null && dataItem.length > 0) {
34
+ if (isValidPort(dataItem) && ports.indexOf(dataItem) === -1) {
35
+ ports.push(dataItem);
36
+ }
37
+ }
38
+ }
39
+ }
40
+ /**
41
+ * get the time column from the analyzed data
42
+ * @param data the analyzed data
43
+ * @param firstChunk whether it's first chunk or not
44
+ * @param startTime selected starting time. It's millisecond, need to be converted second.
45
+ * @param endTime selected ending time. It's millisecond, need to be converted second.
46
+ * @param lastProcessedTime last processed time form last chunk
47
+ * @param time time object which contains the time data for all ports
48
+ * @param selectedPort if the selected port is empty (did not select any port), all ports info are needed
49
+ * @param isMDC flag for MDC system
50
+ * @param timezone selected timezone
51
+ * @param maxRowsLimitation prevent browser from crashing, set the max rows limitation.
52
+ * This comes from the input: maxRowsLimitation of the component.
53
+ */
54
+ static _getTimeColumn(data, firstChunk, startTime, endTime, lastProcessedTime, time, selectedPort, isMDC, timezone, maxRowsLimitation) {
55
+ // convert millisecond to second for startTime and endTime.
56
+ startTime = startTime / 1000;
57
+ endTime = endTime / 1000;
58
+ const timeColumn = 2;
59
+ let startLine = 0;
60
+ let iStart = -1;
61
+ let iEnd = -1;
62
+ let curTime = lastProcessedTime;
63
+ let lastProcessedTimeReturn;
64
+ let totalNum = 0;
65
+ let mdcFlag = isMDC;
66
+ const defaultPort = getDefaultPort();
67
+ const maxRowNum = this._getMaxRowsLimitation(maxRowsLimitation);
68
+ if (firstChunk) {
69
+ if (curTime >= startTime && curTime <= endTime) {
70
+ iStart = 1; // start from first line
71
+ /** Modified at 2018/10/10,
72
+ * in some case, eg: the nameserver history trace gets modified by Kook, Jin Young's python script,
73
+ * the port show in the first line as well, and does not like the non-mdc system, this kind of file has
74
+ * one port in it. The history for non-mdc system doesn't have port info in the port column.*/
75
+ // get port for the line 1.
76
+ const firstLinePort = getPort(data[1][1]);
77
+ // init time array for the first line.
78
+ if (!selectedPort || selectedPort.length === 0 || isSamePort(firstLinePort, selectedPort, mdcFlag)) {
79
+ // does not select any port or
80
+ // it's non-mdc (mdcFlag is false at the beginning) system and the selected port is the first line port
81
+ time[firstLinePort] = [];
82
+ time[firstLinePort][0] = curTime * 1000;
83
+ }
84
+ }
85
+ lastProcessedTimeReturn = curTime;
86
+ startLine = 2;
87
+ }
88
+ // get current total number
89
+ Object.keys(time).forEach(key => {
90
+ if (time[key]) {
91
+ totalNum += time[key].length;
92
+ }
93
+ });
94
+ if (curTime == null) {
95
+ console.error('getTimeColumn', 'Can not get the time from the file, internal error!');
96
+ return { indexStart: null, indexEnd: null, lastProcessedTime: null, isMDC: null };
97
+ }
98
+ for (let i = startLine; i < data.length; i++) {
99
+ // sometime the last line is empty, need to be skipped.
100
+ if (data[i] == null || data[i].length === 0 || (data[i].length === 1 && data[i][0].length === 0)) {
101
+ continue;
102
+ }
103
+ // get port number and initialize the relative port array in time
104
+ const port = getPort(data[i][1]); // data[i][1] == null || data[i][1].length == 0 ? __DEFAULT_PORT : data[i][1];
105
+ if (!(port in time)) {
106
+ // add undefined port to time, then we can find all ports in time
107
+ time[port] = void 0;
108
+ }
109
+ if (time[port] == null && isSamePort(port, selectedPort, mdcFlag)) {
110
+ time[port] = [];
111
+ // if other ports exists in this file, default port will be set to undefined.
112
+ if (!mdcFlag && port !== defaultPort && time[defaultPort]) {
113
+ // update the total num;
114
+ totalNum -= time[defaultPort].length;
115
+ time[defaultPort].length = 0;
116
+ time[defaultPort] = void 0;
117
+ mdcFlag = true;
118
+ }
119
+ }
120
+ curTime = calculateValue4Time(curTime, data[i][timeColumn], timezone);
121
+ if (curTime > endTime) {
122
+ if (iEnd < 0) {
123
+ iEnd = i - 1;
124
+ }
125
+ break;
126
+ }
127
+ if (iStart >= 0) {
128
+ if (time[port]) {
129
+ // not null means it's the selected port
130
+ time[port][time[port].length] = curTime * 1000;
131
+ totalNum++;
132
+ }
133
+ }
134
+ else {
135
+ if (curTime >= startTime && curTime <= endTime) {
136
+ if (time[port]) {
137
+ // only selected port counted in
138
+ if (iStart < 0) {
139
+ iStart = i;
140
+ }
141
+ time[port][time[port].length] = curTime * 1000;
142
+ totalNum++;
143
+ }
144
+ }
145
+ }
146
+ // last processed time need to be recorded anyway
147
+ lastProcessedTimeReturn = curTime;
148
+ if (totalNum >= maxRowNum) {
149
+ iEnd = i;
150
+ break;
151
+ }
152
+ }
153
+ return { indexStart: iStart, indexEnd: iEnd, lastProcessedTime: lastProcessedTimeReturn, isMDC: mdcFlag };
154
+ }
155
+ /**
156
+ * Get data for all columns
157
+ * @param columnNum the total number of columns. For mdc system,
158
+ * the length of each row is different. Host relative data does not exist in tenant line.
159
+ * Needs to use column number from the first line.
160
+ * @param data data parsed by papa
161
+ * @param firstChunk the flag which identifies whether it's the first chunk or not.
162
+ * @param time
163
+ * @param indexStart
164
+ * @param indexEnd
165
+ * @param lastProcessedLine
166
+ * @param resultData the result data after analyzed
167
+ * @param selectedPort
168
+ * @param isMDC
169
+ */
170
+ static _getDataColumns(columnNum, data, firstChunk, time, indexStart, indexEnd, lastProcessedLine, resultData, selectedPort, isMDC) {
171
+ let startLine = 0;
172
+ // for mdc system, the length is not correct (host relative data only exists in the "empty" port line).
173
+ // Needs to use header from the first line.
174
+ // const columnNum = data[0].length;
175
+ if (firstChunk) {
176
+ /**
177
+ * Modified at 2018/10/10,
178
+ * in some case, eg: the nameserver history trace gets modified by Kook, Jin Young's python script,
179
+ * the port show in the first line as well, and does not like the non-mdc system, this kind of file has
180
+ * one port in it. The history for non-mdc system doesn't have port info in the port column.
181
+ */
182
+ // get port for the line 1.
183
+ const firstLinePort = getPort(data[1][1]);
184
+ // Initialize data column with default 'DEFAULT' port if it's not MDC system. MDC system, 'DEFAULT' gets ignored
185
+ if (!isMDC && time[firstLinePort]) {
186
+ resultData[firstLinePort] = [];
187
+ // removed below logic, because first line is the real number, do not need to do the convert.
188
+ // curLine = data[1].slice(3).map(Number);
189
+ for (let j = 3; j < columnNum; j++) {
190
+ const index = j - 3;
191
+ // initialize data array for all columns of the default '0000' port
192
+ resultData[firstLinePort][index] = [];
193
+ // get the first line data of the column if it's included
194
+ if (indexStart === 1) {
195
+ resultData[firstLinePort][index][0] = { x: time[firstLinePort][0], y: lastProcessedLine[index] };
196
+ }
197
+ }
198
+ }
199
+ startLine = 2;
200
+ }
201
+ for (let j = 3; j < columnNum; j++) {
202
+ const index = j - 3;
203
+ for (let i = startLine; i < data.length; i++) {
204
+ // sometime the last line is empty, need to be skipped.
205
+ if (data[i] == null || data[i].length === 0 || (data[i].length === 1 && data[i][0].length === 0)) {
206
+ continue;
207
+ }
208
+ // get port number and initialize the relative port array in data
209
+ const port = getPort(data[i][1]);
210
+ if (resultData[port] == null && isSamePort(port, selectedPort, isMDC)) {
211
+ resultData[port] = [];
212
+ }
213
+ if (resultData[port] && resultData[port][index] == null) {
214
+ resultData[port][index] = [];
215
+ }
216
+ lastProcessedLine[index] = calculateValue(lastProcessedLine[index], data[i][j]);
217
+ if (i >= indexStart && (i <= indexEnd || indexEnd < 0) && indexStart >= 0) {
218
+ if (resultData[port]) {
219
+ const length = resultData[port][index].length;
220
+ resultData[port][index][length] = { x: time[port][length], y: lastProcessedLine[index] };
221
+ }
222
+ }
223
+ else if (indexEnd > 0 && i > indexEnd) {
224
+ break;
225
+ }
226
+ }
227
+ }
228
+ }
229
+ /**
230
+ * Get Chart data from provided file.
231
+ * @param file the nameserver history file
232
+ * @param startTime
233
+ * @param endTime
234
+ * @param port
235
+ * @param timezone
236
+ * @param maxRowsLimitation prevent browser from crashing, set the max rows limitation.
237
+ * @param progress call back function for updating progress
238
+ */
239
+ getChartContentFromFile(file, startTime, endTime, port, timezone, maxRowsLimitation, progress) {
240
+ // load done, beginning parsing
241
+ const beginTime = new Date();
242
+ let firstChunk = true;
243
+ // save last processed data just for the later calculation
244
+ let lastProcessedData;
245
+ // save last processed time just for the later calculation
246
+ let lastProcessedTime;
247
+ // save last processed cursor position for progress calculation.
248
+ // let lastProcessedCursor = 0;
249
+ let indexStart = -1, indexEnd = -1;
250
+ const time = {};
251
+ const data = {};
252
+ let header;
253
+ let host;
254
+ let isMDC = false;
255
+ let columnNum;
256
+ let abortType;
257
+ const rejectAndAbort = (reject, parser) => {
258
+ if (progress) {
259
+ progress(100);
260
+ }
261
+ reject(`${file.name} is empty or the format is not correct.`);
262
+ parser.abort();
263
+ };
264
+ return new Promise((resolve, reject) => {
265
+ parse(file, {
266
+ chunk: (results, parser) => {
267
+ // the progress increment of this step
268
+ // let analyzeStepProgress = (results.meta.cursor - lastProcessedCursor) / file.size * 100;
269
+ printProcessedTime(beginTime, 'step1');
270
+ if (indexEnd >= 0) {
271
+ // already finished, quite.
272
+ return;
273
+ }
274
+ else {
275
+ // reset start point
276
+ indexStart = -1;
277
+ }
278
+ // get time column
279
+ if (firstChunk) {
280
+ if (!validateData(results.data)) {
281
+ return rejectAndAbort(reject, parser);
282
+ }
283
+ // initialize the header
284
+ header = results.data[0].slice(3);
285
+ // get column number
286
+ columnNum = results.data[0].length;
287
+ // get host name
288
+ host = results.data[1][0];
289
+ // get the first line time info from first line, it is a real number, do not need to do the convert with ">,<".
290
+ lastProcessedTime = getTimeFromTimeZone(parseFloat(results.data[1][2]), timezone);
291
+ // get the first line data info from first line, it is a real number, do not need to do the convert with ">,<".
292
+ lastProcessedData = results.data[1].slice(3).map(Number);
293
+ }
294
+ printProcessedTime(beginTime, 'step2');
295
+ if (!lastProcessedData) {
296
+ return rejectAndAbort(reject, parser);
297
+ }
298
+ // get time column
299
+ ({ indexStart, indexEnd, lastProcessedTime, isMDC } = FileService._getTimeColumn(results.data, firstChunk, startTime, endTime, lastProcessedTime, time, port, isMDC, timezone, maxRowsLimitation));
300
+ printProcessedTime(beginTime, 'step3');
301
+ if (indexStart == null && indexEnd == null && lastProcessedTime == null && isMDC == null) {
302
+ return rejectAndAbort(reject, parser);
303
+ }
304
+ // get all other data columns
305
+ FileService._getDataColumns(columnNum, results.data, firstChunk, time, indexStart, indexEnd, lastProcessedData, data, port, isMDC);
306
+ if (firstChunk) {
307
+ firstChunk = false;
308
+ }
309
+ printProcessedTime(beginTime, 'step4');
310
+ if (indexEnd >= 0) {
311
+ // do not need to process the left parts, manually trigger complete
312
+ const processedLines = Object.keys(time).reduce((total, curKey) => time[curKey] ? total + time[curKey].length : total, 0);
313
+ if (processedLines >= FileService._getMaxRowsLimitation(maxRowsLimitation)) {
314
+ abortType = Abort.maxLineNumReached;
315
+ }
316
+ else {
317
+ abortType = Abort.maxTimeRangeReached;
318
+ }
319
+ if (progress) {
320
+ progress(100);
321
+ }
322
+ parser.abort();
323
+ return;
324
+ }
325
+ else {
326
+ // the overall progress if this step is finished
327
+ if (progress) {
328
+ progress(Math.round(results.meta.cursor / file.size * 100));
329
+ }
330
+ // lastProcessedCursor = results.meta.cursor;
331
+ }
332
+ },
333
+ complete: () => {
334
+ printProcessedTime(beginTime, 'step_complete');
335
+ resolve({ header: header, host: host, time: time, data: data, aborted: abortType });
336
+ }
337
+ });
338
+ });
339
+ }
340
+ /**
341
+ * Get all ports from the name server history file
342
+ * @param file the name server history file
343
+ * @param progress call back for updating the progress
344
+ */
345
+ getPortsFromFile(file, progress) {
346
+ const beginTime = new Date();
347
+ let firstChunk = true;
348
+ const ports = [];
349
+ const defaultPort = getDefaultPort();
350
+ return new Promise((resolve, reject) => {
351
+ parse(file, {
352
+ chunk: (results, parser) => {
353
+ // get time column
354
+ if (firstChunk) {
355
+ if (!validateData(results.data)) {
356
+ if (progress) {
357
+ progress(100);
358
+ }
359
+ reject(`${file.name} is empty or the format is not correct.`);
360
+ parser.abort();
361
+ return;
362
+ }
363
+ }
364
+ printProcessedTime(beginTime, 'port.step1');
365
+ FileService._getPorts(results.data, firstChunk, ports);
366
+ if (firstChunk) {
367
+ firstChunk = false;
368
+ }
369
+ if (progress) {
370
+ progress(Math.round(results.meta.cursor / file.size * 100));
371
+ }
372
+ },
373
+ complete: () => {
374
+ // parsing done
375
+ printProcessedTime(beginTime, 'step_complete');
376
+ if (ports.length === 0) {
377
+ ports[0] = defaultPort;
378
+ }
379
+ resolve(ports);
380
+ }
381
+ });
382
+ });
383
+ }
384
+ }
385
+ FileService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FileService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
386
+ FileService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FileService });
387
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FileService, decorators: [{
388
+ type: Injectable
389
+ }] });
390
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL25hbWVzZXJ2ZXItaGlzdG9yeS12aWV3ZXIvc2VydmljZXMvZmlsZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUNMLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLE9BQU8sRUFDUCxtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsWUFBWSxFQUNiLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFDLEtBQUssRUFBbUQsTUFBTSxVQUFVLENBQUM7O0FBRWpGOzs7R0FHRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsTUFBTSxDQUFDO0FBRzNDLE1BQU0sT0FBTyxXQUFXO0lBQ3RCOzs7T0FHRztJQUNLLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxhQUFrQixJQUFJO1FBQ3pELElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEUsT0FBTywyQkFBMkIsQ0FBQztTQUNwQztRQUNELE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBZ0IsRUFBRSxVQUFtQixFQUFFLEtBQWU7UUFDN0UsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsSUFBSSxVQUFVLEVBQUU7WUFDZCxvQkFBb0I7WUFDcEIsSUFBSSxHQUFHLENBQUMsQ0FBQztTQUNWO1FBRUQsT0FBTyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUs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LEVBQUU7Z0NBQ1osUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzZCQUNmOzRCQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLHlDQUF5QyxDQUFDLENBQUM7NEJBQzlELE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs0QkFDZixPQUFPO3lCQUNSO3FCQUNGO29CQUNELGtCQUFrQixDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDNUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDdkQsSUFBSSxVQUFVLEVBQUU7d0JBQ2QsVUFBVSxHQUFHLEtBQUssQ0FBQztxQkFDcEI7b0JBQ0QsSUFBSSxRQUFRLEVBQUU7d0JBQ1osUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUM3RDtnQkFDSCxDQUFDO2dCQUNELFFBQVEsRUFBRSxHQUFHLEVBQUU7b0JBQ2IsZUFBZTtvQkFDZixrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7b0JBQy9DLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7d0JBQ3RCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7cUJBQ3hCO29CQUNELE9BQU8sQ0FBRSxLQUFLLENBQUMsQ0FBQztnQkFDbEIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7eUdBMWFVLFdBQVc7NkdBQVgsV0FBVzs0RkFBWCxXQUFXO2tCQUR2QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBjYWxjdWxhdGVWYWx1ZSxcclxuICBjYWxjdWxhdGVWYWx1ZTRUaW1lLFxyXG4gIGdldERlZmF1bHRQb3J0LFxyXG4gIGdldFBvcnQsXHJcbiAgZ2V0VGltZUZyb21UaW1lWm9uZSxcclxuICBpc1NhbWVQb3J0LFxyXG4gIGlzVmFsaWRQb3J0LFxyXG4gIHByaW50UHJvY2Vzc2VkVGltZSxcclxuICB2YWxpZGF0ZURhdGFcclxufSBmcm9tICcuLi91dGlscyc7XHJcbmltcG9ydCB7cGFyc2V9IGZyb20gJ3BhcGFwYXJzZSc7XHJcbmltcG9ydCB7QWJvcnQsIENoYXJ0Q29udGVudCwgQ2hhcnRDb250ZW50RGF0YSwgQ2hhcnRDb250ZW50VGltZX0gZnJvbSAnLi4vdHlwZXMnO1xyXG5cclxuLyoqXHJcbiAqIHByZXZlbnQgYnJvd3NlciBmcm9tIGNyYXNoaW5nLCBzZXQgdGhlIG1heCByb3dzIGxpbWl0YXRpb24uXHJcbiAqIFRoaXMgY291bGQgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGlucHV0Om1heFJvd3NMaW1pdGF0aW9uIG9mIHRoZSBjb21wb25lbnQuXHJcbiAqL1xyXG5jb25zdCBfREVGQVVMVF9NQVhfUk9XU19JTl9NRU1PUlkgPSAxMDAwMDA7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBGaWxlU2VydmljZSB7XHJcbiAgLyoqXHJcbiAgICogcHJldmVudCBicm93c2VyIGZyb20gY3Jhc2hpbmcsIHNldCB0aGUgbWF4IHJvd3MgbGltaXRhdGlvbi5cclxuICAgKiBAcGFyYW0gbGltaXRhdGlvbiBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgbnVsbCwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGlzIG9uZS5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBfZ2V0TWF4Um93c0xpbWl0YXRpb24obGltaXRhdGlvbjogYW55ID0gbnVsbCkge1xyXG4gICAgaWYgKGxpbWl0YXRpb24gPT0gbnVsbCB8fCBpc05hTihsaW1pdGF0aW9uKSB8fCBsaW1pdGF0aW9uLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gX0RFRkFVTFRfTUFYX1JPV1NfSU5fTUVNT1JZO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE51bWJlcihsaW1pdGF0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGdldCBhbGwgYXZhaWxhYmxlIHBvcnRzIGZyb20gZGF0YVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIF9nZXRQb3J0cyhkYXRhOiBzdHJpbmdbXVtdLCBmaXJzdENodW5rOiBib29sZWFuLCBwb3J0czogc3RyaW5nW10pIHtcclxuICAgIGxldCBsaW5lID0gMDtcclxuICAgIGlmIChmaXJzdENodW5rKSB7XHJcbiAgICAgIC8vIHN0YXJ0IGZyb20gbGluZSAzXHJcbiAgICAgIGxpbmUgPSAyO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoOyBsaW5lIDwgZGF0YS5sZW5ndGg7IGxpbmUrKykge1xyXG4gICAgICBjb25zdCBkYXRhSXRlbSA9IGRhdGFbbGluZV1bMV07XHJcbiAgICAgIGlmIChkYXRhSXRlbSAhPSBudWxsICYmIGRhdGFJdGVtLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpZiAoaXNWYWxpZFBvcnQoZGF0YUl0ZW0pICYmIHBvcnRzLmluZGV4T2YoZGF0YUl0ZW0pID09PSAtMSkge1xyXG4gICAgICAgICAgcG9ydHMucHVzaChkYXRhSXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBnZXQgdGhlIHRpbWUgY29sdW1uIGZyb20gdGhlIGFuYWx5emVkIGRhdGFcclxuICAgKiBAcGFyYW0gZGF0YSB0aGUgYW5hbHl6ZWQgZGF0YVxyXG4gICAqIEBwYXJhbSBmaXJzdENodW5rIHdoZXRoZXIgaXQncyBmaXJzdCBjaHVuayBvciBub3RcclxuICAgKiBAcGFyYW0gc3RhcnRUaW1lIHNlbGVjdGVkIHN0YXJ0aW5nIHRpbWUuIEl0J3MgbWlsbGlzZWNvbmQsIG5lZWQgdG8gYmUgY29udmVydGVkIHNlY29uZC5cclxuICAgKiBAcGFyYW0gZW5kVGltZSBzZWxlY3RlZCBlbmRpbmcgdGltZS4gSXQncyBtaWxsaXNlY29uZCwgbmVlZCB0byBiZSBjb252ZXJ0ZWQgc2Vjb25kLlxyXG4gICAqIEBwYXJhbSBsYXN0UHJvY2Vzc2VkVGltZSBsYXN0IHByb2Nlc3NlZCB0aW1lIGZvcm0gbGFzdCBjaHVua1xyXG4gICAqIEBwYXJhbSB0aW1lIHRpbWUgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSB0aW1lIGRhdGEgZm9yIGFsbCBwb3J0c1xyXG4gICAqIEBwYXJhbSBzZWxlY3RlZFBvcnQgaWYgdGhlIHNlbGVjdGVkIHBvcnQgaXMgZW1wdHkgKGRpZCBub3Qgc2VsZWN0IGFueSBwb3J0KSwgYWxsIHBvcnRzIGluZm8gYXJlIG5lZWRlZFxyXG4gICAqIEBwYXJhbSBpc01EQyBmbGFnIGZvciBNREMgc3lzdGVtXHJcbiAgICogQHBhcmFtIHRpbWV6b25lIHNlbGVjdGVkIHRpbWV6b25lXHJcbiAgICogQHBhcmFtIG1heFJvd3NMaW1pdGF0aW9uIHByZXZlbnQgYnJvd3NlciBmcm9tIGNyYXNoaW5nLCBzZXQgdGhlIG1heCByb3dzIGxpbWl0YXRpb24uXHJcbiAgICogVGhpcyBjb21lcyBmcm9tIHRoZSBpbnB1dDogbWF4Um93c0xpbWl0YXRpb24gb2YgdGhlIGNvbXBvbmVudC5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBfZ2V0VGltZUNvbHVtbihkYXRhOiBzdHJpbmdbXVtdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2h1bms6IGJvb2xlYW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQcm9jZXNzZWRUaW1lOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogQ2hhcnRDb250ZW50VGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBvcnQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01EQzogYm9vbGVhbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lem9uZTogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvd3NMaW1pdGF0aW9uOiBhbnkpIHtcclxuICAgIC8vIGNvbnZlcnQgbWlsbGlzZWNvbmQgdG8gc2Vjb25kIGZvciBzdGFydFRpbWUgYW5kIGVuZFRpbWUuXHJcbiAgICBzdGFydFRpbWUgPSBzdGFydFRpbWUgLyAxMDAwO1xyXG4gICAgZW5kVGltZSA9IGVuZFRpbWUgLyAxMDAwO1xyXG4gICAgY29uc3QgdGltZUNvbHVtbiA9IDI7XHJcbiAgICBsZXQgc3RhcnRMaW5lID0gMDtcclxuICAgIGxldCBpU3RhcnQgPSAtMTtcclxuICAgIGxldCBpRW5kID0gLTE7XHJcblxyXG4gICAgbGV0IGN1clRpbWUgPSBsYXN0UHJvY2Vzc2VkVGltZTtcclxuICAgIGxldCBsYXN0UHJvY2Vzc2VkVGltZVJldHVybjtcclxuICAgIGxldCB0b3RhbE51bSA9IDA7XHJcbiAgICBsZXQgbWRjRmxhZyA9IGlzTURDO1xyXG4gICAgY29uc3QgZGVmYXVsdFBvcnQgPSBnZXREZWZhdWx0UG9ydCgpO1xyXG4gICAgY29uc3QgbWF4Um93TnVtID0gdGhpcy5fZ2V0TWF4Um93c0xpbWl0YXRpb24obWF4Um93c0xpbWl0YXRpb24pO1xyXG5cclxuICAgIGlmIChmaXJzdENodW5rKSB7XHJcbiAgICAgIGlmIChjdXJUaW1lID49IHN0YXJ0VGltZSAmJiBjdXJUaW1lIDw9IGVuZFRpbWUpIHtcclxuICAgICAgICBpU3RhcnQgPSAxOyAvLyBzdGFydCBmcm9tIGZpcnN0IGxpbmVcclxuXHJcbiAgICAgICAgLyoqIE1vZGlmaWVkIGF0IDIwMTgvMTAvMTAsXHJcbiAgICAgICAgICogaW4gc29tZSBjYXNlLCBlZzogdGhlIG5hbWVzZXJ2ZXIgaGlzdG9yeSB0cmFjZSBnZXRzIG1vZGlmaWVkIGJ5IEtvb2ssIEppbiBZb3VuZydzIHB5dGhvbiBzY3JpcHQsXHJcbiAgICAgICAgICogdGhlIHBvcnQgc2hvdyBpbiB0aGUgZmlyc3QgbGluZSBhcyB3ZWxsLCBhbmQgZG9lcyBub3QgbGlrZSB0aGUgbm9uLW1kYyBzeXN0ZW0sIHRoaXMga2luZCBvZiBmaWxlIGhhc1xyXG4gICAgICAgICAqIG9uZSBwb3J0IGluIGl0LiBUaGUgaGlzdG9yeSBmb3Igbm9uLW1kYyBzeXN0ZW0gZG9lc24ndCBoYXZlIHBvcnQgaW5mbyBpbiB0aGUgcG9ydCBjb2x1bW4uKi9cclxuXHJcbiAgICAgICAgICAvLyBnZXQgcG9ydCBmb3IgdGhlIGxpbmUgMS5cclxuICAgICAgICBjb25zdCBmaXJzdExpbmVQb3J0ID0gZ2V0UG9ydChkYXRhWzFdWzFdKTtcclxuICAgICAgICAvLyBpbml0IHRpbWUgYXJyYXkgZm9yIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAgICAgIGlmICghc2VsZWN0ZWRQb3J0IHx8IHNlbGVjdGVkUG9ydC5sZW5ndGggPT09IDAgfHwgaXNTYW1lUG9ydChmaXJzdExpbmVQb3J0LCBzZWxlY3RlZFBvcnQsIG1kY0ZsYWcpKSB7XHJcbiAgICAgICAgICAvLyBkb2VzIG5vdCBzZWxlY3QgYW55IHBvcnQgb3JcclxuICAgICAgICAgIC8vIGl0J3Mgbm9uLW1kYyAobWRjRmxhZyBpcyBmYWxzZSBhdCB0aGUgYmVnaW5uaW5nKSBzeXN0ZW0gYW5kIHRoZSBzZWxlY3RlZCBwb3J0IGlzIHRoZSBmaXJzdCBsaW5lIHBvcnRcclxuICAgICAgICAgIHRpbWVbZmlyc3RMaW5lUG9ydF0gPSBbXTtcclxuICAgICAgICAgIHRpbWVbZmlyc3RMaW5lUG9ydF1bMF0gPSBjdXJUaW1lICogMTAwMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGFzdFByb2Nlc3NlZFRpbWVSZXR1cm4gPSBjdXJUaW1lO1xyXG4gICAgICBzdGFydExpbmUgPSAyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldCBjdXJyZW50IHRvdGFsIG51bWJlclxyXG4gICAgT2JqZWN0LmtleXModGltZSkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBpZiAodGltZVtrZXldKSB7XHJcbiAgICAgICAgdG90YWxOdW0gKz0gdGltZVtrZXldLmxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGN1clRpbWUgPT0gbnVsbCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdnZXRUaW1lQ29sdW1uJywgJ0NhbiBub3QgZ2V0IHRoZSB0aW1lIGZyb20gdGhlIGZpbGUsIGludGVybmFsIGVycm9yIScpO1xyXG4gICAgICByZXR1cm4ge2luZGV4U3RhcnQ6IG51bGwsIGluZGV4RW5kOiBudWxsLCBsYXN0UHJvY2Vzc2VkVGltZTogbnVsbCwgaXNNREM6IG51bGx9O1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSBzdGFydExpbmU7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIC8vIHNvbWV0aW1lIHRoZSBsYXN0IGxpbmUgaXMgZW1wdHksIG5lZWQgdG8gYmUgc2tpcHBlZC5cclxuICAgICAgaWYgKGRhdGFbaV0gPT0gbnVsbCB8fCBkYXRhW2ldLmxlbmd0aCA9PT0gMCB8fCAoZGF0YVtpXS5sZW5ndGggPT09IDEgJiYgZGF0YVtpXVswXS5sZW5ndGggPT09IDApKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGdldCBwb3J0IG51bWJlciBhbmQgaW5pdGlhbGl6ZSB0aGUgcmVsYXRpdmUgcG9ydCBhcnJheSBpbiB0aW1lXHJcbiAgICAgIGNvbnN0IHBvcnQgPSBnZXRQb3J0KGRhdGFbaV1bMV0pOyAvLyBkYXRhW2ldWzFdID09IG51bGwgfHwgZGF0YVtpXVsxXS5sZW5ndGggPT0gMCA/IF9fREVGQVVMVF9QT1JUIDogZGF0YVtpXVsxXTtcclxuICAgICAgaWYgKCEocG9ydCBpbiB0aW1lKSkge1xyXG4gICAgICAgIC8vIGFkZCB1bmRlZmluZWQgcG9ydCB0byB0aW1lLCB0aGVuIHdlIGNhbiBmaW5kIGFsbCBwb3J0cyBpbiB0aW1lXHJcbiAgICAgICAgdGltZVtwb3J0XSA9IHZvaWQgMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGltZVtwb3J0XSA9PSBudWxsICYmIGlzU2FtZVBvcnQocG9ydCwgc2VsZWN0ZWRQb3J0LCBtZGNGbGFnKSkge1xyXG4gICAgICAgIHRpbWVbcG9ydF0gPSBbXTtcclxuICAgICAgICAvLyBpZiBvdGhlciBwb3J0cyBleGlzdHMgaW4gdGhpcyBmaWxlLCBkZWZhdWx0IHBvcnQgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxyXG4gICAgICAgIGlmICghbWRjRmxhZyAmJiBwb3J0ICE9PSBkZWZhdWx0UG9ydCAmJiB0aW1lW2RlZmF1bHRQb3J0XSkge1xyXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSB0b3RhbCBudW07XHJcbiAgICAgICAgICB0b3RhbE51bSAtPSB0aW1lW2RlZmF1bHRQb3J0XS5sZW5ndGg7XHJcbiAgICAgICAgICB0aW1lW2RlZmF1bHRQb3J0XS5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgdGltZVtkZWZhdWx0UG9ydF0gPSB2b2lkIDA7XHJcbiAgICAgICAgICBtZGNGbGFnID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY3VyVGltZSA9IGNhbGN1bGF0ZVZhbHVlNFRpbWUoY3VyVGltZSwgZGF0YVtpXVt0aW1lQ29sdW1uXSwgdGltZXpvbmUpO1xyXG4gICAgICBpZiAoY3VyVGltZSA+IGVuZFRpbWUpIHtcclxuICAgICAgICBpZiAoaUVuZCA8IDApIHtcclxuICAgICAgICAgIGlFbmQgPSBpIC0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGlTdGFydCA+PSAwKSB7XHJcbiAgICAgICAgaWYgKHRpbWVbcG9ydF0pIHtcclxuICAgICAgICAgIC8vIG5vdCBudWxsIG1lYW5zIGl0J3MgdGhlIHNlbGVjdGVkIHBvcnRcclxuICAgICAgICAgIHRpbWVbcG9ydF1bdGltZVtwb3J0XS5sZW5ndGhdID0gY3VyVGltZSAqIDEwMDA7XHJcbiAgICAgICAgICB0b3RhbE51bSArKztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGN1clRpbWUgPj0gc3RhcnRUaW1lICYmIGN1clRpbWUgPD0gZW5kVGltZSkge1xyXG4gICAgICAgICAgaWYgKHRpbWVbcG9ydF0pIHtcclxuICAgICAgICAgICAgLy8gb25seSBzZWxlY3RlZCBwb3J0IGNvdW50ZWQgaW5cclxuICAgICAgICAgICAgaWYgKGlTdGFydCA8IDApIHtcclxuICAgICAgICAgICAgICBpU3RhcnQgPSBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRpbWVbcG9ydF1bdGltZVtwb3J0XS5sZW5ndGhdID0gY3VyVGltZSAqIDEwMDA7XHJcbiAgICAgICAgICAgIHRvdGFsTnVtICsrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBsYXN0IHByb2Nlc3NlZCB0aW1lIG5lZWQgdG8gYmUgcmVjb3JkZWQgYW55d2F5XHJcbiAgICAgIGxhc3RQcm9jZXNzZWRUaW1lUmV0dXJuID0gY3VyVGltZTtcclxuXHJcbiAgICAgIGlmICh0b3RhbE51bSA+PSBtYXhSb3dOdW0pIHtcclxuICAgICAgICBpRW5kID0gaTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtpbmRleFN0YXJ0OiBpU3RhcnQsIGluZGV4RW5kOiBpRW5kLCBsYXN0UHJvY2Vzc2VkVGltZTogbGFzdFByb2Nlc3NlZFRpbWVSZXR1cm4sIGlzTURDOiBtZGNGbGFnfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBkYXRhIGZvciBhbGwgY29sdW1uc1xyXG4gICAqIEBwYXJhbSBjb2x1bW5OdW0gdGhlIHRvdGFsIG51bWJlciBvZiBjb2x1bW5zLiBGb3IgbWRjIHN5c3RlbSxcclxuICAgKiAgICAgICAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgZWFjaCByb3cgaXMgZGlmZmVyZW50LiBIb3N0IHJlbGF0aXZlIGRhdGEgZG9lcyBub3QgZXhpc3QgaW4gdGVuYW50IGxpbmUuXHJcbiAgICogICAgICAgICAgICAgICAgICBOZWVkcyB0byB1c2UgY29sdW1uIG51bWJlciBmcm9tIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAqIEBwYXJhbSBkYXRhICAgICAgZGF0YSBwYXJzZWQgYnkgcGFwYVxyXG4gICAqIEBwYXJhbSBmaXJzdENodW5rIHRoZSBmbGFnIHdoaWNoIGlkZW50aWZpZXMgd2hldGhlciBpdCdzIHRoZSBmaXJzdCBjaHVuayBvciBub3QuXHJcbiAgICogQHBhcmFtIHRpbWVcclxuICAgKiBAcGFyYW0gaW5kZXhTdGFydFxyXG4gICAqIEBwYXJhbSBpbmRleEVuZFxyXG4gICAqIEBwYXJhbSBsYXN0UHJvY2Vzc2VkTGluZVxyXG4gICAqIEBwYXJhbSByZXN1bHREYXRhICAgdGhlIHJlc3VsdCBkYXRhIGFmdGVyIGFuYWx5emVkXHJcbiAgICogQHBhcmFtIHNlbGVjdGVkUG9ydFxyXG4gICAqIEBwYXJhbSBpc01EQ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIF9nZXREYXRhQ29sdW1ucyhjb2x1bW5OdW06IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogc3RyaW5nW11bXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDaHVuazogYm9vbGVhbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogQ2hhcnRDb250ZW50VGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTdGFydDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEVuZDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UHJvY2Vzc2VkTGluZTogbnVtYmVyW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdERhdGE6IENoYXJ0Q29udGVudERhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUG9ydDogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01EQzogYm9vbGVhbikge1xyXG4gICAgbGV0IHN0YXJ0TGluZSA9IDA7XHJcbiAgICAvLyBmb3IgbWRjIHN5c3RlbSwgdGhlIGxlbmd0aCBpcyBub3QgY29ycmVjdCAoaG9zdCByZWxhdGl2ZSBkYXRhIG9ubHkgZXhpc3RzIGluIHRoZSBcImVtcHR5XCIgcG9ydCBsaW5lKS5cclxuICAgIC8vIE5lZWRzIHRvIHVzZSBoZWFkZXIgZnJvbSB0aGUgZmlyc3QgbGluZS5cclxuICAgIC8vIGNvbnN0IGNvbHVtbk51bSA9IGRhdGFbMF0ubGVuZ3RoO1xyXG5cclxuICAgIGlmIChmaXJzdENodW5rKSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBNb2RpZmllZCBhdCAyMDE4LzEwLzEwLFxyXG4gICAgICAgKiBpbiBzb21lIGNhc2UsIGVnOiB0aGUgbmFtZXNlcnZlciBoaXN0b3J5IHRyYWNlIGdldHMgbW9kaWZpZWQgYnkgS29vaywgSmluIFlvdW5nJ3MgcHl0aG9uIHNjcmlwdCxcclxuICAgICAgICogdGhlIHBvcnQgc2hvdyBpbiB0aGUgZmlyc3QgbGluZSBhcyB3ZWxsLCBhbmQgZG9lcyBub3QgbGlrZSB0aGUgbm9uLW1kYyBzeXN0ZW0sIHRoaXMga2luZCBvZiBmaWxlIGhhc1xyXG4gICAgICAgKiBvbmUgcG9ydCBpbiBpdC4gVGhlIGhpc3RvcnkgZm9yIG5vbi1tZGMgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBwb3J0IGluZm8gaW4gdGhlIHBvcnQgY29sdW1uLlxyXG4gICAgICAgKi9cclxuXHJcbiAgICAgIC8vIGdldCBwb3J0IGZvciB0aGUgbGluZSAxLlxyXG4gICAgICBjb25zdCBmaXJzdExpbmVQb3J0ID0gZ2V0UG9ydChkYXRhWzFdWzFdKTtcclxuICAgICAgLy8gSW5pdGlhbGl6ZSBkYXRhIGNvbHVtbiB3aXRoIGRlZmF1bHQgJ0RFRkFVTFQnIHBvcnQgaWYgaXQncyBub3QgTURDIHN5c3RlbS4gTURDIHN5c3RlbSwgJ0RFRkFVTFQnIGdldHMgaWdub3JlZFxyXG4gICAgICBpZiAoIWlzTURDICYmIHRpbWVbZmlyc3RMaW5lUG9ydF0pIHtcclxuICAgICAgICByZXN1bHREYXRhW2ZpcnN0TGluZVBvcnRdID0gW107XHJcbiAgICAgICAgLy8gcmVtb3ZlZCBiZWxvdyBsb2dpYywgYmVjYXVzZSBmaXJzdCBsaW5lIGlzIHRoZSByZWFsIG51bWJlciwgZG8gbm90IG5lZWQgdG8gZG8gdGhlIGNvbnZlcnQuXHJcbiAgICAgICAgLy8gY3VyTGluZSA9IGRhdGFbMV0uc2xpY2UoMykubWFwKE51bWJlcik7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDM7IGogPCBjb2x1bW5OdW07IGorKykge1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBqIC0gMztcclxuXHJcbiAgICAgICAgICAvLyBpbml0aWFsaXplIGRhdGEgYXJyYXkgZm9yIGFsbCBjb2x1bW5zIG9mIHRoZSBkZWZhdWx0ICcwMDAwJyBwb3J0XHJcbiAgICAgICAgICByZXN1bHREYXRhW2ZpcnN0TGluZVBvcnRdW2luZGV4XSA9IFtdO1xyXG4gICAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBsaW5lIGRhdGEgb2YgdGhlIGNvbHVtbiBpZiBpdCdzIGluY2x1ZGVkXHJcbiAgICAgICAgICBpZiAoaW5kZXhTdGFydCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXN1bHREYXRhW2ZpcnN0TGluZVBvcnRdW2luZGV4XVswXSA9IHt4OiB0aW1lW2ZpcnN0TGluZVBvcnRdWzBdLCB5OiBsYXN0UHJvY2Vzc2VkTGluZVtpbmRleF19O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBzdGFydExpbmUgPSAyO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGogPSAzOyBqIDwgY29sdW1uTnVtOyBqKyspIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBqIC0gMztcclxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0TGluZTsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyBzb21ldGltZSB0aGUgbGFzdCBsaW5lIGlzIGVtcHR5LCBuZWVkIHRvIGJlIHNraXBwZWQuXHJcbiAgICAgICAgaWYgKGRhdGFbaV0gPT0gbnVsbCB8fCBkYXRhW2ldLmxlbmd0aCA9PT0gMCB8fCAoZGF0YVtpXS5sZW5ndGggPT09IDEgJiYgZGF0YVtpXVswXS5sZW5ndGggPT09IDApKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGdldCBwb3J0IG51bWJlciBhbmQgaW5pdGlhbGl6ZSB0aGUgcmVsYXRpdmUgcG9ydCBhcnJheSBpbiBkYXRhXHJcbiAgICAgICAgY29uc3QgcG9ydCA9IGdldFBvcnQoZGF0YVtpXVsxXSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdERhdGFbcG9ydF0gPT0gbnVsbCAmJiBpc1NhbWVQb3J0KHBvcnQsIHNlbGVjdGVkUG9ydCwgaXNNREMpKSB7XHJcbiAgICAgICAgICByZXN1bHREYXRhW3BvcnRdID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHREYXRhW3BvcnRdICYmIHJlc3VsdERhdGFbcG9ydF1baW5kZXhdID09IG51bGwpIHtcclxuICAgICAgICAgIHJlc3VsdERhdGFbcG9ydF1baW5kZXhdID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsYXN0UHJvY2Vzc2VkTGluZVtpbmRleF0gPSBjYWxjdWxhdGVWYWx1ZShsYXN0UHJvY2Vzc2VkTGluZVtpbmRleF0sIGRhdGFbaV1bal0pO1xyXG4gICAgICAgIGlmIChpID49IGluZGV4U3RhcnQgJiYgKGkgPD0gaW5kZXhFbmQgfHwgaW5kZXhFbmQgPCAwKSAmJiBpbmRleFN0YXJ0ID49IDApIHtcclxuICAgICAgICAgIGlmIChyZXN1bHREYXRhW3BvcnRdKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHJlc3VsdERhdGFbcG9ydF1baW5kZXhdLmxlbmd0aDtcclxuICAgICAgICAgICAgcmVzdWx0RGF0YVtwb3J0XVtpbmRleF1bbGVuZ3RoXSA9IHt4OiB0aW1lW3BvcnRdW2xlbmd0aF0sIHk6IGxhc3RQcm9jZXNzZWRMaW5lW2luZGV4XX07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleEVuZCA+IDAgJiYgaSA+IGluZGV4RW5kKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBDaGFydCBkYXRhIGZyb20gcHJvdmlkZWQgZmlsZS5cclxuICAgKiBAcGFyYW0gZmlsZSB0aGUgbmFtZXNlcnZlciBoaXN0b3J5IGZpbGVcclxuICAgKiBAcGFyYW0gc3RhcnRUaW1lXHJcbiAgICogQHBhcmFtIGVuZFRpbWVcclxuICAgKiBAcGFyYW0gcG9ydFxyXG4gICAqIEBwYXJhbSB0aW1lem9uZVxyXG4gICAqIEBwYXJhbSBtYXhSb3dzTGltaXRhdGlvbiBwcmV2ZW50IGJyb3dzZXIgZnJvbSBjcmFzaGluZywgc2V0IHRoZSBtYXggcm93cyBsaW1pdGF0aW9uLlxyXG4gICAqIEBwYXJhbSBwcm9ncmVzcyBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yIHVwZGF0aW5nIHByb2dyZXNzXHJcbiAgICovXHJcbiAgcHVibGljIGdldENoYXJ0Q29udGVudEZyb21GaWxlKGZpbGU6IEZpbGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXpvbmU6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Um93c0xpbWl0YXRpb246IGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M6IGFueSk6IFByb21pc2U8Q2hhcnRDb250ZW50PiB7XHJcbiAgICAvLyBsb2FkIGRvbmUsIGJlZ2lubmluZyBwYXJzaW5nXHJcbiAgICBjb25zdCBiZWdpblRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgbGV0IGZpcnN0Q2h1bmsgPSB0cnVlO1xyXG4gICAgLy8gc2F2ZSBsYXN0IHByb2Nlc3NlZCBkYXRhIGp1c3QgZm9yIHRoZSBsYXRlciBjYWxjdWxhdGlvblxyXG4gICAgbGV0IGxhc3RQcm9jZXNzZWREYXRhO1xyXG4gICAgLy8gc2F2ZSBsYXN0IHByb2Nlc3NlZCB0aW1lIGp1c3QgZm9yIHRoZSBsYXRlciBjYWxjdWxhdGlvblxyXG4gICAgbGV0IGxhc3RQcm9jZXNzZWRUaW1lO1xyXG4gICAgLy8gc2F2ZSBsYXN0IHByb2Nlc3NlZCBjdXJzb3IgcG9zaXRpb24gZm9yIHByb2dyZXNzIGNhbGN1bGF0aW9uLlxyXG4gICAgLy8gbGV0IGxhc3RQcm9jZXNzZWRDdXJzb3IgPSAwO1xyXG4gICAgbGV0IGluZGV4U3RhcnQgPSAtMSwgaW5kZXhFbmQgPSAtMTtcclxuICAgIGNvbnN0IHRpbWU6IENoYXJ0Q29udGVudFRpbWUgPSB7fTtcclxuICAgIGNvbnN0IGRhdGE6IENoYXJ0Q29udGVudERhdGEgPSB7fTtcclxuICAgIGxldCBoZWFkZXI7XHJcbiAgICBsZXQgaG9zdDtcclxuICAgIGxldCBpc01EQyA9IGZhbHNlO1xyXG4gICAgbGV0IGNvbHVtbk51bTtcclxuICAgIGxldCBhYm9ydFR5cGU6IEFib3J0O1xyXG5cclxuICAgIGNvbnN0IHJlamVjdEFuZEFib3J0ID0gKHJlamVjdCwgcGFyc2VyKSA9PiB7XHJcbiAgICAgIGlmIChwcm9ncmVzcykge1xyXG4gICAgICAgIHByb2dyZXNzKDEwMCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVqZWN0KGAke2ZpbGUubmFtZX0gaXMgZW1wdHkgb3IgdGhlIGZvcm1hdCBpcyBub3QgY29ycmVjdC5gKTtcclxuICAgICAgcGFyc2VyLmFib3J0KCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgcGFyc2UoZmlsZSwge1xyXG4gICAgICAgIGNodW5rOiAocmVzdWx0cywgcGFyc2VyKSA9PiB7XHJcbiAgICAgICAgICAvLyB0aGUgcHJvZ3Jlc3MgaW5jcmVtZW50IG9mIHRoaXMgc3RlcFxyXG4gICAgICAgICAgLy8gbGV0IGFuYWx5emVTdGVwUHJvZ3Jlc3MgPSAocmVzdWx0cy5tZXRhLmN1cnNvciAtIGxhc3RQcm9jZXNzZWRDdXJzb3IpIC8gZmlsZS5zaXplICogMTAwO1xyXG4gICAgICAgICAgcHJpbnRQcm9jZXNzZWRUaW1lKGJlZ2luVGltZSwgJ3N0ZXAxJyk7XHJcbiAgICAgICAgICBpZiAoaW5kZXhFbmQgPj0gMCkge1xyXG4gICAgICAgICAgICAvLyBhbHJlYWR5IGZpbmlzaGVkLCBxdWl0ZS5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gcmVzZXQgc3RhcnQgcG9pbnRcclxuICAgICAgICAgICAgaW5kZXhTdGFydCA9IC0xO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGdldCB0aW1lIGNvbHVtblxyXG4gICAgICAgICAgaWYgKGZpcnN0Q2h1bmspIHtcclxuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZURhdGEocmVzdWx0cy5kYXRhKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZWplY3RBbmRBYm9ydChyZWplY3QsIHBhcnNlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGhlYWRlclxyXG4gICAgICAgICAgICBoZWFkZXIgPSByZXN1bHRzLmRhdGFbMF0uc2xpY2UoMyk7XHJcbiAgICAgICAgICAgIC8vIGdldCBjb2x1bW4gbnVtYmVyXHJcbiAgICAgICAgICAgIGNvbHVtbk51bSA9IHJlc3VsdHMuZGF0YVswXS5sZW5ndGg7XHJcbiAgICAgICAgICAgIC8vIGdldCBob3N0IG5hbWVcclxuICAgICAgICAgICAgaG9zdCA9IHJlc3VsdHMuZGF0YVsxXVswXTtcclxuICAgICAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBsaW5lIHRpbWUgaW5mbyBmcm9tIGZpcnN0IGxpbmUsIGl0IGlzIGEgcmVhbCBudW1iZXIsIGRvIG5vdCBuZWVkIHRvIGRvIHRoZSBjb252ZXJ0IHdpdGggXCI+LDxcIi5cclxuICAgICAgICAgICAgbGFzdFByb2Nlc3NlZFRpbWUgPSBnZXRUaW1lRnJvbVRpbWVab25lKHBhcnNlRmxvYXQocmVzdWx0cy5kYXRhWzFdWzJdKSwgdGltZXpvbmUpO1xyXG4gICAgICAgICAgICAvLyBnZXQgdGhlIGZpcnN0IGxpbmUgZGF0YSBpbmZvIGZyb20gZmlyc3QgbGluZSwgaXQgaXMgYSByZWFsIG51bWJlciwgZG8gbm90IG5lZWQgdG8gZG8gdGhlIGNvbnZlcnQgd2l0aCBcIj4sPFwiLlxyXG4gICAgICAgICAgICBsYXN0UHJvY2Vzc2VkRGF0YSA9IHJlc3VsdHMuZGF0YVsxXS5zbGljZSgzKS5tYXAoTnVtYmVyKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwcmludFByb2Nlc3NlZFRpbWUoYmVnaW5UaW1lLCAnc3RlcDInKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWxhc3RQcm9jZXNzZWREYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZWplY3RBbmRBYm9ydChyZWplY3QsIHBhcnNlcik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gZ2V0IHRpbWUgY29sdW1uXHJcbiAgICAgICAgICAoe2luZGV4U3RhcnQsIGluZGV4RW5kLCBsYXN0UHJvY2Vzc2VkVGltZSwgaXNNREN9ID0gRmlsZVNlcnZpY2UuX2dldFRpbWVDb2x1bW4oXHJcbiAgICAgICAgICAgIHJlc3VsdHMuZGF0YSwgZmlyc3RDaHVuaywgc3RhcnRUaW1lLCBlbmRUaW1lLCBsYXN0UHJvY2Vzc2VkVGltZSwgdGltZSwgcG9ydCwgaXNNREMsIHRpbWV6b25lLCBtYXhSb3dzTGltaXRhdGlvbikpO1xyXG4gICAgICAgICAgcHJpbnRQcm9jZXNzZWRUaW1lKGJlZ2luVGltZSwgJ3N0ZXAzJyk7XHJcblxyXG4gICAgICAgICAgaWYgKGluZGV4U3RhcnQgPT0gbnVsbCAmJiBpbmRleEVuZCA9PSBudWxsICYmIGxhc3RQcm9jZXNzZWRUaW1lID09IG51bGwgJiYgaXNNREMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0QW5kQWJvcnQocmVqZWN0LCBwYXJzZXIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGdldCBhbGwgb3RoZXIgZGF0YSBjb2x1bW5zXHJcbiAgICAgICAgICBGaWxlU2VydmljZS5fZ2V0RGF0YUNvbHVtbnMoXHJcbiAgICAgICAgICAgIGNvbHVtbk51bSwgcmVzdWx0cy5kYXRhLCBmaXJzdENodW5rLCB0aW1lLCBpbmRleFN0YXJ0LCBpbmRleEVuZCwgbGFzdFByb2Nlc3NlZERhdGEsIGRhdGEsIHBvcnQsIGlzTURDKTtcclxuXHJcbiAgICAgICAgICBpZiAoZmlyc3RDaHVuaykge1xyXG4gICAgICAgICAgICBmaXJzdENodW5rID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcHJpbnRQcm9jZXNzZWRUaW1lKGJlZ2luVGltZSwgJ3N0ZXA0Jyk7XHJcblxyXG4gICAgICAgICAgaWYgKGluZGV4RW5kID49IDApIHtcclxuICAgICAgICAgICAgLy8gZG8gbm90IG5lZWQgdG8gcHJvY2VzcyB0aGUgbGVmdCBwYXJ0cywgbWFudWFsbHkgdHJpZ2dlciBjb21wbGV0ZVxyXG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzZWRMaW5lcyA9IE9iamVjdC5rZXlzKHRpbWUpLnJlZHVjZSgodG90YWwsIGN1cktleSkgPT4gdGltZVtjdXJLZXldID8gdG90YWwgKyB0aW1lW2N1cktleV0ubGVuZ3RoIDogdG90YWwsIDApO1xyXG4gICAgICAgICAgICBpZiAocHJvY2Vzc2VkTGluZXMgPj0gRmlsZVNlcnZpY2UuX2dldE1heFJvd3NMaW1pdGF0aW9uKG1heFJvd3NMaW1pdGF0aW9uKSkge1xyXG4gICAgICAgICAgICAgIGFib3J0VHlwZSA9IEFib3J0Lm1heExpbmVOdW1SZWFjaGVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGFib3J0VHlwZSA9IEFib3J0Lm1heFRpbWVSYW5nZVJlYWNoZWQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgIHByb2dyZXNzKDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyc2VyLmFib3J0KCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHRoZSBvdmVyYWxsIHByb2dyZXNzIGlmIHRoaXMgc3RlcCBpcyBmaW5pc2hlZFxyXG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICBwcm9ncmVzcyhNYXRoLnJvdW5kKHJlc3VsdHMubWV0YS5jdXJzb3IgLyBmaWxlLnNpemUgKiAxMDApKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBsYXN0UHJvY2Vzc2VkQ3Vyc29yID0gcmVzdWx0cy5tZXRhLmN1cnNvcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICBwcmludFByb2Nlc3NlZFRpbWUoYmVnaW5UaW1lLCAnc3RlcF9jb21wbGV0ZScpO1xyXG4gICAgICAgICAgcmVzb2x2ZSAoe2hlYWRlcjogaGVhZGVyLCBob3N0OiBob3N0LCB0aW1lOiB0aW1lLCBkYXRhOiBkYXRhLCBhYm9ydGVkOiBhYm9ydFR5cGV9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIHBvcnRzIGZyb20gdGhlIG5hbWUgc2VydmVyIGhpc3RvcnkgZmlsZVxyXG4gICAqIEBwYXJhbSBmaWxlIHRoZSBuYW1lIHNlcnZlciBoaXN0b3J5IGZpbGVcclxuICAgKiBAcGFyYW0gcHJvZ3Jlc3MgY2FsbCBiYWNrIGZvciB1cGRhdGluZyB0aGUgcHJvZ3Jlc3NcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0UG9ydHNGcm9tRmlsZShmaWxlOiBGaWxlLCBwcm9ncmVzczogYW55KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgY29uc3QgYmVnaW5UaW1lID0gbmV3IERhdGUoKTtcclxuICAgIGxldCBmaXJzdENodW5rID0gdHJ1ZTtcclxuICAgIGNvbnN0IHBvcnRzID0gW107XHJcbiAgICBjb25zdCBkZWZhdWx0UG9ydCA9IGdldERlZmF1bHRQb3J0KCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBwYXJzZShmaWxlLCB7XHJcbiAgICAgICAgY2h1bms6IChyZXN1bHRzLCBwYXJzZXIpID0+IHtcclxuICAgICAgICAgIC8vIGdldCB0aW1lIGNvbHVtblxyXG4gICAgICAgICAgaWYgKGZpcnN0Q2h1bmspIHtcclxuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZURhdGEocmVzdWx0cy5kYXRhKSkge1xyXG4gICAgICAgICAgICAgIGlmIChwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3MoMTAwKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGAke2ZpbGUubmFtZX0gaXMgZW1wdHkgb3IgdGhlIGZvcm1hdCBpcyBub3QgY29ycmVjdC5gKTtcclxuICAgICAgICAgICAgICBwYXJzZXIuYWJvcnQoKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHByaW50UHJvY2Vzc2VkVGltZShiZWdpblRpbWUsICdwb3J0LnN0ZXAxJyk7XHJcbiAgICAgICAgICBGaWxlU2VydmljZS5fZ2V0UG9ydHMocmVzdWx0cy5kYXRhLCBmaXJzdENodW5rLCBwb3J0cyk7XHJcbiAgICAgICAgICBpZiAoZmlyc3RDaHVuaykge1xyXG4gICAgICAgICAgICBmaXJzdENodW5rID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgcHJvZ3Jlc3MoTWF0aC5yb3VuZChyZXN1bHRzLm1ldGEuY3Vyc29yIC8gZmlsZS5zaXplICogMTAwKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgLy8gcGFyc2luZyBkb25lXHJcbiAgICAgICAgICBwcmludFByb2Nlc3NlZFRpbWUoYmVnaW5UaW1lLCAnc3RlcF9jb21wbGV0ZScpO1xyXG4gICAgICAgICAgaWYgKHBvcnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBwb3J0c1swXSA9IGRlZmF1bHRQb3J0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVzb2x2ZSAocG9ydHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,4 @@
1
+ export * from './chart.service';
2
+ export * from './file.service';
3
+ export * from './ui.service';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci9zZXJ2aWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NoYXJ0LnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2ZpbGUuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdWkuc2VydmljZSc7XHJcbiJdfQ==