ngx-hana-nameserver-history-viewer 1.1.2 → 1.1.9-2.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/README.md +6 -5
  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.js → ngx-hana-nameserver-history-viewer.mjs} +971 -2679
  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 +33 -57
  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/utils/chartjs-downsample/lttb_data_mipmap.d.ts +1 -1
  94. package/src/nameserver-history-viewer/utils/file-util.d.ts +11 -0
  95. package/bundles/ngx-hana-nameserver-history-viewer.umd.js +0 -6735
  96. package/bundles/ngx-hana-nameserver-history-viewer.umd.js.map +0 -1
  97. package/bundles/ngx-hana-nameserver-history-viewer.umd.min.js +0 -2
  98. package/bundles/ngx-hana-nameserver-history-viewer.umd.min.js.map +0 -1
  99. package/esm2015/ngx-hana-nameserver-history-viewer.js +0 -10
  100. package/esm2015/public-api.js +0 -6
  101. package/esm2015/src/nameserver-history-viewer/components/alert/alert.component.js +0 -114
  102. package/esm2015/src/nameserver-history-viewer/components/alert/alert.module.js +0 -21
  103. package/esm2015/src/nameserver-history-viewer/components/alert/index.js +0 -7
  104. package/esm2015/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -141
  105. package/esm2015/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
  106. package/esm2015/src/nameserver-history-viewer/components/index.js +0 -13
  107. package/esm2015/src/nameserver-history-viewer/components/instruction/index.js +0 -6
  108. package/esm2015/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -62
  109. package/esm2015/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -868
  110. package/esm2015/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
  111. package/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
  112. package/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -60
  113. package/esm2015/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
  114. package/esm2015/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -35
  115. package/esm2015/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
  116. package/esm2015/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -68
  117. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
  118. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -151
  119. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -80
  120. package/esm2015/src/nameserver-history-viewer/index.js +0 -6
  121. package/esm2015/src/nameserver-history-viewer/nameserver-history.module.js +0 -42
  122. package/esm2015/src/nameserver-history-viewer/services/chart.service.js +0 -504
  123. package/esm2015/src/nameserver-history-viewer/services/file.service.js +0 -487
  124. package/esm2015/src/nameserver-history-viewer/services/index.js +0 -8
  125. package/esm2015/src/nameserver-history-viewer/services/ui.service.js +0 -922
  126. package/esm2015/src/nameserver-history-viewer/types/abort.types.js +0 -13
  127. package/esm2015/src/nameserver-history-viewer/types/alert.types.js +0 -13
  128. package/esm2015/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
  129. package/esm2015/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
  130. package/esm2015/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
  131. package/esm2015/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
  132. package/esm2015/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
  133. package/esm2015/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
  134. package/esm2015/src/nameserver-history-viewer/types/html-element.type.js +0 -19
  135. package/esm2015/src/nameserver-history-viewer/types/index.js +0 -32
  136. package/esm2015/src/nameserver-history-viewer/types/item.types.js +0 -19
  137. package/esm2015/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
  138. package/esm2015/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
  139. package/esm2015/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
  140. package/esm2015/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
  141. package/esm2015/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
  142. package/esm2015/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
  143. package/esm2015/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
  144. package/esm2015/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
  145. package/esm2015/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -25
  146. package/esm2015/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
  147. package/esm2015/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
  148. package/esm2015/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
  149. package/esm2015/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
  150. package/esm2015/src/nameserver-history-viewer/types/port.types.js +0 -17
  151. package/esm2015/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
  152. package/esm2015/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
  153. package/esm2015/src/nameserver-history-viewer/types/unit.types.js +0 -19
  154. package/esm2015/src/nameserver-history-viewer/utils/chart-util.js +0 -38
  155. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
  156. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
  157. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -222
  158. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
  159. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -166
  160. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -311
  161. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -130
  162. package/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -827
  163. package/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
  164. package/esm2015/src/nameserver-history-viewer/utils/file-util.js +0 -162
  165. package/esm2015/src/nameserver-history-viewer/utils/index.js +0 -9
  166. package/esm2015/src/nameserver-history-viewer/utils/time-util.js +0 -139
  167. package/esm2015/src/nameserver-history-viewer/utils/ui-util.js +0 -239
  168. package/esm5/ngx-hana-nameserver-history-viewer.js +0 -10
  169. package/esm5/public-api.js +0 -6
  170. package/esm5/src/nameserver-history-viewer/components/alert/alert.component.js +0 -146
  171. package/esm5/src/nameserver-history-viewer/components/alert/alert.module.js +0 -25
  172. package/esm5/src/nameserver-history-viewer/components/alert/index.js +0 -7
  173. package/esm5/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -155
  174. package/esm5/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
  175. package/esm5/src/nameserver-history-viewer/components/index.js +0 -13
  176. package/esm5/src/nameserver-history-viewer/components/instruction/index.js +0 -6
  177. package/esm5/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -67
  178. package/esm5/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -1116
  179. package/esm5/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
  180. package/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
  181. package/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -85
  182. package/esm5/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
  183. package/esm5/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -26
  184. package/esm5/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
  185. package/esm5/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -58
  186. package/esm5/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
  187. package/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -180
  188. package/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -110
  189. package/esm5/src/nameserver-history-viewer/index.js +0 -6
  190. package/esm5/src/nameserver-history-viewer/nameserver-history.module.js +0 -46
  191. package/esm5/src/nameserver-history-viewer/services/chart.service.js +0 -659
  192. package/esm5/src/nameserver-history-viewer/services/file.service.js +0 -606
  193. package/esm5/src/nameserver-history-viewer/services/index.js +0 -8
  194. package/esm5/src/nameserver-history-viewer/services/ui.service.js +0 -1141
  195. package/esm5/src/nameserver-history-viewer/types/abort.types.js +0 -13
  196. package/esm5/src/nameserver-history-viewer/types/alert.types.js +0 -13
  197. package/esm5/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
  198. package/esm5/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
  199. package/esm5/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
  200. package/esm5/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
  201. package/esm5/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
  202. package/esm5/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
  203. package/esm5/src/nameserver-history-viewer/types/html-element.type.js +0 -19
  204. package/esm5/src/nameserver-history-viewer/types/index.js +0 -32
  205. package/esm5/src/nameserver-history-viewer/types/item.types.js +0 -19
  206. package/esm5/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
  207. package/esm5/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
  208. package/esm5/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
  209. package/esm5/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
  210. package/esm5/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
  211. package/esm5/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
  212. package/esm5/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
  213. package/esm5/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
  214. package/esm5/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -25
  215. package/esm5/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
  216. package/esm5/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
  217. package/esm5/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
  218. package/esm5/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
  219. package/esm5/src/nameserver-history-viewer/types/port.types.js +0 -17
  220. package/esm5/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
  221. package/esm5/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
  222. package/esm5/src/nameserver-history-viewer/types/unit.types.js +0 -19
  223. package/esm5/src/nameserver-history-viewer/utils/chart-util.js +0 -39
  224. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
  225. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
  226. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -316
  227. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
  228. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -240
  229. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -366
  230. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -142
  231. package/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -827
  232. package/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
  233. package/esm5/src/nameserver-history-viewer/utils/file-util.js +0 -163
  234. package/esm5/src/nameserver-history-viewer/utils/index.js +0 -9
  235. package/esm5/src/nameserver-history-viewer/utils/time-util.js +0 -139
  236. package/esm5/src/nameserver-history-viewer/utils/ui-util.js +0 -241
  237. package/fesm2015/ngx-hana-nameserver-history-viewer.js.map +0 -1
  238. package/fesm5/ngx-hana-nameserver-history-viewer.js +0 -6861
  239. package/fesm5/ngx-hana-nameserver-history-viewer.js.map +0 -1
  240. package/ngx-hana-nameserver-history-viewer-1.1.2.tgz +0 -0
  241. package/ngx-hana-nameserver-history-viewer.metadata.json +0 -1
@@ -1,922 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import { Injectable } from '@angular/core';
6
- import { getIgnoredLineNumFromTail, isUnitTimeRelated, getValueByUnit, getRoundedValue, calculateYScale } from '../utils';
7
- import { ScaleGroup, Unit, UnitType, Item } from '../types';
8
- // Using dynamic flag to fix the issue of ng-packagr #696: Lambda not supported
9
- // @dynamic
10
- export class UIService {
11
- constructor() {
12
- this._DEFAULT_DISPLAY_ITEMS = ['cpuUsed', 'indexserverMemUsed', 'mvccNum'];
13
- this._HIDED_COLUMNS = [Item.yScaleGroup, Item.description];
14
- this._MEASURE_COLUMNS = [Item.max, Item.average, Item.sum, Item.last];
15
- this._loadHistoryInfos = {};
16
- }
17
- /**
18
- * get the colors for legends
19
- * @param {?=} alpha
20
- * @return {?}
21
- */
22
- static getColors(alpha = null) {
23
- if (alpha == null) {
24
- alpha = 0.8;
25
- }
26
- return {
27
- cpuUsed: this._getRgbColor(199, 21, 133, alpha),
28
- // mediumvioletred
29
- memoryResident: this._getRgbColor(238, 130, 238, alpha),
30
- // violet
31
- memoryTotalResident: this._getRgbColor(72, 61, 139, alpha),
32
- // darkslateblue
33
- memoryUsed: this._getRgbColor(0, 0, 205, alpha),
34
- // mediumblue
35
- memoryLimit: this._getRgbColor(255, 105, 180, alpha),
36
- // hotpink
37
- memorySize: this._getRgbColor(70, 130, 180, alpha),
38
- // steelblue
39
- diskUsed: this._getRgbColor(25, 25, 112, alpha),
40
- // midnightblue
41
- diskSize: this._getRgbColor(0, 255, 255, alpha),
42
- // aqua
43
- networkIn: this._getRgbColor(102, 51, 153, alpha),
44
- // rebeccapurple
45
- networkOut: this._getRgbColor(245, 222, 179, alpha),
46
- // wheat
47
- swapIn: this._getRgbColor(47, 79, 79, alpha),
48
- // darkslategray
49
- swapOut: this._getRgbColor(205, 92, 92, alpha),
50
- // indianred
51
- indexserverCpu: this._getRgbColor(255, 99, 71, alpha),
52
- // tomato
53
- indexserverCpuSys: this._getRgbColor(255, 20, 147, alpha),
54
- // deeppink
55
- indexserverMemUsed: this._getRgbColor(0, 255, 0, alpha),
56
- // lime
57
- indexserverMemLimit: this._getRgbColor(139, 0, 0, alpha),
58
- // darkred
59
- indexserverHandles: this._getRgbColor(139, 0, 139, alpha),
60
- // darkmagenta
61
- indexserverPingtime: this._getRgbColor(189, 183, 107, alpha),
62
- // darkkhaki
63
- indexserverSwapIn: this._getRgbColor(112, 128, 144, alpha),
64
- // slategray
65
- sqlConnections: this._getRgbColor(85, 107, 47, alpha),
66
- // darkolivegreen
67
- internalConnections: this._getRgbColor(46, 139, 87, alpha),
68
- // seagreen
69
- externalConnections: this._getRgbColor(147, 112, 219, alpha),
70
- // mediumpurple
71
- idleConnections: this._getRgbColor(216, 191, 216, alpha),
72
- // thistle
73
- sqlTransactions: this._getRgbColor(220, 20, 60, alpha),
74
- // crimson
75
- internalTransactions: this._getRgbColor(186, 85, 211, alpha),
76
- // mediumorchid
77
- externalTransactions: this._getRgbColor(221, 160, 221, alpha),
78
- // plum
79
- userTransactions: this._getRgbColor(210, 105, 30, alpha),
80
- // chocolate
81
- sqlBlockedTrans: this._getRgbColor(0, 0, 255, alpha),
82
- // blue
83
- sqlStatements: this._getRgbColor(188, 143, 143, alpha),
84
- // rosybrown
85
- cidRange: this._getRgbColor(32, 178, 170, alpha),
86
- // lightseagreen
87
- tidRange: this._getRgbColor(124, 252, 0, alpha),
88
- // lawngreen
89
- pendingRequestCount: this._getRgbColor(160, 32, 240, alpha),
90
- // purple3
91
- mvccNum: this._getRgbColor(65, 105, 225, alpha),
92
- // royalblue
93
- acquiredRecordLocks: this._getRgbColor(0, 250, 154, alpha),
94
- // mediumspringgreen
95
- searchCount: this._getRgbColor(127, 255, 212, alpha),
96
- // aquamarine
97
- indexingCount: this._getRgbColor(0, 191, 255, alpha),
98
- // deepskyblue
99
- mergeCount: this._getRgbColor(135, 206, 235, alpha),
100
- // skyblue
101
- unloadCount: this._getRgbColor(255, 165, 0, alpha),
102
- // orange
103
- indexserverThreads: this._getRgbColor(0, 100, 0, alpha),
104
- // darkgreen
105
- waitingThreads: this._getRgbColor(176, 48, 96, alpha),
106
- // maroon3
107
- totalThreads: this._getRgbColor(100, 149, 237, alpha),
108
- // cornflower
109
- activeSqlExecutors: this._getRgbColor(175, 238, 238, alpha),
110
- // paleturquoise
111
- waitingSqlExecutors: this._getRgbColor(50, 205, 50, alpha),
112
- // limegreen
113
- totalSqlExecutors: this._getRgbColor(240, 230, 140, alpha),
114
- // khaki
115
- dataWriteSize: this._getRgbColor(102, 205, 170, alpha),
116
- // mediumaquamarine
117
- dataWriteTime: this._getRgbColor(169, 169, 169, alpha),
118
- // darkgray
119
- logWriteSize: this._getRgbColor(160, 82, 45, alpha),
120
- // sienna
121
- logWriteTime: this._getRgbColor(128, 128, 0, alpha),
122
- // olive
123
- dataReadSize: this._getRgbColor(255, 215, 0, alpha),
124
- // gold
125
- dataReadTime: this._getRgbColor(95, 158, 160, alpha),
126
- // cadetblue
127
- logReadSize: this._getRgbColor(255, 0, 0, alpha),
128
- // red
129
- logReadTime: this._getRgbColor(184, 134, 11, alpha),
130
- // darkgoldenrod
131
- dataBackupWriteSize: this._getRgbColor(255, 255, 0, alpha),
132
- // yellow
133
- dataBackupWriteTime: this._getRgbColor(154, 205, 50, alpha),
134
- // yellowgreen
135
- logBackupWriteSize: this._getRgbColor(0, 0, 139, alpha),
136
- // darkblue
137
- logBackupWriteTime: this._getRgbColor(219, 112, 147, alpha),
138
- // palevioletred
139
- mutexCollisionCount: this._getRgbColor(244, 164, 96, alpha),
140
- // sandybrown
141
- readWriteLockCollisionCount: this._getRgbColor(233, 150, 122, alpha),
142
- // darksalmon
143
- admissinControlAdmitCount: this._getRgbColor(143, 188, 143, alpha),
144
- // darkseagreen
145
- admissionControlRejectCount: this._getRgbColor(255, 0, 255, alpha),
146
- // fuchsia
147
- admissionControlWaitingRequests: this._getRgbColor(153, 50, 204, alpha),
148
- // darkorchid
149
- admissionControlWaitTime: this._getRgbColor(144, 238, 144, alpha),
150
- };
151
- }
152
- /**
153
- * @private
154
- * @return {?}
155
- */
156
- static get _unitType() {
157
- /** @type {?} */
158
- const unitType = {};
159
- unitType[Unit.PCT] = UnitType.TypeEA;
160
- unitType[Unit.MS] = UnitType.TypeEA;
161
- unitType[Unit.Empty] = UnitType.TypeEA;
162
- unitType[Unit.GB] = UnitType.TypeGB;
163
- unitType[Unit.MB] = UnitType.TypeMB;
164
- unitType[Unit.MBPerSec] = UnitType.TypeMBSec;
165
- unitType[Unit.SecPerSec] = UnitType.TypeSecSec;
166
- unitType[Unit.StmtPerSec] = UnitType.TypeSec;
167
- unitType[Unit.ReqPerSec] = UnitType.TypeSec;
168
- unitType[Unit.ColPerSec] = UnitType.TypeSec;
169
- return unitType;
170
- }
171
- /**
172
- * get yScale group list from the enum ScaleGroup
173
- * @private
174
- * @return {?}
175
- */
176
- static get _YScaleGroupList() {
177
- return Object.keys(ScaleGroup).filter((/**
178
- * @param {?} key
179
- * @return {?}
180
- */
181
- key => !isNaN(Number(ScaleGroup[key])))).map((/**
182
- * @param {?} key
183
- * @return {?}
184
- */
185
- key => ScaleGroup[key]));
186
- }
187
- /**
188
- * Generate one item by the provided attributes and values
189
- * @private
190
- * @param {...?} args the dynamic parameter of [attribute, value]
191
- * @return {?}
192
- */
193
- static _generateLoadHistoryInfoItem(...args) {
194
- /** @type {?} */
195
- const obj = {};
196
- if (!args || args.length <= 0) {
197
- return obj;
198
- }
199
- args.forEach((/**
200
- * @param {?} item
201
- * @return {?}
202
- */
203
- item => {
204
- if (item && item.length >= 2) {
205
- obj[item[0]] = item[1];
206
- }
207
- }));
208
- return obj;
209
- }
210
- /**
211
- * generate the loadHistoryInfo object with default values.
212
- * @private
213
- * @return {?}
214
- */
215
- static _generateLoadHistoryInfo() {
216
- // minimum value for YScale of swapIn, swapOut, indexserverSwapIn is 100 (according to hana studio)
217
- /** @type {?} */
218
- const infoItem = UIService._generateLoadHistoryInfoItem;
219
- // just for making the name shorter...
220
- /** @type {?} */
221
- const cpuUsed = infoItem([Item.kpi, 'CPU'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.CPU], [Item.unit, Unit.PCT], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'CPU Used by all processes']);
222
- /** @type {?} */
223
- const memoryResident = infoItem([Item.kpi, 'Database Resident Memory'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Physical memory used for all HANA processes']);
224
- /** @type {?} */
225
- const memoryTotalResident = infoItem([Item.kpi, 'Total Resident Memory'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Physical memory used for all processes']);
226
- /** @type {?} */
227
- const memoryUsed = infoItem([Item.kpi, 'Database Used Memory'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Memory used for all HANA processes']);
228
- /** @type {?} */
229
- const memoryLimit = infoItem([Item.kpi, 'Database Allocation Limit'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Memory allocation limit for all processes of HANA instance']);
230
- /** @type {?} */
231
- const memorySize = infoItem([Item.kpi, 'Physical Memory Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Physical memory size']);
232
- /** @type {?} */
233
- const diskUsed = infoItem([Item.kpi, 'Disk Used'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Disk], [Item.unit, Unit.GB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Disk used']);
234
- /** @type {?} */
235
- const diskSize = infoItem([Item.kpi, 'Disk Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Disk], [Item.unit, Unit.GB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Disk size']);
236
- /** @type {?} */
237
- const networkIn = infoItem([Item.kpi, 'Network In'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Network], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from network by all processes']);
238
- /** @type {?} */
239
- const networkOut = infoItem([Item.kpi, 'Network Out'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Network], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to network by all processes']);
240
- /** @type {?} */
241
- const swapIn = infoItem([Item.kpi, 'Swap In'], [Item.yScale, 100], [Item.yScaleGroup, ScaleGroup.Swap], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from swap by all processes (pswpin line in /proc/vmstat * sysconf(_SC_PAGESIZE))']);
242
- /** @type {?} */
243
- const swapOut = infoItem([Item.kpi, 'Swap Out'], [Item.yScale, 100], [Item.yScaleGroup, ScaleGroup.Swap], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written To swap by all processes (pswpout line in /proc/vmstat * sysconf(_SC_PAGESIZE))']);
244
- /** @type {?} */
245
- const indexserverCpu = infoItem([Item.kpi, 'Index Server CPU'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.CPU], [Item.unit, Unit.PCT], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'CPU used by Service']);
246
- /** @type {?} */
247
- const indexserverCpuSys = infoItem([Item.kpi, 'System CPU'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.CPU], [Item.unit, Unit.PCT], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'OS Kernel/System CPU used by Service']);
248
- /** @type {?} */
249
- const indexserverMemUsed = infoItem([Item.kpi, 'Memory Used'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Memory used by Service']);
250
- /** @type {?} */
251
- const indexserverMemLimit = infoItem([Item.kpi, 'Memory Allocation Limit'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Memory allocation limit for Service']);
252
- /** @type {?} */
253
- const indexserverHandles = infoItem([Item.kpi, 'Handles'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open handles']);
254
- /** @type {?} */
255
- const indexserverPingtime = infoItem([Item.kpi, 'Ping Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.MS], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Duration of Service ping request (THREAD_METHOD=\'__nsWatchdog\'). This request includes the collection of service specific KPI\'s']);
256
- /** @type {?} */
257
- const indexserverSwapIn = infoItem([Item.kpi, 'Index Server Swap In'], [Item.yScale, 100], [Item.yScaleGroup, ScaleGroup.Swap], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from swap by Service (column 12(majflt) in /proc/<pid>/stat * sysconf(_SC_PAGESIZE))']);
258
- /** @type {?} */
259
- const sqlConnections = infoItem([Item.kpi, 'Open Connections'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Conn], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL connections']);
260
- /** @type {?} */
261
- const internalConnections = infoItem([Item.kpi, 'Internal Connections'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Conn], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL internal connections']);
262
- /** @type {?} */
263
- const externalConnections = infoItem([Item.kpi, 'External Connections'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Conn], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL external connections']);
264
- /** @type {?} */
265
- const idleConnections = infoItem([Item.kpi, 'Idle Connections'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Conn], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL idle connections']);
266
- /** @type {?} */
267
- const sqlTransactions = infoItem([Item.kpi, 'Open Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Trans], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL transactions']);
268
- /** @type {?} */
269
- const internalTransactions = infoItem([Item.kpi, 'Internal Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Trans], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of internal transactions']);
270
- /** @type {?} */
271
- const externalTransactions = infoItem([Item.kpi, 'External Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Trans], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of external transactions']);
272
- /** @type {?} */
273
- const userTransactions = infoItem([Item.kpi, 'User Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Trans], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of user transactions']);
274
- /** @type {?} */
275
- const sqlBlockedTrans = infoItem([Item.kpi, 'Blocked Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of blocked SQL transactions']);
276
- /** @type {?} */
277
- const sqlStatements = infoItem([Item.kpi, 'Statements'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Stmt], [Item.unit, Unit.StmtPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of finished SQL statements']);
278
- /** @type {?} */
279
- const cidRange = infoItem([Item.kpi, 'Active Commit ID Range'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Range between newest and oldest active commit ID']);
280
- /** @type {?} */
281
- const tidRange = infoItem([Item.kpi, 'Active Transaction ID Range'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Range between newest and oldest active transaction ID']);
282
- /** @type {?} */
283
- const pendingRequestCount = infoItem([Item.kpi, 'Pending Request Count'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of pending session requests']);
284
- /** @type {?} */
285
- const mvccNum = infoItem([Item.kpi, 'Active Versions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of active MVCC versions']);
286
- /** @type {?} */
287
- const acquiredRecordLocks = infoItem([Item.kpi, 'Acquired Record Locks'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of acquired record locks']);
288
- /** @type {?} */
289
- const searchCount = infoItem([Item.kpi, 'Read Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Req], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of read requests (select)']);
290
- /** @type {?} */
291
- const indexingCount = infoItem([Item.kpi, 'Write Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Req], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of write requests (insert,update,delete)']);
292
- /** @type {?} */
293
- const mergeCount = infoItem([Item.kpi, 'Merge Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Req], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of merge requests']);
294
- /** @type {?} */
295
- const unloadCount = infoItem([Item.kpi, 'Column Unloads'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Req], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of column unloads']);
296
- /** @type {?} */
297
- const indexserverThreads = infoItem([Item.kpi, 'Active Threads'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of active threads']);
298
- /** @type {?} */
299
- const waitingThreads = infoItem([Item.kpi, 'Waiting Threads'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of waiting threads']);
300
- /** @type {?} */
301
- const totalThreads = infoItem([Item.kpi, 'Total Threads'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Total number of threads']);
302
- /** @type {?} */
303
- const activeSqlExecutors = infoItem([Item.kpi, 'Active SqlExecutors'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of active SqlExecutors']);
304
- /** @type {?} */
305
- const waitingSqlExecutors = infoItem([Item.kpi, 'Waiting SqlExecutors'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of waiting SqlExecutors']);
306
- /** @type {?} */
307
- const totalSqlExecutors = infoItem([Item.kpi, 'Total SqlExecutors'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Total number of SqlExecutors']);
308
- /** @type {?} */
309
- const dataWriteSize = infoItem([Item.kpi, 'Data Write Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to data area']);
310
- /** @type {?} */
311
- const dataWriteTime = infoItem([Item.kpi, 'Data Write Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for writing to data area']);
312
- /** @type {?} */
313
- const logWriteSize = infoItem([Item.kpi, 'Log Write Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to log area']);
314
- /** @type {?} */
315
- const logWriteTime = infoItem([Item.kpi, 'Log Write Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for writing to log area']);
316
- /** @type {?} */
317
- const dataReadSize = infoItem([Item.kpi, 'Data Read Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from data area']);
318
- /** @type {?} */
319
- const dataReadTime = infoItem([Item.kpi, 'Data Read Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for reading from data area']);
320
- /** @type {?} */
321
- const logReadSize = infoItem([Item.kpi, 'Log Read Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from log area']);
322
- /** @type {?} */
323
- const logReadTime = infoItem([Item.kpi, 'Log Read Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for reading from log area']);
324
- /** @type {?} */
325
- const dataBackupWriteSize = infoItem([Item.kpi, 'Data Backup Write Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to data backup']);
326
- /** @type {?} */
327
- const dataBackupWriteTime = infoItem([Item.kpi, 'Data Backup Write Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for writing to data backup']);
328
- /** @type {?} */
329
- const logBackupWriteSize = infoItem([Item.kpi, 'Log Backup Write Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to log backup']);
330
- /** @type {?} */
331
- const logBackupWriteTime = infoItem([Item.kpi, 'Log Backup Write Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for writing to log backup']);
332
- /** @type {?} */
333
- const mutexCollisionCount = infoItem([Item.kpi, 'Mutex Collisions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ColPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of collisions on mutexes']);
334
- /** @type {?} */
335
- const readWriteLockCollisionCount = infoItem([Item.kpi, 'Read/Write Lock Collisions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ColPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of collisions on read/write locks']);
336
- /** @type {?} */
337
- const admissinControlAdmitCount = infoItem([Item.kpi, 'Admitted Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests admitted by admission control']);
338
- /** @type {?} */
339
- const admissionControlRejectCount = infoItem([Item.kpi, 'Rejected Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests rejected by admission control']);
340
- /** @type {?} */
341
- const admissionControlWaitingRequests = infoItem([Item.kpi, 'Waiting Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests waiting in admission control queue']);
342
- /** @type {?} */
343
- const admissionControlWaitTime = infoItem([Item.kpi, 'Wait Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Total wait time of session requests queued in admission control queue']);
344
- /** @type {?} */
345
- const admissionControlEnqueueCount = infoItem([Item.kpi, 'Enqueued Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests enqueued by admission control']);
346
- /** @type {?} */
347
- const admissionControlDequeueCount = infoItem([Item.kpi, 'Dequeued Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests dequeued by admission control']);
348
- /** @type {?} */
349
- const admissionControlTimeoutCount = infoItem([Item.kpi, 'Timed out Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of timed out session requests in admission control queue']);
350
- // generate Host
351
- /** @type {?} */
352
- const loadHistoryInfoHost = {
353
- cpuUsed: cpuUsed,
354
- memoryResident: memoryResident,
355
- memoryTotalResident: memoryTotalResident,
356
- memoryUsed: memoryUsed,
357
- memoryLimit: memoryLimit,
358
- memorySize: memorySize,
359
- diskUsed: diskUsed,
360
- diskSize: diskSize,
361
- networkIn: networkIn,
362
- networkOut: networkOut,
363
- swapIn: swapIn,
364
- swapOut: swapOut,
365
- };
366
- // generate Index Server
367
- /** @type {?} */
368
- const loadHistoryInfoIndexServer = {
369
- indexserverCpu: indexserverCpu,
370
- indexserverCpuSys: indexserverCpuSys,
371
- indexserverMemUsed: indexserverMemUsed,
372
- indexserverMemLimit: indexserverMemLimit,
373
- indexserverHandles: indexserverHandles,
374
- indexserverPingtime: indexserverPingtime,
375
- indexserverSwapIn: indexserverSwapIn,
376
- };
377
- // generate SQL
378
- /** @type {?} */
379
- const loadHistoryInfoSQL = {
380
- sqlConnections: sqlConnections,
381
- internalConnections: internalConnections,
382
- externalConnections: externalConnections,
383
- idleConnections: idleConnections,
384
- sqlTransactions: sqlTransactions,
385
- internalTransactions: internalTransactions,
386
- externalTransactions: externalTransactions,
387
- userTransactions: userTransactions,
388
- sqlBlockedTrans: sqlBlockedTrans,
389
- sqlStatements: sqlStatements,
390
- cidRange: cidRange,
391
- tidRange: tidRange,
392
- pendingRequestCount: pendingRequestCount,
393
- };
394
- // generate Row Store
395
- /** @type {?} */
396
- const loadHistoryInfoRowStore = {
397
- mvccNum: mvccNum,
398
- acquiredRecordLocks: acquiredRecordLocks,
399
- };
400
- // generate Column Store
401
- /** @type {?} */
402
- const loadHistoryInfoColumnStore = {
403
- searchCount: searchCount,
404
- indexingCount: indexingCount,
405
- mergeCount: mergeCount,
406
- unloadCount: unloadCount,
407
- };
408
- // generate Threads
409
- /** @type {?} */
410
- const loadHistoryInfoThreads = {
411
- indexserverThreads: indexserverThreads,
412
- waitingThreads: waitingThreads,
413
- totalThreads: totalThreads,
414
- activeSqlExecutors: activeSqlExecutors,
415
- waitingSqlExecutors: waitingSqlExecutors,
416
- totalSqlExecutors: totalSqlExecutors,
417
- };
418
- // generate Persistence
419
- /** @type {?} */
420
- const loadHistoryInfoPersistence = {
421
- dataWriteSize: dataWriteSize,
422
- dataWriteTime: dataWriteTime,
423
- logWriteSize: logWriteSize,
424
- logWriteTime: logWriteTime,
425
- dataReadSize: dataReadSize,
426
- dataReadTime: dataReadTime,
427
- logReadSize: logReadSize,
428
- logReadTime: logReadTime,
429
- };
430
- // generate Backup
431
- /** @type {?} */
432
- const loadHistoryInfoBackup = {
433
- dataBackupWriteSize: dataBackupWriteSize,
434
- dataBackupWriteTime: dataBackupWriteTime,
435
- logBackupWriteSize: logBackupWriteSize,
436
- logBackupWriteTime: logBackupWriteTime,
437
- };
438
- // generate Synchronization Primitives
439
- /** @type {?} */
440
- const loadHistoryInfoSynchronizationPrimitives = {
441
- mutexCollisionCount: mutexCollisionCount,
442
- readWriteLockCollisionCount: readWriteLockCollisionCount,
443
- };
444
- // Session Admission Control
445
- /** @type {?} */
446
- const loadHistoryInfoSessionAdmissionControl = {
447
- admissinControlAdmitCount: admissinControlAdmitCount,
448
- admissionControlRejectCount: admissionControlRejectCount,
449
- admissionControlWaitingRequests: admissionControlWaitingRequests,
450
- admissionControlWaitTime: admissionControlWaitTime,
451
- admissionControlEnqueueCount: admissionControlEnqueueCount,
452
- admissionControlDequeueCount: admissionControlDequeueCount,
453
- admissionControlTimeoutCount: admissionControlTimeoutCount,
454
- };
455
- return {
456
- 'Host': loadHistoryInfoHost,
457
- 'Index Server': loadHistoryInfoIndexServer,
458
- 'SQL': loadHistoryInfoSQL,
459
- 'Row Store': loadHistoryInfoRowStore,
460
- 'Column Store': loadHistoryInfoColumnStore,
461
- 'Threads': loadHistoryInfoThreads,
462
- 'Persistence': loadHistoryInfoPersistence,
463
- 'Backup': loadHistoryInfoBackup,
464
- 'Synchronization Primitives': loadHistoryInfoSynchronizationPrimitives,
465
- 'Session Admission Control': loadHistoryInfoSessionAdmissionControl
466
- };
467
- }
468
- /**
469
- * get rgbcolor object via red, green, blue and alpha.
470
- * @private
471
- * @param {?} red
472
- * @param {?} green
473
- * @param {?} blue
474
- * @param {?} alpha
475
- * @return {?}
476
- */
477
- static _getRgbColor(red, green, blue, alpha) {
478
- return { red: red, green: green, blue: blue, alpha: alpha };
479
- }
480
- /**
481
- * @private
482
- * @param {?} item
483
- * @param {?} yScale
484
- * @return {?}
485
- */
486
- static _getYScaleForItem(item, yScale) {
487
- return yScale > item[Item.yScale] ? (item[Item.unit] === Unit.PCT ? 100 : yScale) : item[Item.yScale];
488
- }
489
- /**
490
- * @private
491
- * @param {?} groupItems
492
- * @return {?}
493
- */
494
- static _getMaxValueOfGroup(groupItems) {
495
- /** @type {?} */
496
- let max = 0;
497
- if (groupItems) {
498
- max = groupItems.reduce((/**
499
- * @param {?} maxValue
500
- * @param {?} current
501
- * @return {?}
502
- */
503
- (maxValue, current) => {
504
- return current.Max > maxValue ? current.Max : maxValue;
505
- }), 0);
506
- }
507
- return max;
508
- }
509
- /**
510
- * @private
511
- * @param {?} port
512
- * @return {?}
513
- */
514
- _getLoadHistoryInfo(port) {
515
- if (!this._loadHistoryInfos[port]) {
516
- this._loadHistoryInfos[port] = UIService._generateLoadHistoryInfo();
517
- }
518
- return this._loadHistoryInfos[port];
519
- }
520
- /**
521
- * @private
522
- * @param {?} itemKey
523
- * @param {?} port
524
- * @return {?}
525
- */
526
- _getProcessingUnit(itemKey, port) {
527
- /** @type {?} */
528
- const historyDetailItem = this._getItemByKey(itemKey, port);
529
- if (historyDetailItem) {
530
- /** @type {?} */
531
- let unit = historyDetailItem.Unit;
532
- if (!unit) {
533
- unit = '';
534
- }
535
- return UIService._unitType[unit];
536
- }
537
- }
538
- /**
539
- * @private
540
- * @param {?} key
541
- * @param {?} overview
542
- * @param {?} unit
543
- * @param {?} port
544
- * @return {?}
545
- */
546
- _setOverview(key, overview, unit, port) {
547
- /** @type {?} */
548
- const historyDetailItem = this._getItemByKey(key, port);
549
- if (historyDetailItem) {
550
- historyDetailItem.Max = overview.Max >= 0 ? overview.Max : 0;
551
- historyDetailItem.Average = overview.Average >= 0 ? overview.Average : 0;
552
- // only TYPE_CONVERSION_MBSEC and TYPE_CONVERTION_SEC (eg: MB/s, req/s stmt/s...) need sum
553
- historyDetailItem.Sum = isUnitTimeRelated(unit) ? (overview.Sum >= 0 ? overview.Sum : 0) : '-';
554
- historyDetailItem.Last = overview.Last >= 0 ? overview.Last : 0;
555
- }
556
- }
557
- /**
558
- * convert unit values (eg: byte to MB or GB) and generate the control data (sum, max, avg) for one row
559
- * @private
560
- * @param {?} row
561
- * @param {?} key
562
- * @param {?} unit
563
- * @param {?} port
564
- * @return {?}
565
- */
566
- _convertUnitAndGenerateRowControlData(row, key, unit, port) {
567
- return new Promise((/**
568
- * @param {?} resolve
569
- * @return {?}
570
- */
571
- resolve => {
572
- if (row) {
573
- /** @type {?} */
574
- const overview = { Sum: 0, Max: 0, Average: 0, Last: 0 };
575
- /** @type {?} */
576
- const ignoredTailLineNum = getIgnoredLineNumFromTail();
577
- /** @type {?} */
578
- let invalidCount = 0;
579
- // convert unit and calculate the overview data, skip the first, and last three rows.
580
- row.forEach((/**
581
- * @param {?} item
582
- * @param {?} index
583
- * @param {?} arrayData
584
- * @return {?}
585
- */
586
- (item, index, arrayData) => {
587
- // skip ignored line(s) from tail
588
- if (index <= row.length - ignoredTailLineNum - 1) {
589
- if (arrayData[index].y >= 0) {
590
- arrayData[index].y = getValueByUnit(item.y, unit);
591
- overview.Sum += arrayData[index].y;
592
- if (isUnitTimeRelated(unit)) {
593
- if (index === 0) {
594
- // according to hana studio, for those time related column, the first value is set to 0
595
- arrayData[index].y = 0;
596
- }
597
- else {
598
- // get value for unit like: MB/s (value / seconds)
599
- /** @type {?} */
600
- const timeDiff = arrayData[index].x - arrayData[index - 1].x;
601
- arrayData[index].y = timeDiff !== 0 ? arrayData[index].y * 1000 / timeDiff : 0;
602
- }
603
- }
604
- arrayData[index].y = getRoundedValue(arrayData[index].y);
605
- if (arrayData[index].y > overview.Max) {
606
- overview.Max = arrayData[index].y;
607
- }
608
- }
609
- else {
610
- // set value to 0, for those points with value -1 or < 0
611
- arrayData[index].y = 0;
612
- // invalid count + 1, for calculating the average (not time relative)
613
- invalidCount++;
614
- }
615
- }
616
- }));
617
- if (row.length >= (ignoredTailLineNum + invalidCount)) {
618
- if (isUnitTimeRelated(unit)) {
619
- /** @type {?} */
620
- const timePeriod = row[row.length - ignoredTailLineNum - 1].x - row[0].x;
621
- overview.Average = timePeriod !== 0 ? getRoundedValue(overview.Sum * 1000 / timePeriod) : 0;
622
- }
623
- else {
624
- /** @type {?} */
625
- const validItemCount = row.length - ignoredTailLineNum - invalidCount;
626
- overview.Average = validItemCount > 0 ? getRoundedValue(overview.Sum / validItemCount) : 0;
627
- }
628
- overview.Last = row[row.length - ignoredTailLineNum - 1].y;
629
- overview.Sum = getRoundedValue(overview.Sum);
630
- overview.Max = getRoundedValue(overview.Max);
631
- // remove those ignored lines
632
- row.length = row.length - ignoredTailLineNum;
633
- }
634
- this._setOverview(key, overview, unit, port);
635
- }
636
- resolve();
637
- }));
638
- }
639
- /**
640
- * Loop from all history items, put those history items which
641
- * have the same yScaleGroup together, using yScaleGroup as key.
642
- * eg: {__SCALE_GROUP_CPU:[item1, item2...], __SCALE_GROUP_UNKNOWN:[item3, item4...]}
643
- * @private
644
- * @param {?} port
645
- * @return {?}
646
- */
647
- _getYScaleGroupWithHistoryItems(port) {
648
- /** @type {?} */
649
- const yScaleGroup = {};
650
- /** @type {?} */
651
- const loadHistoryInfo = this._getLoadHistoryInfo(port);
652
- Object.keys(loadHistoryInfo).forEach((/**
653
- * @param {?} parentKey
654
- * @return {?}
655
- */
656
- parentKey => {
657
- Object.keys(loadHistoryInfo[parentKey]).forEach((/**
658
- * @param {?} childKey
659
- * @return {?}
660
- */
661
- childKey => {
662
- /** @type {?} */
663
- const detailItem = loadHistoryInfo[parentKey][childKey];
664
- /** @type {?} */
665
- const yScaleGroupKey = detailItem._YScaleGroup;
666
- if (!yScaleGroup[yScaleGroupKey]) {
667
- yScaleGroup[yScaleGroupKey] = [];
668
- }
669
- yScaleGroup[yScaleGroupKey].push(detailItem);
670
- }));
671
- }));
672
- return yScaleGroup;
673
- }
674
- /**
675
- * @private
676
- * @param {?} groupItems
677
- * @param {?} group
678
- * @return {?}
679
- */
680
- _setYScaleOfGroup(groupItems, group) {
681
- if (groupItems) {
682
- if (group === ScaleGroup.Unknown) {
683
- groupItems.forEach((/**
684
- * @param {?} item
685
- * @return {?}
686
- */
687
- item => item[Item.yScale] = UIService._getYScaleForItem(item, calculateYScale(item.Max))));
688
- }
689
- else {
690
- /** @type {?} */
691
- const yScale = calculateYScale(UIService._getMaxValueOfGroup(groupItems));
692
- groupItems.forEach((/**
693
- * @param {?} item
694
- * @return {?}
695
- */
696
- item => item[Item.yScale] = UIService._getYScaleForItem(item, yScale)));
697
- }
698
- }
699
- }
700
- /**
701
- * @private
702
- * @param {?} key
703
- * @param {?} port
704
- * @return {?}
705
- */
706
- _getItemByKey(key, port) {
707
- /** @type {?} */
708
- const loadHistoryInfo = this._getLoadHistoryInfo(port);
709
- for (const itemKey of Object.keys(loadHistoryInfo)) {
710
- if (key in loadHistoryInfo[itemKey]) {
711
- return loadHistoryInfo[itemKey][key];
712
- }
713
- }
714
- }
715
- /**
716
- * reset the load history info object, to prevent memory leak
717
- * @return {?}
718
- */
719
- clearLoadHistoryInfos() {
720
- this._loadHistoryInfos = {};
721
- }
722
- /**
723
- * get all the data for the selection table
724
- * @param {?} headerKeys
725
- * @param {?} port
726
- * @param {?} defaultDisplayItems
727
- * @return {?}
728
- */
729
- getSelectionTableRows(headerKeys, port, defaultDisplayItems) {
730
- /** @type {?} */
731
- const rows = [];
732
- /** @type {?} */
733
- const loadHistoryInfo = this._getLoadHistoryInfo(port);
734
- /** @type {?} */
735
- const defaultItems = defaultDisplayItems && defaultDisplayItems.length > 0 ? defaultDisplayItems : this._DEFAULT_DISPLAY_ITEMS;
736
- Object.keys(loadHistoryInfo).forEach((/**
737
- * @param {?} keyParent
738
- * @return {?}
739
- */
740
- keyParent => {
741
- rows.push({ KPI: keyParent, header: true });
742
- /** @type {?} */
743
- const len = rows.length;
744
- rows.push(...Object.keys(loadHistoryInfo[keyParent])
745
- .filter((/**
746
- * @param {?} keyChild
747
- * @return {?}
748
- */
749
- keyChild => headerKeys.includes(keyChild)))
750
- .map((/**
751
- * @param {?} keyChild
752
- * @return {?}
753
- */
754
- keyChild => {
755
- loadHistoryInfo[keyParent][keyChild].header = false;
756
- loadHistoryInfo[keyParent][keyChild].checked = defaultItems.includes(keyChild);
757
- return loadHistoryInfo[keyParent][keyChild];
758
- })));
759
- if (len === rows.length) {
760
- // no sub items, remove the header
761
- rows.pop();
762
- }
763
- }));
764
- return rows;
765
- }
766
- /**
767
- * get all hidden columns. Those hidden columns = input hidden columns + default hidden columns
768
- * @param {?} hideMeasureColumns the array contains the columns list that need to be hidden.
769
- * @return {?}
770
- */
771
- getHiddenColumns(hideMeasureColumns) {
772
- // only measure columns can be hidden
773
- /** @type {?} */
774
- const hideColumns = hideMeasureColumns ? hideMeasureColumns.filter((/**
775
- * @param {?} column
776
- * @return {?}
777
- */
778
- column => this._MEASURE_COLUMNS.includes(column))) : [];
779
- return hideColumns ? this._HIDED_COLUMNS.concat(hideColumns) : this._HIDED_COLUMNS;
780
- }
781
- /**
782
- * get header information and format it to {headKey: key, headText: text}
783
- * @param {?} keys
784
- * @param {?} port
785
- * @return {?}
786
- */
787
- getHeader(keys, port) {
788
- return keys.map((/**
789
- * @param {?} key
790
- * @return {?}
791
- */
792
- key => {
793
- /** @type {?} */
794
- const item = this._getItemByKey(key, port);
795
- if (item != null && 'KPI' in item) {
796
- return ({ key: key, text: item.KPI });
797
- }
798
- else {
799
- console.warn(`${key} is not configured.`);
800
- }
801
- })).filter((/**
802
- * @param {?} key
803
- * @return {?}
804
- */
805
- key => key != null));
806
- }
807
- /**
808
- * Get the selected items, which need to be displayed on the chart.
809
- * @param {?} headerKeys array that contains the keys of header
810
- * @param {?} port the relative port
811
- * @param {?} defaultDisplayItems the items list that will be displayed by default.
812
- * @return {?}
813
- */
814
- getDisplayItems(headerKeys, port, defaultDisplayItems) {
815
- /** @type {?} */
816
- const selectionTable = this.getSelectionTableRows(headerKeys, port, defaultDisplayItems);
817
- return selectionTable.filter((/**
818
- * @param {?} row
819
- * @return {?}
820
- */
821
- row => row.checked)).map((/**
822
- * @param {?} row
823
- * @return {?}
824
- */
825
- row => row.KPI));
826
- }
827
- /**
828
- * Get the Y Scale by the keys and port
829
- * @param {?} keys
830
- * @param {?} port
831
- * @return {?}
832
- */
833
- getYScale(keys, port) {
834
- /** @type {?} */
835
- const yScales = [];
836
- if (keys) {
837
- keys.forEach((/**
838
- * @param {?} key
839
- * @return {?}
840
- */
841
- key => {
842
- yScales.push(this._getItemByKey(key, port)[Item.yScale]);
843
- }));
844
- }
845
- return yScales;
846
- }
847
- /**
848
- * Generate Y Scale for the port
849
- * @param {?} port
850
- * @return {?}
851
- */
852
- generateYScale(port) {
853
- /** @type {?} */
854
- const yScaleGroup = this._getYScaleGroupWithHistoryItems(port);
855
- UIService._YScaleGroupList.forEach((/**
856
- * @param {?} group
857
- * @return {?}
858
- */
859
- group => {
860
- /** @type {?} */
861
- const historyItems = yScaleGroup[group];
862
- if (historyItems) {
863
- this._setYScaleOfGroup(historyItems, group);
864
- }
865
- }));
866
- }
867
- /**
868
- * convert unit values (eg: byte to MB or GB) and generate the control data (sum, max, avg)
869
- * @param {?} data the nameserver history data
870
- * @param {?} header header list
871
- * @param {?} port selected port
872
- * @return {?}
873
- */
874
- convertUnitAndGenerateControlData(data, header, port) {
875
- /** @type {?} */
876
- const promises = [];
877
- if (data && header) {
878
- data.forEach((/**
879
- * @param {?} row
880
- * @param {?} index
881
- * @return {?}
882
- */
883
- (row, index) => {
884
- if (row) {
885
- // get detail history item key, like indexserverCpu
886
- /** @type {?} */
887
- const itemKey = header[index];
888
- /** @type {?} */
889
- const unit = this._getProcessingUnit(itemKey, port);
890
- promises.push(this._convertUnitAndGenerateRowControlData(row, itemKey, unit, port));
891
- }
892
- }));
893
- }
894
- return Promise.all(promises);
895
- }
896
- }
897
- UIService.decorators = [
898
- { type: Injectable }
899
- ];
900
- if (false) {
901
- /**
902
- * @type {?}
903
- * @private
904
- */
905
- UIService.prototype._DEFAULT_DISPLAY_ITEMS;
906
- /**
907
- * @type {?}
908
- * @private
909
- */
910
- UIService.prototype._HIDED_COLUMNS;
911
- /**
912
- * @type {?}
913
- * @private
914
- */
915
- UIService.prototype._MEASURE_COLUMNS;
916
- /**
917
- * @type {?}
918
- * @private
919
- */
920
- UIService.prototype._loadHistoryInfos;
921
- }
922
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1oYW5hLW5hbWVzZXJ2ZXItaGlzdG9yeS12aWV3ZXIvIiwic291cmNlcyI6WyJzcmMvbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci9zZXJ2aWNlcy91aS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMxSCxPQUFPLEVBaUJMLFVBQVUsRUFDVixJQUFJLEVBQ0osUUFBUSxFQUNSLElBQUksRUFDTCxNQUFNLFVBQVUsQ0FBQzs7O0FBS2xCLE1BQU0sT0FBTyxTQUFTO0lBRHRCO1FBRW1CLDJCQUFzQixHQUFhLENBQUMsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hGLG1CQUFjLEdBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRSxxQkFBZ0IsR0FBYSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRixzQkFBaUIsR0FBRyxFQUFFLENBQUM7SUF1akJqQyxDQUFDOzs7Ozs7SUFsakJRLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBZ0IsSUFBSTtRQUMxQyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDakIsS0FBSyxHQUFHLEdBQUcsQ0FBQztTQUNiO1FBQ0QsT0FBTztZQUNMLE9BQU8sRUFBMEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUM7O1lBQ3ZFLGNBQWMsRUFBbUIsSUFB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QUUsSUFBSSxDQUFDLEVBQUUsQ0FBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDOztjQUNuVCxVQUFVLEdBQXdCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDOztjQUMvUyxXQUFXLEdBQXVCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsMkJBQTJCLENBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSw0REFBNEQsQ0FBQyxDQUFDOztjQUN2VSxVQUFVLEdBQXdCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDOztjQUNqUyxRQUFRLEdBQTBCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFtQixFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDOztjQUN0UixRQUFRLEdBQTBCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFtQixFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDOztjQUN0UixTQUFTLEdBQXlCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLDBDQUEwQyxDQUFDLENBQUM7O2NBQ3JULFVBQVUsR0FBd0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQWlCLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsMkNBQTJDLENBQUMsQ0FBQzs7Y0FDdFQsTUFBTSxHQUE0QixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBcUIsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMs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QUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUseUNBQXlDLENBQUMsQ0FBQzs7Y0FDcFQsZUFBZSxHQUFtQixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUscUNBQXFDLENBQUMsQ0FBQzs7Y0FDaFQsZUFBZSxHQUFtQixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsaUNBQWlDLENBQUMsQ0FBQzs7Y0FDNVMsb0JBQW9CLEdBQWMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7O2NBQzVTLG9CQUFvQixHQUFjLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLENBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDOztjQUM1UyxnQkFBZ0IsR0FBa0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLDZCQUE2QixDQUFDLENBQUM7O2NBQ3hTLGVBQWUsR0FBbUIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxzQkFBc0IsQ0FBUSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLG9DQUFvQyxDQUFDLENBQUM7O2NBQy9TLGFBQWEsR0FBcUIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsbUNBQW1DLENBQUMsQ0FBQzs7Y0FDOVMsUUFBUSxHQUEwQixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLHdCQUF3QixDQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsa0RBQWtELENBQUMsQ0FBQzs7Y0FDN1QsUUFBUSxHQUEwQixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLDZCQUE2QixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsdURBQXVELENBQUMsQ0FBQzs7Y0FDbFUsbUJBQW1CLEdBQWUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLG9DQUFvQyxDQUFDLENBQUM7O2NBQy9TLE9BQU8sR0FBMkIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBYSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGdDQUFnQyxDQUFDLENBQUM7O2NBQzNTLG1CQUFtQixHQUFlLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLENBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDOztjQUM1UyxXQUFXLEdBQXVCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsa0NBQWtDLENBQUMsQ0FBQzs7Y0FDN1MsYUFBYSxHQUFxQixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsaURBQWlELENBQUMsQ0FBQzs7Y0FDNVQsVUFBVSxHQUF3QixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsMEJBQTBCLENBQUMsQ0FBQzs7Y0FDclMsV0FBVyxHQUF1QixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsMEJBQTBCLENBQUMsQ0FBQzs7Y0FDclMsa0JBQWtCLEdBQWdCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDOztjQUNyUyxjQUFjLEdBQW9CLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMs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LElBQUksQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDOztjQUN2UyxhQUFhLEdBQXFCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDOztjQUMvUyxZQUFZLEdBQXNCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDOztjQUN0UyxZQUFZLEdBQXNCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDOztjQUM5UyxZQUFZLEdBQXNCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDOztjQUN0UyxZQUFZLEdBQXNCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDOztjQUNqVCxXQUFXLEdBQXVCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsMEJBQTBCLENBQUMsQ0FBQzs7Y0FDclMsV0FBVyxHQUF1QixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBZSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLHFDQUFxQyxDQUFDLENBQUM7O2NBQ2hULG1CQUFtQixHQUFlLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLENBQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJ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QyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsK0RBQStELENBQUMsQ0FBQzs7Y0FDMVUsd0JBQXdCLEdBQVUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsdUVBQXVFLENBQUMsQ0FBQzs7Y0FDbFYsNEJBQTRCLEdBQU0sUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FB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LFFBQVEsQ0FBQyxDQUFDO0lBQy9CLENBQUM7OztZQTNqQkYsVUFBVTs7Ozs7OztJQUVULDJDQUFpRzs7Ozs7SUFDakcsbUNBQWlGOzs7OztJQUNqRixxQ0FBNEY7Ozs7O0lBQzVGLHNDQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZ2V0SWdub3JlZExpbmVOdW1Gcm9tVGFpbCwgaXNVbml0VGltZVJlbGF0ZWQsIGdldFZhbHVlQnlVbml0LCBnZXRSb3VuZGVkVmFsdWUsIGNhbGN1bGF0ZVlTY2FsZSB9IGZyb20gJy4uL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBDb2xvclJnYmEsXHJcbiAgTG9hZEhpc3RvcnlJbmZvLFxyXG4gIExvYWRIaXN0b3J5SW5mb0JhY2t1cCxcclxuICBMb2FkSGlzdG9yeUluZm9Db2x1bW5TdG9yZSxcclxuICBMb2FkSGlzdG9yeUluZm9Ib3N0LFxyXG4gIExvYWRIaXN0b3J5SW5mb0luZGV4U2VydmVyLFxyXG4gIExvYWRIaXN0b3J5SW5mb0l0ZW0sXHJcbiAgTG9hZEhpc3RvcnlJbmZvUGVyc2lzdGVuY2UsXHJcbiAgTG9hZEhpc3RvcnlJbmZvUm93U3RvcmUsXHJcbiAgTG9hZEhpc3RvcnlJbmZvU2Vzc2lvbkFkbWlzc2lvbkNvbnRyb2wsXHJcbiAgTG9hZEhpc3RvcnlJbmZvU1FMLFxyXG4gIExvYWRIaXN0b3J5SW5mb1N5bmNQcmltaXRpdmVzLFxyXG4gIExvYWRIaXN0b3J5SW5mb1RocmVhZHMsXHJcbiAgQ2hhcnRDb250ZW50RGF0YUl0ZW0sXHJcbiAgQ2hhcnRDb250ZW50SGVhZGVyLFxyXG4gIExlZ2VuZENvbG9yLFxyXG4gIFNjYWxlR3JvdXAsXHJcbiAgVW5pdCxcclxuICBVbml0VHlwZSxcclxuICBJdGVtXHJcbn0gZnJvbSAnLi4vdHlwZXMnO1xyXG5cclxuLy8gVXNpbmcgZHluYW1pYyBmbGFnIHRvIGZpeCB0aGUgaXNzdWUgb2YgbmctcGFja2FnciAjNjk2OiBMYW1iZGEgbm90IHN1cHBvcnRlZFxyXG4vLyBAZHluYW1pY1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBVSVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX0RFRkFVTFRfRElTUExBWV9JVEVNUzogc3RyaW5nW10gPSBbJ2NwdVVzZWQnLCAnaW5kZXhzZXJ2ZXJNZW1Vc2VkJywgJ212Y2NOdW0nXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9ISURFRF9DT0xVTU5TOiBzdHJpbmdbXSA9IFtJdGVtLnlTY2FsZUdyb3VwLCBJdGVtLmRlc2NyaXB0aW9uXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9NRUFTVVJFX0NPTFVNTlM6IHN0cmluZ1tdID0gW0l0ZW0ubWF4LCBJdGVtLmF2ZXJhZ2UsIEl0ZW0uc3VtLCBJdGVtLmxhc3RdO1xyXG4gIHByaXZhdGUgX2xvYWRIaXN0b3J5SW5mb3MgPSB7fTtcclxuXHJcbiAgLyoqXHJcbiAgICogZ2V0IHRoZSBjb2xvcnMgZm9yIGxlZ2VuZHNcclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIGdldENvbG9ycyhhbHBoYTogbnVtYmVyID0gbnVsbCk6IExlZ2VuZENvbG9yIHtcclxuICAgIGlmIChhbHBoYSA9PSBudWxsKSB7XHJcbiAgICAgIGFscGhhID0gMC44O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY3B1VXNlZCAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTk5LCAyMSwgMTMzLCBhbHBoYSksIC8vIG1lZGl1bXZpb2xldHJlZFxyXG4gICAgICBtZW1vcnlSZXNpZGVudCAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyMzgsIDEzMCwgMjM4LCBhbHBoYSksIC8vIHZpb2xldFxyXG4gICAgICBtZW1vcnlUb3RhbFJlc2lkZW50ICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcig3MiwgNjEsIDEzOSwgYWxwaGEpLCAvLyBkYXJrc2xhdGVibHVlXHJcbiAgICAgIG1lbW9yeVVzZWQgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDAsIDAsIDIwNSwgYWxwaGEpLCAvLyBtZWRpdW1ibHVlXHJcbiAgICAgIG1lbW9yeUxpbWl0ICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI1NSwgMTA1LCAxODAsIGFscGhhKSwgLy8gaG90cGlua1xyXG4gICAgICBtZW1vcnlTaXplICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcig3MCwgMTMwLCAxODAsIGFscGhhKSwgLy8gc3RlZWxibHVlXHJcbiAgICAgIGRpc2tVc2VkICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI1LCAyNSwgMTEyLCBhbHBoYSksIC8vIG1pZG5pZ2h0Ymx1ZVxyXG4gICAgICBkaXNrU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigwLCAyNTUsIDI1NSwgYWxwaGEpLCAvLyBhcXVhXHJcbiAgICAgIG5ldHdvcmtJbiAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDEwMiwgNTEsIDE1MywgYWxwaGEpLCAvLyByZWJlY2NhcHVycGxlXHJcbiAgICAgIG5ldHdvcmtPdXQgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI0NSwgMjIyLCAxNzksIGFscGhhKSwgLy8gd2hlYXRcclxuICAgICAgc3dhcEluICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoNDcsIDc5LCA3OSwgYWxwaGEpLCAvLyBkYXJrc2xhdGVncmF5XHJcbiAgICAgIHN3YXBPdXQgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDIwNSwgOTIsIDkyLCBhbHBoYSksIC8vIGluZGlhbnJlZFxyXG4gICAgICBpbmRleHNlcnZlckNwdSAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyNTUsIDk5LCA3MSwgYWxwaGEpLCAvLyB0b21hdG9cclxuICAgICAgaW5kZXhzZXJ2ZXJDcHVTeXMgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjU1LCAyMCwgMTQ3LCBhbHBoYSksIC8vIGRlZXBwaW5rXHJcbiAgICAgIGluZGV4c2VydmVyTWVtVXNlZCAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDAsIDI1NSwgMCwgYWxwaGEpLCAvLyBsaW1lXHJcbiAgICAgIGluZGV4c2VydmVyTWVtTGltaXQgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDEzOSwgMCwgMCwgYWxwaGEpLCAvLyBkYXJrcmVkXHJcbiAgICAgIGluZGV4c2VydmVySGFuZGxlcyAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDEzOSwgMCwgMTM5LCBhbHBoYSksIC8vIGRhcmttYWdlbnRhXHJcbiAgICAgIGluZGV4c2VydmVyUGluZ3RpbWUgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE4OSwgMTgzLCAxMDcsIGFscGhhKSwgLy8gZGFya2toYWtpXHJcbiAgICAgIGluZGV4c2VydmVyU3dhcEluICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDExMiwgMTI4LCAxNDQsIGFscGhhKSwgLy8gc2xhdGVncmF5XHJcbiAgICAgIHNxbENvbm5lY3Rpb25zICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDg1LCAxMDcsIDQ3LCBhbHBoYSksIC8vIGRhcmtvbGl2ZWdyZWVuXHJcbiAgICAgIGludGVybmFsQ29ubmVjdGlvbnMgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDQ2LCAxMzksIDg3LCBhbHBoYSksIC8vIHNlYWdyZWVuXHJcbiAgICAgIGV4dGVybmFsQ29ubmVjdGlvbnMgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE0NywgMTEyLCAyMTksIGFscGhhKSwgLy8gbWVkaXVtcHVycGxlXHJcbiAgICAgIGlkbGVDb25uZWN0aW9ucyAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDIxNiwgMTkxLCAyMTYsIGFscGhhKSwgLy8gdGhpc3RsZVxyXG4gICAgICBzcWxUcmFuc2FjdGlvbnMgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyMjAsIDIwLCA2MCwgYWxwaGEpLCAvLyBjcmltc29uXHJcbiAgICAgIGludGVybmFsVHJhbnNhY3Rpb25zICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE4NiwgODUsIDIxMSwgYWxwaGEpLCAvLyBtZWRpdW1vcmNoaWRcclxuICAgICAgZXh0ZXJuYWxUcmFuc2FjdGlvbnMgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjIxLCAxNjAsIDIyMSwgYWxwaGEpLCAvLyBwbHVtXHJcbiAgICAgIHVzZXJUcmFuc2FjdGlvbnMgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDIxMCwgMTA1LCAzMCwgYWxwaGEpLCAvLyBjaG9jb2xhdGVcclxuICAgICAgc3FsQmxvY2tlZFRyYW5zICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMCwgMCwgMjU1LCBhbHBoYSksIC8vIGJsdWVcclxuICAgICAgc3FsU3RhdGVtZW50cyAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTg4LCAxNDMsIDE0MywgYWxwaGEpLCAvLyByb3N5YnJvd25cclxuICAgICAgY2lkUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMzIsIDE3OCwgMTcwLCBhbHBoYSksIC8vIGxpZ2h0c2VhZ3JlZW5cclxuICAgICAgdGlkUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTI0LCAyNTIsIDAsIGFscGhhKSwgLy8gbGF3bmdyZWVuXHJcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Q291bnQgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE2MCwgMzIsIDI0MCwgYWxwaGEpLCAvLyBwdXJwbGUzXHJcbiAgICAgIG12Y2NOdW0gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDY1LCAxMDUsIDIyNSwgYWxwaGEpLCAvLyByb3lhbGJsdWVcclxuICAgICAgYWNxdWlyZWRSZWNvcmRMb2NrcyAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMCwgMjUwLCAxNTQsIGFscGhhKSwgLy8gbWVkaXVtc3ByaW5nZ3JlZW5cclxuICAgICAgc2VhcmNoQ291bnQgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTI3LCAyNTUsIDIxMiwgYWxwaGEpLCAvLyBhcXVhbWFyaW5lXHJcbiAgICAgIGluZGV4aW5nQ291bnQgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDAsIDE5MSwgMjU1LCBhbHBoYSksIC8vIGRlZXBza3libHVlXHJcbiAgICAgIG1lcmdlQ291bnQgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDEzNSwgMjA2LCAyMzUsIGFscGhhKSwgLy8gc2t5Ymx1ZVxyXG4gICAgICB1bmxvYWRDb3VudCAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyNTUsIDE2NSwgMCwgYWxwaGEpLCAvLyBvcmFuZ2VcclxuICAgICAgaW5kZXhzZXJ2ZXJUaHJlYWRzICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMCwgMTAwLCAwLCBhbHBoYSksIC8vIGRhcmtncmVlblxyXG4gICAgICB3YWl0aW5nVGhyZWFkcyAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxNzYsIDQ4LCA5NiwgYWxwaGEpLCAvLyBtYXJvb24zXHJcbiAgICAgIHRvdGFsVGhyZWFkcyAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDEwMCwgMTQ5LCAyMzcsIGFscGhhKSwgLy8gY29ybmZsb3dlclxyXG4gICAgICBhY3RpdmVTcWxFeGVjdXRvcnMgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxNzUsIDIzOCwgMjM4LCBhbHBoYSksIC8vIHBhbGV0dXJxdW9pc2VcclxuICAgICAgd2FpdGluZ1NxbEV4ZWN1dG9ycyAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoNTAsIDIwNSwgNTAsIGFscGhhKSwgLy8gbGltZWdyZWVuXHJcbiAgICAgIHRvdGFsU3FsRXhlY3V0b3JzICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI0MCwgMjMwLCAxNDAsIGFscGhhKSwgLy8ga2hha2lcclxuICAgICAgZGF0YVdyaXRlU2l6ZSAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTAyLCAyMDUsIDE3MCwgYWxwaGEpLCAvLyBtZWRpdW1hcXVhbWFyaW5lXHJcbiAgICAgIGRhdGFXcml0ZVRpbWUgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE2OSwgMTY5LCAxNjksIGFscGhhKSwgLy8gZGFya2dyYXlcclxuICAgICAgbG9nV3JpdGVTaXplICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTYwLCA4MiwgNDUsIGFscGhhKSwgLy8gc2llbm5hXHJcbiAgICAgIGxvZ1dyaXRlVGltZSAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDEyOCwgMTI4LCAwLCBhbHBoYSksIC8vIG9saXZlXHJcbiAgICAgIGRhdGFSZWFkU2l6ZSAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI1NSwgMjE1LCAwLCBhbHBoYSksIC8vIGdvbGRcclxuICAgICAgZGF0YVJlYWRUaW1lICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoOTUsIDE1OCwgMTYwLCBhbHBoYSksIC8vIGNhZGV0Ymx1ZVxyXG4gICAgICBsb2dSZWFkU2l6ZSAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyNTUsIDAsIDAsIGFscGhhKSwgLy8gcmVkXHJcbiAgICAgIGxvZ1JlYWRUaW1lICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE4NCwgMTM0LCAxMSwgYWxwaGEpLCAvLyBkYXJrZ29sZGVucm9kXHJcbiAgICAgIGRhdGFCYWNrdXBXcml0ZVNpemUgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI1NSwgMjU1LCAwLCBhbHBoYSksIC8vIHllbGxvd1xyXG4gICAgICBkYXRhQmFja3VwV3JpdGVUaW1lICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxNTQsIDIwNSwgNTAsIGFscGhhKSwgLy8geWVsbG93Z3JlZW5cclxuICAgICAgbG9nQmFja3VwV3JpdGVTaXplICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMCwgMCwgMTM5LCBhbHBoYSksIC8vIGRhcmtibHVlXHJcbiAgICAgIGxvZ0JhY2t1cFdyaXRlVGltZSAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDIxOSwgMTEyLCAxNDcsIGFscGhhKSwgLy8gcGFsZXZpb2xldHJlZFxyXG4gICAgICBtdXRleENvbGxpc2lvbkNvdW50ICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyNDQsIDE2NCwgOTYsIGFscGhhKSwgLy8gc2FuZHlicm93blxyXG4gICAgICByZWFkV3JpdGVMb2NrQ29sbGlzaW9uQ291bnQgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyMzMsIDE1MCwgMTIyLCBhbHBoYSksIC8vIGRhcmtzYWxtb25cclxuICAgICAgYWRtaXNzaW5Db250cm9sQWRtaXRDb3VudCAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTQzLCAxODgsIDE0MywgYWxwaGEpLCAvLyBkYXJrc2VhZ3JlZW5cclxuICAgICAgYWRtaXNzaW9uQ29udHJvbFJlamVjdENvdW50ICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjU1LCAwLCAyNTUsIGFscGhhKSwgLy8gZnVjaHNpYVxyXG4gICAgICBhZG1pc3Npb25Db250cm9sV2FpdGluZ1JlcXVlc3RzOiB0aGlzLl9nZXRSZ2JDb2xvcigxNTMsIDUwLCAyMDQsIGFscGhhKSwgLy8gZGFya29yY2hpZFxyXG4gICAgICBhZG1pc3Npb25Db250cm9sV2FpdFRpbWUgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxNDQsIDIzOCwgMTQ0LCBhbHBoYSksIC8vIGxpZ2h0Z3JlZW5cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBnZXQgX3VuaXRUeXBlKCk6IGFueSB7XHJcbiAgICBjb25zdCB1bml0VHlwZSA9IHt9O1xyXG4gICAgdW5pdFR5cGVbVW5pdC5QQ1RdID0gVW5pdFR5cGUuVHlwZUVBO1xyXG4gICAgdW5pdFR5cGVbVW5pdC5NU10gPSBVbml0VHlwZS5UeXBlRUE7XHJcbiAgICB1bml0VHlwZVtVbml0LkVtcHR5XSA9IFVuaXRUeXBlLlR5cGVFQTtcclxuICAgIHVuaXRUeXBlW1VuaXQuR0JdID0gVW5pdFR5cGUuVHlwZUdCO1xyXG4gICAgdW5pdFR5cGVbVW5pdC5NQl0gPSBVbml0VHlwZS5UeXBlTUI7XHJcbiAgICB1bml0VHlwZVtVbml0Lk1CUGVyU2VjXSA9IFVuaXRUeXBlLlR5cGVNQlNlYztcclxuICAgIHVuaXRUeXBlW1VuaXQuU2VjUGVyU2VjXSA9IFVuaXRUeXBlLlR5cGVTZWNTZWM7XHJcbiAgICB1bml0VHlwZVtVbml0LlN0bXRQZXJTZWNdID0gVW5pdFR5cGUuVHlwZVNlYztcclxuICAgIHVuaXRUeXBlW1VuaXQuUmVxUGVyU2VjXSA9IFVuaXRUeXBlLlR5cGVTZWM7XHJcbiAgICB1bml0VHlwZVtVbml0LkNvbFBlclNlY10gPSBVbml0VHlwZS5UeXBlU2VjO1xyXG4gICAgcmV0dXJuIHVuaXRUeXBlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2V0IHlTY2FsZSBncm91cCBsaXN0IGZyb20gdGhlIGVudW0gU2NhbGVHcm91cFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIGdldCBfWVNjYWxlR3JvdXBMaXN0KCk6IGFueVtdIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhTY2FsZUdyb3VwKS5maWx0ZXIoa2V5ID0+ICFpc05hTihOdW1iZXIoU2NhbGVHcm91cFtrZXldKSkpLm1hcChrZXkgPT4gU2NhbGVHcm91cFtrZXldKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIG9uZSBpdGVtIGJ5IHRoZSBwcm92aWRlZCBhdHRyaWJ1dGVzIGFuZCB2YWx1ZXNcclxuICAgKiBAcGFyYW0gYXJncyB0aGUgZHluYW1pYyBwYXJhbWV0ZXIgb2YgW2F0dHJpYnV0ZSwgdmFsdWVdXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2dlbmVyYXRlTG9hZEhpc3RvcnlJbmZvSXRlbSguLi5hcmdzKTogTG9hZEhpc3RvcnlJbmZvSXRlbSB7XHJcbiAgICBjb25zdCBvYmogPSB7fTtcclxuICAgIGlmICghYXJncyB8fCBhcmdzLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgYXJncy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBpZiAoaXRlbSAmJiBpdGVtLmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgICAgb2JqW2l0ZW1bMF1dID0gaXRlbVsxXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2VuZXJhdGUgdGhlIGxvYWRIaXN0b3J5SW5mbyBvYmplY3Qgd2l0aCBkZWZhdWx0IHZhbHVlcy5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBfZ2VuZXJhdGVMb2FkSGlzdG9yeUluZm8oKTogTG9hZEhpc3RvcnlJbmZvIHtcclxuICAgIC8vIG1pbmltdW0gdmFsdWUgZm9yIFlTY2FsZSBvZiBzd2FwSW4sIHN3YXBPdXQsIGluZGV4c2VydmVyU3dhcEluIGlzIDEwMCAoYWNjb3JkaW5nIHRvIGhhbmEgc3R1ZGlvKVxyXG4gICAgY29uc3QgaW5mb0l0ZW0gPSBVSVNlcnZpY2UuX2dlbmVyYXRlTG9hZEhpc3RvcnlJbmZvSXRlbTsgLy8ganVzdCBmb3IgbWFraW5nIHRoZSBuYW1lIHNob3J0ZXIuLi5cclxuICAgIGNvbnN0IGNwdVVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdDUFUnICAgICAgICAgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5DUFUgICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5QQ1QgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQ1BVIFVzZWQgYnkgYWxsIHByb2Nlc3NlcyddKTtcclxuICAgIGNvbnN0IG1lbW9yeVJlc2lkZW50ICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdEYXRhYmFzZSBSZXNpZGVudCBNZW1vcnknICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5NZW1vcnkgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQiAgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnUGh5c2ljYWwgbWVtb3J5IHVzZWQgZm9yIGFsbCBIQU5BIHByb2Nlc3NlcyddKTtcclxuICAgIGNvbnN0IG1lbW9yeVRvdGFsUmVzaWRlbnQgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdUb3RhbCBSZXNpZGVudCBNZW1vcnknICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5NZW1vcnkgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQiAgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnUGh5c2ljYWwgbWVtb3J5IHVzZWQgZm9yIGFsbCBwcm9jZXNzZXMnXSk7XHJcbiAgICBjb25zdCBtZW1vcnlVc2VkICAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGF0YWJhc2UgVXNlZCBNZW1vcnknICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuTWVtb3J5IF0sIFtJdGVtLnVuaXQsIFVuaXQuTUIgICAgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ01lbW9yeSB1c2VkIGZvciBhbGwgSEFOQSBwcm9jZXNzZXMnXSk7XHJcbiAgICBjb25zdCBtZW1vcnlMaW1pdCAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGF0YWJhc2UgQWxsb2NhdGlvbiBMaW1pdCcgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuTWVtb3J5IF0sIFtJdGVtLnVuaXQsIFVuaXQuTUIgICAgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ01lbW9yeSBhbGxvY2F0aW9uIGxpbWl0IGZvciBhbGwgcHJvY2Vzc2VzIG9mIEhBTkEgaW5zdGFuY2UnXSk7XHJcbiAgICBjb25zdCBtZW1vcnlTaXplICAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnUGh5c2ljYWwgTWVtb3J5IFNpemUnICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuTWVtb3J5IF0sIFtJdGVtLnVuaXQsIFVuaXQuTUIgICAgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ1BoeXNpY2FsIG1lbW9yeSBzaXplJ10pO1xyXG4gICAgY29uc3QgZGlza1VzZWQgICAgICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0Rpc2sgVXNlZCcgICAgICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLkRpc2sgICBdLCBbSXRlbS51bml0LCBVbml0LkdCICAgICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdEaXNrIHVzZWQnXSk7XHJcbiAgICBjb25zdCBkaXNrU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGlzayBTaXplJyAgICAgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuRGlzayAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuR0IgICAgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ0Rpc2sgc2l6ZSddKTtcclxuICAgIGNvbnN0IG5ldHdvcmtJbiAgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdOZXR3b3JrIEluJyAgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5OZXR3b3JrXSwgW0l0ZW0udW5pdCwgVW5pdC5NQlBlclNlYyAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQnl0ZXMgcmVhZCBmcm9tIG5ldHdvcmsgYnkgYWxsIHByb2Nlc3NlcyddKTtcclxuICAgIGNvbnN0IG5ldHdvcmtPdXQgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdOZXR3b3JrIE91dCcgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5OZXR3b3JrXSwgW0l0ZW0udW5pdCwgVW5pdC5NQlBlclNlYyAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQnl0ZXMgd3JpdHRlbiB0byBuZXR3b3JrIGJ5IGFsbCBwcm9jZXNzZXMnXSk7XHJcbiAgICBjb25zdCBzd2FwSW4gICAgICAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnU3dhcCBJbicgICAgICAgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMTAwXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuU3dhcCAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuTUJQZXJTZWMgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ0J5dGVzIHJlYWQgZnJvbSBzd2FwIGJ5IGFsbCBwcm9jZXNzZXMgKHBzd3BpbiBsaW5lIGluIC9wcm9jL3Ztc3RhdCAqIHN5c2NvbmYoX1NDX1BBR0VTSVpFKSknXSk7XHJcbiAgICBjb25zdCBzd2FwT3V0ICAgICAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnU3dhcCBPdXQnICAgICAgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMTAwXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuU3dhcCAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuTUJQZXJTZWMgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ0J5dGVzIHdyaXR0ZW4gVG8gc3dhcCBieSBhbGwgcHJvY2Vzc2VzIChwc3dwb3V0IGxpbmUgaW4gL3Byb2Mvdm1zdGF0ICogc3lzY29uZihfU0NfUEFHRVNJWkUpKSddKTtcclxuICAgIGNvbnN0IGluZGV4c2VydmVyQ3B1ICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdJbmRleCBTZXJ2ZXIgQ1BVJyAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5DUFUgICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5QQ1QgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQ1BVIHVzZWQgYnkgU2VydmljZSddKTtcclxuICAgIGNvbnN0IGluZGV4c2VydmVyQ3B1U3lzICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdTeXN0ZW0gQ1BVJyAgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5DUFUgICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5QQ1QgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnT1MgS2VybmVsL1N5c3RlbSBDUFUgdXNlZCBieSBTZXJ2aWNlJ10pO1xyXG4gICAgY29uc3QgaW5kZXhzZXJ2ZXJNZW1Vc2VkICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ01lbW9yeSBVc2VkJyAgICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLk1lbW9yeSBdLCBbSXRlbS51bml0LCBVbml0Lk1CICAgICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdNZW1vcnkgdXNlZCBieSBTZXJ2aWNlJ10pO1xyXG4gICAgY29uc3QgaW5kZXhzZXJ2ZXJNZW1MaW1pdCAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ01lbW9yeSBBbGxvY2F0aW9uIExpbWl0JyAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLk1lbW9yeSBdLCBbSXRlbS51bml0LCBVbml0Lk1CICAgICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdNZW1vcnkgYWxsb2NhdGlvbiBsaW1pdCBmb3IgU2VydmljZSddKTtcclxuICAgIGNvbnN0IGluZGV4c2VydmVySGFuZGxlcyAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdIYW5kbGVzJyAgICAgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIG9wZW4gaGFuZGxlcyddKTtcclxuICAgIGNvbnN0IGluZGV4c2VydmVyUGluZ3RpbWUgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdQaW5nIFRpbWUnICAgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5NUyAgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnRHVyYXRpb24gb2YgU2VydmljZSBwaW5nIHJlcXVlc3QgKFRIUkVBRF9NRVRIT0Q9XFwnX19uc1dhdGNoZG9nXFwnKS4gVGhpcyByZXF1ZXN0IGluY2x1ZGVzIHRoZSBjb2xsZWN0aW9uIG9mIHNlcnZpY2Ugc3BlY2lmaWMgS1BJXFwncyddKTtcclxuICAgIGNvbnN0IGluZGV4c2VydmVyU3dhcEluICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdJbmRleCBTZXJ2ZXIgU3dhcCBJbicgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAxMDBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Td2FwICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQlBlclNlYyAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQnl0ZXMgcmVhZCBmcm9tIHN3YXAgYnkgU2VydmljZSAoY29sdW1uIDEyKG1hamZsdCkgaW4gL3Byb2MvPHBpZD4vc3RhdCAqIHN5c2NvbmYoX1NDX1BBR0VTSVpFKSknXSk7XHJcbiAgICBjb25zdCBzcWxDb25uZWN0aW9ucyAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnT3BlbiBDb25uZWN0aW9ucycgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuQ29ubiAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBvcGVuIFNRTCBjb25uZWN0aW9ucyddKTtcclxuICAgIGNvbnN0IGludGVybmFsQ29ubmVjdGlvbnMgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdJbnRlcm5hbCBDb25uZWN0aW9ucycgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Db25uICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIG9wZW4gU1FMIGludGVybmFsIGNvbm5lY3Rpb25zJ10pO1xyXG4gICAgY29uc3QgZXh0ZXJuYWxDb25uZWN0aW9ucyAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0V4dGVybmFsIENvbm5lY3Rpb25zJyAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLkNvbm4gICBdLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2Ygb3BlbiBTUUwgZXh0ZXJuYWwgY29ubmVjdGlvbnMnXSk7XHJcbiAgICBjb25zdCBpZGxlQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnSWRsZSBDb25uZWN0aW9ucycgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuQ29ubiAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBvcGVuIFNRTCBpZGxlIGNvbm5lY3Rpb25zJ10pO1xyXG4gICAgY29uc3Qgc3FsVHJhbnNhY3Rpb25zICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ09wZW4gVHJhbnNhY3Rpb25zJyAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlRyYW5zICBdLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2Ygb3BlbiBTUUwgdHJhbnNhY3Rpb25zJ10pO1xyXG4gICAgY29uc3QgaW50ZXJuYWxUcmFuc2FjdGlvbnMgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0ludGVybmFsIFRyYW5zYWN0aW9ucycgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlRyYW5zICBdLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgaW50ZXJuYWwgdHJhbnNhY3Rpb25zJ10pO1xyXG4gICAgY29uc3QgZXh0ZXJuYWxUcmFuc2FjdGlvbnMgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0V4dGVybmFsIFRyYW5zYWN0aW9ucycgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlRyYW5zICBdLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgZXh0ZXJuYWwgdHJhbnNhY3Rpb25zJ10pO1xyXG4gICAgY29uc3QgdXNlclRyYW5zYWN0aW9ucyAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1VzZXIgVHJhbnNhY3Rpb25zJyAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlRyYW5zICBdLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgdXNlciB0cmFuc2FjdGlvbnMnXSk7XHJcbiAgICBjb25zdCBzcWxCbG9ja2VkVHJhbnMgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnQmxvY2tlZCBUcmFuc2FjdGlvbnMnICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBibG9ja2VkIFNRTCB0cmFuc2FjdGlvbnMnXSk7XHJcbiAgICBjb25zdCBzcWxTdGF0ZW1lbnRzICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnU3RhdGVtZW50cycgICAgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuU3RtdCAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuU3RtdFBlclNlYyBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBmaW5pc2hlZCBTUUwgc3RhdGVtZW50cyddKTtcclxuICAgIGNvbnN0IGNpZFJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdBY3RpdmUgQ29tbWl0IElEIFJhbmdlJyAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnUmFuZ2UgYmV0d2VlbiBuZXdlc3QgYW5kIG9sZGVzdCBhY3RpdmUgY29tbWl0IElEJ10pO1xyXG4gICAgY29uc3QgdGlkUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0FjdGl2ZSBUcmFuc2FjdGlvbiBJRCBSYW5nZSddLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdSYW5nZSBiZXR3ZWVuIG5ld2VzdCBhbmQgb2xkZXN0IGFjdGl2ZSB0cmFuc2FjdGlvbiBJRCddKTtcclxuICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0Q291bnQgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdQZW5kaW5nIFJlcXVlc3QgQ291bnQnICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIHBlbmRpbmcgc2Vzc2lvbiByZXF1ZXN0cyddKTtcclxuICAgIGNvbnN0IG12Y2NOdW0gICAgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdBY3RpdmUgVmVyc2lvbnMnICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIGFjdGl2ZSBNVkNDIHZlcnNpb25zJ10pO1xyXG4gICAgY29uc3QgYWNxdWlyZWRSZWNvcmRMb2NrcyAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0FjcXVpcmVkIFJlY29yZCBMb2NrcycgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgYWNxdWlyZWQgcmVjb3JkIGxvY2tzJ10pO1xyXG4gICAgY29uc3Qgc2VhcmNoQ291bnQgICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1JlYWQgUmVxdWVzdHMnICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlJlcSAgICBdLCBbSXRlbS51bml0LCBVbml0LlJlcVBlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgcmVhZCByZXF1ZXN0cyAoc2VsZWN0KSddKTtcclxuICAgIGNvbnN0IGluZGV4aW5nQ291bnQgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdXcml0ZSBSZXF1ZXN0cycgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5SZXEgICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5SZXFQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIHdyaXRlIHJlcXVlc3RzIChpbnNlcnQsdXBkYXRlLGRlbGV0ZSknXSk7XHJcbiAgICBjb25zdCBtZXJnZUNvdW50ICAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnTWVyZ2UgUmVxdWVzdHMnICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuUmVxICAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuUmVxUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBtZXJnZSByZXF1ZXN0cyddKTtcclxuICAgIGNvbnN0IHVubG9hZENvdW50ICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdDb2x1bW4gVW5sb2FkcycgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5SZXEgICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5SZXFQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIGNvbHVtbiB1bmxvYWRzJ10pO1xyXG4gICAgY29uc3QgaW5kZXhzZXJ2ZXJUaHJlYWRzICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0FjdGl2ZSBUaHJlYWRzJyAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgYWN0aXZlIHRocmVhZHMnXSk7XHJcbiAgICBjb25zdCB3YWl0aW5nVGhyZWFkcyAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnV2FpdGluZyBUaHJlYWRzJyAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiB3YWl0aW5nIHRocmVhZHMnXSk7XHJcbiAgICBjb25zdCB0b3RhbFRocmVhZHMgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnVG90YWwgVGhyZWFkcycgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ1RvdGFsIG51bWJlciBvZiB0aHJlYWRzJ10pO1xyXG4gICAgY29uc3QgYWN0aXZlU3FsRXhlY3V0b3JzICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0FjdGl2ZSBTcWxFeGVjdXRvcnMnICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgYWN0aXZlIFNxbEV4ZWN1dG9ycyddKTtcclxuICAgIGNvbnN0IHdhaXRpbmdTcWxFeGVjdXRvcnMgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdXYWl0aW5nIFNxbEV4ZWN1dG9ycycgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIHdhaXRpbmcgU3FsRXhlY3V0b3JzJ10pO1xyXG4gICAgY29uc3QgdG90YWxTcWxFeGVjdXRvcnMgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1RvdGFsIFNxbEV4ZWN1dG9ycycgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdUb3RhbCBudW1iZXIgb2YgU3FsRXhlY3V0b3JzJ10pO1xyXG4gICAgY29uc3QgZGF0YVdyaXRlU2l6ZSAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0RhdGEgV3JpdGUgU2l6ZScgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLldSU2l6ZSBdLCBbSXRlbS51bml0LCBVbml0Lk1CUGVyU2VjICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdCeXRlcyB3cml0dGVuIHRvIGRhdGEgYXJlYSddKTtcclxuICAgIGNvbnN0IGRhdGFXcml0ZVRpbWUgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdEYXRhIFdyaXRlIFRpbWUnICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5XUlRpbWUgXSwgW0l0ZW0udW5pdCwgVW5pdC5TZWNQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnVGltZSB1c2VkIGZvciB3cml0aW5nIHRvIGRhdGEgYXJlYSddKTtcclxuICAgIGNvbnN0IGxvZ1dyaXRlU2l6ZSAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdMb2cgV3JpdGUgU2l6ZScgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5XUlNpemUgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQlBlclNlYyAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQnl0ZXMgd3JpdHRlbiB0byBsb2cgYXJlYSddKTtcclxuICAgIGNvbnN0IGxvZ1dyaXRlVGltZSAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdMb2cgV3JpdGUgVGltZScgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5XUlRpbWUgXSwgW0l0ZW0udW5pdCwgVW5pdC5TZWNQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnVGltZSB1c2VkIGZvciB3cml0aW5nIHRvIGxvZyBhcmVhJ10pO1xyXG4gICAgY29uc3QgZGF0YVJlYWRTaXplICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0RhdGEgUmVhZCBTaXplJyAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLldSU2l6ZSBdLCBbSXRlbS51bml0LCBVbml0Lk1CUGVyU2VjICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdCeXRlcyByZWFkIGZyb20gZGF0YSBhcmVhJ10pO1xyXG4gICAgY29uc3QgZGF0YVJlYWRUaW1lICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0RhdGEgUmVhZCBUaW1lJyAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLldSVGltZSBdLCBbSXRlbS51bml0LCBVbml0LlNlY1BlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdUaW1lIHVzZWQgZm9yIHJlYWRpbmcgZnJvbSBkYXRhIGFyZWEnXSk7XHJcbiAgICBjb25zdCBsb2dSZWFkU2l6ZSAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnTG9nIFJlYWQgU2l6ZScgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuV1JTaXplIF0sIFtJdGVtLnVuaXQsIFVuaXQuTUJQZXJTZWMgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ0J5dGVzIHJlYWQgZnJvbSBsb2cgYXJlYSddKTtcclxuICAgIGNvbnN0IGxvZ1JlYWRUaW1lICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdMb2cgUmVhZCBUaW1lJyAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5XUlRpbWUgXSwgW0l0ZW0udW5pdCwgVW5pdC5TZWNQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnVGltZSB1c2VkIGZvciByZWFkaW5nIGZyb20gbG9nIGFyZWEnXSk7XHJcbiAgICBjb25zdCBkYXRhQmFja3VwV3JpdGVTaXplICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGF0YSBCYWNrdXAgV3JpdGUgU2l6ZScgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuV1JTaXplIF0sIFtJdGVtLnVuaXQsIFVuaXQuTUJQZXJTZWMgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ0J5dGVzIHdyaXR0ZW4gdG8gZGF0YSBiYWNrdXAnXSk7XHJcbiAgICBjb25zdCBkYXRhQmFja3VwV3JpdGVUaW1lICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGF0YSBCYWNrdXAgV3JpdGUgVGltZScgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuV1JUaW1lIF0sIFtJdGVtLnVuaXQsIFVuaXQuU2VjUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ1RpbWUgdXNlZCBmb3Igd3JpdGluZyB0byBkYXRhIGJhY2t1cCddKTtcclxuICAgIGNvbnN0IGxvZ0JhY2t1cFdyaXRlU2l6ZSAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdMb2cgQmFja3VwIFdyaXRlIFNpemUnICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5XUlNpemUgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQlBlclNlYyAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQnl0ZXMgd3JpdHRlbiB0byBsb2cgYmFja3VwJ10pO1xyXG4gICAgY29uc3QgbG9nQmFja3VwV3JpdGVUaW1lICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0xvZyBCYWNrdXAgV3JpdGUgVGltZScgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLldSVGltZSBdLCBbSXRlbS51bml0LCBVbml0LlNlY1BlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdUaW1lIHVzZWQgZm9yIHdyaXRpbmcgdG8gbG9nIGJhY2t1cCddKTtcclxuICAgIGNvbnN0IG11dGV4Q29sbGlzaW9uQ291bnQgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdNdXRleCBDb2xsaXNpb25zJyAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5Db2xQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIGNvbGxpc2lvbnMgb24gbXV0ZXhlcyddKTtcclxuICAgIGNvbnN0IHJlYWRXcml0ZUxvY2tDb2xsaXNpb25Db3VudCAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdSZWFkL1dyaXRlIExvY2sgQ29sbGlzaW9ucycgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5Db2xQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIGNvbGxpc2lvbnMgb24gcmVhZC93cml0ZSBsb2NrcyddKTtcclxuICAgIGNvbnN0IGFkbWlzc2luQ29udHJvbEFkbWl0Q291bnQgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdBZG1pdHRlZCBSZXF1ZXN0cycgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5SZXFQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIHNlc3Npb24gcmVxdWVzdHMgYWRtaXR0ZWQgYnkgYWRtaXNzaW9uIGNvbnRyb2wnXSk7XHJcbiAgICBjb25zdCBhZG1pc3Npb25Db250cm9sUmVqZWN0Q291bnQgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnUmVqZWN0ZWQgUmVxdWVzdHMnICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuUmVxUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBzZXNzaW9uIHJlcXVlc3RzIHJlamVjdGVkIGJ5IGFkbWlzc2lvbiBjb250cm9sJ10pO1xyXG4gICAgY29uc3QgYWRtaXNzaW9uQ29udHJvbFdhaXRpbmdSZXF1ZXN0cyA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1dhaXRpbmcgUmVxdWVzdHMnICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LlJlcVBlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2Ygc2Vzc2lvbiByZXF1ZXN0cyB3YWl0aW5nIGluIGFkbWlzc2lvbiBjb250cm9sIHF1ZXVlJ10pO1xyXG4gICAgY29uc3QgYWRtaXNzaW9uQ29udHJvbFdhaXRUaW1lICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1dhaXQgVGltZScgICAgICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LlNlY1BlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdUb3RhbCB3YWl0IHRpbWUgb2Ygc2Vzc2lvbiByZXF1ZXN0cyBxdWV1ZWQgaW4gYWRtaXNzaW9uIGNvbnRyb2wgcXVldWUnXSk7XHJcbiAgICBjb25zdCBhZG1pc3Npb25Db250cm9sRW5xdWV1ZUNvdW50ICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRW5xdWV1ZWQgUmVxdWVzdHMnICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuUmVxUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBzZXNzaW9uIHJlcXVlc3RzIGVucXVldWVkIGJ5IGFkbWlzc2lvbiBjb250cm9sJ10pO1xyXG4gICAgY29uc3QgYWRtaXNzaW9uQ29udHJvbERlcXVldWVDb3VudCAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0RlcXVldWVkIFJlcXVlc3RzJyAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LlJlcVBlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2Ygc2Vzc2lvbiByZXF1ZXN0cyBkZXF1ZXVlZCBieSBhZG1pc3Npb24gY29udHJvbCddKTtcclxuICAgIGNvbnN0IGFkbWlzc2lvbkNvbnRyb2xUaW1lb3V0Q291bnQgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdUaW1lZCBvdXQgUmVxdWVzdHMnICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuUmVxUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiB0aW1lZCBvdXQgc2Vzc2lvbiByZXF1ZXN0cyBpbiBhZG1pc3Npb24gY29udHJvbCBxdWV1ZSddKTtcclxuXHJcbiAgICAvLyBnZW5lcmF0ZSBIb3N0XHJcbiAgICBjb25zdCBsb2FkSGlzdG9yeUluZm9Ib3N0OiBMb2FkSGlzdG9yeUluZm9Ib3N0ID0ge1xyXG4gICAgICBjcHVVc2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogY3B1VXNlZCAgICAgICAgICAgICxcclxuICAgICAgbWVtb3J5UmVzaWRlbnQgICAgICAgICAgICAgICAgICA6IG1lbW9yeVJlc2lkZW50ICAgICAsXHJcbiAgICAgIG1lbW9yeVRvdGFsUmVzaWRlbnQgICAgICAgICAgICAgOiBtZW1vcnlUb3RhbFJlc2lkZW50LFxyXG4gICAgICBtZW1vcnlVc2VkICAgICAgICAgICAgICAgICAgICAgIDogbWVtb3J5VXNlZCAgICAgICAgICxcclxuICAgICAgbWVtb3J5TGltaXQgICAgICAgICAgICAgICAgICAgICA6IG1lbW9yeUxpbWl0ICAgICAgICAsXHJcbiAgICAgIG1lbW9yeVNpemUgICAgICAgICAgICAgICAgICAgICAgOiBtZW1vcnlTaXplICAgICAgICAgLFxyXG4gICAgICBkaXNrVXNlZCAgICAgICAgICAgICAgICAgICAgICAgIDogZGlza1VzZWQgICAgICAgICAgICxcclxuICAgICAgZGlza1NpemUgICAgICAgICAgICAgICAgICAgICAgICA6IGRpc2tTaXplICAgICAgICAgICAsXHJcbiAgICAgIG5ldHdvcmtJbiAgICAgICAgICAgICAgICAgICAgICAgOiBuZXR3b3JrSW4gICAgICAgICAgLFxyXG4gICAgICBuZXR3b3JrT3V0ICAgICAgICAgICAgICAgICAgICAgIDogbmV0d29ya091dCAgICAgICAgICxcclxuICAgICAgc3dhcEluICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN3YXBJbiAgICAgICAgICAgICAsXHJcbiAgICAgIHN3YXBPdXQgICAgICAgICAgICAgICAgICAgICAgICAgOiBzd2FwT3V0ICAgICAgICAgICAgLFxyXG4gICAgfTtcclxuICAgIC8vIGdlbmVyYXRlIEluZGV4IFNlcnZlclxyXG4gICAgY29uc3QgbG9hZEhpc3RvcnlJbmZvSW5kZXhTZXJ2ZXI6IExvYWRIaXN0b3J5SW5mb0luZGV4U2VydmVyID0ge1xyXG4gICAgICBpbmRleHNlcnZlckNwdSAgICAgICAgICAgICAgICAgIDogaW5kZXhzZXJ2ZXJDcHUgICAgICAsXHJcbiAgICAgIGluZGV4c2VydmVyQ3B1U3lzICAgICAgICAgICAgICAgOiBpbmRleHNlcnZlckNwdVN5cyAgICxcclxuICAgICAgaW5kZXhzZXJ2ZXJNZW1Vc2VkICAgICAgICAgICAgICA6IGluZGV4c2VydmVyTWVtVXNlZCAgLFxyXG4gICAgICBpbmRleHNlcnZlck1lbUxpbWl0ICAgICAgICAgICAgIDogaW5kZXhzZXJ2ZXJNZW1MaW1pdCAsXHJcbiAgICAgIGluZGV4c2VydmVySGFuZGxlcyAgICAgICAgICAgICAgOiBpbmRleHNlcnZlckhhbmRsZXMgICxcclxuICAgICAgaW5kZXhzZXJ2ZXJQaW5ndGltZSAgICAgICAgICAgICA6IGluZGV4c2VydmVyUGluZ3RpbWUgLFxyXG4gICAgICBpbmRleHNlcnZlclN3YXBJbiAgICAgICAgICAgICAgIDogaW5kZXhzZXJ2ZXJTd2FwSW4gICAsXHJcbiAgICB9O1xyXG4gICAgLy8gZ2VuZXJhdGUgU1FMXHJcbiAgICBjb25zdCBsb2FkSGlzdG9yeUluZm9TUUw6IExvYWRIaXN0b3J5SW5mb1NRTCA9IHtcclxuICAgICAgc3FsQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAgICA6IHNxbENvbm5lY3Rpb25zICAgICAgLFxyXG4gICAgICBpbnRlcm5hbENvbm5lY3Rpb25zICAgICAgICAgICAgIDogaW50ZXJuYWxDb25uZWN0aW9ucyAsXHJcbiAgICAgIGV4dGVybmFsQ29ubmVjdGlvbnMgICAgICAgICAgICAgOiBleHRlcm5hbENvbm5lY3Rpb25zICxcclxuICAgICAgaWRsZUNvbm5lY3Rpb25zICAgICAgICAgICAgICAgICA6IGlkbGVDb25uZWN0aW9ucyAgICAgLFxyXG4gICAgICBzcWxUcmFuc2FjdGlvbnMgICAgICAgICAgICAgICAgIDogc3FsVHJhbnNhY3Rpb25zICAgICAsXHJcbiAgICAgIGludGVybmFsVHJhbnNhY3Rpb25zICAgICAgICAgICAgOiBpbnRlcm5hbFRyYW5zYWN0aW9ucyxcclxuICAgICAgZXh0ZXJuYWxUcmFuc2FjdGlvbnMgICAgICAgICAgICA6IGV4dGVybmFsVHJhbnNhY3Rpb25zLFxyXG4gICAgICB1c2VyVHJhbnNhY3Rpb25zICAgICAgICAgICAgICAgIDogdXNlclRyYW5zYWN0aW9ucyAgICAsXHJcbiAgICAgIHNxbEJsb2NrZWRUcmFucyAgICAgICAgICAgICAgICAgOiBzcWxCbG9ja2VkVHJhbnMgICAgICxcclxuICAgICAgc3FsU3RhdGVtZW50cyAgICAgICAgICAgICAgICAgICA6IHNxbFN0YXRlbWVudHMgICAgICAgLFxyXG4gICAgICBjaWRSYW5nZSAgICAgICAgICAgICAgICAgICAgICAgIDogY2lkUmFuZ2UgICAgICAgICAgICAsXHJcbiAgICAgIHRpZFJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgOiB0aWRSYW5nZSAgICAgICAgICAgICxcclxuICAgICAgcGVuZGluZ1JlcXVlc3RDb3VudCAgICAgICAgICAgICA6IHBlbmRpbmdSZXF1ZXN0Q291bnQgLFxyXG4gICAgfTtcclxuICAgIC8vIGdlbmVyYXRlIFJvdyBTdG9yZVxyXG4gICAgY29uc3QgbG9hZEhpc3RvcnlJbmZvUm93U3RvcmU6IExvYWRIaXN0b3J5SW5mb1Jvd1N0b3JlID0ge1xyXG4gICAgICBtdmNjTnVtICAgICAgICAgICAgICAgICAgICAgICAgIDogbXZjY051bSAgICAgICAgICAgICxcclxuICAgICAgYWNxdWlyZWRSZWNvcmRMb2NrcyAgICAgICAgICAgICA6IGFjcXVpcmVkUmVjb3JkTG9ja3MsXHJcbiAgICB9O1xyXG4gICAgLy8gZ2VuZXJhdGUgQ29sdW1uIFN0b3JlXHJcbiAgICBjb25zdCBsb2FkSGlzdG9yeUluZm9Db2x1bW5TdG9yZTogTG9hZEhpc3RvcnlJbmZvQ29sdW1uU3RvcmUgPSB7XHJcbiAgICAgIHNlYXJjaENvdW50ICAgICAgICAgICAgICAgICAgICAgOiBzZWFyY2hDb3VudCAgLFxyXG4gICAgICBpbmRleGluZ0NvdW50ICAgICAgICAgICAgICAgICAgIDogaW5kZXhpbmdDb3VudCxcclxuICAgICAgbWVyZ2VDb3VudCAgICAgICAgICAgICAgICAgICAgICA6IG1lcmdlQ291bnQgICAsXHJcbiAgICAgIHVubG9hZENvdW50ICAgICAgICAgICAgICAgICAgICAgOiB1bmxvYWRDb3VudCAgLFxyXG4gICAgfTtcclxuICAgIC8vIGdlbmVyYXRlIFRocmVhZHNcclxuICAgIGNvbnN0IGxvYWRIaXN0b3J5SW5mb1RocmVhZHM6IExvYWRIaXN0b3J5SW5mb1RocmVhZHMgPSB7XHJcbiAgICAgIGluZGV4c2VydmVyVGhyZWFkcyAgICAgICAgICAgICAgOiBpbmRleHNlcnZlclRocmVhZHMgLFxyXG4gICAgICB3YWl0aW5nVGhyZWFkcyAgICAgICAgICAgICAgICAgIDogd2FpdGluZ1RocmVhZHMgICAgICxcclxuICAgICAgdG90YWxUaHJlYWRzICAgICAgICAgICAgICAgICAgICA6IHRvdGFsVGhyZWFkcyAgICAgICAsXHJcbiAgICAgIGFjdGl2ZVNxbEV4ZWN1dG9ycyAgICAgICAgICAgICAgOiBhY3RpdmVTcWxFeGVjdXRvcnMgLFxyXG4gICAgICB3YWl0aW5nU3FsRXhlY3V0b3JzICAgICAgICAgICAgIDogd2FpdGluZ1NxbEV4ZWN1dG9ycyxcclxuICAgICAgdG90YWxTcWxFeGVjdXRvcnMgICAgICAgICAgICAgICA6IHRvdGFsU3FsRXhlY3V0b3JzICAsXHJcbiAgICB9O1xyXG4gICAgLy8gZ2VuZXJhdGUgUGVyc2lzdGVuY2VcclxuICAgIGNvbnN0IGxvYWRIaXN0b3J5SW5mb1BlcnNpc3RlbmNlOiBMb2FkSGlzdG9yeUluZm9QZXJzaXN0ZW5jZSA9IHtcclxuICAgICAgZGF0YVdyaXRlU2l6ZSAgICAgICAgICAgICAgICAgICA6IGRhdGFXcml0ZVNpemUsXHJcbiAgICAgIGRhdGFXcml0ZVRpbWUgICAgICAgICAgICAgICAgICAgOiBkYXRhV3JpdGVUaW1lLFxyXG4gICAgICBsb2dXcml0ZVNpemUgICAgICAgICAgICAgICAgICAgIDogbG9nV3JpdGVTaXplICxcclxuICAgICAgbG9nV3JpdGVUaW1lICAgICAgICAgICAgICAgICAgICA6IGxvZ1dyaXRlVGltZSAsXHJcblxyXG4gICAgICBkYXRhUmVhZFNpemUgICAgICAgICAgICAgICAgICAgIDogZGF0YVJlYWRTaXplICxcclxuICAgICAgZGF0YVJlYWRUaW1lICAgICAgICAgICAgICAgICAgICA6IGRhdGFSZWFkVGltZSAsXHJcbiAgICAgIGxvZ1JlYWRTaXplICAgICAgICAgICAgICAgICAgICAgOiBsb2dSZWFkU2l6ZSAgLFxyXG4gICAgICBsb2dSZWFkVGltZSAgICAgICAgICAgICAgICAgICAgIDogbG9nUmVhZFRpbWUgICxcclxuICAgIH07XHJcbiAgICAvLyBnZW5lcmF0ZSBCYWNrdXBcclxuICAgIGNvbnN0IGxvYWRIaXN0b3J5SW5mb0JhY2t1cDogTG9hZEhpc3RvcnlJbmZvQmFja3VwID0ge1xyXG4gICAgICBkYXRhQmFja3VwV3JpdGVTaXplICAgICAgICAgICAgIDogZGF0YUJhY2t1cFdyaXRlU2l6ZSxcclxuICAgICAgZGF0YUJhY2t1cFdyaXRlVGltZSAgICAgICAgICAgICA6IGRhdGFCYWNrdXBXcml0ZVRpbWUsXHJcbiAgICAgIGxvZ0JhY2t1cFdyaXRlU2l6ZSAgICAgICAgICAgICAgOiBsb2dCYWNrdXBXcml0ZVNpemUgLFxyXG4gICAgICBsb2dCYWNrdXBXcml0ZVRpbWUgICAgICAgICAgICAgIDogbG9nQmFja3VwV3JpdGVUaW1lICxcclxuICAgIH07XHJcbiAgICAvLyBnZW5lcmF0ZSBTeW5jaHJvbml6YXRpb24gUHJpbWl0aXZlc1xyXG4gICAgY29uc3QgbG9hZEhpc3RvcnlJbmZvU3luY2hyb25pemF0aW9uUHJpbWl0aXZlczogTG9hZEhpc3RvcnlJbmZvU3luY1ByaW1pdGl2ZXMgPSB7XHJcbiAgICAgIG11dGV4Q29sbGlzaW9uQ291bnQgICAgICAgICAgICAgOiBtdXRleENvbGxpc2lvbkNvdW50ICAgICAgICAsXHJcbiAgICAgIHJlYWRXcml0ZUxvY2tDb2xsaXNpb25Db3VudCAgICAgOiByZWFkV3JpdGVMb2NrQ29sbGlzaW9uQ291bnQsXHJcbiAgICB9O1xyXG4gICAgLy8gU2Vzc2lvbiBBZG1pc3Npb24gQ29udHJvbFxyXG4gICAgY29uc3QgbG9hZEhpc3RvcnlJbmZvU2Vzc2lvbkFkbWlzc2lvbkNvbnRyb2w6IExvYWRIaXN0b3J5SW5mb1Nlc3Npb25BZG1pc3Npb25Db250cm9sID0ge1xyXG4gICAgICBhZG1pc3NpbkNvbnRyb2xBZG1pdENvdW50ICAgICAgIDogYWRtaXNzaW5Db250cm9sQWRtaXRDb3VudCAgICAgICxcclxuICAgICAgYWRtaXNzaW9uQ29udHJvbFJlamVjdENvdW50ICAgICA6IGFkbWlzc2lvbkNvbnRyb2xSZWplY3RDb3VudCAgICAsXHJcbiAgICAgIGFkbWlzc2lvbkNvbnRyb2xXYWl0aW5nUmVxdWVzdHMgOiBhZG1pc3Npb25Db250cm9sV2FpdGluZ1JlcXVlc3RzLFxyXG4gICAgICBhZG1pc3Npb25Db250cm9sV2FpdFRpbWUgICAgICAgIDogYWRtaXNzaW9uQ29udHJvbFdhaXRUaW1lICAgICAgICxcclxuICAgICAgYWRtaXNzaW9uQ29udHJvbEVucXVldWVDb3VudCAgICA6IGFkbWlzc2lvbkNvbnRyb2xFbnF1ZXVlQ291bnQgICAsXHJcbiAgICAgIGFkbWlzc2lvbkNvbnRyb2xEZXF1ZXVlQ291bnQgICAgOiBhZG1pc3Npb25Db250cm9sRGVxdWV1ZUNvdW50ICAgLFxyXG4gICAgICBhZG1pc3Npb25Db250cm9sVGltZW91dENvdW50ICAgIDogYWRtaXNzaW9uQ29udHJvbFRpbWVvdXRDb3VudCAgICxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ0hvc3QnOiBsb2FkSGlzdG9yeUluZm9Ib3N0LFxyXG4gICAgICAnSW5kZXggU2VydmVyJzogbG9hZEhpc3RvcnlJbmZvSW5kZXhTZXJ2ZXIsXHJcbiAgICAgICdTUUwnOiBsb2FkSGlzdG9yeUluZm9TUUwsXHJcbiAgICAgICdSb3cgU3RvcmUnOiBsb2FkSGlzdG9yeUluZm9Sb3dTdG9yZSxcclxuICAgICAgJ0NvbHVtbiBTdG9yZSc6IGxvYWRIaXN0b3J5SW5mb0NvbHVtblN0b3JlLFxyXG4gICAgICAnVGhyZWFkcyc6IGxvYWRIaXN0b3J5SW5mb1RocmVhZHMsXHJcbiAgICAgICdQZXJzaXN0ZW5jZSc6IGxvYWRIaXN0b3J5SW5mb1BlcnNpc3RlbmNlLFxyXG4gICAgICAnQmFja3VwJzogbG9hZEhpc3RvcnlJbmZvQmFja3VwLFxyXG4gICAgICAnU3luY2hyb25pemF0aW9uIFByaW1pdGl2ZXMnOiBsb2FkSGlzdG9yeUluZm9TeW5jaHJvbml6YXRpb25QcmltaXRpdmVzLFxyXG4gICAgICAnU2Vzc2lvbiBBZG1pc3Npb24gQ29udHJvbCc6IGxvYWRIaXN0b3J5SW5mb1Nlc3Npb25BZG1pc3Npb25Db250cm9sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2V0IHJnYmNvbG9yIG9iamVjdCB2aWEgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2dldFJnYkNvbG9yKHJlZDogbnVtYmVyLCBncmVlbjogbnVtYmVyLCBibHVlOiBudW1iZXIsIGFscGhhOiBudW1iZXIpOiBDb2xvclJnYmEge1xyXG4gICAgcmV0dXJuIHtyZWQ6IHJlZCwgZ3JlZW46IGdyZWVuLCBibHVlOiBibHVlLCBhbHBoYTogYWxwaGF9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2dldFlTY2FsZUZvckl0ZW0oaXRlbTogYW55LCB5U2NhbGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4geVNjYWxlID4gaXRlbVtJdGVtLnlTY2FsZV0gPyAoaXRlbVtJdGVtLnVuaXRdID09PSBVbml0LlBDVCA/IDEwMCA6IHlTY2FsZSkgOiBpdGVtW0l0ZW0ueVNjYWxlXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIF9nZXRNYXhWYWx1ZU9mR3JvdXAoZ3JvdXBJdGVtczogYW55KTogbnVtYmVyIHtcclxuICAgIGxldCBtYXggPSAwO1xyXG4gICAgaWYgKGdyb3VwSXRlbXMpIHtcclxuICAgICAgbWF4ID0gZ3JvdXBJdGVtcy5yZWR1Y2UoKG1heFZhbHVlLCBjdXJyZW50KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQuTWF4ID4gbWF4VmFsdWUgPyBjdXJyZW50Lk1heCA6IG1heFZhbHVlO1xyXG4gICAgICB9LCAwKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtYXg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRMb2FkSGlzdG9yeUluZm8ocG9ydDogc3RyaW5nKTogTG9hZEhpc3RvcnlJbmZvIHtcclxuICAgIGlmICghdGhpcy5fbG9hZEhpc3RvcnlJbmZvc1twb3J0XSkge1xyXG4gICAgICB0aGlzLl9sb2FkSGlzdG9yeUluZm9zW3BvcnRdID0gVUlTZXJ2aWNlLl9nZW5lcmF0ZUxvYWRIaXN0b3J5SW5mbygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRIaXN0b3J5SW5mb3NbcG9ydF07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRQcm9jZXNzaW5nVW5pdChpdGVtS2V5OiBzdHJpbmcsIHBvcnQ6IHN0cmluZyk6IFVuaXRUeXBlIHtcclxuICAgIGNvbnN0IGhpc3RvcnlEZXRhaWxJdGVtOiBMb2FkSGlzdG9yeUluZm9JdGVtID0gdGhpcy5fZ2V0SXRlbUJ5S2V5KGl0ZW1LZXksIHBvcnQpO1xyXG4gICAgaWYgKGhpc3RvcnlEZXRhaWxJdGVtKSB7XHJcbiAgICAgIGxldCB1bml0ID0gaGlzdG9yeURldGFpbEl0ZW0uVW5pdDtcclxuICAgICAgaWYgKCF1bml0KSB7XHJcbiAgICAgICAgdW5pdCA9ICcnO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBVSVNlcnZpY2UuX3VuaXRUeXBlW3VuaXRdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0T3ZlcnZpZXcgKGtleTogc3RyaW5nLCBvdmVydmlldzogTG9hZEhpc3RvcnlJbmZvSXRlbSwgdW5pdDogVW5pdFR5cGUsIHBvcnQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgaGlzdG9yeURldGFpbEl0ZW0gPSB0aGlzLl9nZXRJdGVtQnlLZXkoa2V5LCBwb3J0KTtcclxuICAgIGlmIChoaXN0b3J5RGV0YWlsSXRlbSkge1xyXG4gICAgICBoaXN0b3J5RGV0YWlsSXRlbS5NYXggPSBvdmVydmlldy5NYXggPj0gMCA/IG92ZXJ2aWV3Lk1heCA6IDA7XHJcbiAgICAgIGhpc3RvcnlEZXRhaWxJdGVtLkF2ZXJhZ2UgPSBvdmVydmlldy5BdmVyYWdlID49IDAgPyBvdmVydmlldy5BdmVyYWdlIDogMDtcclxuICAgICAgLy8gb25seSBUWVBFX0NPTlZFUlNJT05fTUJTRUMgYW5kIFRZUEVfQ09OVkVSVElPTl9TRUMgKGVnOiBNQi9zLCByZXEvcyBzdG10L3MuLi4pIG5lZWQgc3VtXHJcbiAgICAgIGhpc3RvcnlEZXRhaWxJdGVtLlN1bSA9IGlzVW5pdFRpbWVSZWxhdGVkKHVuaXQpID8gKG92ZXJ2aWV3LlN1bSA+PSAwID8gb3ZlcnZpZXcuU3VtIDogMCkgOiAnLSc7XHJcbiAgICAgIGhpc3RvcnlEZXRhaWxJdGVtLkxhc3QgPSBvdmVydmlldy5MYXN0ID49IDAgPyBvdmVydmlldy5MYXN0IDogMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNvbnZlcnQgdW5pdCB2YWx1ZXMgKGVnOiBieXRlIHRvIE1CIG9yIEdCKSBhbmQgZ2VuZXJhdGUgdGhlIGNvbnRyb2wgZGF0YSAoc3VtLCBtYXgsIGF2ZykgZm9yIG9uZSByb3dcclxuICAgKi9cclxuICBwcml2YXRlIF9jb252ZXJ0VW5pdEFuZEdlbmVyYXRlUm93Q29udHJvbERhdGEocm93OiBDaGFydENvbnRlbnREYXRhSXRlbVtdLCBrZXk6IHN0cmluZywgdW5pdDogVW5pdFR5cGUsIHBvcnQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICBjb25zdCBvdmVydmlldzogTG9hZEhpc3RvcnlJbmZvSXRlbSA9IHtTdW06IDAsIE1heDogMCwgQXZlcmFnZTogMCwgTGFzdDogMH07XHJcbiAgICAgICAgY29uc3QgaWdub3JlZFRhaWxMaW5lTnVtID0gZ2V0SWdub3JlZExpbmVOdW1Gcm9tVGFpbCgpO1xyXG4gICAgICAgIGxldCBpbnZhbGlkQ291bnQgPSAwO1xyXG4gICAgICAgIC8vIGNvbnZlcnQgdW5pdCBhbmQgY2FsY3VsYXRlIHRoZSBvdmVydmlldyBkYXRhLCBza2lwIHRoZSBmaXJzdCwgYW5kIGxhc3QgdGhyZWUgcm93cy5cclxuICAgICAgICByb3cuZm9yRWFjaCgoaXRlbSwgaW5kZXgsIGFycmF5RGF0YSkgPT4ge1xyXG4gICAgICAgICAgLy8gc2tpcCBpZ25vcmVkIGxpbmUocykgZnJvbSB0YWlsXHJcbiAgICAgICAgICBpZiAoaW5kZXggPD0gcm93Lmxlbmd0aCAtIGlnbm9yZWRUYWlsTGluZU51bSAtIDEpIHtcclxuICAgICAgICAgICAgaWYgKGFycmF5RGF0YVtpbmRleF0ueSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgYXJyYXlEYXRhW2luZGV4XS55ID0gZ2V0VmFsdWVCeVVuaXQoaXRlbS55LCB1bml0KTtcclxuICAgICAgICAgICAgICBvdmVydmlldy5TdW0gKz0gYXJyYXlEYXRhW2luZGV4XS55O1xyXG4gICAgICAgICAgICAgIGlmIChpc1VuaXRUaW1lUmVsYXRlZCh1bml0KSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBoYW5hIHN0dWRpbywgZm9yIHRob3NlIHRpbWUgcmVsYXRlZCBjb2x1bW4sIHRoZSBmaXJzdCB2YWx1ZSBpcyBzZXQgdG8gMFxyXG4gICAgICAgICAgICAgICAgICBhcnJheURhdGFbaW5kZXhdLnkgPSAwO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgLy8gZ2V0IHZhbHVlIGZvciB1bml0IGxpa2U6IE1CL3MgICh2YWx1ZSAvIHNlY29uZHMpXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVEaWZmID0gYXJyYXlEYXRhW2luZGV4XS54IC0gYXJyYXlEYXRhW2luZGV4IC0gMV0ueDtcclxuICAgICAgICAgICAgICAgICAgYXJyYXlEYXRhW2luZGV4XS55ID0gdGltZURpZmYgIT09IDAgPyBhcnJheURhdGFbaW5kZXhdLnkgKiAxMDAwIC8gdGltZURpZmYgOiAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBhcnJheURhdGFbaW5kZXhdLnkgPSBnZXRSb3VuZGVkVmFsdWUoYXJyYXlEYXRhW2luZGV4XS55KTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGFycmF5RGF0YVtpbmRleF0ueSA+IG92ZXJ2aWV3Lk1heCkge1xyXG4gICAgICAgICAgICAgICAgb3ZlcnZpZXcuTWF4ID0gYXJyYXlEYXRhW2luZGV4XS55O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgdG8gMCwgZm9yIHRob3NlIHBvaW50cyB3aXRoIHZhbHVlIC0xIG9yIDwgMFxyXG4gICAgICAgICAgICAgIGFycmF5RGF0YVtpbmRleF0ueSA9IDA7XHJcbiAgICAgICAgICAgICAgLy8gaW52YWxpZCBjb3VudCArIDEsIGZvciBjYWxjdWxhdGluZyB0aGUgYXZlcmFnZSAobm90IHRpbWUgcmVsYXRpdmUpXHJcbiAgICAgICAgICAgICAgaW52YWxpZENvdW50Kys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHJvdy5sZW5ndGggPj0gKGlnbm9yZWRUYWlsTGluZU51bSArIGludmFsaWRDb3VudCkpIHtcclxuICAgICAgICAgIGlmIChpc1VuaXRUaW1lUmVsYXRlZCh1bml0KSkge1xyXG4gICAgICAgICAgICBjb25zdCB0aW1lUGVyaW9kID0gcm93W3Jvdy5sZW5ndGggLSBpZ25vcmVkVGFpbExpbmVOdW0gLSAxXS54IC0gcm93WzBdLng7XHJcbiAgICAgICAgICAgIG92ZXJ2aWV3LkF2ZXJhZ2UgPSB0aW1lUGVyaW9kICE9PSAwID8gZ2V0Um91bmRlZFZhbHVlKG92ZXJ2aWV3LlN1bSAqIDEwMDAgLyB0aW1lUGVyaW9kKSA6IDA7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB2YWxpZEl0ZW1Db3VudCA9IHJvdy5sZW5ndGggLSBpZ25vcmVkVGFpbExpbmVOdW0gLSBpbnZhbGlkQ291bnQ7XHJcbiAgICAgICAgICAgIG92ZXJ2aWV3LkF2ZXJhZ2UgPSB2YWxpZEl0ZW1Db3VudCA+IDAgPyBnZXRSb3VuZGVkVmFsdWUob3ZlcnZpZXcuU3VtIC8gdmFsaWRJdGVtQ291bnQpIDogMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIG92ZXJ2aWV3Lkxhc3QgPSByb3dbcm93Lmxlbmd0aCAtIGlnbm9yZWRUYWlsTGluZU51bSAtIDFdLnk7XHJcbiAgICAgICAgICBvdmVydmlldy5TdW0gPSBnZXRSb3VuZGVkVmFsdWUob3ZlcnZpZXcuU3VtKTtcclxuICAgICAgICAgIG92ZXJ2aWV3Lk1heCA9IGdldFJvdW5kZWRWYWx1ZShvdmVydmlldy5NYXgpO1xyXG5cclxuICAgICAgICAgIC8vIHJlbW92ZSB0aG9zZSBpZ25vcmVkIGxpbmVzXHJcbiAgICAgICAgICByb3cubGVuZ3RoID0gcm93Lmxlbmd0aCAtIGlnbm9yZWRUYWlsTGluZU51bTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc2V0T3ZlcnZpZXcoa2V5LCBvdmVydmlldywgdW5pdCwgcG9ydCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb29wIGZyb20gYWxsIGhpc3RvcnkgaXRlbXMsIHB1dCB0aG9zZSBoaXN0b3J5IGl0ZW1zIHdoaWNoXHJcbiAgICogaGF2ZSB0aGUgc2FtZSB5U2NhbGVHcm91cCB0b2dldGhlciwgdXNpbmcgeVNjYWxlR3JvdXAgYXMga2V5LlxyXG4gICAqIGVnOiB7X19TQ0FMRV9HUk9VUF9DUFU6W2l0ZW0xLCBpdGVtMi4uLl0sIF9fU0NBTEVfR1JPVVBfVU5LTk9XTjpbaXRlbTMsIGl0ZW00Li4uXX1cclxuICAgKi9cclxuICBwcml2YXRlIF9nZXRZU2NhbGVHcm91cFdpdGhIaXN0b3J5SXRlbXMocG9ydDogc3RyaW5nKToge30ge1xyXG4gICAgY29uc3QgeVNjYWxlR3JvdXAgPSB7fTtcclxuICAgIGNvbnN0IGxvYWRIaXN0b3J5SW5mbyA9IHRoaXMuX2dldExvYWRIaXN0b3J5SW5mbyhwb3J0KTtcclxuXHJcbiAgICBPYmplY3Qua2V5cyhsb2FkSGlzdG9yeUluZm8pLmZvckVhY2gocGFyZW50S2V5ID0+IHtcclxuICAgICAgT2JqZWN0LmtleXMobG9hZEhpc3RvcnlJbmZvW3BhcmVudEtleV0pLmZvckVhY2goY2hpbGRLZXkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRldGFpbEl0ZW0gPSBsb2FkSGlzdG9yeUluZm9bcGFyZW50S2V5XVtjaGlsZEtleV07XHJcbiAgICAgICAgY29uc3QgeVNjYWxlR3JvdXBLZXkgPSBkZXRhaWxJdGVtLl9ZU2NhbGVHcm91cDtcclxuICAgICAgICBpZiAoIXlTY2FsZUdyb3VwW3lTY2FsZUdyb3VwS2V5XSkge1xyXG4gICAgICAgICAgeVNjYWxlR3JvdXBbeVNjYWxlR3JvdXBLZXldID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHlTY2FsZUdyb3VwW3lTY2FsZUdyb3VwS2V5XS5wdXNoKGRldGFpbEl0ZW0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHlTY2FsZUdyb3VwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0WVNjYWxlT2ZHcm91cChncm91cEl0ZW1zOiBhbnksIGdyb3VwOiBTY2FsZUdyb3VwKSB7XHJcbiAgICBpZiAoZ3JvdXBJdGVtcykge1xyXG4gICAgICBpZiAoZ3JvdXAgPT09IFNjYWxlR3JvdXAuVW5rbm93bikge1xyXG4gICAgICAgIGdyb3VwSXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW1bSXRlbS55U2NhbGVdID0gVUlTZXJ2aWNlLl9nZXRZU2NhbGVGb3JJdGVtKGl0ZW0sIGNhbGN1bGF0ZVlTY2FsZShpdGVtLk1heCkpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCB5U2NhbGUgPSBjYWxjdWxhdGVZU2NhbGUoVUlTZXJ2aWNlLl9nZXRNYXhWYWx1ZU9mR3JvdXAoZ3JvdXBJdGVtcykpO1xyXG4gICAgICAgIGdyb3VwSXRlbXMuZm9yRWFjaChpdGVtID0+ICBpdGVtW0l0ZW0ueVNjYWxlXSA9IFVJU2VydmljZS5fZ2V0WVNjYWxlRm9ySXRlbShpdGVtLCB5U2NhbGUpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0SXRlbUJ5S2V5KGtleTogc3RyaW5nLCBwb3J0OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgY29uc3QgbG9hZEhpc3RvcnlJbmZvID0gdGhpcy5fZ2V0TG9hZEhpc3RvcnlJbmZvKHBvcnQpO1xyXG4gICAgZm9yICggY29uc3QgaXRlbUtleSBvZiBPYmplY3Qua2V5cyhsb2FkSGlzdG9yeUluZm8pKSB7XHJcbiAgICAgIGlmIChrZXkgaW4gbG9hZEhpc3RvcnlJbmZvW2l0ZW1LZXldKSB7XHJcbiAgICAgICAgcmV0dXJuIGxvYWRIaXN0b3J5SW5mb1tpdGVtS2V5XVtrZXldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiByZXNldCB0aGUgbG9hZCBoaXN0b3J5IGluZm8gb2JqZWN0LCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrXHJcbiAgICovXHJcbiAgcHVibGljIGNsZWFyTG9hZEhpc3RvcnlJbmZvcygpIHtcclxuICAgIHRoaXMuX2xvYWRIaXN0b3J5SW5mb3MgPSB7fTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGdldCBhbGwgdGhlIGRhdGEgZm9yIHRoZSBzZWxlY3Rpb24gdGFibGVcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0U2VsZWN0aW9uVGFibGVSb3dzKGhlYWRlcktleXM6IHN0cmluZ1tdLCBwb3J0OiBzdHJpbmcsIGRlZmF1bHREaXNwbGF5SXRlbXM6IHN0cmluZ1tdKTogYW55W10ge1xyXG4gICAgY29uc3Qgcm93czogYW55W10gPSBbXTtcclxuICAgIGNvbnN0IGxvYWRIaXN0b3J5SW5mbyA9IHRoaXMuX2dldExvYWRIaXN0b3J5SW5mbyhwb3J0KTtcclxuXHJcbiAgICBjb25zdCBkZWZhdWx0SXRlbXMgPSBkZWZhdWx0RGlzcGxheUl0ZW1zICYmIGRlZmF1bHREaXNwbGF5SXRlbXMubGVuZ3RoID4gMCA/IGRlZmF1bHREaXNwbGF5SXRlbXMgOiB0aGlzLl9ERUZBVUxUX0RJU1BMQVlfSVRFTVM7XHJcblxyXG4gICAgT2JqZWN0LmtleXMobG9hZEhpc3RvcnlJbmZvKS5mb3JFYWNoKGtleVBhcmVudCA9PiB7XHJcbiAgICAgIHJvd3MucHVzaCh7S1BJOiBrZXlQYXJlbnQsIGhlYWRlcjogdHJ1ZX0pO1xyXG4gICAgICBjb25zdCBsZW4gPSByb3dzLmxlbmd0aDtcclxuICAgICAgcm93cy5wdXNoKC4uLk9iamVjdC5rZXlzKGxvYWRIaXN0b3J5SW5mb1trZXlQYXJlbnRdKVxyXG4gICAgICAgIC5maWx0ZXIoa2V5Q2hpbGQgPT4gaGVhZGVyS2V5cy5pbmNsdWRlcyhrZXlDaGlsZCkpXHJcbiAgICAgICAgLm1hcChrZXlDaGlsZCA9PiB7XHJcbiAgICAgICAgICBsb2FkSGlzdG9yeUluZm9ba2V5UGFyZW50XVtrZXlDaGlsZF0uaGVhZGVyID0gZmFsc2U7XHJcbiAgICAgICAgICBsb2FkSGlzdG9yeUluZm9ba2V5UGFyZW50XVtrZXlDaGlsZF0uY2hlY2tlZCA9IGRlZmF1bHRJdGVtcy5pbmNsdWRlcyhrZXlDaGlsZCk7XHJcbiAgICAgICAgICByZXR1cm4gbG9hZEhpc3RvcnlJbmZvW2tleVBhcmVudF1ba2V5Q2hpbGRdO1xyXG4gICAgICB9KSk7XHJcbiAgICAgIGlmIChsZW4gPT09IHJvd3MubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gbm8gc3ViIGl0ZW1zLCByZW1vdmUgdGhlIGhlYWRlclxyXG4gICAgICAgIHJvd3MucG9wKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByb3dzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2V0IGFsbCBoaWRkZW4gY29sdW1ucy4gVGhvc2UgaGlkZGVuIGNvbHVtbnMgPSBpbnB1dCBoaWRkZW4gY29sdW1ucyArIGRlZmF1bHQgaGlkZGVuIGNvbHVtbnNcclxuICAgKiBAcGFyYW0gaGlkZU1lYXN1cmVDb2x1bW5zIHRoZSBhcnJheSBjb250YWlucyB0aGUgY29sdW1ucyBsaXN0IHRoYXQgbmVlZCB0byBiZSBoaWRkZW4uXHJcbiAgICovXHJcbiAgcHVibGljIGdldEhpZGRlbkNvbHVtbnMoaGlkZU1lYXN1cmVDb2x1bW5zOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcclxuICAgIC8vIG9ubHkgbWVhc3VyZSBjb2x1bW5zIGNhbiBiZSBoaWRkZW5cclxuICAgIGNvbnN0IGhpZGVDb2x1bW5zID0gaGlkZU1lYXN1cmVDb2x1bW5zID8gaGlkZU1lYXN1cmVDb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gdGhpcy5fTUVBU1VSRV9DT0xVTU5TLmluY2x1ZGVzKGNvbHVtbikpIDogW107XHJcbiAgICByZXR1cm4gaGlkZUNvbHVtbnMgPyB0aGlzLl9ISURFRF9DT0xVTU5TLmNvbmNhdChoaWRlQ29sdW1ucykgOiB0aGlzLl9ISURFRF9DT0xVTU5TO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2V0IGhlYWRlciBpbmZvcm1hdGlvbiBhbmQgZm9ybWF0IGl0IHRvIHtoZWFkS2V5OiBrZXksIGhlYWRUZXh0OiB0ZXh0fVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRIZWFkZXIoa2V5czogc3RyaW5nW10sIHBvcnQ6IHN0cmluZyk6IENoYXJ0Q29udGVudEhlYWRlcltdIHtcclxuICAgIHJldHVybiBrZXlzLm1hcChrZXkgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5fZ2V0SXRlbUJ5S2V5KGtleSwgcG9ydCk7XHJcbiAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgJ0tQSScgaW4gaXRlbSkge1xyXG4gICAgICAgIHJldHVybiAoe2tleToga2V5LCB0ZXh0OiBpdGVtLktQSX0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgJHtrZXl9IGlzIG5vdCBjb25maWd1cmVkLmApO1xyXG4gICAgICB9XHJcbiAgICB9KS5maWx0ZXIoa2V5ID0+IGtleSAhPSBudWxsICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIHNlbGVjdGVkIGl0ZW1zLCB3aGljaCBuZWVkIHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgY2hhcnQuXHJcbiAgICogQHBhcmFtIGhlYWRlcktleXMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUga2V5cyBvZiBoZWFkZXJcclxuICAgKiBAcGFyYW0gcG9ydCB0aGUgcmVsYXRpdmUgcG9ydFxyXG4gICAqIEBwYXJhbSBkZWZhdWx0RGlzcGxheUl0ZW1zIHRoZSBpdGVtcyBsaXN0IHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgYnkgZGVmYXVsdC5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RGlzcGxheUl0ZW1zKGhlYWRlcktleXM6IHN0cmluZ1tdLCBwb3J0OiBzdHJpbmcsIGRlZmF1bHREaXNwbGF5SXRlbXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uVGFibGUgPSB0aGlzLmdldFNlbGVjdGlvblRhYmxlUm93cyhoZWFkZXJLZXlzLCBwb3J0LCBkZWZhdWx0RGlzcGxheUl0ZW1zKTtcclxuICAgIHJldHVybiBzZWxlY3Rpb25UYWJsZS5maWx0ZXIocm93ID0+IHJvdy5jaGVja2VkKS5tYXAocm93ID0+IHJvdy5LUEkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBZIFNjYWxlIGJ5IHRoZSBrZXlzIGFuZCBwb3J0XHJcbiAgICovXHJcbiAgcHVibGljIGdldFlTY2FsZShrZXlzOiBzdHJpbmdbXSwgcG9ydDogc3RyaW5nKTogbnVtYmVyW10ge1xyXG4gICAgY29uc3QgeVNjYWxlcyA9IFtdO1xyXG4gICAgaWYgKGtleXMpIHtcclxuICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgeVNjYWxlcy5wdXNoKHRoaXMuX2dldEl0ZW1CeUtleShrZXksIHBvcnQpW0l0ZW0ueVNjYWxlXSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHlTY2FsZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBZIFNjYWxlIGZvciB0aGUgcG9ydFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZW5lcmF0ZVlTY2FsZShwb3J0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHlTY2FsZUdyb3VwID0gdGhpcy5fZ2V0WVNjYWxlR3JvdXBXaXRoSGlzdG9yeUl0ZW1zKHBvcnQpO1xyXG4gICAgVUlTZXJ2aWNlLl9ZU2NhbGVHcm91cExpc3QuZm9yRWFjaChncm91cCA9PiB7XHJcbiAgICAgIGNvbnN0IGhpc3RvcnlJdGVtcyA9IHlTY2FsZUdyb3VwW2dyb3VwXTtcclxuICAgICAgaWYgKGhpc3RvcnlJdGVtcykge1xyXG4gICAgICAgIHRoaXMuX3NldFlTY2FsZU9mR3JvdXAoaGlzdG9yeUl0ZW1zLCBncm91cCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogY29udmVydCB1bml0IHZhbHVlcyAoZWc6IGJ5dGUgdG8gTUIgb3IgR0IpIGFuZCBnZW5lcmF0ZSB0aGUgY29udHJvbCBkYXRhIChzdW0sIG1heCwgYXZnKVxyXG4gICAqIEBwYXJhbSBkYXRhIHRoZSBuYW1lc2VydmVyIGhpc3RvcnkgZGF0YVxyXG4gICAqIEBwYXJhbSBoZWFkZXIgaGVhZGVyIGxpc3RcclxuICAgKiBAcGFyYW0gcG9ydCBzZWxlY3RlZCBwb3J0XHJcbiAgICovXHJcbiAgcHVibGljIGNvbnZlcnRVbml0QW5kR2VuZXJhdGVDb250cm9sRGF0YShkYXRhOiBDaGFydENvbnRlbnREYXRhSXRlbVtdW10sIGhlYWRlcjogc3RyaW5nW10sIHBvcnQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xyXG4gICAgaWYgKGRhdGEgJiYgaGVhZGVyKSB7XHJcbiAgICAgIGRhdGEuZm9yRWFjaCgocm93LCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICAgIC8vIGdldCBkZXRhaWwgaGlzdG9yeSBpdGVtIGtleSwgbGlrZSBpbmRleHNlcnZlckNwdVxyXG4gICAgICAgICAgY29uc3QgaXRlbUtleSA9IGhlYWRlcltpbmRleF07XHJcbiAgICAgICAgICBjb25zdCB1bml0ID0gdGhpcy5fZ2V0UHJvY2Vzc2luZ1VuaXQoaXRlbUtleSwgcG9ydCk7XHJcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX2NvbnZlcnRVbml0QW5kR2VuZXJhdGVSb3dDb250cm9sRGF0YShyb3csIGl0ZW1LZXksIHVuaXQsIHBvcnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==