ngx-hana-nameserver-history-viewer 1.1.1 → 1.1.90

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 (242) hide show
  1. package/README.md +7 -6
  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/fesm2015/ngx-hana-nameserver-history-viewer.mjs +4081 -0
  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 +1 -1
  76. package/package.json +36 -61
  77. package/src/nameserver-history-viewer/components/alert/alert.component.d.ts +4 -1
  78. package/src/nameserver-history-viewer/components/alert/alert.module.d.ts +6 -0
  79. package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.d.ts +3 -0
  80. package/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +3 -0
  81. package/src/nameserver-history-viewer/components/nameserver-history.component.d.ts +33 -14
  82. package/src/nameserver-history-viewer/components/port-selector/port-selector.component.d.ts +4 -1
  83. package/src/nameserver-history-viewer/components/port-selector/port-selector.service.d.ts +3 -0
  84. package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +3 -0
  85. package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +3 -0
  86. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.d.ts +3 -0
  87. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.d.ts +3 -0
  88. package/src/nameserver-history-viewer/index.d.ts +1 -0
  89. package/src/nameserver-history-viewer/nameserver-history.module.d.ts +17 -0
  90. package/src/nameserver-history-viewer/services/chart.service.d.ts +4 -1
  91. package/src/nameserver-history-viewer/services/file.service.d.ts +4 -0
  92. package/src/nameserver-history-viewer/services/ui.service.d.ts +5 -2
  93. package/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.d.ts +3 -0
  94. package/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.d.ts +1 -1
  95. package/src/nameserver-history-viewer/utils/file-util.d.ts +11 -0
  96. package/bundles/ngx-hana-nameserver-history-viewer.umd.js +0 -6298
  97. package/bundles/ngx-hana-nameserver-history-viewer.umd.js.map +0 -1
  98. package/bundles/ngx-hana-nameserver-history-viewer.umd.min.js +0 -2
  99. package/bundles/ngx-hana-nameserver-history-viewer.umd.min.js.map +0 -1
  100. package/esm2015/ngx-hana-nameserver-history-viewer.js +0 -10
  101. package/esm2015/public-api.js +0 -6
  102. package/esm2015/src/nameserver-history-viewer/components/alert/alert.component.js +0 -108
  103. package/esm2015/src/nameserver-history-viewer/components/alert/alert.module.js +0 -21
  104. package/esm2015/src/nameserver-history-viewer/components/alert/index.js +0 -7
  105. package/esm2015/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -141
  106. package/esm2015/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
  107. package/esm2015/src/nameserver-history-viewer/components/index.js +0 -13
  108. package/esm2015/src/nameserver-history-viewer/components/instruction/index.js +0 -6
  109. package/esm2015/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -62
  110. package/esm2015/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -742
  111. package/esm2015/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
  112. package/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
  113. package/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -56
  114. package/esm2015/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
  115. package/esm2015/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -35
  116. package/esm2015/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
  117. package/esm2015/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -68
  118. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
  119. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -135
  120. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -72
  121. package/esm2015/src/nameserver-history-viewer/index.js +0 -6
  122. package/esm2015/src/nameserver-history-viewer/nameserver-history.module.js +0 -42
  123. package/esm2015/src/nameserver-history-viewer/services/chart.service.js +0 -423
  124. package/esm2015/src/nameserver-history-viewer/services/file.service.js +0 -447
  125. package/esm2015/src/nameserver-history-viewer/services/index.js +0 -8
  126. package/esm2015/src/nameserver-history-viewer/services/ui.service.js +0 -817
  127. package/esm2015/src/nameserver-history-viewer/types/abort.types.js +0 -13
  128. package/esm2015/src/nameserver-history-viewer/types/alert.types.js +0 -13
  129. package/esm2015/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
  130. package/esm2015/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
  131. package/esm2015/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
  132. package/esm2015/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
  133. package/esm2015/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
  134. package/esm2015/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
  135. package/esm2015/src/nameserver-history-viewer/types/html-element.type.js +0 -19
  136. package/esm2015/src/nameserver-history-viewer/types/index.js +0 -32
  137. package/esm2015/src/nameserver-history-viewer/types/item.types.js +0 -19
  138. package/esm2015/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
  139. package/esm2015/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
  140. package/esm2015/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
  141. package/esm2015/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
  142. package/esm2015/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
  143. package/esm2015/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
  144. package/esm2015/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
  145. package/esm2015/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
  146. package/esm2015/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -19
  147. package/esm2015/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
  148. package/esm2015/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
  149. package/esm2015/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
  150. package/esm2015/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
  151. package/esm2015/src/nameserver-history-viewer/types/port.types.js +0 -17
  152. package/esm2015/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
  153. package/esm2015/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
  154. package/esm2015/src/nameserver-history-viewer/types/unit.types.js +0 -19
  155. package/esm2015/src/nameserver-history-viewer/utils/chart-util.js +0 -38
  156. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
  157. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
  158. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -213
  159. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
  160. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -158
  161. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -295
  162. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -130
  163. package/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -733
  164. package/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
  165. package/esm2015/src/nameserver-history-viewer/utils/file-util.js +0 -149
  166. package/esm2015/src/nameserver-history-viewer/utils/index.js +0 -9
  167. package/esm2015/src/nameserver-history-viewer/utils/time-util.js +0 -135
  168. package/esm2015/src/nameserver-history-viewer/utils/ui-util.js +0 -203
  169. package/esm5/ngx-hana-nameserver-history-viewer.js +0 -10
  170. package/esm5/public-api.js +0 -6
  171. package/esm5/src/nameserver-history-viewer/components/alert/alert.component.js +0 -140
  172. package/esm5/src/nameserver-history-viewer/components/alert/alert.module.js +0 -25
  173. package/esm5/src/nameserver-history-viewer/components/alert/index.js +0 -7
  174. package/esm5/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -155
  175. package/esm5/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
  176. package/esm5/src/nameserver-history-viewer/components/index.js +0 -13
  177. package/esm5/src/nameserver-history-viewer/components/instruction/index.js +0 -6
  178. package/esm5/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -67
  179. package/esm5/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -990
  180. package/esm5/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
  181. package/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
  182. package/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -81
  183. package/esm5/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
  184. package/esm5/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -26
  185. package/esm5/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
  186. package/esm5/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -58
  187. package/esm5/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
  188. package/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -164
  189. package/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -102
  190. package/esm5/src/nameserver-history-viewer/index.js +0 -6
  191. package/esm5/src/nameserver-history-viewer/nameserver-history.module.js +0 -46
  192. package/esm5/src/nameserver-history-viewer/services/chart.service.js +0 -578
  193. package/esm5/src/nameserver-history-viewer/services/file.service.js +0 -566
  194. package/esm5/src/nameserver-history-viewer/services/index.js +0 -8
  195. package/esm5/src/nameserver-history-viewer/services/ui.service.js +0 -1036
  196. package/esm5/src/nameserver-history-viewer/types/abort.types.js +0 -13
  197. package/esm5/src/nameserver-history-viewer/types/alert.types.js +0 -13
  198. package/esm5/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
  199. package/esm5/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
  200. package/esm5/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
  201. package/esm5/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
  202. package/esm5/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
  203. package/esm5/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
  204. package/esm5/src/nameserver-history-viewer/types/html-element.type.js +0 -19
  205. package/esm5/src/nameserver-history-viewer/types/index.js +0 -32
  206. package/esm5/src/nameserver-history-viewer/types/item.types.js +0 -19
  207. package/esm5/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
  208. package/esm5/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
  209. package/esm5/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
  210. package/esm5/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
  211. package/esm5/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
  212. package/esm5/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
  213. package/esm5/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
  214. package/esm5/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
  215. package/esm5/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -19
  216. package/esm5/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
  217. package/esm5/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
  218. package/esm5/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
  219. package/esm5/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
  220. package/esm5/src/nameserver-history-viewer/types/port.types.js +0 -17
  221. package/esm5/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
  222. package/esm5/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
  223. package/esm5/src/nameserver-history-viewer/types/unit.types.js +0 -19
  224. package/esm5/src/nameserver-history-viewer/utils/chart-util.js +0 -39
  225. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
  226. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
  227. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -307
  228. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
  229. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -232
  230. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -350
  231. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -142
  232. package/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -733
  233. package/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
  234. package/esm5/src/nameserver-history-viewer/utils/file-util.js +0 -150
  235. package/esm5/src/nameserver-history-viewer/utils/index.js +0 -9
  236. package/esm5/src/nameserver-history-viewer/utils/time-util.js +0 -135
  237. package/esm5/src/nameserver-history-viewer/utils/ui-util.js +0 -205
  238. package/fesm2015/ngx-hana-nameserver-history-viewer.js +0 -5223
  239. package/fesm2015/ngx-hana-nameserver-history-viewer.js.map +0 -1
  240. package/fesm5/ngx-hana-nameserver-history-viewer.js +0 -6295
  241. package/fesm5/ngx-hana-nameserver-history-viewer.js.map +0 -1
  242. package/ngx-hana-nameserver-history-viewer.metadata.json +0 -1
@@ -1,990 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import { Component, ElementRef, Input, ViewChild } from '@angular/core';
6
- import { SelectionModel } from '@angular/cdk/collections';
7
- import { setChartHeight, sleep, isEmptyData, getDisplayPort, getFileFromInput, isSameFile, getAbbreviatedFileName, getFileFromDrop, getRealPorts, getTimeString, printProcessedTime, getTimeRangeString, generatePorts, getDefaultTimezone } from '../utils';
8
- import { Abort, Alert, HtmlElement, Item } from '../types';
9
- import { FileService, ChartService, UIService } from '../services';
10
- import 'hammerjs';
11
- import '../utils/chartjs-downsample';
12
- import '../utils/chartjs-zoom';
13
- var NameServerHistoryComponent = /** @class */ (function () {
14
- function NameServerHistoryComponent(fileService, chartService, uiService) {
15
- this.fileService = fileService;
16
- this.chartService = chartService;
17
- this.uiService = uiService;
18
- /**
19
- * time info of the name server history file
20
- */
21
- this.time = {};
22
- /**
23
- * data of the name server history file
24
- */
25
- this.data = {};
26
- /**
27
- * header of the name server history file
28
- */
29
- this.header = [];
30
- /**
31
- * host of the name server history file
32
- */
33
- this.host = 'nameserver history file';
34
- /**
35
- * the progress for reading file
36
- */
37
- this.readProgress = 0;
38
- /**
39
- * selected/dropped file name (abbreviation), full file name will be shown via the tooltips
40
- */
41
- this.abbreviatedFileName = 'or Drop File Here';
42
- /**
43
- * for the instruction step 4
44
- */
45
- this.stepShowChart = false;
46
- }
47
- /**
48
- * @return {?}
49
- */
50
- NameServerHistoryComponent.prototype.ngOnInit = /**
51
- * @return {?}
52
- */
53
- function () {
54
- // this.timezone = this.defaultTimezone;
55
- this.onResize();
56
- // init items' status
57
- // reset chart button will be disable by default later, only be enabled after zoomed
58
- this._toggleItems([
59
- { id: HtmlElement.chartArea, status: false },
60
- { id: HtmlElement.readFileProgress, status: false },
61
- { id: HtmlElement.showChartButton, status: false },
62
- { id: HtmlElement.loadPortsButton, status: true },
63
- { id: HtmlElement.resetChartButton, status: false }
64
- ]);
65
- };
66
- /**
67
- * Reset Chart to initial status
68
- * If legend is already selected/unselected from the list, it wouldn't be restored.
69
- */
70
- /**
71
- * Reset Chart to initial status
72
- * If legend is already selected/unselected from the list, it wouldn't be restored.
73
- * @return {?}
74
- */
75
- NameServerHistoryComponent.prototype.resetChart = /**
76
- * Reset Chart to initial status
77
- * If legend is already selected/unselected from the list, it wouldn't be restored.
78
- * @return {?}
79
- */
80
- function () {
81
- var _this = this;
82
- this._toggleItems([{ id: HtmlElement.resetChartButton, status: false }]);
83
- if (this.tableSource && this._selection) {
84
- this.chartService.resetChart(this.tableSource, this._selection)
85
- .catch(function (e) { return _this._showMessage(Alert.error, e); });
86
- }
87
- };
88
- /**
89
- * read the file and display the chart
90
- */
91
- /**
92
- * read the file and display the chart
93
- * @return {?}
94
- */
95
- NameServerHistoryComponent.prototype.showChart = /**
96
- * read the file and display the chart
97
- * @return {?}
98
- */
99
- function () {
100
- var _this = this;
101
- // after click, this button and reset button needs to be disabled
102
- this._toggleItems([
103
- { id: HtmlElement.resetChartButton, status: false },
104
- { id: HtmlElement.showChartButton, status: false }
105
- ]);
106
- this.stepShowChart = true;
107
- this._initChartEnv().then(function () {
108
- /** @type {?} */
109
- var selectedTime = _this._selectedTimeRange;
110
- if (selectedTime.startTime > selectedTime.endTime) {
111
- _this._showMessage(Alert.error, 'Time range is not correct.');
112
- return;
113
- }
114
- if (_this.file) {
115
- // it's time for displaying the reading progress bar
116
- _this._toggleItems([{ id: HtmlElement.readFileProgress, status: true }]);
117
- return _this._buildChartFromDataFile(_this.file, selectedTime.startTime, selectedTime.endTime, _this.port);
118
- }
119
- }).catch(function (e) {
120
- _this._showMessage(Alert.error, e);
121
- _this._toggleItems([{ id: HtmlElement.readFileProgress, status: false }]);
122
- });
123
- };
124
- /**
125
- * load all ports from file
126
- */
127
- /**
128
- * load all ports from file
129
- * @return {?}
130
- */
131
- NameServerHistoryComponent.prototype.loadPorts = /**
132
- * load all ports from file
133
- * @return {?}
134
- */
135
- function () {
136
- // do confirmation actions
137
- if (this.file) {
138
- // before start loading ports from file, display progress bar and disable the show chart button
139
- this._toggleItems([
140
- { id: HtmlElement.readFileProgress, status: true },
141
- { id: HtmlElement.showChartButton, status: false }
142
- ]);
143
- this._readPortsFromFile(this.file);
144
- }
145
- };
146
- /**
147
- * select name server history file, currently only supports 1 file.
148
- */
149
- /**
150
- * select name server history file, currently only supports 1 file.
151
- * @param {?} event
152
- * @return {?}
153
- */
154
- NameServerHistoryComponent.prototype.fileSelected = /**
155
- * select name server history file, currently only supports 1 file.
156
- * @param {?} event
157
- * @return {?}
158
- */
159
- function (event) {
160
- var _this = this;
161
- /** @type {?} */
162
- var selectedFile = getFileFromInput(event.target);
163
- if (selectedFile) {
164
- if (!isSameFile(this.file, selectedFile)) {
165
- // init port selector
166
- this._initPortSelector().catch(function (e) { return _this._showMessage(Alert.error, e); });
167
- this.file = selectedFile;
168
- this.abbreviatedFileName = getAbbreviatedFileName(this.file.name);
169
- // after file has been selected, the show chart button needs to be enabled
170
- this._toggleItems([{ id: HtmlElement.showChartButton, status: true }]);
171
- }
172
- }
173
- };
174
- /**
175
- * drop name server history file, currently only supports 1 file.
176
- */
177
- /**
178
- * drop name server history file, currently only supports 1 file.
179
- * @param {?} event
180
- * @return {?}
181
- */
182
- NameServerHistoryComponent.prototype.fileDropped = /**
183
- * drop name server history file, currently only supports 1 file.
184
- * @param {?} event
185
- * @return {?}
186
- */
187
- function (event) {
188
- var _this = this;
189
- getFileFromDrop(event)
190
- .then(function (file) {
191
- if (!isSameFile(_this.file, file)) {
192
- // init port selector
193
- _this.file = file;
194
- if (_this.file) {
195
- _this.abbreviatedFileName = getAbbreviatedFileName(_this.file.name);
196
- // after file has been dropped, the show chart button needs to be enabled
197
- _this._toggleItems([{ id: HtmlElement.showChartButton, status: true }]);
198
- }
199
- }
200
- })
201
- .then(function () {
202
- return _this._initPortSelector();
203
- })
204
- .catch(function (e) { return _this._showMessage(Alert.error, e); });
205
- };
206
- /**
207
- * Select one item from selection table, relative dataset will be shown or hidden
208
- */
209
- /**
210
- * Select one item from selection table, relative dataset will be shown or hidden
211
- * @param {?} event
212
- * @return {?}
213
- */
214
- NameServerHistoryComponent.prototype.selectItem = /**
215
- * Select one item from selection table, relative dataset will be shown or hidden
216
- * @param {?} event
217
- * @return {?}
218
- */
219
- function (event) {
220
- var _this = this;
221
- if (event && event.tableRow) {
222
- /** @type {?} */
223
- var row = event.tableRow;
224
- this._selection.toggle(row);
225
- this.chartService.toggleDataInChart(row.KPI, !this._selection.isSelected(row))
226
- .catch(function (e) { return _this._showMessage(Alert.error, e); });
227
- }
228
- };
229
- /**
230
- * recalculating chart height when resizing
231
- */
232
- /**
233
- * recalculating chart height when resizing
234
- * @return {?}
235
- */
236
- NameServerHistoryComponent.prototype.onResize = /**
237
- * recalculating chart height when resizing
238
- * @return {?}
239
- */
240
- function () {
241
- /** @type {?} */
242
- var nameserverHistoryAllElement = this.nameserverHistoryAllRef ? this.nameserverHistoryAllRef.nativeElement : null;
243
- /** @type {?} */
244
- var nameserverHistoryContentElement = this.nameserverHistoryContentRef ? this.nameserverHistoryContentRef.nativeElement : null;
245
- setChartHeight(nameserverHistoryAllElement, nameserverHistoryContentElement);
246
- };
247
- /**
248
- * Switch port and reinitialize chart, triggered by changing the port
249
- * @param port the selected port
250
- */
251
- /**
252
- * Switch port and reinitialize chart, triggered by changing the port
253
- * @param {?} port the selected port
254
- * @return {?}
255
- */
256
- NameServerHistoryComponent.prototype.switchPortForChart = /**
257
- * Switch port and reinitialize chart, triggered by changing the port
258
- * @param {?} port the selected port
259
- * @return {?}
260
- */
261
- function (port) {
262
- var _this = this;
263
- if (port === this._currentChartPort) {
264
- // not to switch port, because the relative port is displaying, no need to render twice.
265
- return;
266
- }
267
- if (!this.file || !port || port.length === 0 || port.slice(1, 3) === '**') {
268
- return;
269
- }
270
- else if (Object.keys(this.time).length > 1 && !getRealPorts(Object.keys(this.time).filter(function (key) { return _this.time[key]; })).includes(port)) {
271
- this._showMessage(Alert.info, "Data of port:" + port + " is not loaded, please load the data first by clicking the \"Show\" button.");
272
- return;
273
- }
274
- // only do switch ports when available ports number > 1
275
- if (Object.keys(this.time).filter(function (key) { return _this.time[key]; }).length > 1) {
276
- // disable the "show chart" and "reset chart" button first
277
- this._toggleItems([
278
- { id: HtmlElement.showChartButton, status: false },
279
- { id: HtmlElement.resetChartButton, status: false }
280
- ]);
281
- // init the environment with switch flag
282
- this._initChartEnv(true).then(function () {
283
- return _this._buildChart(port, null, true);
284
- }).catch(function (e) { return _this._showMessage(Alert.error, e); });
285
- }
286
- };
287
- Object.defineProperty(NameServerHistoryComponent.prototype, "hiddenColumns", {
288
- /**
289
- * get the columns which need to be hidden from the selection table
290
- */
291
- get: /**
292
- * get the columns which need to be hidden from the selection table
293
- * @return {?}
294
- */
295
- function () {
296
- return this.uiService.getHiddenColumns(this.hideMeasureColumns);
297
- },
298
- enumerable: true,
299
- configurable: true
300
- });
301
- Object.defineProperty(NameServerHistoryComponent.prototype, "defaultTimezone", {
302
- /**
303
- * get default timezone
304
- */
305
- get: /**
306
- * get default timezone
307
- * @return {?}
308
- */
309
- function () {
310
- return getDefaultTimezone();
311
- },
312
- enumerable: true,
313
- configurable: true
314
- });
315
- Object.defineProperty(NameServerHistoryComponent.prototype, "kpiColumn", {
316
- /**
317
- * get the key column (KPI)
318
- */
319
- get: /**
320
- * get the key column (KPI)
321
- * @return {?}
322
- */
323
- function () {
324
- return Item.kpi;
325
- },
326
- enumerable: true,
327
- configurable: true
328
- });
329
- Object.defineProperty(NameServerHistoryComponent.prototype, "descColumn", {
330
- /**
331
- * get the key column (KPI)
332
- */
333
- get: /**
334
- * get the key column (KPI)
335
- * @return {?}
336
- */
337
- function () {
338
- return Item.description;
339
- },
340
- enumerable: true,
341
- configurable: true
342
- });
343
- Object.defineProperty(NameServerHistoryComponent.prototype, "_selectedTimeRange", {
344
- /**
345
- * get the selected time range, set second and millisecond part to 0
346
- */
347
- get: /**
348
- * get the selected time range, set second and millisecond part to 0
349
- * @private
350
- * @return {?}
351
- */
352
- function () {
353
- /** @type {?} */
354
- var startTime = 0;
355
- /** @type {?} */
356
- var endTime = 4102358400000;
357
- if (this.dateTimeRange != null) {
358
- if (this.dateTimeRange.length >= 1) {
359
- // get start time
360
- if (this.dateTimeRange[0]) {
361
- startTime = this.dateTimeRange[0].setSeconds(0, 0);
362
- }
363
- if (this.dateTimeRange[1]) {
364
- endTime = this.dateTimeRange[1].setSeconds(0, 0);
365
- }
366
- }
367
- }
368
- return { startTime: startTime, endTime: endTime };
369
- },
370
- enumerable: true,
371
- configurable: true
372
- });
373
- Object.defineProperty(NameServerHistoryComponent.prototype, "_selectedTimeRangeString", {
374
- /**
375
- * get the time range string, eg: 2018-10-25 10:25 ~ 2018-10-26 10:26
376
- */
377
- get: /**
378
- * get the time range string, eg: 2018-10-25 10:25 ~ 2018-10-26 10:26
379
- * @private
380
- * @return {?}
381
- */
382
- function () {
383
- /** @type {?} */
384
- var selectedTimeRangeString = this._selectedTimeRange;
385
- return getTimeString(selectedTimeRangeString.startTime) + " ~ " + getTimeString(selectedTimeRangeString.endTime);
386
- },
387
- enumerable: true,
388
- configurable: true
389
- });
390
- Object.defineProperty(NameServerHistoryComponent.prototype, "_headerKey", {
391
- /**
392
- * get array of header key
393
- */
394
- get: /**
395
- * get array of header key
396
- * @private
397
- * @return {?}
398
- */
399
- function () {
400
- if (this.header) {
401
- return this.header.map(function (headerItem) { return headerItem.key; });
402
- }
403
- },
404
- enumerable: true,
405
- configurable: true
406
- });
407
- Object.defineProperty(NameServerHistoryComponent.prototype, "_headerText", {
408
- /**
409
- * get array of header text
410
- */
411
- get: /**
412
- * get array of header text
413
- * @private
414
- * @return {?}
415
- */
416
- function () {
417
- return this.header.map(function (headerItem) { return headerItem.text; });
418
- },
419
- enumerable: true,
420
- configurable: true
421
- });
422
- /**
423
- * read ports from the selected nameserver history file
424
- * @param file nameserver history file
425
- */
426
- /**
427
- * read ports from the selected nameserver history file
428
- * @private
429
- * @param {?} file nameserver history file
430
- * @return {?}
431
- */
432
- NameServerHistoryComponent.prototype._readPortsFromFile = /**
433
- * read ports from the selected nameserver history file
434
- * @private
435
- * @param {?} file nameserver history file
436
- * @return {?}
437
- */
438
- function (file) {
439
- var _this = this;
440
- this.fileService.getPortsFromFile(file, function (progress) {
441
- _this.readProgress = progress;
442
- }).then(function (ports) {
443
- return sleep(100).then(function () {
444
- return _this._initPortSelector(ports);
445
- });
446
- }).catch(function (e) { return _this._showMessage(Alert.error, e); });
447
- };
448
- /**
449
- * build chart from the selected nameserver history file
450
- * @param file the nameserver history file
451
- * @param startTime start time
452
- * @param endTime end time
453
- * @param selectedPort selected port for nameserver history file (MDC system)
454
- */
455
- /**
456
- * build chart from the selected nameserver history file
457
- * @private
458
- * @param {?} file the nameserver history file
459
- * @param {?} startTime start time
460
- * @param {?} endTime end time
461
- * @param {?} selectedPort selected port for nameserver history file (MDC system)
462
- * @return {?}
463
- */
464
- NameServerHistoryComponent.prototype._buildChartFromDataFile = /**
465
- * build chart from the selected nameserver history file
466
- * @private
467
- * @param {?} file the nameserver history file
468
- * @param {?} startTime start time
469
- * @param {?} endTime end time
470
- * @param {?} selectedPort selected port for nameserver history file (MDC system)
471
- * @return {?}
472
- */
473
- function (file, startTime, endTime, selectedPort) {
474
- var _this = this;
475
- return this.fileService.getChartContentFromFile(file, startTime, endTime, selectedPort, this.timezone, this.maxRowsLimitation, function (progress) { return _this.readProgress = progress; })
476
- .then(function (result) {
477
- // parsing done
478
- /** @type {?} */
479
- var beginTime = new Date();
480
- /** @type {?} */
481
- var promises = [];
482
- /** @type {?} */
483
- var ports = getRealPorts(Object.keys(result.time), true);
484
- ports.forEach(function (port) {
485
- // convert the unit and generate controlling data for all ports
486
- promises.push(_this.uiService.convertUnitAndGenerateControlData(result.data[port], result.header, port));
487
- });
488
- return Promise.all(promises)
489
- .then(function () {
490
- // get all ports from the analyzed data(time)
491
- // get the port that will be shown in the page
492
- /** @type {?} */
493
- var port = getDisplayPort(ports, selectedPort);
494
- printProcessedTime(beginTime, 'converting step');
495
- ports.forEach(function (portItem) { return _this.uiService.generateYScale(portItem); });
496
- printProcessedTime(beginTime, 'generating YScale step');
497
- _this.data = result.data;
498
- _this.time = result.time;
499
- _this.header = _this.uiService.getHeader(result.header, port);
500
- _this.host = result.host;
501
- if (result.aborted === Abort.maxLineNumReached) {
502
- _this._showMessage(Alert.warning, "Maximum number of lines reached. Processed time range is: " + getTimeRangeString(_this.time) + ".");
503
- }
504
- else {
505
- if (isEmptyData(_this.data)) {
506
- _this._showMessage(Alert.info, "Cannot find any data for the selected time period: " + _this._selectedTimeRangeString);
507
- }
508
- else {
509
- _this._showMessage(Alert.success, "Processed time range is: " + getTimeRangeString(_this.time) + ".");
510
- }
511
- }
512
- return sleep(100).then(function () {
513
- return _this._buildChart(port, ports);
514
- });
515
- });
516
- });
517
- };
518
- /**
519
- * reinitialize the port selector with the ports
520
- */
521
- /**
522
- * reinitialize the port selector with the ports
523
- * @private
524
- * @param {?=} ports
525
- * @param {?=} selectedPort
526
- * @return {?}
527
- */
528
- NameServerHistoryComponent.prototype._initPortSelector = /**
529
- * reinitialize the port selector with the ports
530
- * @private
531
- * @param {?=} ports
532
- * @param {?=} selectedPort
533
- * @return {?}
534
- */
535
- function (ports, selectedPort) {
536
- var _this = this;
537
- if (ports === void 0) { ports = null; }
538
- if (selectedPort === void 0) { selectedPort = null; }
539
- return new Promise(function (resolve) {
540
- // initialization for ngx-select
541
- if (ports != null && ports.length > 1) {
542
- // MDC, remove default '0000' port
543
- _this.ports = generatePorts(getRealPorts(ports), selectedPort);
544
- }
545
- else {
546
- _this.ports = generatePorts(ports);
547
- }
548
- if (ports != null && selectedPort === null) {
549
- // reset status when doing:
550
- // 1. loading ports
551
- // 2. the file doesn't contain the selected Port
552
- _this.readProgress = 0;
553
- // hide the progress bar and enable the "show chart" button
554
- _this._toggleItems([
555
- { id: HtmlElement.readFileProgress, status: false },
556
- { id: HtmlElement.showChartButton, status: true }
557
- ]);
558
- }
559
- resolve();
560
- });
561
- };
562
- /**
563
- * build and display the chart on page
564
- * @param port the selected port
565
- * @param ports all available ports
566
- * @param switchFlag indicates whether this function is triggered from switching ports (no init port selector needed)
567
- */
568
- /**
569
- * build and display the chart on page
570
- * @private
571
- * @param {?} port the selected port
572
- * @param {?} ports all available ports
573
- * @param {?=} switchFlag indicates whether this function is triggered from switching ports (no init port selector needed)
574
- * @return {?}
575
- */
576
- NameServerHistoryComponent.prototype._buildChart = /**
577
- * build and display the chart on page
578
- * @private
579
- * @param {?} port the selected port
580
- * @param {?} ports all available ports
581
- * @param {?=} switchFlag indicates whether this function is triggered from switching ports (no init port selector needed)
582
- * @return {?}
583
- */
584
- function (port, ports, switchFlag) {
585
- var _this = this;
586
- if (switchFlag === void 0) { switchFlag = false; }
587
- /** @type {?} */
588
- var beginTime = new Date();
589
- if (port) {
590
- return Promise.resolve(this._loadSettingsForSelectionsTable(port))
591
- .then(function () {
592
- // get the config
593
- return _this.chartService.buildChart(_this.time[port], _this.data[port], _this.uiService.getYScale(_this._headerKey, port), _this._headerText, _this._headerKey, _this._selection, _this.tableSource, _this._getHostTitle(port), _this.uiService.getDisplayItems(_this._headerKey, port, _this.defaultSelectedItems), _this._onZoom.bind(_this))
594
- .then(function () {
595
- _this.readProgress = 0;
596
- // after chart has been created, show the chart area, hide progress bar and enable the "show chart" button
597
- _this._toggleItems([
598
- { id: HtmlElement.chartArea, status: true },
599
- { id: HtmlElement.readFileProgress, status: false },
600
- { id: HtmlElement.showChartButton, status: true }
601
- ]);
602
- // set port to current displaying port
603
- _this._currentChartPort = port;
604
- printProcessedTime(beginTime, 'step_build_chart');
605
- if (ports && ports.length > 0) {
606
- if (!switchFlag) {
607
- // initialize port selector. Do not need to do it when switching port.
608
- return _this._initPortSelector(ports, port);
609
- }
610
- }
611
- });
612
- });
613
- }
614
- else {
615
- if (ports.length > 0) {
616
- this._showMessage(Alert.warning, 'The selected port does not exist in the name server history file. Please choose a correct port and have a try again.');
617
- if (!switchFlag) {
618
- // initialize port selector. Do not need to do it when switching port.
619
- return this._initPortSelector(ports, port);
620
- }
621
- }
622
- }
623
- };
624
- /**
625
- * get the string that will be displayed on the title area of the chart
626
- * eg: host1 - 30040 (2018-09-05 15:32:32 ~ 2018-09-07 15:32:15)
627
- * @param port selected port
628
- */
629
- /**
630
- * get the string that will be displayed on the title area of the chart
631
- * eg: host1 - 30040 (2018-09-05 15:32:32 ~ 2018-09-07 15:32:15)
632
- * @private
633
- * @param {?} port selected port
634
- * @return {?}
635
- */
636
- NameServerHistoryComponent.prototype._getHostTitle = /**
637
- * get the string that will be displayed on the title area of the chart
638
- * eg: host1 - 30040 (2018-09-05 15:32:32 ~ 2018-09-07 15:32:15)
639
- * @private
640
- * @param {?} port selected port
641
- * @return {?}
642
- */
643
- function (port) {
644
- if (this.host) {
645
- return this.host + " - " + port + " ( " + getTimeRangeString(this.time[port]) + " )";
646
- }
647
- };
648
- /**
649
- * after zoom, enable the reset button.
650
- */
651
- /**
652
- * after zoom, enable the reset button.
653
- * @private
654
- * @return {?}
655
- */
656
- NameServerHistoryComponent.prototype._onZoom = /**
657
- * after zoom, enable the reset button.
658
- * @private
659
- * @return {?}
660
- */
661
- function () {
662
- this._toggleItems([{ id: HtmlElement.resetChartButton, status: true }]);
663
- };
664
- /**
665
- * initialize chart, including: destroy current chart, initialize config, initialize all relative data
666
- */
667
- /**
668
- * initialize chart, including: destroy current chart, initialize config, initialize all relative data
669
- * @private
670
- * @param {?=} switchFlag
671
- * @return {?}
672
- */
673
- NameServerHistoryComponent.prototype._initChartEnv = /**
674
- * initialize chart, including: destroy current chart, initialize config, initialize all relative data
675
- * @private
676
- * @param {?=} switchFlag
677
- * @return {?}
678
- */
679
- function (switchFlag) {
680
- var _this = this;
681
- if (switchFlag === void 0) { switchFlag = false; }
682
- return this.chartService.destroyChart().then(function () {
683
- {
684
- // cleanup other data
685
- _this._toggleItems([{ id: HtmlElement.chartArea, status: false }]);
686
- if (!switchFlag) {
687
- Object.keys(_this.time).forEach(function (key) {
688
- if (_this.time[key]) {
689
- _this.time[key].length = 0;
690
- }
691
- });
692
- _this.time = {};
693
- Object.keys(_this.data).forEach(function (key) {
694
- if (_this.data[key]) {
695
- _this.data[key].length = 0;
696
- }
697
- });
698
- _this.data = {};
699
- _this.header.length = 0;
700
- _this.host = 'nameserver history file';
701
- _this.tableSource = void 0;
702
- _this.readProgress = 0;
703
- _this.uiService.clearLoadHistoryInfos();
704
- }
705
- }
706
- });
707
- };
708
- /**
709
- * Load settings for the selection table (the right part of the chart)
710
- * @param port the selected port
711
- */
712
- /**
713
- * Load settings for the selection table (the right part of the chart)
714
- * @private
715
- * @param {?} port the selected port
716
- * @return {?}
717
- */
718
- NameServerHistoryComponent.prototype._loadSettingsForSelectionsTable = /**
719
- * Load settings for the selection table (the right part of the chart)
720
- * @private
721
- * @param {?} port the selected port
722
- * @return {?}
723
- */
724
- function (port) {
725
- var _this = this;
726
- this.tableSource = this.uiService.getSelectionTableRows(this._headerKey, port, this.defaultSelectedItems);
727
- this._selection = new SelectionModel(true, []);
728
- this.tableSource.forEach(function (row) {
729
- if (_this.uiService.getDisplayItems(_this._headerKey, port, _this.defaultSelectedItems).includes(row.KPI)) {
730
- _this._selection.select(row);
731
- }
732
- });
733
- };
734
- /**
735
- * Show messages
736
- * @param type type of the message
737
- * @param message message text
738
- */
739
- /**
740
- * Show messages
741
- * @private
742
- * @param {?} type type of the message
743
- * @param {?} message message text
744
- * @return {?}
745
- */
746
- NameServerHistoryComponent.prototype._showMessage = /**
747
- * Show messages
748
- * @private
749
- * @param {?} type type of the message
750
- * @param {?} message message text
751
- * @return {?}
752
- */
753
- function (type, message) {
754
- var _this = this;
755
- if (type) {
756
- switch (type) {
757
- case Alert.success:
758
- case Alert.info:
759
- break;
760
- case Alert.warning:
761
- console.warn(message);
762
- break;
763
- case Alert.error:
764
- console.error(message);
765
- }
766
- }
767
- if (this.alertMessage === message) {
768
- // try trigger the change event of the alert.
769
- this.alertMessage = void 0;
770
- setTimeout(function () { return _this.alertMessage = message; }, 100);
771
- }
772
- else {
773
- this.alertMessage = message;
774
- }
775
- this.alertType = type;
776
- };
777
- /**
778
- * toggle items with the provided status (show or hide the relative element on the page)
779
- * @param items items with the relative id and status.
780
- */
781
- /**
782
- * toggle items with the provided status (show or hide the relative element on the page)
783
- * @private
784
- * @param {?} items items with the relative id and status.
785
- * @return {?}
786
- */
787
- NameServerHistoryComponent.prototype._toggleItems = /**
788
- * toggle items with the provided status (show or hide the relative element on the page)
789
- * @private
790
- * @param {?} items items with the relative id and status.
791
- * @return {?}
792
- */
793
- function (items) {
794
- var _this = this;
795
- /** @type {?} */
796
- var getVariableNameByTypeId = function (id) {
797
- switch (id) {
798
- case HtmlElement.chartArea: return 'showChartFlag';
799
- case HtmlElement.readFileProgress: return 'showReadFileProgress';
800
- case HtmlElement.showChartButton: return 'enableShowChartButton';
801
- case HtmlElement.loadPortsButton: return 'enableLoadPortsButton';
802
- case HtmlElement.resetChartButton: return 'enableResetChartButton';
803
- }
804
- };
805
- if (items) {
806
- items.forEach(function (item) {
807
- _this[getVariableNameByTypeId(item.id)] = item.status;
808
- });
809
- }
810
- };
811
- NameServerHistoryComponent.decorators = [
812
- { type: Component, args: [{
813
- selector: 'ngx-hana-nameserver-history-viewer',
814
- template: "<div #nameserverHistoryAll class=\"nameserver-history-all\" (window:resize)=\"onResize()\">\n <div class=\"toolbar-chart\">\n <div class=\"upload-box-content\">\n <div *ngIf=\"!showReadFileProgress\">\n <file-drop-input (fileDrop)=\"fileDropped($event)\" (fileInput)=\"fileSelected($event)\"\n [dropAreaText]= \"abbreviatedFileName\"\n [inputAreaText]=\"'Browse'\"\n [title]=\"file?.name? file.name:'Select a name server history file from your local disk.'\">\n </file-drop-input>\n </div>\n <div *ngIf=\"showReadFileProgress\">\n <progress-bar [progress]=\"readProgress\"></progress-bar>\n </div>\n </div>\n <div class=\"input-time\">\n <div class=\"input-time-range\">\n <time-range-selector [disabled]=\"showReadFileProgress\" [(dateTimeRange)]=\"dateTimeRange\"></time-range-selector>\n </div>\n <div class=\"timezone-selector\">\n <timezone-selector [(timezone)]=\"timezone\" [disabled]=\"showReadFileProgress\"></timezone-selector>\n </div>\n </div>\n\n <div class=\"port-selection\">\n <div class=\"port-selector\">\n <port-selector (portChange)=\"switchPortForChart($event)\" [(port)]=\"port\" [ports]=\"ports\" [disabled]=\"showReadFileProgress\"></port-selector>\n </div>\n <div class=\"port-load-button\">\n <button (click)=\"loadPorts()\" title=\"Load all ports from name server history trace file.\" [disabled]=\"!enableShowChartButton || port || !enableLoadPortsButton\">{{showReadFileProgress? \"Loading...\" : \"Load\"}}</button>\n </div>\n </div>\n\n <div class=\"chart-operation\">\n <div class=\"left\">\n <button (click)=\"showChart()\" title=\"Load and display all data from name server history trace file.\" [disabled]=\"!enableShowChartButton\">{{showReadFileProgress? \"Loading...\" : \"Show\"}}</button>\n </div>\n <div class=\"right\">\n <button (click)=\"resetChart()\" title=\"Reset zoom of chart.\" [disabled]=\"showReadFileProgress || !enableResetChartButton\">Reset Chart</button>\n </div>\n </div>\n </div>\n <div #nameserverHistoryContent class=\"nameserver-history-content\">\n <div class=\"nameserver-history-content-chart\">\n <instruction [(show)]=\"showInstruction\" *ngIf=\"!showChartFlag && showInstruction\"\n [step1Finished]=\"file\"\n [step2Finished]=\"dateTimeRange && (dateTimeRange[0] || dateTimeRange[1]) || timezone != defaultTimezone\"\n [step3Finished]=\"port\"\n [step4Finished]=\"stepShowChart && !enableShowChartButton\"\n [step5Finished]=\"false\">\n </instruction>\n <canvas id=\"chartNameServerHistory\" ></canvas>\n </div>\n <div class=\"nameserver-history-content-controller\" >\n <ngx-selection-table (change)=\"selectItem($event)\" *ngIf=\"showChartFlag\"\n [filter]=\"true\"\n [checkbox]=\"true\"\n [tableSource]=\"tableSource\"\n [keyColumn]=\"kpiColumn\"\n [hiddenColumns]=\"hiddenColumns\"\n [tooltipColumn]=\"descColumn\"\n [searchStyle]=\"'searchAll'\"\n [searchColumn]=\"kpiColumn\"\n [multiSelection]=\"true\">\n </ngx-selection-table>\n </div>\n </div>\n</div>\n<div class=\"message-container\" *ngIf=\"alertMessage\">\n <alert [(alertMessage)]=\"alertMessage\" [alertType]=\"alertType\" [alertTimeout]=\"30000\"></alert>\n</div>\n",
815
- providers: [FileService, ChartService, UIService],
816
- styles: [":host *,:host :after,:host :before{box-sizing:inherit;display:inherit;font-size:inherit;font-weight:inherit;font-family:inherit}:host .hover-box,:host .nameserver-history-all .toolbar-chart .port-selection .port-load-button button:hover{outline:0;box-shadow:0 0 6px #23adff}:host .dashed-box,:host .nameserver-history-all .toolbar-chart .chart-operation button,:host .nameserver-history-all .toolbar-chart .input-time,:host .nameserver-history-all .toolbar-chart .port-selection,:host .nameserver-history-all .toolbar-chart .upload-box-content{background:#f8f8f8;box-shadow:inset 0 20px 20px -20px rgba(0,0,0,.6);border:1px dashed #0782d0}:host .nameserver-history-all .toolbar-chart .port-selection .port-load-button button,:host .solid-box{background:#fff;border:1px solid #ccc;border-radius:4px;line-height:1.42857143}:host .nameserver-history-all{width:98%;min-width:1314px;height:auto;border:1px #0782d0;border-bottom-style:dashed;margin:3px 1%;box-sizing:border-box;display:inline-block;font-size:14px;font-weight:400;font-family:Helvetica,Arial,sans-serif}:host .nameserver-history-all .toolbar-chart{width:100%;height:48px}:host .nameserver-history-all .toolbar-chart button{text-align:center;white-space:nowrap;vertical-align:middle}:host .nameserver-history-all .toolbar-chart button:hover{text-shadow:1px 1px 3px #4169e1;cursor:pointer;font-weight:600}:host .nameserver-history-all .toolbar-chart button:disabled{text-shadow:none;opacity:.65;cursor:default;color:#a9a9a9;font-weight:400}:host .nameserver-history-all .toolbar-chart .upload-box-content{width:20%;height:100%;float:left}:host .nameserver-history-all .toolbar-chart .input-time{margin-left:1%;margin-right:1%;width:43%;height:100%}:host .nameserver-history-all .toolbar-chart .input-time .input-time-range{height:100%;width:57%;float:left}:host .nameserver-history-all .toolbar-chart .input-time .timezone-selector{margin-top:6px;height:100%;width:42.5%;margin-right:.5%;float:right}:host .nameserver-history-all .toolbar-chart .port-selection{width:14%;margin-right:1%;height:48px}:host .nameserver-history-all .toolbar-chart .port-selection .port-selector{margin-top:6px;margin-left:2%;margin-right:1%;width:47%;float:left}:host .nameserver-history-all .toolbar-chart .port-selection .port-load-button{margin-top:6px;margin-left:1%;margin-right:2%;width:47%;float:right}:host .nameserver-history-all .toolbar-chart .port-selection .port-load-button button{color:#333;width:100%;padding:6px 12px;margin-bottom:0}:host .nameserver-history-all .toolbar-chart .port-selection .port-load-button button:hover{text-shadow:None;font-weight:400}:host .nameserver-history-all .toolbar-chart .port-selection .port-load-button button:disabled{box-shadow:none}:host .nameserver-history-all .toolbar-chart .chart-operation{width:20%;height:48px;float:right}:host .nameserver-history-all .toolbar-chart .chart-operation .left{margin-right:1%;width:49%;height:100%;float:left}:host .nameserver-history-all .toolbar-chart .chart-operation .right{width:50%;height:100%;float:right}:host .nameserver-history-all .toolbar-chart .chart-operation button{width:100%;height:100%;color:#00008b}:host .nameserver-history-all .nameserver-history-content{width:100%;height:730px;margin:5px 5px 5px 0}:host .nameserver-history-all .nameserver-history-content .nameserver-history-content-chart{width:75%;height:100%;position:relative;float:left}:host .nameserver-history-all .nameserver-history-content .nameserver-history-content-controller{width:25%;height:100%;float:right;overflow:auto}:host .message-container{width:98%;margin:0 1%;box-sizing:border-box;display:inline-block}"]
817
- }] }
818
- ];
819
- /** @nocollapse */
820
- NameServerHistoryComponent.ctorParameters = function () { return [
821
- { type: FileService },
822
- { type: ChartService },
823
- { type: UIService }
824
- ]; };
825
- NameServerHistoryComponent.propDecorators = {
826
- nameserverHistoryAllRef: [{ type: ViewChild, args: ['nameserverHistoryAll', { read: ElementRef },] }],
827
- nameserverHistoryContentRef: [{ type: ViewChild, args: ['nameserverHistoryContent', { read: ElementRef },] }],
828
- defaultSelectedItems: [{ type: Input }],
829
- hideMeasureColumns: [{ type: Input }],
830
- maxRowsLimitation: [{ type: Input }],
831
- showInstruction: [{ type: Input }],
832
- timezone: [{ type: Input }]
833
- };
834
- return NameServerHistoryComponent;
835
- }());
836
- export { NameServerHistoryComponent };
837
- if (false) {
838
- /** @type {?} */
839
- NameServerHistoryComponent.prototype.nameserverHistoryAllRef;
840
- /** @type {?} */
841
- NameServerHistoryComponent.prototype.nameserverHistoryContentRef;
842
- /**
843
- * Input (optional) bind to [defaultSelectedItems]
844
- * @type {?}
845
- */
846
- NameServerHistoryComponent.prototype.defaultSelectedItems;
847
- /**
848
- * Input (optional) bind to [hideMeasureColumns]
849
- * @type {?}
850
- */
851
- NameServerHistoryComponent.prototype.hideMeasureColumns;
852
- /**
853
- * Input (optional) bind to [maxRowsLimitation]
854
- * @type {?}
855
- */
856
- NameServerHistoryComponent.prototype.maxRowsLimitation;
857
- /**
858
- * Input (optional) bind to [showInstruction]
859
- * @type {?}
860
- */
861
- NameServerHistoryComponent.prototype.showInstruction;
862
- /**
863
- * Input (optional) bind to [timezone]
864
- * @type {?}
865
- */
866
- NameServerHistoryComponent.prototype.timezone;
867
- /**
868
- * selected name server history file
869
- * @type {?}
870
- */
871
- NameServerHistoryComponent.prototype.file;
872
- /**
873
- * time info of the name server history file
874
- * @type {?}
875
- */
876
- NameServerHistoryComponent.prototype.time;
877
- /**
878
- * data of the name server history file
879
- * @type {?}
880
- */
881
- NameServerHistoryComponent.prototype.data;
882
- /**
883
- * header of the name server history file
884
- * @type {?}
885
- */
886
- NameServerHistoryComponent.prototype.header;
887
- /**
888
- * host of the name server history file
889
- * @type {?}
890
- */
891
- NameServerHistoryComponent.prototype.host;
892
- /**
893
- * alert message content
894
- * @type {?}
895
- */
896
- NameServerHistoryComponent.prototype.alertMessage;
897
- /**
898
- * alert message type
899
- * @type {?}
900
- */
901
- NameServerHistoryComponent.prototype.alertType;
902
- /**
903
- * selected port
904
- * @type {?}
905
- */
906
- NameServerHistoryComponent.prototype.port;
907
- /**
908
- * all the ports from the nameserver history file
909
- * @type {?}
910
- */
911
- NameServerHistoryComponent.prototype.ports;
912
- /**
913
- * selected time range
914
- * @type {?}
915
- */
916
- NameServerHistoryComponent.prototype.dateTimeRange;
917
- /**
918
- * data source for the selection table (right part of the chart)
919
- * @type {?}
920
- */
921
- NameServerHistoryComponent.prototype.tableSource;
922
- /**
923
- * the progress for reading file
924
- * @type {?}
925
- */
926
- NameServerHistoryComponent.prototype.readProgress;
927
- /**
928
- * selected/dropped file name (abbreviation), full file name will be shown via the tooltips
929
- * @type {?}
930
- */
931
- NameServerHistoryComponent.prototype.abbreviatedFileName;
932
- /**
933
- * for the instruction step 4
934
- * @type {?}
935
- */
936
- NameServerHistoryComponent.prototype.stepShowChart;
937
- /**
938
- * control flag for showing the name server history chart
939
- * @type {?}
940
- */
941
- NameServerHistoryComponent.prototype.showChartFlag;
942
- /**
943
- * control flag for showing the file reading progress
944
- * @type {?}
945
- */
946
- NameServerHistoryComponent.prototype.showReadFileProgress;
947
- /**
948
- * control flag for "Load" ports button
949
- * @type {?}
950
- */
951
- NameServerHistoryComponent.prototype.enableLoadPortsButton;
952
- /**
953
- * control flag for enabling "Show" chart button
954
- * @type {?}
955
- */
956
- NameServerHistoryComponent.prototype.enableShowChartButton;
957
- /**
958
- * control flag for "Reset" chart button
959
- * @type {?}
960
- */
961
- NameServerHistoryComponent.prototype.enableResetChartButton;
962
- /**
963
- * selection information for the selection table
964
- * @type {?}
965
- * @private
966
- */
967
- NameServerHistoryComponent.prototype._selection;
968
- /**
969
- * current displaying port
970
- * @type {?}
971
- * @private
972
- */
973
- NameServerHistoryComponent.prototype._currentChartPort;
974
- /**
975
- * @type {?}
976
- * @private
977
- */
978
- NameServerHistoryComponent.prototype.fileService;
979
- /**
980
- * @type {?}
981
- * @private
982
- */
983
- NameServerHistoryComponent.prototype.chartService;
984
- /**
985
- * @type {?}
986
- * @private
987
- */
988
- NameServerHistoryComponent.prototype.uiService;
989
- }
990
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZXNlcnZlci1oaXN0b3J5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1oYW5hLW5hbWVzZXJ2ZXItaGlzdG9yeS12aWV3ZXIvIiwic291cmNlcyI6WyJzcmMvbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci9jb21wb25lbnRzL25hbWVzZXJ2ZXItaGlzdG9yeS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTFELE9BQU8sRUFDTCxjQUFjLEVBQ2QsS0FBSyxFQUNMLFdBQVcsRUFDWCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLFlBQVksRUFDWixhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixhQUFhLEVBQ2Isa0JBQWtCLEVBQ25CLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQWdFLE1BQU0sVUFBVSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVuRSxPQUFPLFVBQVUsQ0FBQztBQUNsQixPQUFPLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sdUJBQXVCLENBQUM7QUFFL0I7SUE0SUUsb0NBQW9CLFdBQXdCLEVBQ3hCLFlBQTBCLEVBQzFCLFNBQW9CO1FBRnBCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGNBQVMsR0FBVCxTQUFTLENBQVc7Ozs7UUFuR3hDLFNBQUksR0FBcUIsRUFBRSxDQUFDOzs7O1FBSzVCLFNBQUksR0FB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SUFLMUMsbURBQXNCOzs7OztJQUt0QixtREFBdUI7Ozs7O0lBS3ZCLDBEQUE4Qjs7Ozs7SUFLOUIsMkRBQStCOzs7OztJQUsvQiwyREFBK0I7Ozs7O0lBSy9CLDREQUFnQzs7Ozs7O0lBS2hDLGdEQUF3Qzs7Ozs7O0lBS3hDLHVEQUFrQzs7Ozs7SUFFdEIsaURBQWdDOzs7OztJQUNoQyxrREFBa0M7Ozs7O0lBQ2xDLCtDQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdwYXBhcGFyc2UnO1xuaW1wb3J0IHtcbiAgc2V0Q2hhcnRIZWlnaHQsXG4gIHNsZWVwLFxuICBpc0VtcHR5RGF0YSxcbiAgZ2V0RGlzcGxheVBvcnQsXG4gIGdldEZpbGVGcm9tSW5wdXQsXG4gIGlzU2FtZUZpbGUsXG4gIGdldEFiYnJldmlhdGVkRmlsZU5hbWUsXG4gIGdldEZpbGVGcm9tRHJvcCxcbiAgZ2V0UmVhbFBvcnRzLFxuICBnZXRUaW1lU3RyaW5nLFxuICBwcmludFByb2Nlc3NlZFRpbWUsXG4gIGdldFRpbWVSYW5nZVN0cmluZyxcbiAgZ2VuZXJhdGVQb3J0cyxcbiAgZ2V0RGVmYXVsdFRpbWV6b25lXG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IEFib3J0LCBBbGVydCwgSHRtbEVsZW1lbnQsIEl0ZW0sIENoYXJ0Q29udGVudERhdGEsIENoYXJ0Q29udGVudEhlYWRlciwgQ2hhcnRDb250ZW50VGltZSwgUG9ydCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEZpbGVTZXJ2aWNlLCBDaGFydFNlcnZpY2UsIFVJU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzJztcblxuaW1wb3J0ICdoYW1tZXJqcyc7XG5pbXBvcnQgJy4uL3V0aWxzL2NoYXJ0anMtZG93bnNhbXBsZSc7XG5pbXBvcnQgJy4uL3V0aWxzL2NoYXJ0anMtem9vbSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1oYW5hLW5hbWVzZXJ2ZXItaGlzdG9yeS12aWV3ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vbmFtZXNlcnZlci1oaXN0b3J5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbICcuL25hbWVzZXJ2ZXItaGlzdG9yeS5jb21wb25lbnQuc2NzcycgXSxcbiAgcHJvdmlkZXJzOiBbIEZpbGVTZXJ2aWNlLCBDaGFydFNlcnZpY2UsIFVJU2VydmljZSBdXG59KVxuZXhwb3J0IGNsYXNzIE5hbWVTZXJ2ZXJIaXN0b3J5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQFZpZXdDaGlsZCgnbmFtZXNlcnZlckhpc3RvcnlBbGwnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgbmFtZXNlcnZlckhpc3RvcnlBbGxSZWY6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ25hbWVzZXJ2ZXJIaXN0b3J5Q29udGVudCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBuYW1lc2VydmVySGlzdG9yeUNvbnRlbnRSZWY6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIElucHV0IChvcHRpb25hbCkgYmluZCB0byBbZGVmYXVsdFNlbGVjdGVkSXRlbXNdXG4gICAqL1xuICBASW5wdXQoKSBkZWZhdWx0U2VsZWN0ZWRJdGVtczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIElucHV0IChvcHRpb25hbCkgYmluZCB0byBbaGlkZU1lYXN1cmVDb2x1bW5zXVxuICAgKi9cbiAgQElucHV0KCkgaGlkZU1lYXN1cmVDb2x1bW5zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogSW5wdXQgKG9wdGlvbmFsKSBiaW5kIHRvIFttYXhSb3dzTGltaXRhdGlvbl1cbiAgICovXG4gIEBJbnB1dCgpIG1heFJvd3NMaW1pdGF0aW9uOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIElucHV0IChvcHRpb25hbCkgYmluZCB0byBbc2hvd0luc3RydWN0aW9uXVxuICAgKi9cbiAgQElucHV0KCkgc2hvd0luc3RydWN0aW9uOiB0cnVlO1xuXG4gIC8qKlxuICAgKiBJbnB1dCAob3B0aW9uYWwpIGJpbmQgdG8gW3RpbWV6b25lXVxuICAgKi9cbiAgQElucHV0KCkgdGltZXpvbmU6IHN0cmluZztcblxuICAvKipcbiAgICogc2VsZWN0ZWQgbmFtZSBzZXJ2ZXIgaGlzdG9yeSBmaWxlXG4gICAqL1xuICBmaWxlOiBGaWxlO1xuXG4gIC8qKlxuICAgKiB0aW1lIGluZm8gb2YgdGhlIG5hbWUgc2VydmVyIGhpc3RvcnkgZmlsZVxuICAgKi9cbiAgdGltZTogQ2hhcnRDb250ZW50VGltZSA9IHt9O1xuXG4gIC8qKlxuICAgKiBkYXRhIG9mIHRoZSBuYW1lIHNlcnZlciBoaXN0b3J5IGZpbGVcbiAgICovXG4gIGRhdGE6IENoYXJ0Q29udGVudERhdGEgPSB7fTtcblxuICAvKipcbiAgICogaGVhZGVyIG9mIHRoZSBuYW1lIHNlcnZlciBoaXN0b3J5IGZpbGVcbiAgICovXG4gIGhlYWRlcjogQ2hhcnRDb250ZW50SGVhZGVyW10gPSBbXTtcblxuICAvKipcbiAgICogaG9zdCBvZiB0aGUgbmFtZSBzZXJ2ZXIgaGlzdG9yeSBmaWxlXG4gICAqL1xuICBob3N0ID0gJ25hbWVzZXJ2ZXIgaGlzdG9yeSBmaWxlJztcblxuICAvKipcbiAgICogYWxlcnQgbWVzc2FnZSBjb250ZW50XG4gICAqL1xuICBhbGVydE1lc3NhZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogYWxlcnQgbWVzc2FnZSB0eXBlXG4gICAqL1xuICBhbGVydFR5cGU6IEFsZXJ0O1xuXG4gIC8qKlxuICAgKiBzZWxlY3RlZCBwb3J0XG4gICAqL1xuICBwb3J0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGFsbCB0aGUgcG9ydHMgZnJvbSB0aGUgbmFtZXNlcnZlciBoaXN0b3J5IGZpbGVcbiAgICovXG4gIHBvcnRzOiBQb3J0W107XG5cbiAgLyoqXG4gICAqIHNlbGVjdGVkIHRpbWUgcmFuZ2VcbiAgICovXG4gIGRhdGVUaW1lUmFuZ2U6IERhdGVbXTtcblxuICAvKipcbiAgICogZGF0YSBzb3VyY2UgZm9yIHRoZSBzZWxlY3Rpb24gdGFibGUgKHJpZ2h0IHBhcnQgb2YgdGhlIGNoYXJ0KVxuICAgKi9cbiAgdGFibGVTb3VyY2U6IGFueVtdO1xuXG4gIC8qKlxuICAgKiB0aGUgcHJvZ3Jlc3MgZm9yIHJlYWRpbmcgZmlsZVxuICAgKi9cbiAgcmVhZFByb2dyZXNzID0gMDtcblxuICAvKipcbiAgICogc2VsZWN0ZWQvZHJvcHBlZCBmaWxlIG5hbWUgKGFiYnJldmlhdGlvbiksIGZ1bGwgZmlsZSBuYW1lIHdpbGwgYmUgc2hvd24gdmlhIHRoZSB0b29sdGlwc1xuICAgKi9cbiAgYWJicmV2aWF0ZWRGaWxlTmFtZSA9ICdvciBEcm9wIEZpbGUgSGVyZSc7XG5cbiAgLyoqXG4gICAqIGZvciB0aGUgaW5zdHJ1Y3Rpb24gc3RlcCA0XG4gICAqL1xuICBzdGVwU2hvd0NoYXJ0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIGNvbnRyb2wgZmxhZyBmb3Igc2hvd2luZyB0aGUgbmFtZSBzZXJ2ZXIgaGlzdG9yeSBjaGFydFxuICAgKi9cbiAgc2hvd0NoYXJ0RmxhZzogYm9vbGVhbjtcblxuICAvKipcbiAgICogY29udHJvbCBmbGFnIGZvciBzaG93aW5nIHRoZSBmaWxlIHJlYWRpbmcgcHJvZ3Jlc3NcbiAgICovXG4gIHNob3dSZWFkRmlsZVByb2dyZXNzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBjb250cm9sIGZsYWcgZm9yIFwiTG9hZFwiIHBvcnRzIGJ1dHRvblxuICAgKi9cbiAgZW5hYmxlTG9hZFBvcnRzQnV0dG9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBjb250cm9sIGZsYWcgZm9yIGVuYWJsaW5nIFwiU2hvd1wiIGNoYXJ0IGJ1dHRvblxuICAgKi9cbiAgZW5hYmxlU2hvd0NoYXJ0QnV0dG9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBjb250cm9sIGZsYWcgZm9yIFwiUmVzZXRcIiBjaGFydCBidXR0b25cbiAgICovXG4gIGVuYWJsZVJlc2V0Q2hhcnRCdXR0b246IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHNlbGVjdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNlbGVjdGlvbiB0YWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBfc2VsZWN0aW9uOiBTZWxlY3Rpb25Nb2RlbDxhbnk+O1xuXG4gIC8qKlxuICAgKiBjdXJyZW50IGRpc3BsYXlpbmcgcG9ydFxuICAgKi9cbiAgcHJpdmF0ZSBfY3VycmVudENoYXJ0UG9ydDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmlsZVNlcnZpY2U6IEZpbGVTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGNoYXJ0U2VydmljZTogQ2hhcnRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHVpU2VydmljZTogVUlTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIHRoaXMudGltZXpvbmUgPSB0aGlzLmRlZmF1bHRUaW1lem9uZTtcbiAgICB0aGlzLm9uUmVzaXplKCk7XG5cbiAgICAvLyBpbml0IGl0ZW1zJyBzdGF0dXNcbiAgICAvLyByZXNldCBjaGFydCBidXR0b24gd2lsbCBiZSBkaXNhYmxlIGJ5IGRlZmF1bHQgbGF0ZXIsIG9ubHkgYmUgZW5hYmxlZCBhZnRlciB6b29tZWRcbiAgICB0aGlzLl90b2dnbGVJdGVtcyhbXG4gICAgICB7aWQ6IEh0bWxFbGVtZW50LmNoYXJ0QXJlYSwgc3RhdHVzOiBmYWxzZX0sXG4gICAgICB7aWQ6IEh0bWxFbGVtZW50LnJlYWRGaWxlUHJvZ3Jlc3MsIHN0YXR1czogZmFsc2V9LFxuICAgICAge2lkOiBIdG1sRWxlbWVudC5zaG93Q2hhcnRCdXR0b24sIHN0YXR1czogZmFsc2V9LFxuICAgICAge2lkOiBIdG1sRWxlbWVudC5sb2FkUG9ydHNCdXR0b24sIHN0YXR1czogdHJ1ZX0sXG4gICAgICB7aWQ6IEh0bWxFbGVtZW50LnJlc2V0Q2hhcnRCdXR0b24sIHN0YXR1czogZmFsc2V9XSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBDaGFydCB0byBpbml0aWFsIHN0YXR1c1xuICAgKiBJZiBsZWdlbmQgaXMgYWxyZWFkeSBzZWxlY3RlZC91bnNlbGVjdGVkIGZyb20gdGhlIGxpc3QsIGl0IHdvdWxkbid0IGJlIHJlc3RvcmVkLlxuICAgKi9cbiAgcmVzZXRDaGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLl90b2dnbGVJdGVtcyhbe2lkOiBIdG1sRWxlbWVudC5yZXNldENoYXJ0QnV0dG9uLCBzdGF0dXM6IGZhbHNlfV0pO1xuXG4gICAgaWYgKHRoaXMudGFibGVTb3VyY2UgJiYgdGhpcy5fc2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLmNoYXJ0U2VydmljZS5yZXNldENoYXJ0KHRoaXMudGFibGVTb3VyY2UsIHRoaXMuX3NlbGVjdGlvbilcbiAgICAgICAgLmNhdGNoKGUgPT4gdGhpcy5fc2hvd01lc3NhZ2UoQWxlcnQuZXJyb3IsIGUpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmVhZCB0aGUgZmlsZSBhbmQgZGlzcGxheSB0aGUgY2hhcnRcbiAgICovXG4gIHNob3dDaGFydCgpOiB2b2lkIHtcbiAgICAvLyBhZnRlciBjbGljaywgdGhpcyBidXR0b24gYW5kIHJlc2V0IGJ1dHRvbiBuZWVkcyB0byBiZSBkaXNhYmxlZFxuICAgIHRoaXMuX3RvZ2dsZUl0ZW1zKFtcbiAgICAgIHtpZDogSHRtbEVsZW1lbnQucmVzZXRDaGFydEJ1dHRvbiwgc3RhdHVzOiBmYWxzZX0sXG4gICAgICB7aWQ6IEh0bWxFbGVtZW50LnNob3dDaGFydEJ1dHRvbiwgc3RhdHVzOiBmYWxzZX1dKTtcblxuICAgIHRoaXMuc3RlcFNob3dDaGFydCA9IHRydWU7XG5cbiAgICB0aGlzLl9pbml0Q2hhcnRFbnYoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkVGltZSA9IHRoaXMuX3NlbGVjdGVkVGltZVJhbmdlO1xuICAgICAgaWYgKHNlbGVjdGVkVGltZS5zdGFydFRpbWUgPiBzZWxlY3RlZFRpbWUuZW5kVGltZSkge1xuICAgICAgICB0aGlzLl9zaG93TWVzc2FnZShBbGVydC5lcnJvciwgJ1RpbWUgcmFuZ2UgaXMgbm90IGNvcnJlY3QuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZpbGUpIHtcbiAgICAgICAgLy8gaXQncyB0aW1lIGZvciBkaXNwbGF5aW5nIHRoZSByZWFkaW5nIHByb2dyZXNzIGJhclxuICAgICAgICB0aGlzLl90b2dnbGVJdGVtcyhbe2lkOiBIdG1sRWxlbWVudC5yZWFkRmlsZVByb2dyZXNzLCBzdGF0dXM6IHRydWV9XSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWlsZENoYXJ0RnJvbURhdGFGaWxlKHRoaXMuZmlsZSwgc2VsZWN0ZWRUaW1lLnN0YXJ0VGltZSwgc2VsZWN0ZWRUaW1lLmVuZFRpbWUsIHRoaXMucG9ydCk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICB0aGlzLl9zaG93TWVzc2FnZShBbGVydC5lcnJvciwgZSk7XG4gICAgICB0aGlzLl90b2dnbGVJdGVtcyhbe2lkOiBIdG1sRWxlbWVudC5yZWFkRmlsZVByb2dyZXNzLCBzdGF0dXM6IGZhbHNlfV0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGxvYWQgYWxsIHBvcnRzIGZyb20gZmlsZVxuICAgKi9cbiAgbG9hZFBvcnRzKCk6IHZvaWQge1xuICAgIC8vIGRvIGNvbmZpcm1hdGlvbiBhY3Rpb25zXG4gICAgaWYgKHRoaXMuZmlsZSkge1xuICAgICAgLy8gYmVmb3JlIHN0YXJ0IGxvYWRpbmcgcG9ydHMgZnJvbSBmaWxlLCBkaXNwbGF5IHByb2dyZXNzIGJhciBhbmQgZGlzYWJsZSB0aGUgc2hvdyBjaGFydCBidXR0b25cbiAgICAgIHRoaXMuX3RvZ2dsZUl0ZW1zKFtcbiAgICAgICAge2lkOiBIdG1sRWxlbWVudC5yZWFkRmlsZVByb2dyZXNzLCBzdGF0dXM6IHRydWV9LFxuICAgICAgICB7aWQ6IEh0bWxFbGVtZW50LnNob3dDaGFydEJ1dHRvbiwgc3RhdHVzOiBmYWxzZX1cbiAgICAgIF0pO1xuICAgICAgdGhpcy5fcmVhZFBvcnRzRnJvbUZpbGUodGhpcy5maWxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2VsZWN0IG5hbWUgc2VydmVyIGhpc3RvcnkgZmlsZSwgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgMSBmaWxlLlxuICAgKi9cbiAgZmlsZVNlbGVjdGVkKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBzZWxlY3RlZEZpbGUgPSBnZXRGaWxlRnJvbUlucHV0KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKHNlbGVjdGVkRmlsZSkge1xuICAgICAgaWYgKCFpc1NhbWVGaWxlKHRoaXMuZmlsZSwgc2VsZWN0ZWRGaWxlKSkge1xuICAgICAgICAvLyBpbml0IHBvcnQgc2VsZWN0b3JcbiAgICAgICAgdGhpcy5faW5pdFBvcnRTZWxlY3RvcigpLmNhdGNoKGUgPT4gdGhpcy5fc2hvd01lc3NhZ2UoQWxlcnQuZXJyb3IsIGUpKTtcblxuICAgICAgICB0aGlzLmZpbGUgPSBzZWxlY3RlZEZpbGU7XG4gICAgICAgIHRoaXMuYWJicmV2aWF0ZWRGaWxlTmFtZSA9IGdldEFiYnJldmlhdGVkRmlsZU5hbWUodGhpcy5maWxlLm5hbWUpO1xuICAgICAgICAvLyBhZnRlciBmaWxlIGhhcyBiZWVuIHNlbGVjdGVkLCB0aGUgc2hvdyBjaGFydCBidXR0b24gbmVlZHMgdG8gYmUgZW5hYmxlZFxuICAgICAgICB0aGlzLl90b2dnbGVJdGVtcyhbe2lkOiBIdG1sRWxlbWVudC5zaG93Q2hhcnRCdXR0b24sIHN0YXR1czogdHJ1ZX1dKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZHJvcCBuYW1lIHNlcnZlciBoaXN0b3J5IGZpbGUsIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIDEgZmlsZS5cbiAgICovXG4gIGZpbGVEcm9wcGVkKGV2ZW50OiBhbnkpIHtcbiAgICBnZXRGaWxlRnJvbURyb3AoZXZlbnQpXG4gICAgICAudGhlbihmaWxlID0+IHtcbiAgICAgICAgaWYgKCFpc1NhbWVGaWxlKHRoaXMuZmlsZSwgZmlsZSkpIHtcbiAgICAgICAgICAvLyBpbml0IHBvcnQgc2VsZWN0b3JcbiAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICAgICAgICAgIGlmICh0aGlzLmZpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWJicmV2aWF0ZWRGaWxlTmFtZSA9IGdldEFiYnJldmlhdGVkRmlsZU5hbWUodGhpcy5maWxlLm5hbWUpO1xuICAgICAgICAgICAgLy8gYWZ0ZXIgZmlsZSBoYXMgYmVlbiBkcm9wcGVkLCB0aGUgc2hvdyBjaGFydCBidXR0b24gbmVlZHMgdG8gYmUgZW5hYmxlZFxuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlSXRlbXMoW3tpZDogSHRtbEVsZW1lbnQuc2hvd0NoYXJ0QnV0dG9uLCBzdGF0dXM6IHRydWV9XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9fSlcbiAgICAgIC50aGVuKCgpID0+ICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbml0UG9ydFNlbGVjdG9yKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGUgPT4gdGhpcy5fc2hvd01lc3NhZ2UoQWxlcnQuZXJyb3IsIGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3Qgb25lIGl0ZW0gZnJvbSBzZWxlY3Rpb24gdGFibGUsIHJlbGF0aXZlIGRhdGFzZXQgd2lsbCBiZSBzaG93biBvciBoaWRkZW5cbiAgICovXG4gIHNlbGVjdEl0ZW0oZXZlbnQ6IGFueSkge1xuICAgIGlmIChldmVudCAmJiBldmVudC50YWJsZVJvdykge1xuICAgICAgY29uc3Qgcm93ID0gZXZlbnQudGFibGVSb3c7XG4gICAgICB0aGlzLl9zZWxlY3Rpb24udG9nZ2xlKHJvdyk7XG4gICAgICB0aGlzLmNoYXJ0U2VydmljZS50b2dnbGVEYXRhSW5DaGFydChyb3cuS1BJLCAhdGhpcy5fc2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KSlcbiAgICAgICAgLmNhdGNoKGUgPT4gdGhpcy5fc2hvd01lc3NhZ2UoQWxlcnQuZXJyb3IsIGUpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmVjYWxjdWxhdGluZyBjaGFydCBoZWlnaHQgd2hlbiByZXNpemluZ1xuICAgKi9cbiAgb25SZXNpemUoKSB7XG4gICAgY29uc3QgbmFtZXNlcnZlckhpc3RvcnlBbGxFbGVtZW50ID0gdGhpcy5uYW1lc2VydmVySGlzdG9yeUFsbFJlZiA/IHRoaXMubmFtZXNlcnZlckhpc3RvcnlBbGxSZWYubmF0aXZlRWxlbWVudCA6IG51bGw7XG4gICAgY29uc3QgbmFtZXNlcnZlckhpc3RvcnlDb250ZW50RWxlbWVudCA9IHRoaXMubmFtZXNlcnZlckhpc3RvcnlDb250ZW50UmVmID8gdGhpcy5uYW1lc2VydmVySGlzdG9yeUNvbnRlbnRSZWYubmF0aXZlRWxlbWVudCA6IG51bGw7XG4gICAgc2V0Q2hhcnRIZWlnaHQobmFtZXNlcnZlckhpc3RvcnlBbGxFbGVtZW50LCBuYW1lc2VydmVySGlzdG9yeUNvbnRlbnRFbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2l0Y2ggcG9ydCBhbmQgcmVpbml0aWFsaXplIGNoYXJ0LCB0cmlnZ2VyZWQgYnkgY2hhbmdpbmcgdGhlIHBvcnRcbiAgICogQHBhcmFtIHBvcnQgdGhlIHNlbGVjdGVkIHBvcnRcbiAgICovXG4gIHN3aXRjaFBvcnRGb3JDaGFydChwb3J0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAocG9ydCA9PT0gdGhpcy5fY3VycmVudENoYXJ0UG9ydCkge1xuICAgICAgLy8gbm90IHRvIHN3aXRjaCBwb3J0LCBiZWNhdXNlIHRoZSByZWxhdGl2ZSBwb3J0IGlzIGRpc3BsYXlpbmcsIG5vIG5lZWQgdG8gcmVuZGVyIHR3aWNlLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZmlsZSB8fCAhcG9ydCB8fCBwb3J0Lmxlbmd0aCA9PT0gMCB8fCBwb3J0LnNsaWNlKDEsIDMpID09PSAnKionKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChPYmplY3Qua2V5cyh0aGlzLnRpbWUpLmxlbmd0aCA+IDEgJiYgIWdldFJlYWxQb3J0cyhPYmplY3Qua2V5cyh0aGlzLnRpbWUpLmZpbHRlcihrZXkgPT4gdGhpcy50aW1lW2tleV0pKS5pbmNsdWRlcyhwb3J0KSkge1xuICAgICAgdGhpcy5fc2hvd01lc3NhZ2UoQWxlcnQuaW5mbywgYERhdGEgb2YgcG9ydDoke3BvcnR9IGlzIG5vdCBsb2FkZWQsIHBsZWFzZSBsb2FkIHRoZSBkYXRhIGZpcnN0IGJ5IGNsaWNraW5nIHRoZSBcIlNob3dcIiBidXR0b24uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gb25seSBkbyBzd2l0Y2ggcG9ydHMgd2hlbiBhdmFpbGFibGUgcG9ydHMgbnVtYmVyID4gMVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnRpbWUpLmZpbHRlcihrZXkgPT4gdGhpcy50aW1lW2tleV0pLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIGRpc2FibGUgdGhlIFwic2hvdyBjaGFydFwiIGFuZCBcInJlc2V0IGNoYXJ0XCIgYnV0dG9uIGZpcnN0XG4gICAgICB0aGlzLl90b2dnbGVJdGVtcyhbXG4gICAgICAgIHtpZDogSHRtbEVsZW1lbnQuc2hvd0NoYXJ0QnV0dG9uLCBzdGF0dXM6IGZhbHNlfSxcbiAgICAgICAge2lkOiBIdG1sRWxlbWVudC5yZXNldENoYXJ0QnV0dG9uLCBzdGF0dXM6IGZhbHNlfV0pO1xuICAgICAgLy8gaW5pdCB0aGUgZW52aXJvbm1lbnQgd2l0aCBzd2l0Y2ggZmxhZ1xuICAgICAgdGhpcy5faW5pdENoYXJ0RW52KHRydWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVpbGRDaGFydChwb3J0LCBudWxsLCB0cnVlKTtcbiAgICAgIH0pLmNhdGNoKGUgPT4gdGhpcy5fc2hvd01lc3NhZ2UoQWxlcnQuZXJyb3IsIGUpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBjb2x1bW5zIHdoaWNoIG5lZWQgdG8gYmUgaGlkZGVuIGZyb20gdGhlIHNlbGVjdGlvbiB0YWJsZVxuICAgKi9cbiAgZ2V0IGhpZGRlbkNvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnVpU2VydmljZS5nZXRIaWRkZW5Db2x1bW5zKHRoaXMuaGlkZU1lYXN1cmVDb2x1bW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgZGVmYXVsdCB0aW1lem9uZVxuICAgKi9cbiAgZ2V0IGRlZmF1bHRUaW1lem9uZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXREZWZhdWx0VGltZXpvbmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIGtleSBjb2x1bW4gKEtQSSlcbiAgICovXG4gIGdldCBrcGlDb2x1bW4oKTogSXRlbSB7XG4gICAgcmV0dXJuIEl0ZW0ua3BpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUga2V5IGNvbHVtbiAoS1BJKVxuICAgKi9cbiAgZ2V0IGRlc2NDb2x1bW4oKTogSXRlbSB7XG4gICAgcmV0dXJuIEl0ZW0uZGVzY3JpcHRpb247XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBzZWxlY3RlZCB0aW1lIHJhbmdlLCBzZXQgc2Vjb25kIGFuZCBtaWxsaXNlY29uZCBwYXJ0IHRvIDBcbiAgICovXG4gIHByaXZhdGUgZ2V0IF9zZWxlY3RlZFRpbWVSYW5nZSgpOiB7c3RhcnRUaW1lOiBudW1iZXIsIGVuZFRpbWU6IG51bWJlcn0ge1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBlbmRUaW1lID0gNDEwMjM1ODQwMDAwMDsgLy8gMjA5OS8xMi8zMVxuICAgIGlmICh0aGlzLmRhdGVUaW1lUmFuZ2UgIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuZGF0ZVRpbWVSYW5nZS5sZW5ndGggPj0gMSkge1xuICAgICAgICAvLyBnZXQgc3RhcnQgdGltZVxuICAgICAgICBpZiAodGhpcy5kYXRlVGltZVJhbmdlWzBdKSB7XG4gICAgICAgICAgc3RhcnRUaW1lID0gdGhpcy5kYXRlVGltZVJhbmdlWzBdLnNldFNlY29uZHMoMCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0ZVRpbWVSYW5nZVsxXSkge1xuICAgICAgICAgIGVuZFRpbWUgPSB0aGlzLmRhdGVUaW1lUmFuZ2VbMV0uc2V0U2Vjb25kcygwLCAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge3N0YXJ0VGltZTogc3RhcnRUaW1lLCBlbmRUaW1lOiBlbmRUaW1lfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIHRpbWUgcmFuZ2Ugc3RyaW5nLCBlZzogMjAxOC0xMC0yNSAxMDoyNSB+IDIwMTgtMTAtMjYgMTA6MjZcbiAgICovXG4gIHByaXZhdGUgZ2V0IF9zZWxlY3RlZFRpbWVSYW5nZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlbGVjdGVkVGltZVJhbmdlU3RyaW5nID0gdGhpcy5fc2VsZWN0ZWRUaW1lUmFuZ2U7XG4gICAgcmV0dXJuIGAke2dldFRpbWVTdHJpbmcoc2VsZWN0ZWRUaW1lUmFuZ2VTdHJpbmcuc3RhcnRUaW1lKX0gfiAke2dldFRpbWVTdHJpbmcoc2VsZWN0ZWRUaW1lUmFuZ2VTdHJpbmcuZW5kVGltZSl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgYXJyYXkgb2YgaGVhZGVyIGtleVxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgX2hlYWRlcktleSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHRoaXMuaGVhZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5oZWFkZXIubWFwKGhlYWRlckl0ZW0gPT4gaGVhZGVySXRlbS5rZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgYXJyYXkgb2YgaGVhZGVyIHRleHRcbiAgICovXG4gIHByaXZhdGUgZ2V0IF9oZWFkZXJUZXh0KCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkZXIubWFwKGhlYWRlckl0ZW0gPT4gaGVhZGVySXRlbS50ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZWFkIHBvcnRzIGZyb20gdGhlIHNlbGVjdGVkIG5hbWVzZXJ2ZXIgaGlzdG9yeSBmaWxlXG4gICAqIEBwYXJhbSBmaWxlIG5hbWVzZXJ2ZXIgaGlzdG9yeSBmaWxlXG4gICAqL1xuICBwcml2YXRlIF9yZWFkUG9ydHNGcm9tRmlsZShmaWxlOiBGaWxlKTogdm9pZCB7XG4gICAgdGhpcy5maWxlU2VydmljZS5nZXRQb3J0c0Zyb21GaWxlKGZpbGUsIChwcm9ncmVzcykgPT4ge1xuICAgICAgdGhpcy5yZWFkUHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICB9KS50aGVuKHBvcnRzID0+IHtcbiAgICAgIHJldHVybiBzbGVlcCgxMDApLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5pdFBvcnRTZWxlY3Rvcihwb3J0cyk7XG4gICAgICB9KTtcbiAgICB9KS5jYXRjaChlID0+IHRoaXMuX3Nob3dNZXNzYWdlKEFsZXJ0LmVycm9yLCBlKSk7XG4gIH1cblxuICAvKipcbiAgICogYnVpbGQgY2hhcnQgZnJvbSB0aGUgc2VsZWN0ZWQgbmFtZXNlcnZlciBoaXN0b3J5IGZpbGVcbiAgICogQHBhcmFtIGZpbGUgdGhlIG5hbWVzZXJ2ZXIgaGlzdG9yeSBmaWxlXG4gICAqIEBwYXJhbSBzdGFydFRpbWUgc3RhcnQgdGltZVxuICAgKiBAcGFyYW0gZW5kVGltZSBlbmQgdGltZVxuICAgKiBAcGFyYW0gc2VsZWN0ZWRQb3J0IHNlbGVjdGVkIHBvcnQgZm9yIG5hbWVzZXJ2ZXIgaGlzdG9yeSBmaWxlIChNREMgc3lzdGVtKVxuICAgKi9cbiAgcHJpdmF0ZSBfYnVpbGRDaGFydEZyb21EYXRhRmlsZShmaWxlOiBGaWxlLCBzdGFydFRpbWU6IG51bWJlciwgZW5kVGltZTogbnVtYmVyLCBzZWxlY3RlZFBvcnQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZVNlcnZpY2UuZ2V0Q2hhcnRDb250ZW50RnJvbUZpbGUoXG4gICAgICBmaWxlLFxuICAgICAgc3RhcnRUaW1lLFxuICAgICAgZW5kVGltZSxcbiAgICAgIHNlbGVjdGVkUG9ydCxcbiAgICAgIHRoaXMudGltZXpvbmUsXG4gICAgICB0aGlzLm1heFJvd3NMaW1pdGF0aW9uLCBwcm9ncmVzcyA9PiB0aGlzLnJlYWRQcm9ncmVzcyA9IHByb2dyZXNzKVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgLy8gcGFyc2luZyBkb25lXG4gICAgICAgIGNvbnN0IGJlZ2luVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIGNvbnN0IHBvcnRzID0gZ2V0UmVhbFBvcnRzKE9iamVjdC5rZXlzKHJlc3VsdC50aW1lKSwgdHJ1ZSk7XG4gICAgICAgIHBvcnRzLmZvckVhY2gocG9ydCA9PiB7XG4gICAgICAgICAgLy8gY29udmVydCB0aGUgdW5pdCBhbmQgZ2VuZXJhdGUgY29udHJvbGxpbmcgZGF0YSBmb3IgYWxsIHBvcnRzXG4gICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnVpU2VydmljZS5jb252ZXJ0VW5pdEFuZEdlbmVyYXRlQ29udHJvbERhdGEocmVzdWx0LmRhdGFbcG9ydF0sIHJlc3VsdC5oZWFkZXIsIHBvcnQpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgLy8gZ2V0IGFsbCBwb3J0cyBmcm9tIHRoZSBhbmFseXplZCBkYXRhKHRpbWUpXG4gICAgICAgICAgICAvLyBnZXQgdGhlIHBvcnQgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBwYWdlXG4gICAgICAgICAgICBjb25zdCBwb3J0ID0gZ2V0RGlzcGxheVBvcnQocG9ydHMsIHNlbGVjdGVkUG9ydCk7XG5cbiAgICAgICAgICAgIHByaW50UHJvY2Vzc2VkVGltZShiZWdpblRpbWUsICdjb252ZXJ0aW5nIHN0ZXAnKTtcbiAgICAgICAgICAgIHBvcnRzLmZvckVhY2goIHBvcnRJdGVtID0+IHRoaXMudWlTZXJ2aWNlLmdlbmVyYXRlWVNjYWxlKHBvcnRJdGVtKSk7XG4gICAgICAgICAgICBwcmludFByb2Nlc3NlZFRpbWUoYmVnaW5UaW1lLCAnZ2VuZXJhdGluZyBZU2NhbGUgc3RlcCcpO1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gcmVzdWx0LmRhdGE7XG4gICAgICAgICAgICB0aGlzLnRpbWUgPSByZXN1bHQudGltZTtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyID0gdGhpcy51aVNlcnZpY2UuZ2V0SGVhZGVyKHJlc3VsdC5oZWFkZXIsIHBvcnQpO1xuICAgICAgICAgICAgdGhpcy5ob3N0ID0gcmVzdWx0Lmhvc3Q7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmFib3J0ZWQgPT09IEFib3J0Lm1heExpbmVOdW1SZWFjaGVkKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3Nob3dNZXNzYWdlKFxuICAgICAgICAgICAgICAgIEFsZXJ0Lndhcm5pbmcsIGBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyByZWFjaGVkLiBQcm9jZXNzZWQgdGltZSByYW5nZSBpczogJHtnZXRUaW1lUmFuZ2VTdHJpbmcodGhpcy50aW1lKX0uYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoaXNFbXB0eURhdGEodGhpcy5kYXRhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dNZXNzYWdlKEFsZXJ0LmluZm8sIGBDYW5ub3QgZmluZCBhbnkgZGF0YSBmb3IgdGhlIHNlbGVjdGVkIHRpbWUgcGVyaW9kOiAke3RoaXMuX3NlbGVjdGVkVGltZVJhbmdlU3RyaW5nfWApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dNZXNzYWdlKEFsZXJ0LnN1Y2Nlc3MsIGBQcm9jZXNzZWQgdGltZSByYW5nZSBpczogJHtnZXRUaW1lUmFuZ2VTdHJpbmcodGhpcy50aW1lKX0uYCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzbGVlcCgxMDApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYnVpbGRDaGFydChwb3J0LCBwb3J0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlaW5pdGlhbGl6ZSB0aGUgcG9ydCBzZWxlY3RvciB3aXRoIHRoZSBwb3J0c1xuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFBvcnRTZWxlY3Rvcihwb3J0czogc3RyaW5nW10gPSBudWxsLCBzZWxlY3RlZFBvcnQ6IHN0cmluZyA9IG51bGwpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIC8vIGluaXRpYWxpemF0aW9uIGZvciBuZ3gtc2VsZWN0XG4gICAgICBpZiAocG9ydHMgIT0gbnVsbCAmJiBwb3J0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIE1EQywgcmVtb3ZlIGRlZmF1bHQgJzAwMDAnIHBvcnRcbiAgICAgICAgdGhpcy5wb3J0cyA9IGdlbmVyYXRlUG9ydHMoZ2V0UmVhbFBvcnRzKHBvcnRzKSwgc2VsZWN0ZWRQb3J0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucG9ydHMgPSBnZW5lcmF0ZVBvcnRzKHBvcnRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBvcnRzICE9IG51bGwgJiYgc2VsZWN0ZWRQb3J0ID09PSBudWxsKSB7XG4gICAgICAgIC8vIHJlc2V0IHN0YXR1cyB3aGVuIGRvaW5nOlxuICAgICAgICAvLyAxLiBsb2FkaW5nIHBvcnRzXG4gICAgICAgIC8vIDIuIHRoZSBmaWxlIGRvZXNuJ3QgY29udGFpbiB0aGUgc2VsZWN0ZWQgUG9ydFxuICAgICAgICB0aGlzLnJlYWRQcm9ncmVzcyA9IDA7XG4gICAgICAgIC8vIGhpZGUgdGhlIHByb2dyZXNzIGJhciBhbmQgZW5hYmxlIHRoZSBcInNob3cgY2hhcnRcIiBidXR0b25cbiAgICAgICAgdGhpcy5fdG9nZ2xlSXRlbXMoW1xuICAgICAgICAgIHtpZDogSHRtbEVsZW1lbnQucmVhZEZpbGVQcm9ncmVzcywgc3RhdHVzOiBmYWxzZX0sXG4gICAgICAgICAge2lkOiBIdG1sRWxlbWVudC5zaG93Q2hhcnRCdXR0b24sIHN0YXR1czogdHJ1ZX1cbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogYnVpbGQgYW5kIGRpc3BsYXkgdGhlIGNoYXJ0IG9uIHBhZ2VcbiAgICogQHBhcmFtIHBvcnQgdGhlIHNlbGVjdGVkIHBvcnRcbiAgICogQHBhcmFtIHBvcnRzIGFsbCBhdmFpbGFibGUgcG9ydHNcbiAgICogQHBhcmFtIHN3aXRjaEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBzd2l0Y2hpbmcgcG9ydHMgKG5vIGluaXQgcG9ydCBzZWxlY3RvciBuZWVkZWQpXG4gICAqL1xuICBwcml2YXRlIF9idWlsZENoYXJ0KHBvcnQ6IHN0cmluZywgcG9ydHM6IHN0cmluZ1tdLCBzd2l0Y2hGbGFnID0gZmFsc2UpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGJlZ2luVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgaWYgKHBvcnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fbG9hZFNldHRpbmdzRm9yU2VsZWN0aW9uc1RhYmxlKHBvcnQpKVxuICAgICAgICAudGhlbiggKCkgPT4ge1xuICAgICAgICAgIC8vIGdldCB0aGUgY29uZmlnXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY2hhcnRTZXJ2aWNlLmJ1aWxkQ2hhcnQoXG4gICAgICAgICAgICB0aGlzLnRpbWVbcG9ydF0sXG4gICAgICAgICAgICB0aGlzLmRhdGFbcG9ydF0sXG4gICAgICAgICAgICB0aGlzLnVpU2VydmljZS5nZXRZU2NhbGUodGhpcy5faGVhZGVyS2V5LCBwb3J0KSxcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlclRleHQsXG4gICAgICAgICAgICB0aGlzLl9oZWFkZXJLZXksXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb24sXG4gICAgICAgICAgICB0aGlzLnRhYmxlU291cmNlLFxuICAgICAgICAgICAgdGhpcy5fZ2V0SG9zdFRpdGxlKHBvcnQpLFxuICAgICAgICAgICAgdGhpcy51aVNlcnZpY2UuZ2V0RGlzcGxheUl0ZW1zKHRoaXMuX2hlYWRlcktleSwgcG9ydCwgdGhpcy5kZWZhdWx0U2VsZWN0ZWRJdGVtcyksXG4gICAgICAgICAgICB0aGlzLl9vblpvb20uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5yZWFkUHJvZ3Jlc3MgPSAwO1xuICAgICAgICAgICAgICAvLyBhZnRlciBjaGFydCBoYXMgYmVlbiBjcmVhdGVkLCBzaG93IHRoZSBjaGFydCBhcmVhLCBoaWRlIHByb2dyZXNzIGJhciBhbmQgZW5hYmxlIHRoZSBcInNob3cgY2hhcnRcIiBidXR0b25cbiAgICAgICAgICAgICAgdGhpcy5fdG9nZ2xlSXRlbXMoW1xuICAgICAgICAgICAgICAgIHtpZDogSHRtbEVsZW1lbnQuY2hhcnRBcmVhLCBzdGF0dXM6IHRydWV9LFxuICAgICAgICAgICAgICAgIHtpZDogSHRtbEVsZW1lbnQucmVhZEZpbGVQcm9ncmVzcywgc3RhdHVzOiBmYWxzZX0sXG4gICAgICAgICAgICAgICAge2lkOiBIdG1sRWxlbWVudC5zaG93Q2hhcnRCdXR0b24sIHN0YXR1czogdHJ1ZX1cbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIC8vIHNldCBwb3J0IHRvIGN1cnJlbnQgZGlzcGxheWluZyBwb3J0XG4gICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRDaGFydFBvcnQgPSBwb3J0O1xuICAgICAgICAgICAgICBwcmludFByb2Nlc3NlZFRpbWUoYmVnaW5UaW1lLCAnc3RlcF9idWlsZF9jaGFydCcpO1xuICAgICAgICAgICAgICBpZiAocG9ydHMgJiYgcG9ydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICghc3dpdGNoRmxhZykge1xuICAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBwb3J0IHNlbGVjdG9yLiBEbyBub3QgbmVlZCB0byBkbyBpdCB3aGVuIHN3aXRjaGluZyBwb3J0LlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRQb3J0U2VsZWN0b3IocG9ydHMsIHBvcnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocG9ydHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl9zaG93TWVzc2FnZShcbiAgICAgICAgICBBbGVydC53YXJuaW5nLFxuICAgICAgICAgICdUaGUgc2VsZWN0ZWQgcG9ydCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbmFtZSBzZXJ2ZXIgaGlzdG9yeSBmaWxlLiBQbGVhc2UgY2hvb3NlIGEgY29ycmVjdCBwb3J0IGFuZCBoYXZlIGEgdHJ5IGFnYWluLicpO1xuICAgICAgICBpZiAoIXN3aXRjaEZsYWcpIHtcbiAgICAgICAgICAvLyBpbml0aWFsaXplIHBvcnQgc2VsZWN0b3IuIERvIG5vdCBuZWVkIHRvIGRvIGl0IHdoZW4gc3dpdGNoaW5nIHBvcnQuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRQb3J0U2VsZWN0b3IocG9ydHMsIHBvcnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgc3RyaW5nIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gdGhlIHRpdGxlIGFyZWEgb2YgdGhlIGNoYXJ0XG4gICAqIGVnOiBob3N0MSAtIDMwMDQwICgyMDE4LTA5LTA1IDE1OjMyOjMyIH4gMjAxOC0wOS0wNyAxNTozMjoxNSlcbiAgICogQHBhcmFtIHBvcnQgc2VsZWN0ZWQgcG9ydFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0SG9zdFRpdGxlKHBvcnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaG9zdCkge1xuICAgICAgcmV0dXJuICBgJHt0aGlzLmhvc3R9IC0gJHtwb3J0fSAoICR7Z2V0VGltZVJhbmdlU3RyaW5nKHRoaXMudGltZVtwb3J0XSl9IClgO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBhZnRlciB6b29tLCBlbmFibGUgdGhlIHJlc2V0IGJ1dHRvbi5cbiAgICovXG4gIHByaXZhdGUgX29uWm9vbSgpOiB2b2lkIHtcbiAgICB0aGlzLl90b2dnbGVJdGVtcyhbe2lkOiBIdG1sRWxlbWVudC5yZXNldENoYXJ0QnV0dG9uLCBzdGF0dXM6IHRydWV9XSk7XG4gIH1cblxuICAvKipcbiAgICogaW5pdGlhbGl6ZSBjaGFydCwgaW5jbHVkaW5nOiBkZXN0cm95IGN1cnJlbnQgY2hhcnQsIGluaXRpYWxpemUgY29uZmlnLCBpbml0aWFsaXplIGFsbCByZWxhdGl2ZSBkYXRhXG4gICAqL1xuICBwcml2YXRlIF9pbml0Q2hhcnRFbnYoc3dpdGNoRmxhZzogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFydFNlcnZpY2UuZGVzdHJveUNoYXJ0KCkudGhlbigoKSA9PiB7XG4gICAgICB7XG4gICAgICAgIC8vIGNsZWFudXAgb3RoZXIgZGF0YVxuICAgICAgICB0aGlzLl90b2dnbGVJdGVtcyhbe2lkOiBIdG1sRWxlbWVudC5jaGFydEFyZWEsIHN0YXR1czogZmFsc2V9XSk7XG5cbiAgICAgICAgaWYgKCFzd2l0Y2hGbGFnKSB7XG4gICAgICAgICAgT2JqZWN0LmtleXModGhpcy50aW1lKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy50aW1lW2tleV0pIHtcbiAgICAgICAgICAgICAgdGhpcy50aW1lW2tleV0ubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIH19KTtcbiAgICAgICAgICB0aGlzLnRpbWUgPSB7fTtcbiAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmRhdGEpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFba2V5XSkge1xuICAgICAgICAgICAgICB0aGlzLmRhdGFba2V5XS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgfX0pO1xuICAgICAgICAgIHRoaXMuZGF0YSA9IHt9O1xuICAgICAgICAgIHRoaXMuaGVhZGVyLmxlbmd0aCA9IDA7XG4gICAgICAgICAgdGhpcy5ob3N0ID0gJ25hbWVzZXJ2ZXIgaGlzdG9yeSBmaWxlJztcbiAgICAgICAgICB0aGlzLnRhYmxlU291cmNlID0gdm9pZCAwO1xuICAgICAgICAgIHRoaXMucmVhZFByb2dyZXNzID0gMDtcbiAgICAgICAgICB0aGlzLnVpU2VydmljZS5jbGVhckxvYWRIaXN0b3J5SW5mb3MoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgc2V0dGluZ3MgZm9yIHRoZSBzZWxlY3Rpb24gdGFibGUgKHRoZSByaWdodCBwYXJ0IG9mIHRoZSBjaGFydClcbiAgICogQHBhcmFtIHBvcnQgdGhlIHNlbGVjdGVkIHBvcnRcbiAgICovXG4gIHByaXZhdGUgX2xvYWRTZXR0aW5nc0ZvclNlbGVjdGlvbnNUYWJsZShwb3J0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRhYmxlU291cmNlID0gdGhpcy51aVNlcnZpY2UuZ2V0U2VsZWN0aW9uVGFibGVSb3dzKHRoaXMuX2hlYWRlcktleSwgcG9ydCwgdGhpcy5kZWZhdWx0U2VsZWN0ZWRJdGVtcyk7XG4gICAgdGhpcy5fc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsKHRydWUsIFtdKTtcbiAgICB0aGlzLnRhYmxlU291cmNlLmZvckVhY2gocm93ID0+IHtcbiAgICAgIGlmICh0aGlzLnVpU2VydmljZS5nZXREaXNwbGF5SXRlbXModGhpcy5faGVhZGVyS2V5LCBwb3J0LCB0aGlzLmRlZmF1bHRTZWxlY3RlZEl0ZW1zKS5pbmNsdWRlcyhyb3cuS1BJKSkge1xuICAgICAgICB0aGlzLl9zZWxlY3Rpb24uc2VsZWN0KHJvdyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBtZXNzYWdlc1xuICAgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHRoZSBtZXNzYWdlXG4gICAqIEBwYXJhbSBtZXNzYWdlIG1lc3NhZ2UgdGV4dFxuICAgKi9cbiAgcHJpdmF0ZSBfc2hvd01lc3NhZ2UodHlwZTogQWxlcnQsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0eXBlKSB7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBBbGVydC5zdWNjZXNzOlxuICAgICAgICBjYXNlIEFsZXJ0LmluZm86XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQWxlcnQud2FybmluZzpcbiAgICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQWxlcnQuZXJyb3I6XG4gICAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuYWxlcnRNZXNzYWdlID09PSBtZXNzYWdlKSB7XG4gICAgICAvLyB0cnkgdHJpZ2dlciB0aGUgY2hhbmdlIGV2ZW50IG9mIHRoZSBhbGVydC5cbiAgICAgIHRoaXMuYWxlcnRNZXNzYWdlID0gdm9pZCAwO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFsZXJ0TWVzc2FnZSA9IG1lc3NhZ2UsIDEwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWxlcnRNZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG4gICAgdGhpcy5hbGVydFR5cGUgPSB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvZ2dsZSBpdGVtcyB3aXRoIHRoZSBwcm92aWRlZCBzdGF0dXMgKHNob3cgb3IgaGlkZSB0aGUgcmVsYXRpdmUgZWxlbWVudCBvbiB0aGUgcGFnZSlcbiAgICogQHBhcmFtIGl0ZW1zIGl0ZW1zIHdpdGggdGhlIHJlbGF0aXZlIGlkIGFuZCBzdGF0dXMuXG4gICAqL1xuICBwcml2YXRlIF90b2dnbGVJdGVtcyhpdGVtczoge2lkOiBIdG1sRWxlbWVudCwgc3RhdHVzOiBib29sZWFufVtdKSB7XG4gICAgY29uc3QgZ2V0VmFyaWFibGVOYW1lQnlUeXBlSWQgPSAoaWQ6IEh0bWxFbGVtZW50KSA9PiB7XG4gICAgICBzd2l0Y2ggKGlkKSB7XG4gICAgICAgIGNhc2UgSHRtbEVsZW1lbnQuY2hhcnRBcmVhOiByZXR1cm4gJ3Nob3dDaGFydEZsYWcnO1xuICAgICAgICBjYXNlIEh0bWxFbGVtZW50LnJlYWRGaWxlUHJvZ3Jlc3M6IHJldHVybiAnc2hvd1JlYWRGaWxlUHJvZ3Jlc3MnO1xuICAgICAgICBjYXNlIEh0bWxFbGVtZW50LnNob3dDaGFydEJ1dHRvbjogcmV0dXJuICdlbmFibGVTaG93Q2hhcnRCdXR0b24nO1xuICAgICAgICBjYXNlIEh0bWxFbGVtZW50LmxvYWRQb3J0c0J1dHRvbjogcmV0dXJuICdlbmFibGVMb2FkUG9ydHNCdXR0b24nO1xuICAgICAgICBjYXNlIEh0bWxFbGVtZW50LnJlc2V0Q2hhcnRCdXR0b246IHJldHVybiAnZW5hYmxlUmVzZXRDaGFydEJ1dHRvbic7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoaXRlbXMpIHtcbiAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIHRoaXNbZ2V0VmFyaWFibGVOYW1lQnlUeXBlSWQoaXRlbS5pZCldID0gaXRlbS5zdGF0dXM7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==