@sunbird-cb/utils-v2 0.0.21 → 0.0.22-ang-13-16

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 (406) hide show
  1. package/esm2022/lib/components/image-crop/image-crop.component.mjs +172 -0
  2. package/esm2022/lib/components/image-crop/image-crop.module.mjs +55 -0
  3. package/esm2022/lib/constants/features.enum.mjs +555 -0
  4. package/esm2022/lib/constants/instances.enum.mjs +5 -0
  5. package/esm2022/lib/constants/misc.constants.mjs +2 -0
  6. package/esm2022/lib/directives/class-change-on-scroll/class-change-on-scroll.directive.mjs +87 -0
  7. package/esm2022/lib/directives/class-change-on-scroll/class-change-on-scroll.module.mjs +20 -0
  8. package/esm2022/lib/directives/default-thumbnail/default-thumbnail.directive.mjs +40 -0
  9. package/esm2022/lib/directives/default-thumbnail/default-thumbnail.module.mjs +20 -0
  10. package/esm2022/lib/directives/image-responsive/image-responsive.directive.mjs +86 -0
  11. package/esm2022/lib/directives/image-responsive/image-responsive.module.mjs +20 -0
  12. package/esm2022/lib/directives/in-view-port/in-view-port.directive.mjs +62 -0
  13. package/esm2022/lib/directives/in-view-port/in-view-port.module.mjs +20 -0
  14. package/esm2022/lib/directives/navigation/navigation.directive.mjs +43 -0
  15. package/esm2022/lib/directives/navigation/navigation.module.mjs +20 -0
  16. package/esm2022/lib/directives/permission/permission.directive.mjs +14 -0
  17. package/esm2022/lib/directives/permission/permission.module.mjs +20 -0
  18. package/esm2022/lib/helpers/functions/getStringifiedQueryParams.mjs +9 -0
  19. package/esm2022/lib/helpers/horizontal-scroller/horizontal-scroller.component.mjs +96 -0
  20. package/esm2022/lib/helpers/horizontal-scroller/horizontal-scroller.module.mjs +32 -0
  21. package/esm2022/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.component.mjs +186 -0
  22. package/esm2022/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.module.mjs +32 -0
  23. package/esm2022/lib/helpers/logout/logout.component.mjs +75 -0
  24. package/esm2022/lib/helpers/logout/logout.module.mjs +31 -0
  25. package/esm2022/lib/models/profile-v3.models.mjs +2 -0
  26. package/esm2022/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.module.mjs +20 -0
  27. package/esm2022/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.pipe.mjs +117 -0
  28. package/esm2022/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.module.mjs +18 -0
  29. package/esm2022/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.pipe.mjs +57 -0
  30. package/esm2022/lib/pipes/pipe-count-transform/pipe-count-transform.module.mjs +20 -0
  31. package/esm2022/lib/pipes/pipe-count-transform/pipe-count-transform.pipe.mjs +37 -0
  32. package/esm2022/lib/pipes/pipe-coursename/PipeCourseNameModule.mjs +20 -0
  33. package/esm2022/lib/pipes/pipe-coursename/pipe-coursename.pipe.mjs +17 -0
  34. package/esm2022/lib/pipes/pipe-date-concat/pipe-date-concat.module.mjs +20 -0
  35. package/esm2022/lib/pipes/pipe-date-concat/pipe-date-concat.pipe.mjs +36 -0
  36. package/esm2022/lib/pipes/pipe-duration-transform/pipe-duration-transform.module.mjs +20 -0
  37. package/{esm2015/lib/pipes/pipe-duration-transform/pipe-duration-transform.pipe.js → esm2022/lib/pipes/pipe-duration-transform/pipe-duration-transform.pipe.mjs} +10 -6
  38. package/esm2022/lib/pipes/pipe-email/pipe-email.module.mjs +20 -0
  39. package/esm2022/lib/pipes/pipe-email/pipe-email.pipe.mjs +16 -0
  40. package/esm2022/lib/pipes/pipe-filter/pipe-filter.module.mjs +20 -0
  41. package/esm2022/lib/pipes/pipe-filter/pipe-filter.pipe.mjs +20 -0
  42. package/esm2022/lib/pipes/pipe-filter-search/pipe-filter-search.module.mjs +20 -0
  43. package/esm2022/lib/pipes/pipe-filter-search/pipe-filter-search.pipe.mjs +42 -0
  44. package/esm2022/lib/pipes/pipe-filter-v2/pipe-filter-v2.module.mjs +20 -0
  45. package/esm2022/lib/pipes/pipe-filter-v2/pipe-filter-v2.pipe.mjs +25 -0
  46. package/esm2022/lib/pipes/pipe-filter-v3/pipe-filter-v3.module.mjs +20 -0
  47. package/esm2022/lib/pipes/pipe-filter-v3/pipe-filter-v3.pipe.mjs +27 -0
  48. package/esm2022/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.module.mjs +20 -0
  49. package/esm2022/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.pipe.mjs +16 -0
  50. package/esm2022/lib/pipes/pipe-limit-to/pipe-limit-to.module.mjs +20 -0
  51. package/esm2022/lib/pipes/pipe-limit-to/pipe-limit-to.pipe.mjs +29 -0
  52. package/esm2022/lib/pipes/pipe-list-filter/pipe-list-filter.module.mjs +20 -0
  53. package/esm2022/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.mjs +21 -0
  54. package/esm2022/lib/pipes/pipe-name-transform/pipe-name-transform.module.mjs +20 -0
  55. package/esm2022/lib/pipes/pipe-name-transform/pipe-name-transform.pipe.mjs +26 -0
  56. package/esm2022/lib/pipes/pipe-nic-relative/pipe-nic-relative.module.mjs +20 -0
  57. package/esm2022/lib/pipes/pipe-nic-relative/pipe-nic-relative.pipe.mjs +40 -0
  58. package/esm2022/lib/pipes/pipe-order-by/pipe-order-by.module.mjs +20 -0
  59. package/esm2022/lib/pipes/pipe-order-by/pipe-order-by.pipe.mjs +17 -0
  60. package/esm2022/lib/pipes/pipe-ordinal/pipe-ordinal.module.mjs +20 -0
  61. package/esm2022/lib/pipes/pipe-ordinal/pipe-ordinal.pipe.mjs +21 -0
  62. package/esm2022/lib/pipes/pipe-partial-content/pipe-partial-content.module.mjs +20 -0
  63. package/esm2022/lib/pipes/pipe-partial-content/pipe-partial-content.pipe.mjs +22 -0
  64. package/esm2022/lib/pipes/pipe-public-URL/pipe-public-URL.module.mjs +20 -0
  65. package/esm2022/lib/pipes/pipe-public-URL/pipe-public-URL.pipe.mjs +27 -0
  66. package/esm2022/lib/pipes/pipe-relative-time/pipe-relative-time.module.mjs +20 -0
  67. package/esm2022/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.mjs +20 -0
  68. package/esm2022/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.module.mjs +20 -0
  69. package/esm2022/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.pipe.mjs +33 -0
  70. package/esm2022/lib/resolvers/explore-detail.resolver.mjs +76 -0
  71. package/esm2022/lib/resolvers/marketing-offering.resolve.mjs +35 -0
  72. package/esm2022/lib/resolvers/module-name.resolver.mjs +36 -0
  73. package/esm2022/lib/resolvers/page-name.resolver.mjs +33 -0
  74. package/esm2022/lib/resolvers/page.constant.mjs +4 -0
  75. package/esm2022/lib/resolvers/page.model.mjs +2 -0
  76. package/esm2022/lib/resolvers/page.resolver.mjs +82 -0
  77. package/esm2022/lib/resolvers/resolver.model.mjs +2 -0
  78. package/esm2022/lib/services/auth-keycloak.service.mjs +120 -0
  79. package/esm2022/lib/services/auth-microsoft.service.mjs +173 -0
  80. package/esm2022/lib/services/card-content.model.mjs +11 -0
  81. package/esm2022/lib/services/configurations.model.mjs +2 -0
  82. package/esm2022/lib/services/configurations.service.mjs +82 -0
  83. package/esm2022/lib/services/content-strip-multiple.model.mjs +2 -0
  84. package/esm2022/lib/services/event.model.mjs +145 -0
  85. package/esm2022/lib/services/event.service.mjs +294 -0
  86. package/esm2022/lib/services/logger.service.mjs +45 -0
  87. package/esm2022/lib/services/ms-office.model.mjs +2 -0
  88. package/esm2022/lib/services/multilingual-translations.service.mjs +121 -0
  89. package/esm2022/lib/services/nps-grid.service.mjs +38 -0
  90. package/esm2022/lib/services/subapplication-respond.service.mjs +206 -0
  91. package/esm2022/lib/services/telemetry.service.mjs +694 -0
  92. package/esm2022/lib/services/user-preference.model.mjs +2 -0
  93. package/esm2022/lib/services/user-preference.service.mjs +92 -0
  94. package/esm2022/lib/services/utility.service.mjs +122 -0
  95. package/esm2022/lib/services/value.service.mjs +25 -0
  96. package/esm2022/lib/services/widget-content.model.mjs +132 -0
  97. package/esm2022/lib/services/widget-content.service.mjs +194 -0
  98. package/esm2022/lib/services/widget-resolver.model.mjs +2 -0
  99. package/esm2022/lib/services/widget-search.model.mjs +2 -0
  100. package/esm2022/public-api.mjs +96 -0
  101. package/esm2022/sunbird-cb-utils-v2.mjs +2 -0
  102. package/fesm2022/sunbird-cb-utils-v2.mjs +5327 -0
  103. package/fesm2022/sunbird-cb-utils-v2.mjs.map +1 -0
  104. package/index.d.ts +2 -0
  105. package/lib/components/image-crop/image-crop.component.d.ts +5 -2
  106. package/lib/components/image-crop/image-crop.module.d.ts +14 -0
  107. package/lib/constants/misc.constants.d.ts +2 -2
  108. package/lib/directives/class-change-on-scroll/class-change-on-scroll.directive.d.ts +6 -3
  109. package/lib/directives/class-change-on-scroll/class-change-on-scroll.module.d.ts +6 -0
  110. package/lib/directives/default-thumbnail/default-thumbnail.directive.d.ts +3 -0
  111. package/lib/directives/default-thumbnail/default-thumbnail.module.d.ts +6 -0
  112. package/lib/directives/image-responsive/image-responsive.directive.d.ts +3 -0
  113. package/lib/directives/image-responsive/image-responsive.module.d.ts +6 -0
  114. package/lib/directives/in-view-port/in-view-port.directive.d.ts +3 -0
  115. package/lib/directives/in-view-port/in-view-port.module.d.ts +6 -0
  116. package/lib/directives/navigation/navigation.directive.d.ts +3 -0
  117. package/lib/directives/navigation/navigation.module.d.ts +6 -0
  118. package/lib/directives/permission/permission.directive.d.ts +3 -0
  119. package/lib/directives/permission/permission.module.d.ts +6 -0
  120. package/lib/helpers/horizontal-scroller/horizontal-scroller.component.d.ts +3 -0
  121. package/lib/helpers/horizontal-scroller/horizontal-scroller.module.d.ts +9 -0
  122. package/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.component.d.ts +3 -0
  123. package/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.module.d.ts +9 -0
  124. package/lib/helpers/logout/logout.component.d.ts +5 -2
  125. package/lib/helpers/logout/logout.module.d.ts +9 -0
  126. package/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.module.d.ts +6 -0
  127. package/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.pipe.d.ts +3 -0
  128. package/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.module.d.ts +6 -0
  129. package/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.pipe.d.ts +3 -0
  130. package/lib/pipes/pipe-count-transform/pipe-count-transform.module.d.ts +6 -0
  131. package/lib/pipes/pipe-count-transform/pipe-count-transform.pipe.d.ts +3 -0
  132. package/lib/pipes/pipe-coursename/PipeCourseNameModule.d.ts +6 -0
  133. package/lib/pipes/pipe-coursename/pipe-coursename.pipe.d.ts +3 -0
  134. package/lib/pipes/pipe-date-concat/pipe-date-concat.module.d.ts +6 -0
  135. package/lib/pipes/pipe-date-concat/pipe-date-concat.pipe.d.ts +3 -0
  136. package/lib/pipes/pipe-duration-transform/pipe-duration-transform.module.d.ts +6 -0
  137. package/lib/pipes/pipe-duration-transform/pipe-duration-transform.pipe.d.ts +3 -0
  138. package/lib/pipes/pipe-email/pipe-email.module.d.ts +6 -0
  139. package/lib/pipes/pipe-email/pipe-email.pipe.d.ts +3 -0
  140. package/lib/pipes/pipe-filter/pipe-filter.module.d.ts +6 -0
  141. package/lib/pipes/pipe-filter/pipe-filter.pipe.d.ts +3 -0
  142. package/lib/pipes/pipe-filter-search/pipe-filter-search.module.d.ts +6 -0
  143. package/lib/pipes/pipe-filter-search/pipe-filter-search.pipe.d.ts +3 -0
  144. package/lib/pipes/pipe-filter-v2/pipe-filter-v2.module.d.ts +6 -0
  145. package/lib/pipes/pipe-filter-v2/pipe-filter-v2.pipe.d.ts +3 -0
  146. package/lib/pipes/pipe-filter-v3/pipe-filter-v3.module.d.ts +6 -0
  147. package/lib/pipes/pipe-filter-v3/pipe-filter-v3.pipe.d.ts +3 -0
  148. package/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.module.d.ts +6 -0
  149. package/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.pipe.d.ts +3 -0
  150. package/lib/pipes/pipe-limit-to/pipe-limit-to.module.d.ts +6 -0
  151. package/lib/pipes/pipe-limit-to/pipe-limit-to.pipe.d.ts +3 -0
  152. package/lib/pipes/pipe-list-filter/pipe-list-filter.module.d.ts +6 -0
  153. package/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.d.ts +3 -0
  154. package/lib/pipes/pipe-name-transform/pipe-name-transform.module.d.ts +6 -0
  155. package/lib/pipes/pipe-name-transform/pipe-name-transform.pipe.d.ts +3 -0
  156. package/lib/pipes/pipe-nic-relative/pipe-nic-relative.module.d.ts +6 -0
  157. package/lib/pipes/pipe-nic-relative/pipe-nic-relative.pipe.d.ts +3 -0
  158. package/lib/pipes/pipe-order-by/pipe-order-by.module.d.ts +6 -0
  159. package/lib/pipes/pipe-order-by/pipe-order-by.pipe.d.ts +7 -4
  160. package/lib/pipes/pipe-ordinal/pipe-ordinal.module.d.ts +6 -0
  161. package/lib/pipes/pipe-ordinal/pipe-ordinal.pipe.d.ts +3 -0
  162. package/lib/pipes/pipe-partial-content/pipe-partial-content.module.d.ts +6 -0
  163. package/lib/pipes/pipe-partial-content/pipe-partial-content.pipe.d.ts +3 -0
  164. package/lib/pipes/pipe-public-URL/pipe-public-URL.module.d.ts +6 -0
  165. package/lib/pipes/pipe-public-URL/pipe-public-URL.pipe.d.ts +3 -0
  166. package/lib/pipes/pipe-relative-time/pipe-relative-time.module.d.ts +6 -0
  167. package/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.d.ts +3 -0
  168. package/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.module.d.ts +6 -0
  169. package/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.pipe.d.ts +3 -0
  170. package/lib/resolvers/explore-detail.resolver.d.ts +5 -2
  171. package/lib/resolvers/marketing-offering.resolve.d.ts +5 -2
  172. package/lib/resolvers/module-name.resolver.d.ts +5 -2
  173. package/lib/resolvers/page-name.resolver.d.ts +5 -2
  174. package/lib/resolvers/page.model.d.ts +1 -1
  175. package/lib/resolvers/page.resolver.d.ts +5 -2
  176. package/lib/services/auth-keycloak.service.d.ts +7 -16
  177. package/lib/services/auth-microsoft.service.d.ts +5 -2
  178. package/lib/services/configurations.model.d.ts +29 -27
  179. package/lib/services/configurations.service.d.ts +3 -0
  180. package/lib/services/content-strip-multiple.model.d.ts +7 -6
  181. package/lib/services/event.service.d.ts +5 -0
  182. package/lib/services/logger.service.d.ts +7 -4
  183. package/lib/services/multilingual-translations.service.d.ts +3 -0
  184. package/lib/services/nps-grid.service.d.ts +3 -0
  185. package/lib/services/subapplication-respond.service.d.ts +3 -0
  186. package/lib/services/telemetry.service.d.ts +6 -3
  187. package/lib/services/user-preference.service.d.ts +3 -0
  188. package/lib/services/utility.service.d.ts +10 -7
  189. package/lib/services/value.service.d.ts +3 -0
  190. package/lib/services/widget-content.model.d.ts +21 -20
  191. package/lib/services/widget-content.service.d.ts +3 -0
  192. package/lib/services/widget-resolver.model.d.ts +1 -1
  193. package/package.json +28 -25
  194. package/public-api.d.ts +8 -0
  195. package/sunbird-cb-utils-v2-0.0.22-ang-13-16.tgz +0 -0
  196. package/bundles/sunbird-cb-utils-v2.umd.js +0 -7283
  197. package/bundles/sunbird-cb-utils-v2.umd.js.map +0 -1
  198. package/bundles/sunbird-cb-utils-v2.umd.min.js +0 -2
  199. package/bundles/sunbird-cb-utils-v2.umd.min.js.map +0 -1
  200. package/esm2015/lib/components/image-crop/image-crop.component.js +0 -195
  201. package/esm2015/lib/components/image-crop/image-crop.module.js +0 -27
  202. package/esm2015/lib/constants/features.enum.js +0 -555
  203. package/esm2015/lib/constants/instances.enum.js +0 -5
  204. package/esm2015/lib/constants/misc.constants.js +0 -1
  205. package/esm2015/lib/directives/class-change-on-scroll/class-change-on-scroll.directive.js +0 -87
  206. package/esm2015/lib/directives/class-change-on-scroll/class-change-on-scroll.module.js +0 -15
  207. package/esm2015/lib/directives/default-thumbnail/default-thumbnail.directive.js +0 -38
  208. package/esm2015/lib/directives/default-thumbnail/default-thumbnail.module.js +0 -15
  209. package/esm2015/lib/directives/image-responsive/image-responsive.directive.js +0 -92
  210. package/esm2015/lib/directives/image-responsive/image-responsive.module.js +0 -15
  211. package/esm2015/lib/directives/in-view-port/in-view-port.directive.js +0 -68
  212. package/esm2015/lib/directives/in-view-port/in-view-port.module.js +0 -15
  213. package/esm2015/lib/directives/navigation/navigation.directive.js +0 -39
  214. package/esm2015/lib/directives/navigation/navigation.module.js +0 -15
  215. package/esm2015/lib/directives/permission/permission.directive.js +0 -11
  216. package/esm2015/lib/directives/permission/permission.module.js +0 -15
  217. package/esm2015/lib/helpers/functions/getStringifiedQueryParams.js +0 -9
  218. package/esm2015/lib/helpers/horizontal-scroller/horizontal-scroller.component.js +0 -99
  219. package/esm2015/lib/helpers/horizontal-scroller/horizontal-scroller.module.js +0 -19
  220. package/esm2015/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.component.js +0 -196
  221. package/esm2015/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.module.js +0 -19
  222. package/esm2015/lib/helpers/logout/logout.component.js +0 -90
  223. package/esm2015/lib/helpers/logout/logout.module.js +0 -20
  224. package/esm2015/lib/models/profile-v3.models.js +0 -104
  225. package/esm2015/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.module.js +0 -15
  226. package/esm2015/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.pipe.js +0 -116
  227. package/esm2015/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.module.js +0 -13
  228. package/esm2015/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.pipe.js +0 -59
  229. package/esm2015/lib/pipes/pipe-count-transform/pipe-count-transform.module.js +0 -15
  230. package/esm2015/lib/pipes/pipe-count-transform/pipe-count-transform.pipe.js +0 -33
  231. package/esm2015/lib/pipes/pipe-coursename/PipeCourseNameModule.js +0 -15
  232. package/esm2015/lib/pipes/pipe-coursename/pipe-coursename.pipe.js +0 -13
  233. package/esm2015/lib/pipes/pipe-date-concat/pipe-date-concat.module.js +0 -15
  234. package/esm2015/lib/pipes/pipe-date-concat/pipe-date-concat.pipe.js +0 -43
  235. package/esm2015/lib/pipes/pipe-duration-transform/pipe-duration-transform.module.js +0 -15
  236. package/esm2015/lib/pipes/pipe-email/pipe-email.module.js +0 -15
  237. package/esm2015/lib/pipes/pipe-email/pipe-email.pipe.js +0 -12
  238. package/esm2015/lib/pipes/pipe-filter/pipe-filter.module.js +0 -15
  239. package/esm2015/lib/pipes/pipe-filter/pipe-filter.pipe.js +0 -16
  240. package/esm2015/lib/pipes/pipe-filter-search/pipe-filter-search.module.js +0 -15
  241. package/esm2015/lib/pipes/pipe-filter-search/pipe-filter-search.pipe.js +0 -38
  242. package/esm2015/lib/pipes/pipe-filter-v2/pipe-filter-v2.module.js +0 -15
  243. package/esm2015/lib/pipes/pipe-filter-v2/pipe-filter-v2.pipe.js +0 -21
  244. package/esm2015/lib/pipes/pipe-filter-v3/pipe-filter-v3.module.js +0 -15
  245. package/esm2015/lib/pipes/pipe-filter-v3/pipe-filter-v3.pipe.js +0 -23
  246. package/esm2015/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.module.js +0 -15
  247. package/esm2015/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.pipe.js +0 -12
  248. package/esm2015/lib/pipes/pipe-limit-to/pipe-limit-to.module.js +0 -15
  249. package/esm2015/lib/pipes/pipe-limit-to/pipe-limit-to.pipe.js +0 -25
  250. package/esm2015/lib/pipes/pipe-list-filter/pipe-list-filter.module.js +0 -15
  251. package/esm2015/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.js +0 -17
  252. package/esm2015/lib/pipes/pipe-name-transform/pipe-name-transform.module.js +0 -15
  253. package/esm2015/lib/pipes/pipe-name-transform/pipe-name-transform.pipe.js +0 -27
  254. package/esm2015/lib/pipes/pipe-nic-relative/pipe-nic-relative.module.js +0 -15
  255. package/esm2015/lib/pipes/pipe-nic-relative/pipe-nic-relative.pipe.js +0 -39
  256. package/esm2015/lib/pipes/pipe-order-by/pipe-order-by.module.js +0 -15
  257. package/esm2015/lib/pipes/pipe-order-by/pipe-order-by.pipe.js +0 -16
  258. package/esm2015/lib/pipes/pipe-ordinal/pipe-ordinal.module.js +0 -15
  259. package/esm2015/lib/pipes/pipe-ordinal/pipe-ordinal.pipe.js +0 -17
  260. package/esm2015/lib/pipes/pipe-partial-content/pipe-partial-content.module.js +0 -15
  261. package/esm2015/lib/pipes/pipe-partial-content/pipe-partial-content.pipe.js +0 -18
  262. package/esm2015/lib/pipes/pipe-public-URL/pipe-public-URL.module.js +0 -15
  263. package/esm2015/lib/pipes/pipe-public-URL/pipe-public-URL.pipe.js +0 -26
  264. package/esm2015/lib/pipes/pipe-relative-time/pipe-relative-time.module.js +0 -15
  265. package/esm2015/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.js +0 -16
  266. package/esm2015/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.module.js +0 -15
  267. package/esm2015/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.pipe.js +0 -35
  268. package/esm2015/lib/resolvers/explore-detail.resolver.js +0 -89
  269. package/esm2015/lib/resolvers/marketing-offering.resolve.js +0 -40
  270. package/esm2015/lib/resolvers/module-name.resolver.js +0 -38
  271. package/esm2015/lib/resolvers/page-name.resolver.js +0 -32
  272. package/esm2015/lib/resolvers/page.constant.js +0 -4
  273. package/esm2015/lib/resolvers/page.model.js +0 -48
  274. package/esm2015/lib/resolvers/page.resolver.js +0 -90
  275. package/esm2015/lib/resolvers/resolver.model.js +0 -6
  276. package/esm2015/lib/services/auth-keycloak.service.js +0 -268
  277. package/esm2015/lib/services/auth-microsoft.service.js +0 -196
  278. package/esm2015/lib/services/card-content.model.js +0 -31
  279. package/esm2015/lib/services/configurations.model.js +0 -551
  280. package/esm2015/lib/services/configurations.service.js +0 -142
  281. package/esm2015/lib/services/content-strip-multiple.model.js +0 -75
  282. package/esm2015/lib/services/event.model.js +0 -258
  283. package/esm2015/lib/services/event.service.js +0 -286
  284. package/esm2015/lib/services/logger.service.js +0 -55
  285. package/esm2015/lib/services/ms-office.model.js +0 -8
  286. package/esm2015/lib/services/multilingual-translations.service.js +0 -136
  287. package/esm2015/lib/services/nps-grid.service.js +0 -45
  288. package/esm2015/lib/services/subapplication-respond.service.js +0 -214
  289. package/esm2015/lib/services/telemetry.service.js +0 -619
  290. package/esm2015/lib/services/user-preference.model.js +0 -38
  291. package/esm2015/lib/services/user-preference.service.js +0 -90
  292. package/esm2015/lib/services/utility.service.js +0 -145
  293. package/esm2015/lib/services/value.service.js +0 -31
  294. package/esm2015/lib/services/widget-content.model.js +0 -373
  295. package/esm2015/lib/services/widget-content.service.js +0 -204
  296. package/esm2015/lib/services/widget-resolver.model.js +0 -57
  297. package/esm2015/lib/services/widget-search.model.js +0 -126
  298. package/esm2015/public-api.js +0 -88
  299. package/esm2015/sunbird-cb-utils-v2.js +0 -10
  300. package/esm5/lib/components/image-crop/image-crop.component.js +0 -200
  301. package/esm5/lib/components/image-crop/image-crop.module.js +0 -31
  302. package/esm5/lib/constants/features.enum.js +0 -555
  303. package/esm5/lib/constants/instances.enum.js +0 -5
  304. package/esm5/lib/constants/misc.constants.js +0 -1
  305. package/esm5/lib/directives/class-change-on-scroll/class-change-on-scroll.directive.js +0 -105
  306. package/esm5/lib/directives/class-change-on-scroll/class-change-on-scroll.module.js +0 -19
  307. package/esm5/lib/directives/default-thumbnail/default-thumbnail.directive.js +0 -40
  308. package/esm5/lib/directives/default-thumbnail/default-thumbnail.module.js +0 -19
  309. package/esm5/lib/directives/image-responsive/image-responsive.directive.js +0 -95
  310. package/esm5/lib/directives/image-responsive/image-responsive.module.js +0 -19
  311. package/esm5/lib/directives/in-view-port/in-view-port.directive.js +0 -73
  312. package/esm5/lib/directives/in-view-port/in-view-port.module.js +0 -19
  313. package/esm5/lib/directives/navigation/navigation.directive.js +0 -41
  314. package/esm5/lib/directives/navigation/navigation.module.js +0 -19
  315. package/esm5/lib/directives/permission/permission.directive.js +0 -14
  316. package/esm5/lib/directives/permission/permission.module.js +0 -19
  317. package/esm5/lib/helpers/functions/getStringifiedQueryParams.js +0 -9
  318. package/esm5/lib/helpers/horizontal-scroller/horizontal-scroller.component.js +0 -103
  319. package/esm5/lib/helpers/horizontal-scroller/horizontal-scroller.module.js +0 -23
  320. package/esm5/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.component.js +0 -201
  321. package/esm5/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.module.js +0 -23
  322. package/esm5/lib/helpers/logout/logout.component.js +0 -96
  323. package/esm5/lib/helpers/logout/logout.module.js +0 -24
  324. package/esm5/lib/models/profile-v3.models.js +0 -104
  325. package/esm5/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.module.js +0 -19
  326. package/esm5/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.pipe.js +0 -118
  327. package/esm5/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.module.js +0 -17
  328. package/esm5/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.pipe.js +0 -63
  329. package/esm5/lib/pipes/pipe-count-transform/pipe-count-transform.module.js +0 -19
  330. package/esm5/lib/pipes/pipe-count-transform/pipe-count-transform.pipe.js +0 -37
  331. package/esm5/lib/pipes/pipe-coursename/PipeCourseNameModule.js +0 -19
  332. package/esm5/lib/pipes/pipe-coursename/pipe-coursename.pipe.js +0 -17
  333. package/esm5/lib/pipes/pipe-date-concat/pipe-date-concat.module.js +0 -19
  334. package/esm5/lib/pipes/pipe-date-concat/pipe-date-concat.pipe.js +0 -45
  335. package/esm5/lib/pipes/pipe-duration-transform/pipe-duration-transform.module.js +0 -19
  336. package/esm5/lib/pipes/pipe-duration-transform/pipe-duration-transform.pipe.js +0 -86
  337. package/esm5/lib/pipes/pipe-email/pipe-email.module.js +0 -19
  338. package/esm5/lib/pipes/pipe-email/pipe-email.pipe.js +0 -16
  339. package/esm5/lib/pipes/pipe-filter/pipe-filter.module.js +0 -19
  340. package/esm5/lib/pipes/pipe-filter/pipe-filter.pipe.js +0 -20
  341. package/esm5/lib/pipes/pipe-filter-search/pipe-filter-search.module.js +0 -19
  342. package/esm5/lib/pipes/pipe-filter-search/pipe-filter-search.pipe.js +0 -46
  343. package/esm5/lib/pipes/pipe-filter-v2/pipe-filter-v2.module.js +0 -19
  344. package/esm5/lib/pipes/pipe-filter-v2/pipe-filter-v2.pipe.js +0 -25
  345. package/esm5/lib/pipes/pipe-filter-v3/pipe-filter-v3.module.js +0 -19
  346. package/esm5/lib/pipes/pipe-filter-v3/pipe-filter-v3.pipe.js +0 -31
  347. package/esm5/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.module.js +0 -19
  348. package/esm5/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.pipe.js +0 -16
  349. package/esm5/lib/pipes/pipe-limit-to/pipe-limit-to.module.js +0 -19
  350. package/esm5/lib/pipes/pipe-limit-to/pipe-limit-to.pipe.js +0 -30
  351. package/esm5/lib/pipes/pipe-list-filter/pipe-list-filter.module.js +0 -19
  352. package/esm5/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.js +0 -21
  353. package/esm5/lib/pipes/pipe-name-transform/pipe-name-transform.module.js +0 -19
  354. package/esm5/lib/pipes/pipe-name-transform/pipe-name-transform.pipe.js +0 -31
  355. package/esm5/lib/pipes/pipe-nic-relative/pipe-nic-relative.module.js +0 -19
  356. package/esm5/lib/pipes/pipe-nic-relative/pipe-nic-relative.pipe.js +0 -41
  357. package/esm5/lib/pipes/pipe-order-by/pipe-order-by.module.js +0 -19
  358. package/esm5/lib/pipes/pipe-order-by/pipe-order-by.pipe.js +0 -18
  359. package/esm5/lib/pipes/pipe-ordinal/pipe-ordinal.module.js +0 -19
  360. package/esm5/lib/pipes/pipe-ordinal/pipe-ordinal.pipe.js +0 -21
  361. package/esm5/lib/pipes/pipe-partial-content/pipe-partial-content.module.js +0 -19
  362. package/esm5/lib/pipes/pipe-partial-content/pipe-partial-content.pipe.js +0 -34
  363. package/esm5/lib/pipes/pipe-public-URL/pipe-public-URL.module.js +0 -19
  364. package/esm5/lib/pipes/pipe-public-URL/pipe-public-URL.pipe.js +0 -28
  365. package/esm5/lib/pipes/pipe-relative-time/pipe-relative-time.module.js +0 -19
  366. package/esm5/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.js +0 -20
  367. package/esm5/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.module.js +0 -19
  368. package/esm5/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.pipe.js +0 -38
  369. package/esm5/lib/resolvers/explore-detail.resolver.js +0 -93
  370. package/esm5/lib/resolvers/marketing-offering.resolve.js +0 -43
  371. package/esm5/lib/resolvers/module-name.resolver.js +0 -40
  372. package/esm5/lib/resolvers/page-name.resolver.js +0 -35
  373. package/esm5/lib/resolvers/page.constant.js +0 -4
  374. package/esm5/lib/resolvers/page.model.js +0 -48
  375. package/esm5/lib/resolvers/page.resolver.js +0 -98
  376. package/esm5/lib/resolvers/resolver.model.js +0 -6
  377. package/esm5/lib/services/auth-keycloak.service.js +0 -353
  378. package/esm5/lib/services/auth-microsoft.service.js +0 -251
  379. package/esm5/lib/services/card-content.model.js +0 -31
  380. package/esm5/lib/services/configurations.model.js +0 -551
  381. package/esm5/lib/services/configurations.service.js +0 -144
  382. package/esm5/lib/services/content-strip-multiple.model.js +0 -75
  383. package/esm5/lib/services/event.model.js +0 -258
  384. package/esm5/lib/services/event.service.js +0 -290
  385. package/esm5/lib/services/logger.service.js +0 -73
  386. package/esm5/lib/services/ms-office.model.js +0 -8
  387. package/esm5/lib/services/multilingual-translations.service.js +0 -138
  388. package/esm5/lib/services/nps-grid.service.js +0 -47
  389. package/esm5/lib/services/subapplication-respond.service.js +0 -219
  390. package/esm5/lib/services/telemetry.service.js +0 -668
  391. package/esm5/lib/services/user-preference.model.js +0 -38
  392. package/esm5/lib/services/user-preference.service.js +0 -109
  393. package/esm5/lib/services/utility.service.js +0 -178
  394. package/esm5/lib/services/value.service.js +0 -33
  395. package/esm5/lib/services/widget-content.model.js +0 -373
  396. package/esm5/lib/services/widget-content.service.js +0 -226
  397. package/esm5/lib/services/widget-resolver.model.js +0 -57
  398. package/esm5/lib/services/widget-search.model.js +0 -126
  399. package/esm5/public-api.js +0 -88
  400. package/esm5/sunbird-cb-utils-v2.js +0 -10
  401. package/fesm2015/sunbird-cb-utils-v2.js +0 -6477
  402. package/fesm2015/sunbird-cb-utils-v2.js.map +0 -1
  403. package/fesm5/sunbird-cb-utils-v2.js +0 -6986
  404. package/fesm5/sunbird-cb-utils-v2.js.map +0 -1
  405. package/sunbird-cb-utils-v2.d.ts +0 -9
  406. package/sunbird-cb-utils-v2.metadata.json +0 -1
@@ -1,668 +0,0 @@
1
- import * as tslib_1 from "tslib";
2
- import { Inject, Injectable } from '@angular/core';
3
- import { filter } from 'rxjs/operators';
4
- import { ConfigurationsService } from './configurations.service';
5
- import { WsEvents } from './event.model';
6
- import { EventService } from './event.service';
7
- import { LoggerService } from './logger.service';
8
- import { Router, NavigationStart } from '@angular/router';
9
- import { NPSGridService } from './nps-grid.service';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "./configurations.service";
12
- import * as i2 from "./event.service";
13
- import * as i3 from "./logger.service";
14
- import * as i4 from "@angular/router";
15
- import * as i5 from "./nps-grid.service";
16
- var TelemetryService = (function () {
17
- function TelemetryService(configSvc, eventsSvc, environment, logger, router, npsSvc) {
18
- this.configSvc = configSvc;
19
- this.eventsSvc = eventsSvc;
20
- this.logger = logger;
21
- this.router = router;
22
- this.npsSvc = npsSvc;
23
- this.previousUrl = null;
24
- this.telemetryConfig = null;
25
- this.pData = null;
26
- this.contextCdata = [];
27
- this.isAnonymousTelemetry = true;
28
- this.telArray = [];
29
- this.externalApps = {
30
- RBCP: 'rbcp-web-ui',
31
- };
32
- this.environment = environment;
33
- var instanceConfig = this.configSvc.instanceConfig;
34
- this.navigationStart();
35
- this.initializeConfig(instanceConfig);
36
- this.addPlayerListener();
37
- this.addCustomEventListener();
38
- this.addInteractListener();
39
- this.addFeedbackListener();
40
- this.addTimeSpentListener();
41
- this.addSearchListener();
42
- this.addHearbeatListener();
43
- this.addCustomImpressionListener();
44
- this.addCustomListener();
45
- this.addCustomListenerForGetStart();
46
- this.addCustomListenerForPlatformRating();
47
- }
48
- TelemetryService.prototype.navigationStart = function () {
49
- var _this = this;
50
- this.router.events.subscribe((function (event) {
51
- if (event instanceof NavigationStart) {
52
- if (event.url.includes('/public/') || event.url.includes('&preview=true') || event.url.includes('/certs')) {
53
- _this.isAnonymousTelemetry = true;
54
- _this.updateTelemetryConfig();
55
- var instanceConfig = _this.configSvc.instanceConfig;
56
- _this.initializeConfig(instanceConfig);
57
- }
58
- }
59
- }));
60
- };
61
- Object.defineProperty(TelemetryService.prototype, "isAnonymousTelemetryRequired", {
62
- get: function () {
63
- return this.isAnonymousTelemetry;
64
- },
65
- enumerable: true,
66
- configurable: true
67
- });
68
- TelemetryService.prototype.updateTelemetryConfig = function () {
69
- if (this.configSvc.instanceConfig && this.configSvc.instanceConfig.telemetryConfig) {
70
- if (this.isAnonymousTelemetryRequired) {
71
- this.configSvc.instanceConfig.telemetryConfig.endpoint = this.configSvc.instanceConfig.telemetryConfig.publicEndpoint;
72
- }
73
- else {
74
- this.configSvc.instanceConfig.telemetryConfig.endpoint = this.configSvc.instanceConfig.telemetryConfig.protectedEndpoint;
75
- }
76
- }
77
- };
78
- TelemetryService.prototype.initializeConfig = function (instanceConfig) {
79
- if (instanceConfig) {
80
- this.telemetryConfig = instanceConfig.telemetryConfig;
81
- this.telemetryConfig = tslib_1.__assign({}, this.telemetryConfig, { pdata: tslib_1.__assign({}, this.telemetryConfig.pdata, { id: this.environment.name + "." + this.telemetryConfig.pdata.id }), uid: (this.configSvc.userProfile && this.configSvc.userProfile.userId) ?
82
- this.configSvc.userProfile.userId : '', channel: this.rootOrgId || this.telemetryConfig.channel, sid: this.getTelemetrySessionId });
83
- this.pData = this.telemetryConfig.pdata;
84
- }
85
- };
86
- Object.defineProperty(TelemetryService.prototype, "getTelemetrySessionId", {
87
- get: function () {
88
- return localStorage.getItem('telemetrySessionId') || '';
89
- },
90
- enumerable: true,
91
- configurable: true
92
- });
93
- Object.defineProperty(TelemetryService.prototype, "rootOrgId", {
94
- get: function () {
95
- if (this.configSvc && this.configSvc.userProfile && this.configSvc.userProfile.rootOrgId) {
96
- return this.configSvc.userProfile.rootOrgId;
97
- }
98
- return '';
99
- },
100
- enumerable: true,
101
- configurable: true
102
- });
103
- TelemetryService.prototype.triggerNPSUpdate = function (data) {
104
- this.telArray.push(data);
105
- if (this.telArray && this.telArray.length === 4) {
106
- if (localStorage.getItem('ratingformID')) {
107
- this.telArray = [];
108
- this.npsSvc.updateTelemetryData(true);
109
- }
110
- }
111
- };
112
- TelemetryService.prototype.start = function (edata, data, pageContext) {
113
- try {
114
- if (this.telemetryConfig) {
115
- $t.start(this.telemetryConfig, (pageContext && pageContext.pageId) ?
116
- pageContext.pageId
117
- : '', '1.0', {
118
- type: edata.type,
119
- mode: edata.mode,
120
- pageid: (pageContext && pageContext.pageId) ?
121
- pageContext.pageId
122
- : '',
123
- duration: 1,
124
- }, tslib_1.__assign({ context: tslib_1.__assign({ pdata: tslib_1.__assign({}, this.pData, { id: this.pData.id }) }, (pageContext && pageContext.module ? { env: pageContext.module } : null)), object: tslib_1.__assign({}, (data) && data) }, (this.configSvc.userProfile && this.configSvc.userProfile.userId ?
125
- null : { actor: { id: '', type: 'AnonymousUser' } })));
126
- }
127
- else {
128
- this.logger.error('Error Initializing Telemetry. Config missing.');
129
- }
130
- }
131
- catch (e) {
132
- console.log('Error in telemetry start', e);
133
- }
134
- };
135
- TelemetryService.prototype.end = function (edata, data, pageContext) {
136
- try {
137
- $t.end({
138
- type: edata.type,
139
- mode: edata.mode,
140
- pageid: (pageContext && pageContext.pageId) ?
141
- pageContext.pageId
142
- : '',
143
- }, {
144
- context: tslib_1.__assign({ pdata: tslib_1.__assign({}, this.pData, { id: this.pData.id }) }, (pageContext && pageContext.module ? { env: pageContext.module } : null)),
145
- object: tslib_1.__assign({}, (data) && data),
146
- });
147
- }
148
- catch (e) {
149
- console.log('Error in telemetry end', e);
150
- }
151
- };
152
- TelemetryService.prototype.audit = function (type, props, data) {
153
- try {
154
- $t.audit({
155
- type: type,
156
- props: props,
157
- state: data,
158
- prevstate: '',
159
- duration: '',
160
- }, {
161
- context: {
162
- pdata: tslib_1.__assign({}, this.pData, { id: this.pData.id }),
163
- },
164
- });
165
- }
166
- catch (e) {
167
- console.log('Error in telemetry audit', e);
168
- }
169
- };
170
- TelemetryService.prototype.heartbeat = function (type, id) {
171
- try {
172
- $t.heartbeat({
173
- id: id,
174
- type: type,
175
- });
176
- }
177
- catch (e) {
178
- console.log('Error in telemetry heartbeat', e);
179
- }
180
- };
181
- TelemetryService.prototype.impression = function (data, objectType) {
182
- this.triggerNPSUpdate(data);
183
- try {
184
- var page = this.getPageDetails();
185
- if (data && data.pageContext) {
186
- page.pageid = data.pageContext.pageId;
187
- page.module = data.pageContext.module;
188
- }
189
- var edata = {
190
- pageid: page.pageid,
191
- type: page.pageUrlParts[0],
192
- uri: page.pageUrl,
193
- };
194
- if (page.objectId) {
195
- var config = {
196
- context: {
197
- pdata: tslib_1.__assign({}, this.pData, { id: this.pData.id }),
198
- env: page.module || (this.telemetryConfig && this.telemetryConfig.env),
199
- },
200
- object: tslib_1.__assign({ id: page.objectId, type: objectType }, (data && data.object)),
201
- };
202
- if (!page.objectId || !objectType) {
203
- config.object = {};
204
- }
205
- $t.impression(edata, config);
206
- }
207
- else {
208
- $t.impression(edata, {
209
- context: {
210
- pdata: tslib_1.__assign({}, this.pData, { id: this.pData && this.pData.id }),
211
- env: page.module || '',
212
- },
213
- object: tslib_1.__assign({}, (data && data.object)),
214
- });
215
- }
216
- this.previousUrl = page.pageUrl;
217
- }
218
- catch (e) {
219
- console.log('Error in telemetry impression', e);
220
- }
221
- };
222
- TelemetryService.prototype.externalImpression = function (impressionData) {
223
- try {
224
- var page = this.getPageDetails();
225
- if (this.externalApps[impressionData.subApplicationName]) {
226
- var externalConfig = page.objectId ? {
227
- context: {
228
- pdata: tslib_1.__assign({}, this.pData, { id: this.externalApps[impressionData.subApplicationName] }),
229
- },
230
- object: {
231
- id: page.objectId,
232
- },
233
- } : {
234
- context: {
235
- pdata: tslib_1.__assign({}, this.pData, { id: this.externalApps[impressionData.subApplicationName] }),
236
- },
237
- };
238
- $t.impression(impressionData.data, externalConfig);
239
- }
240
- }
241
- catch (e) {
242
- console.log('Error in telemetry externalImpression', e);
243
- }
244
- };
245
- TelemetryService.prototype.addCustomListenerForPlatformRating = function () {
246
- var _this = this;
247
- this.eventsSvc.getPREvents$
248
- .pipe(filter((function (event) {
249
- return event &&
250
- event.eventType === WsEvents.WsEventType.Telemetry &&
251
- event.data.eventSubType === WsEvents.EnumTelemetrySubType.PlatformRating &&
252
- event.data.mode &&
253
- event.data;
254
- })))
255
- .subscribe((function (event) {
256
- if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded) {
257
- _this.start({
258
- type: event.data.type || WsEvents.WsTimeSpentType.Player,
259
- mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
260
- }, {}, event.pageContext);
261
- }
262
- if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded) {
263
- _this.end({
264
- type: event.data.type || WsEvents.WsTimeSpentType.Player,
265
- mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
266
- }, event.data.object, event.pageContext);
267
- }
268
- if (event.data.state === WsEvents.EnumTelemetrySubType.Interact) {
269
- $t.interact({
270
- type: event.data.edata.type,
271
- subtype: event.data.edata.subType,
272
- id: (event.data.edata && event.data.edata.id) ?
273
- event.data.edata.id
274
- : '',
275
- pageid: event.pageContext && event.pageContext.pageId || '',
276
- }, {
277
- context: tslib_1.__assign({ pdata: tslib_1.__assign({}, _this.pData, { id: _this.pData.id }) }, (event.pageContext && event.pageContext.module ? { env: event.pageContext.module } : null)),
278
- object: tslib_1.__assign({}, event.data.object),
279
- });
280
- }
281
- }));
282
- };
283
- TelemetryService.prototype.addCustomListenerForGetStart = function () {
284
- var _this = this;
285
- this.eventsSvc.getStartEvents$
286
- .pipe(filter((function (event) {
287
- return event &&
288
- event.eventType === WsEvents.WsEventType.Telemetry &&
289
- event.data.eventSubType === WsEvents.EnumTelemetrySubType.GetStarted &&
290
- event.data.mode &&
291
- event.data;
292
- })))
293
- .subscribe((function (event) {
294
- if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded) {
295
- _this.start({
296
- type: event.data.type || WsEvents.WsTimeSpentType.Player,
297
- mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
298
- }, {}, event.pageContext);
299
- }
300
- if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded) {
301
- _this.end({
302
- type: event.data.type || WsEvents.WsTimeSpentType.Player,
303
- mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
304
- }, event.data.object, event.pageContext);
305
- }
306
- if (event.data.state === WsEvents.EnumTelemetrySubType.Interact) {
307
- $t.interact({
308
- type: event.data.edata.type,
309
- subtype: event.data.edata.subType,
310
- id: (event.data.edata && event.data.edata.id) ?
311
- event.data.edata.id
312
- : '',
313
- pageid: event.pageContext && event.pageContext.pageId || '',
314
- }, {
315
- context: tslib_1.__assign({ pdata: tslib_1.__assign({}, _this.pData, { id: _this.pData.id }) }, (event.pageContext && event.pageContext.module ? { env: event.pageContext.module } : null)),
316
- object: tslib_1.__assign({}, event.data.object),
317
- });
318
- }
319
- }));
320
- };
321
- TelemetryService.prototype.addCustomListener = function () {
322
- var _this = this;
323
- this.eventsSvc.chatbotEvents$
324
- .pipe(filter((function (event) {
325
- return event &&
326
- event.eventType === WsEvents.WsEventType.Telemetry &&
327
- event.data.eventSubType === WsEvents.EnumTelemetrySubType.Chatbot &&
328
- event.data.mode &&
329
- event.data;
330
- })))
331
- .subscribe((function (event) {
332
- if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded) {
333
- _this.start({
334
- type: event.data.type || WsEvents.WsTimeSpentType.Player,
335
- mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
336
- }, {}, event.pageContext);
337
- }
338
- if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded) {
339
- _this.end({
340
- type: event.data.type || WsEvents.WsTimeSpentType.Player,
341
- mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
342
- }, {}, event.pageContext);
343
- }
344
- if (event.data.state === WsEvents.EnumTelemetrySubType.Interact) {
345
- $t.interact({
346
- type: event.data.edata.type,
347
- subtype: event.data.edata.subType,
348
- id: (event.data.edata && event.data.edata.id) ?
349
- event.data.edata.id
350
- : '',
351
- pageid: event.pageContext && event.pageContext.pageId || '',
352
- }, {
353
- context: tslib_1.__assign({ pdata: tslib_1.__assign({}, _this.pData, { id: _this.pData.id }) }, (event.pageContext && event.pageContext.module ? { env: event.pageContext.module } : null)),
354
- object: tslib_1.__assign({}, event.data.object),
355
- });
356
- }
357
- }));
358
- };
359
- TelemetryService.prototype.addCustomImpressionListener = function () {
360
- var _this = this;
361
- this.eventsSvc.events$
362
- .pipe(filter((function (event) {
363
- return event &&
364
- event.data &&
365
- event.eventType === WsEvents.WsEventType.Telemetry &&
366
- event.data.eventSubType === WsEvents.EnumTelemetrySubType.Impression;
367
- })))
368
- .subscribe((function (event) {
369
- try {
370
- _this.impression(event.data);
371
- }
372
- catch (e) {
373
- console.log('Error in telemetry impression', e);
374
- }
375
- }));
376
- };
377
- TelemetryService.prototype.addTimeSpentListener = function () {
378
- var _this = this;
379
- this.eventsSvc.events$
380
- .pipe(filter((function (event) {
381
- return event &&
382
- event.eventType === WsEvents.WsEventType.Telemetry &&
383
- event.data.type === WsEvents.WsTimeSpentType.Page &&
384
- event.data.mode &&
385
- event.data;
386
- })))
387
- .subscribe((function (event) {
388
- if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded) {
389
- _this.start({
390
- type: event.data.type || WsEvents.WsTimeSpentType.Player,
391
- mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
392
- }, {}, event.pageContext);
393
- }
394
- if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded) {
395
- _this.end({
396
- type: event.data.type || WsEvents.WsTimeSpentType.Player,
397
- mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
398
- }, {}, event.pageContext);
399
- }
400
- }));
401
- };
402
- TelemetryService.prototype.addCustomEventListener = function () {
403
- var _this = this;
404
- this.eventsSvc.events$
405
- .pipe(filter((function (event) {
406
- return event &&
407
- event.eventType === WsEvents.WsEventType.Telemetry;
408
- })))
409
- .subscribe((function (event) {
410
- if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded &&
411
- event.data.type !== WsEvents.WsTimeSpentType.Player) {
412
- _this.start({
413
- type: event.data.type,
414
- mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
415
- }, event.data.object, event.pageContext);
416
- }
417
- if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded &&
418
- event.data.type !== WsEvents.WsTimeSpentType.Player) {
419
- _this.end({
420
- type: event.data.type || WsEvents.WsTimeSpentType.Player,
421
- mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
422
- }, event.data.object, event.pageContext);
423
- }
424
- }));
425
- };
426
- TelemetryService.prototype.addPlayerListener = function () {
427
- var _this = this;
428
- this.eventsSvc.events$
429
- .pipe(filter((function (event) {
430
- return event &&
431
- event.eventType === WsEvents.WsEventType.Telemetry &&
432
- event.data.type === WsEvents.WsTimeSpentType.Player &&
433
- event.data.mode &&
434
- event.data;
435
- })))
436
- .subscribe((function (event) {
437
- var content = event.data.content;
438
- if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded &&
439
- (!content ||
440
- (content.isIframeSupported || '').toLowerCase() === 'maybe' ||
441
- (content.isIframeSupported || '').toLowerCase() === 'yes' ||
442
- (content.mimeType === 'application/pdf' || 'application/json'))) {
443
- _this.start({
444
- type: event.data.type || WsEvents.WsTimeSpentType.Player,
445
- mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
446
- }, event.data.object, event.pageContext);
447
- }
448
- if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded &&
449
- (!content ||
450
- (content.isIframeSupported || '').toLowerCase() === 'maybe' ||
451
- (content.isIframeSupported || '').toLowerCase() === 'yes' ||
452
- (content.mimeType === 'application/pdf' || 'application/json'))) {
453
- _this.end({
454
- type: event.data.type || WsEvents.WsTimeSpentType.Player,
455
- mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
456
- }, event.data.object, event.pageContext);
457
- }
458
- }));
459
- };
460
- TelemetryService.prototype.addInteractListener = function () {
461
- var _this = this;
462
- var data = this.getPageDetails();
463
- this.triggerNPSUpdate(data.pageid);
464
- this.eventsSvc.events$
465
- .pipe(filter((function (event) {
466
- return event &&
467
- event.data &&
468
- event.eventType === WsEvents.WsEventType.Telemetry &&
469
- event.data.eventSubType === WsEvents.EnumTelemetrySubType.Interact;
470
- })))
471
- .subscribe((function (event) {
472
- var page = _this.getPageDetails();
473
- if (typeof event.from === 'string' && _this.externalApps[event.from]) {
474
- var externalConfig = {
475
- context: {
476
- pdata: tslib_1.__assign({}, _this.pData, { id: _this.externalApps[event.from] }),
477
- },
478
- };
479
- try {
480
- $t.interact(event.data, externalConfig);
481
- }
482
- catch (e) {
483
- console.log('Error in telemetry interact', e);
484
- }
485
- }
486
- else {
487
- try {
488
- $t.interact({
489
- type: event.data.edata.type,
490
- subtype: event.data.edata.subType,
491
- id: (event.data.edata && event.data.edata.id) ?
492
- event.data.edata.id
493
- : '',
494
- pageid: event.data.pageContext && event.data.pageContext.pageId || page.pageid,
495
- }, {
496
- context: tslib_1.__assign({ pdata: tslib_1.__assign({}, _this.pData, { id: _this.pData.id }) }, (event.pageContext && event.pageContext.module ? { env: event.pageContext.module } : null)),
497
- object: tslib_1.__assign({}, event.data.object),
498
- });
499
- }
500
- catch (e) {
501
- console.log('Error in telemetry interact', e);
502
- }
503
- }
504
- }));
505
- };
506
- TelemetryService.prototype.addFeedbackListener = function () {
507
- var _this = this;
508
- this.eventsSvc.events$
509
- .pipe(filter((function (event) {
510
- return event &&
511
- event.data &&
512
- event.eventType === WsEvents.WsEventType.Telemetry &&
513
- event.data.eventSubType === WsEvents.EnumTelemetrySubType.Feedback;
514
- })))
515
- .subscribe((function (event) {
516
- var page = _this.getPageDetails();
517
- try {
518
- $t.feedback({
519
- rating: event.data.object.rating || 0,
520
- commentid: event.data.object.commentid || '',
521
- commenttxt: event.data.object.commenttxt || '',
522
- pageid: page.pageid,
523
- }, {
524
- context: {
525
- pdata: tslib_1.__assign({}, _this.pData, { id: _this.pData.id }),
526
- },
527
- object: {
528
- id: event.data.object.contentId || event.data.object.id || '',
529
- type: event.data.edata.type || '',
530
- ver: "" + (event.data.object.version || '1') + '',
531
- rollup: {},
532
- },
533
- });
534
- }
535
- catch (e) {
536
- console.log('Error in telemetry interact', e);
537
- }
538
- }));
539
- };
540
- TelemetryService.prototype.addHearbeatListener = function () {
541
- var _this = this;
542
- this.eventsSvc.events$
543
- .pipe(filter((function (event) {
544
- return event &&
545
- event.data &&
546
- event.eventType === WsEvents.WsEventType.Telemetry &&
547
- event.data.eventSubType === WsEvents.EnumTelemetrySubType.HeartBeat;
548
- })))
549
- .subscribe((function (event) {
550
- if (typeof event.from === 'string' && _this.externalApps[event.from]) {
551
- var externalConfig = {
552
- context: {
553
- pdata: tslib_1.__assign({}, _this.pData, { id: _this.externalApps[event.from] }),
554
- },
555
- };
556
- try {
557
- $t.heartbeat(event.data, externalConfig);
558
- }
559
- catch (e) {
560
- console.log('Error in telemetry heartbeat', e);
561
- }
562
- }
563
- else {
564
- try {
565
- $t.heartbeat({
566
- type: event.data.type,
567
- id: event.data.id,
568
- }, {
569
- context: {
570
- pdata: tslib_1.__assign({}, _this.pData, { id: _this.pData.id }),
571
- },
572
- });
573
- }
574
- catch (e) {
575
- console.log('Error in telemetry heartbeat', e);
576
- }
577
- }
578
- }));
579
- };
580
- TelemetryService.prototype.addSearchListener = function () {
581
- var _this = this;
582
- this.eventsSvc.events$
583
- .pipe(filter((function (event) {
584
- return event &&
585
- event.data &&
586
- event.eventType === WsEvents.WsEventType.Telemetry &&
587
- event.data.eventSubType === WsEvents.EnumTelemetrySubType.Search;
588
- })))
589
- .subscribe((function (event) {
590
- try {
591
- $t.search({
592
- query: event.data.query,
593
- filters: event.data.filters,
594
- size: event.data.size,
595
- }, {
596
- context: {
597
- pdata: tslib_1.__assign({}, _this.pData, { id: _this.pData.id }),
598
- },
599
- });
600
- }
601
- catch (e) {
602
- console.log('Error in telemetry search', e);
603
- }
604
- }));
605
- };
606
- TelemetryService.prototype.getPageDetails = function () {
607
- var path = window.location.pathname.replace('/', '');
608
- var url = path + window.location.search;
609
- var moduleValue = '';
610
- if (path.includes('discussion-forum')) {
611
- moduleValue = 'Discuss';
612
- }
613
- return {
614
- pageid: path,
615
- pageUrl: url,
616
- pageUrlParts: path.split('/'),
617
- refferUrl: this.previousUrl,
618
- objectId: this.extractContentIdFromUrlParts(path.split('/')),
619
- module: moduleValue,
620
- };
621
- };
622
- TelemetryService.prototype.extractContentIdFromUrlParts = function (urlParts) {
623
- var tocIdx = urlParts.indexOf('toc');
624
- var viewerIdx = urlParts.indexOf('viewer');
625
- if (tocIdx === -1 && viewerIdx === -1) {
626
- return null;
627
- }
628
- if (tocIdx !== -1 && tocIdx < urlParts.length - 1) {
629
- return urlParts[tocIdx + 1];
630
- }
631
- if (viewerIdx !== -1 && viewerIdx < urlParts.length - 2) {
632
- return urlParts[viewerIdx + 2];
633
- }
634
- return null;
635
- };
636
- TelemetryService.decorators = [
637
- { type: Injectable, args: [{
638
- providedIn: 'root',
639
- },] }
640
- ];
641
- TelemetryService.ctorParameters = function () { return [
642
- { type: ConfigurationsService },
643
- { type: EventService },
644
- { type: undefined, decorators: [{ type: Inject, args: ['environment',] }] },
645
- { type: LoggerService },
646
- { type: Router },
647
- { type: NPSGridService }
648
- ]; };
649
- /** @nocollapse */ TelemetryService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function TelemetryService_Factory() { return new TelemetryService(i0.ɵɵinject(i1.ConfigurationsService), i0.ɵɵinject(i2.EventService), i0.ɵɵinject("environment"), i0.ɵɵinject(i3.LoggerService), i0.ɵɵinject(i4.Router), i0.ɵɵinject(i5.NPSGridService)); }, token: TelemetryService, providedIn: "root" });
650
- return TelemetryService;
651
- }());
652
- export { TelemetryService };
653
- if (false) {
654
- TelemetryService.prototype.previousUrl;
655
- TelemetryService.prototype.telemetryConfig;
656
- TelemetryService.prototype.pData;
657
- TelemetryService.prototype.contextCdata;
658
- TelemetryService.prototype.isAnonymousTelemetry;
659
- TelemetryService.prototype.telArray;
660
- TelemetryService.prototype.externalApps;
661
- TelemetryService.prototype.environment;
662
- TelemetryService.prototype.configSvc;
663
- TelemetryService.prototype.eventsSvc;
664
- TelemetryService.prototype.logger;
665
- TelemetryService.prototype.router;
666
- TelemetryService.prototype.npsSvc;
667
- }
668
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3VuYmlyZC1jYi91dGlscy12Mi8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy90ZWxlbWV0cnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBR3ZDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUVoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTs7Ozs7OztBQUluRDtJQWNFLDBCQUNVLFNBQWdDLEVBQ2hDLFNBQXVCLEVBQ1IsV0FBZ0IsRUFFL0IsTUFBcUIsRUFDckIsTUFBYyxFQUNkLE1BQXNCO1FBTnRCLGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBQ2hDLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFHdkIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFqQmhDLGdCQUFXLEdBQWtCLElBQUksQ0FBQTtRQUNqQyxvQkFBZSxHQUE2QyxJQUFJLENBQUE7UUFDaEUsVUFBSyxHQUFRLElBQUksQ0FBQTtRQUNqQixpQkFBWSxHQUFHLEVBQUUsQ0FBQTtRQUNqQix5QkFBb0IsR0FBRyxJQUFJLENBQUE7UUFDM0IsYUFBUSxHQUFRLEVBQUUsQ0FBQTtR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TTtnQkFDTixjQUFjOzs7MkJBVnZCO0NBdTNCQyxBQXoyQkQsSUF5MkJDO1NBdDJCWSxnQkFBZ0I7O0lBQzNCLHVDQUFpQztJQUNqQywyQ0FBZ0U7SUFDaEUsaUNBQWlCO0lBQ2pCLHdDQUFpQjtJQUNqQixnREFBMkI7SUFDM0Isb0NBQWtCO0lBQ2xCLHdDQUVDO0lBQ0QsdUNBQWdCO0lBRWQscUNBQXdDO0lBQ3hDLHFDQUErQjtJQUcvQixrQ0FBNkI7SUFDN0Isa0NBQXNCO0lBQ3RCLGtDQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xyXG4vLyBpbXBvcnQgeyBBdXRoS2V5Y2xvYWtTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLWtleWNsb2FrLnNlcnZpY2UnXHJcbmltcG9ydCB7IE5zSW5zdGFuY2VDb25maWcgfSBmcm9tICcuL2NvbmZpZ3VyYXRpb25zLm1vZGVsJ1xyXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuL2NvbmZpZ3VyYXRpb25zLnNlcnZpY2UnXHJcbmltcG9ydCB7IFdzRXZlbnRzIH0gZnJvbSAnLi9ldmVudC5tb2RlbCdcclxuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi9ldmVudC5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi9sb2dnZXIuc2VydmljZSdcclxuaW1wb3J0IHsgTnNDb250ZW50IH0gZnJvbSAnLi93aWRnZXQtY29udGVudC5tb2RlbCdcclxuaW1wb3J0IHsgUm91dGVyLCBOYXZpZ2F0aW9uU3RhcnQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInXHJcbmltcG9ydCB7IE5QU0dyaWRTZXJ2aWNlIH0gZnJvbSAnLi9ucHMtZ3JpZC5zZXJ2aWNlJ1xyXG5cclxuZGVjbGFyZSB2YXIgJHQ6IGFueVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRlbGVtZXRyeVNlcnZpY2Uge1xyXG4gIHByZXZpb3VzVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbFxyXG4gIHRlbGVtZXRyeUNvbmZpZzogTnNJbnN0YW5jZUNvbmZpZy5JVGVsZW1ldHJ5Q29uZmlnIHwgbnVsbCA9IG51bGxcclxuICBwRGF0YTogYW55ID0gbnVsbFxyXG4gIGNvbnRleHRDZGF0YSA9IFtdXHJcbiAgaXNBbm9ueW1vdXNUZWxlbWV0cnkgPSB0cnVlXHJcbiAgdGVsQXJyYXk6IGFueSA9IFtdXHJcbiAgZXh0ZXJuYWxBcHBzOiBhbnkgPSB7XHJcbiAgICBSQkNQOiAncmJjcC13ZWItdWknLFxyXG4gIH1cclxuICBlbnZpcm9ubWVudDogYW55XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNvbmZpZ1N2YzogQ29uZmlndXJhdGlvbnNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBldmVudHNTdmM6IEV2ZW50U2VydmljZSxcclxuICAgIEBJbmplY3QoJ2Vudmlyb25tZW50JykgZW52aXJvbm1lbnQ6IGFueSxcclxuICAgIC8vIHByaXZhdGUgYXV0aFN2YzogQXV0aEtleWNsb2FrU2VydmljZSxcclxuICAgIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgbnBzU3ZjOiBOUFNHcmlkU2VydmljZSxcclxuICApIHtcclxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudFxyXG4gICAgY29uc3QgaW5zdGFuY2VDb25maWcgPSB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZ1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU3RhcnQoKVxyXG4gICAgdGhpcy5pbml0aWFsaXplQ29uZmlnKGluc3RhbmNlQ29uZmlnKVxyXG4gICAgdGhpcy5hZGRQbGF5ZXJMaXN0ZW5lcigpXHJcbiAgICB0aGlzLmFkZEN1c3RvbUV2ZW50TGlzdGVuZXIoKVxyXG4gICAgdGhpcy5hZGRJbnRlcmFjdExpc3RlbmVyKClcclxuICAgIHRoaXMuYWRkRmVlZGJhY2tMaXN0ZW5lcigpXHJcbiAgICB0aGlzLmFkZFRpbWVTcGVudExpc3RlbmVyKClcclxuICAgIHRoaXMuYWRkU2VhcmNoTGlzdGVuZXIoKVxyXG4gICAgdGhpcy5hZGRIZWFyYmVhdExpc3RlbmVyKClcclxuICAgIHRoaXMuYWRkQ3VzdG9tSW1wcmVzc2lvbkxpc3RlbmVyKClcclxuICAgIHRoaXMuYWRkQ3VzdG9tTGlzdGVuZXIoKVxyXG4gICAgdGhpcy5hZGRDdXN0b21MaXN0ZW5lckZvckdldFN0YXJ0KClcclxuICAgIHRoaXMuYWRkQ3VzdG9tTGlzdGVuZXJGb3JQbGF0Zm9ybVJhdGluZygpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5hdmlnYXRpb25TdGFydCgpIHtcclxuICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnVybC5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCBldmVudC51cmwuaW5jbHVkZXMoJyZwcmV2aWV3PXRydWUnKSB8fCBldmVudC51cmwuaW5jbHVkZXMoJy9jZXJ0cycpKSB7XHJcbiAgICAgICAgICB0aGlzLmlzQW5vbnltb3VzVGVsZW1ldHJ5ID0gdHJ1ZVxyXG4gICAgICAgICAgdGhpcy51cGRhdGVUZWxlbWV0cnlDb25maWcoKVxyXG4gICAgICAgICAgY29uc3QgaW5zdGFuY2VDb25maWcgPSB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZ1xyXG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplQ29uZmlnKGluc3RhbmNlQ29uZmlnKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBpc0Fub255bW91c1RlbGVtZXRyeVJlcXVpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNBbm9ueW1vdXNUZWxlbWV0cnlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVGVsZW1ldHJ5Q29uZmlnKCkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnICYmIHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnLnRlbGVtZXRyeUNvbmZpZykge1xyXG4gICAgICBpZiAodGhpcy5pc0Fub255bW91c1RlbGVtZXRyeVJlcXVpcmVkKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWcudGVsZW1ldHJ5Q29uZmlnLmVuZHBvaW50ID0gdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWcudGVsZW1ldHJ5Q29uZmlnLnB1YmxpY0VuZHBvaW50XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWcudGVsZW1ldHJ5Q29uZmlnLmVuZHBvaW50ID0gdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWcudGVsZW1ldHJ5Q29uZmlnLnByb3RlY3RlZEVuZHBvaW50XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbmZpZyhpbnN0YW5jZUNvbmZpZzogTnNJbnN0YW5jZUNvbmZpZy5JQ29uZmlnIHwgbnVsbCkge1xyXG4gICAgaWYgKGluc3RhbmNlQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMudGVsZW1ldHJ5Q29uZmlnID0gaW5zdGFuY2VDb25maWcudGVsZW1ldHJ5Q29uZmlnXHJcbiAgICAgIHRoaXMudGVsZW1ldHJ5Q29uZmlnID0ge1xyXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5Q29uZmlnLFxyXG4gICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUNvbmZpZy5wZGF0YSxcclxuICAgICAgICAgIC8vIHBpZDogbmF2aWdhdG9yLnVzZXJBZ2VudCxcclxuICAgICAgICAgIGlkOiBgJHt0aGlzLmVudmlyb25tZW50Lm5hbWV9LiR7dGhpcy50ZWxlbWV0cnlDb25maWcucGRhdGEuaWR9YCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHVpZDogKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZCkgP1xyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZCA6ICcnLFxyXG4gICAgICAgIC8vIGF1dGh0b2tlbjogdGhpcy5hdXRoU3ZjLnRva2VuLFxyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICAgICAgY2hhbm5lbDogdGhpcy5yb290T3JnSWQgfHwgdGhpcy50ZWxlbWV0cnlDb25maWcuY2hhbm5lbCxcclxuICAgICAgICBzaWQ6IHRoaXMuZ2V0VGVsZW1ldHJ5U2Vzc2lvbklkLFxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucERhdGEgPSB0aGlzLnRlbGVtZXRyeUNvbmZpZy5wZGF0YVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGdldFRlbGVtZXRyeVNlc3Npb25JZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0ZWxlbWV0cnlTZXNzaW9uSWQnKSB8fCAnJ1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJvb3RPcmdJZCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnJvb3RPcmdJZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUucm9vdE9yZ0lkXHJcbiAgICB9XHJcbiAgICByZXR1cm4gJydcclxuICB9XHJcblxyXG4gIHRyaWdnZXJOUFNVcGRhdGUoZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLnRlbEFycmF5LnB1c2goZGF0YSlcclxuICAgIGlmICh0aGlzLnRlbEFycmF5ICYmIHRoaXMudGVsQXJyYXkubGVuZ3RoID09PSA0KSB7XHJcbiAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncmF0aW5nZm9ybUlEJykpIHtcclxuICAgICAgICB0aGlzLnRlbEFycmF5ID0gW11cclxuICAgICAgICB0aGlzLm5wc1N2Yy51cGRhdGVUZWxlbWV0cnlEYXRhKHRydWUpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0KGVkYXRhOiBhbnksIGRhdGE6IGFueSwgcGFnZUNvbnRleHQ/OiBXc0V2ZW50cy5JVGVsZW1ldHJ5UGFnZUNvbnRleHQpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLnRlbGVtZXRyeUNvbmZpZykge1xyXG4gICAgICAgICR0LnN0YXJ0KFxyXG4gICAgICAgICAgdGhpcy50ZWxlbWV0cnlDb25maWcsXHJcbiAgICAgICAgICAocGFnZUNvbnRleHQgJiYgcGFnZUNvbnRleHQucGFnZUlkKSA/XHJcbiAgICAgICAgICAgIHBhZ2VDb250ZXh0LnBhZ2VJZFxyXG4gICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgJzEuMCcsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIGlkLFxyXG4gICAgICAgICAgICB0eXBlOiBlZGF0YS50eXBlLFxyXG4gICAgICAgICAgICBtb2RlOiBlZGF0YS5tb2RlLFxyXG4gICAgICAgICAgICBwYWdlaWQ6IChwYWdlQ29udGV4dCAmJiBwYWdlQ29udGV4dC5wYWdlSWQpID9cclxuICAgICAgICAgICAgICBwYWdlQ29udGV4dC5wYWdlSWRcclxuICAgICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgICBkdXJhdGlvbjogMSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgLi4uKHBhZ2VDb250ZXh0ICYmIHBhZ2VDb250ZXh0Lm1vZHVsZSA/IHsgZW52OiBwYWdlQ29udGV4dC5tb2R1bGUgfSA6IG51bGwpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvYmplY3Q6IHtcclxuICAgICAgICAgICAgICAuLi4oZGF0YSkgJiYgZGF0YSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLi4uKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZCA/XHJcbiAgICAgICAgICAgICAgIG51bGwgOiB7IGFjdG9yOiB7IGlkOiAnJywgdHlwZTogJ0Fub255bW91c1VzZXInIH0gfSksXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBJbml0aWFsaXppbmcgVGVsZW1ldHJ5LiBDb25maWcgbWlzc2luZy4nKVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IHN0YXJ0JywgZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGVuZChlZGF0YTogYW55LCBkYXRhOiBhbnksIHBhZ2VDb250ZXh0PzogV3NFdmVudHMuSVRlbGVtZXRyeVBhZ2VDb250ZXh0KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAkdC5lbmQoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdHlwZTogZWRhdGEudHlwZSxcclxuICAgICAgICAgIG1vZGU6IGVkYXRhLm1vZGUsXHJcbiAgICAgICAgICBwYWdlaWQ6IChwYWdlQ29udGV4dCAmJiBwYWdlQ29udGV4dC5wYWdlSWQpID9cclxuICAgICAgICAgICAgcGFnZUNvbnRleHQucGFnZUlkXHJcbiAgICAgICAgICAgIDogJycsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICBpZDogdGhpcy5wRGF0YS5pZCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLi4uKHBhZ2VDb250ZXh0ICYmIHBhZ2VDb250ZXh0Lm1vZHVsZSA/IHsgZW52OiBwYWdlQ29udGV4dC5tb2R1bGUgfSA6IG51bGwpLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICAuLi4oZGF0YSkgJiYgZGF0YSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgKVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHRlbGVtZXRyeSBlbmQnLCBlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXVkaXQodHlwZTogc3RyaW5nLCBwcm9wczogc3RyaW5nLCBkYXRhOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICR0LmF1ZGl0KFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICBwcm9wcyxcclxuICAgICAgICAgIC8vIGRhdGEsXHJcbiAgICAgICAgICBzdGF0ZTogZGF0YSwgLy8gT3B0aW9uYWwuIEN1cnJlbnQgU3RhdGVcclxuICAgICAgICAgIHByZXZzdGF0ZTogJycsIC8vIE9wdGlvbmFsLiBQcmV2aW91cyBTdGF0ZVxyXG4gICAgICAgICAgZHVyYXRpb246ICcnLCAvLyBPcHRpb25hbC5cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICApXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGF1ZGl0JywgZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhlYXJ0YmVhdCh0eXBlOiBzdHJpbmcsIGlkOiBzdHJpbmcpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICR0LmhlYXJ0YmVhdCh7XHJcbiAgICAgICAgaWQsXHJcbiAgICAgICAgLy8gbW9kZSxcclxuICAgICAgICB0eXBlLFxyXG4gICAgICB9KVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHRlbGVtZXRyeSBoZWFydGJlYXQnLCBlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW1wcmVzc2lvbihkYXRhPzogYW55LCBvYmplY3RUeXBlPzogYW55KSB7XHJcbiAgICB0aGlzLnRyaWdnZXJOUFNVcGRhdGUoZGF0YSlcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmdldFBhZ2VEZXRhaWxzKClcclxuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5wYWdlQ29udGV4dCkge1xyXG4gICAgICAgIHBhZ2UucGFnZWlkID0gZGF0YS5wYWdlQ29udGV4dC5wYWdlSWRcclxuICAgICAgICBwYWdlLm1vZHVsZSA9IGRhdGEucGFnZUNvbnRleHQubW9kdWxlXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZWRhdGEgPSB7XHJcbiAgICAgICAgcGFnZWlkOiBwYWdlLnBhZ2VpZCwgLy8gUmVxdWlyZWQuIFVuaXF1ZSBwYWdlIGlkXHJcbiAgICAgICAgdHlwZTogcGFnZS5wYWdlVXJsUGFydHNbMF0sIC8vIFJlcXVpcmVkLiBJbXByZXNzaW9uIHR5cGUgKGxpc3QsIGRldGFpbCwgdmlldywgZWRpdCwgd29ya2Zsb3csIHNlYXJjaClcclxuICAgICAgICB1cmk6IHBhZ2UucGFnZVVybCxcclxuICAgICAgfVxyXG4gICAgICBpZiAocGFnZS5vYmplY3RJZCkge1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcclxuICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbnY6IHBhZ2UubW9kdWxlIHx8ICh0aGlzLnRlbGVtZXRyeUNvbmZpZyAmJiB0aGlzLnRlbGVtZXRyeUNvbmZpZy5lbnYpLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICBpZDogcGFnZS5vYmplY3RJZCxcclxuICAgICAgICAgICAgdHlwZTogb2JqZWN0VHlwZSxcclxuICAgICAgICAgICAgLy8gVGhpcyB3aWxsIG92ZXJyaWRlIGFib3ZlIGlkIGlmIHRoZSBkYXRhIGhhcyBvYmplY3QgaW4gaXQuXHJcbiAgICAgICAgICAgIC4uLihkYXRhICYmIGRhdGEub2JqZWN0KSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcGFnZS5vYmplY3RJZCB8fCAhb2JqZWN0VHlwZSkge1xyXG4gICAgICAgICAgY29uZmlnLm9iamVjdCA9IHt9XHJcbiAgICAgICAgfVxyXG4gICAgICAgICR0LmltcHJlc3Npb24oZWRhdGEsIGNvbmZpZylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkdC5pbXByZXNzaW9uKGVkYXRhLCB7XHJcbiAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICBpZDogdGhpcy5wRGF0YSAmJiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbnY6IHBhZ2UubW9kdWxlIHx8ICcnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICAuLi4oZGF0YSAmJiBkYXRhLm9iamVjdCksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wcmV2aW91c1VybCA9IHBhZ2UucGFnZVVybFxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHRlbGVtZXRyeSBpbXByZXNzaW9uJywgZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4dGVybmFsSW1wcmVzc2lvbihpbXByZXNzaW9uRGF0YTogYW55KSB7XHJcbiAgICAvLyB0aGlzLnRyaWdnZXJOUFNVcGRhdGUoaW1wcmVzc2lvbkRhdGEpXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBwYWdlID0gdGhpcy5nZXRQYWdlRGV0YWlscygpXHJcbiAgICAgIGlmICh0aGlzLmV4dGVybmFsQXBwc1tpbXByZXNzaW9uRGF0YS5zdWJBcHBsaWNhdGlvbk5hbWVdKSB7XHJcbiAgICAgICAgY29uc3QgZXh0ZXJuYWxDb25maWcgPSBwYWdlLm9iamVjdElkID8ge1xyXG4gICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgaWQ6IHRoaXMuZXh0ZXJuYWxBcHBzW2ltcHJlc3Npb25EYXRhLnN1YkFwcGxpY2F0aW9uTmFtZV0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb2JqZWN0OiB7XHJcbiAgICAgICAgICAgIGlkOiBwYWdlLm9iamVjdElkLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9IDoge1xyXG4gICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgaWQ6IHRoaXMuZXh0ZXJuYWxBcHBzW2ltcHJlc3Npb25EYXRhLnN1YkFwcGxpY2F0aW9uTmFtZV0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH1cclxuICAgICAgICAkdC5pbXByZXNzaW9uKGltcHJlc3Npb25EYXRhLmRhdGEsIGV4dGVybmFsQ29uZmlnKVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGV4dGVybmFsSW1wcmVzc2lvbicsIGUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBmb3IgUGxhcnRmb3JtIHJhdGluZ1xyXG4gIGFkZEN1c3RvbUxpc3RlbmVyRm9yUGxhdGZvcm1SYXRpbmcoKSB7XHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5nZXRQUkV2ZW50cyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmlsdGVyKFxyXG4gICAgICAgICAgZXZlbnQgPT5cclxuICAgICAgICAgICAgZXZlbnQgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5ldmVudFN1YlR5cGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlBsYXRmb3JtUmF0aW5nICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEubW9kZSAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkxvYWRlZCkge1xyXG4gICAgICAgICAgdGhpcy5zdGFydChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICAgIG1vZGU6IGV2ZW50LmRhdGEubW9kZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudE1vZGUuUGxheSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgIGV2ZW50LnBhZ2VDb250ZXh0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlVubG9hZGVkXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZCh7XHJcbiAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5vYmplY3QsXHJcbiAgICAgICAgICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBldmVudC5kYXRhLnN0YXRlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgJHQuaW50ZXJhY3QoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLmVkYXRhLnR5cGUsXHJcbiAgICAgICAgICAgICAgc3VidHlwZTogZXZlbnQuZGF0YS5lZGF0YS5zdWJUeXBlLFxyXG4gICAgICAgICAgICAgIGlkOiAoZXZlbnQuZGF0YS5lZGF0YSAmJiBldmVudC5kYXRhLmVkYXRhLmlkKSA/XHJcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLmVkYXRhLmlkXHJcbiAgICAgICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgICAgIHBhZ2VpZDogZXZlbnQucGFnZUNvbnRleHQgJiYgZXZlbnQucGFnZUNvbnRleHQucGFnZUlkIHx8ICcnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgLi4uKGV2ZW50LnBhZ2VDb250ZXh0ICYmIGV2ZW50LnBhZ2VDb250ZXh0Lm1vZHVsZSA/IHsgZW52OiBldmVudC5wYWdlQ29udGV4dC5tb2R1bGUgfSA6IG51bGwpLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgb2JqZWN0OiB7XHJcbiAgICAgICAgICAgICAgICAuLi5ldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRDdXN0b21MaXN0ZW5lckZvckdldFN0YXJ0KCkge1xyXG4gICAgdGhpcy5ldmVudHNTdmMuZ2V0U3RhcnRFdmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIGV2ZW50ID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5HZXRTdGFydGVkICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEubW9kZSAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkxvYWRlZCkge1xyXG4gICAgICAgICAgdGhpcy5zdGFydChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICAgIG1vZGU6IGV2ZW50LmRhdGEubW9kZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudE1vZGUuUGxheSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgIGV2ZW50LnBhZ2VDb250ZXh0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlVubG9hZGVkXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZCh7XHJcbiAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5vYmplY3QsXHJcbiAgICAgICAgICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBldmVudC5kYXRhLnN0YXRlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgJHQuaW50ZXJhY3QoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLmVkYXRhLnR5cGUsXHJcbiAgICAgICAgICAgICAgc3VidHlwZTogZXZlbnQuZGF0YS5lZGF0YS5zdWJUeXBlLFxyXG4gICAgICAgICAgICAgIGlkOiAoZXZlbnQuZGF0YS5lZGF0YSAmJiBldmVudC5kYXRhLmVkYXRhLmlkKSA/XHJcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLmVkYXRhLmlkXHJcbiAgICAgICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgICAgIHBhZ2VpZDogZXZlbnQucGFnZUNvbnRleHQgJiYgZXZlbnQucGFnZUNvbnRleHQucGFnZUlkIHx8ICcnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgLi4uKGV2ZW50LnBhZ2VDb250ZXh0ICYmIGV2ZW50LnBhZ2VDb250ZXh0Lm1vZHVsZSA/IHsgZW52OiBldmVudC5wYWdlQ29udGV4dC5tb2R1bGUgfSA6IG51bGwpLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgb2JqZWN0OiB7XHJcbiAgICAgICAgICAgICAgICAuLi5ldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRDdXN0b21MaXN0ZW5lcigpIHtcclxuICAgIHRoaXMuZXZlbnRzU3ZjLmNoYXRib3RFdmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIGV2ZW50ID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5DaGF0Ym90ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEubW9kZSAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkxvYWRlZCkge1xyXG4gICAgICAgICAgdGhpcy5zdGFydChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICAgIG1vZGU6IGV2ZW50LmRhdGEubW9kZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudE1vZGUuUGxheSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgIGV2ZW50LnBhZ2VDb250ZXh0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlVubG9hZGVkXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZCh7XHJcbiAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBldmVudC5kYXRhLnN0YXRlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgJHQuaW50ZXJhY3QoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLmVkYXRhLnR5cGUsXHJcbiAgICAgICAgICAgICAgc3VidHlwZTogZXZlbnQuZGF0YS5lZGF0YS5zdWJUeXBlLFxyXG4gICAgICAgICAgICAgIGlkOiAoZXZlbnQuZGF0YS5lZGF0YSAmJiBldmVudC5kYXRhLmVkYXRhLmlkKSA/XHJcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLmVkYXRhLmlkXHJcbiAgICAgICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgICAgIHBhZ2VpZDogZXZlbnQucGFnZUNvbnRleHQgJiYgZXZlbnQucGFnZUNvbnRleHQucGFnZUlkIHx8ICcnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgLi4uKGV2ZW50LnBhZ2VDb250ZXh0ICYmIGV2ZW50LnBhZ2VDb250ZXh0Lm1vZHVsZSA/IHsgZW52OiBldmVudC5wYWdlQ29udGV4dC5tb2R1bGUgfSA6IG51bGwpLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgb2JqZWN0OiB7XHJcbiAgICAgICAgICAgICAgICAuLi5ldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRDdXN0b21JbXByZXNzaW9uTGlzdGVuZXIoKSB7XHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5ldmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIChldmVudDogV3NFdmVudHMuV3NFdmVudFRlbGVtZXRyeUltcHJlc3Npb24pID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5ldmVudFN1YlR5cGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkltcHJlc3Npb24sXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ2V2ZW50LmRhdGE6OicsIGV2ZW50LmRhdGEpXHJcbiAgICAgICAgICB0aGlzLmltcHJlc3Npb24oZXZlbnQuZGF0YSlcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgaW1wcmVzc2lvbicsIGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgYWRkVGltZVNwZW50TGlzdGVuZXIoKSB7XHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5ldmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIGV2ZW50ID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEudHlwZSA9PT0gV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBhZ2UgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5tb2RlICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEsXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuTG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS50eXBlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXIsXHJcbiAgICAgICAgICAgICAgbW9kZTogZXZlbnQuZGF0YS5tb2RlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50TW9kZS5QbGF5LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgZXZlbnQucGFnZUNvbnRleHRcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlVubG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZCh7XHJcbiAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZEN1c3RvbUV2ZW50TGlzdGVuZXIoKSB7XHJcblxyXG4gICAgdGhpcy5ldmVudHNTdmMuZXZlbnRzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICBldmVudCA9PlxyXG4gICAgICAgICAgICBldmVudCAmJlxyXG4gICAgICAgICAgICBldmVudC5ldmVudFR5cGUgPT09IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeVxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuTG9hZGVkICYmXHJcbiAgICAgICAgICBldmVudC5kYXRhLnR5cGUgIT09IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXJcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuc3RhcnQoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLnR5cGUsXHJcbiAgICAgICAgICAgICAgbW9kZTogZXZlbnQuZGF0YS5tb2RlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50TW9kZS5QbGF5LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgZXZlbnQucGFnZUNvbnRleHRcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuVW5sb2FkZWQgJiZcclxuICAgICAgICAgIGV2ZW50LmRhdGEudHlwZSAhPT0gV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllclxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5lbmQoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLnR5cGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllcixcclxuICAgICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEub2JqZWN0LFxyXG4gICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcbiAgYWRkUGxheWVyTGlzdGVuZXIoKSB7XHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5ldmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIGV2ZW50ID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEudHlwZSA9PT0gV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllciAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLm1vZGUgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YSxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBldmVudC5kYXRhLmNvbnRlbnRcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBldmVudC5kYXRhLnN0YXRlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5Mb2FkZWQgJiZcclxuICAgICAgICAgICghY29udGVudCB8fFxyXG4gICAgICAgICAgICAoY29udGVudC5pc0lmcmFtZVN1cHBvcnRlZCB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ21heWJlJyB8fFxyXG4gICAgICAgICAgICAoY29udGVudC5pc0lmcmFtZVN1cHBvcnRlZCB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ3llcycgfHxcclxuICAgICAgICAgICAgKGNvbnRlbnQubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9wZGYnIHx8ICdhcHBsaWNhdGlvbi9qc29uJykpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS50eXBlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXIsXHJcbiAgICAgICAgICAgICAgbW9kZTogZXZlbnQuZGF0YS5tb2RlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50TW9kZS5QbGF5LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgZXZlbnQucGFnZUNvbnRleHRcclxuXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlVubG9hZGVkICYmXHJcbiAgICAgICAgICAoIWNvbnRlbnQgfHxcclxuICAgICAgICAgICAgKGNvbnRlbnQuaXNJZnJhbWVTdXBwb3J0ZWQgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdtYXliZScgfHxcclxuICAgICAgICAgICAgKGNvbnRlbnQuaXNJZnJhbWVTdXBwb3J0ZWQgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICd5ZXMnIHx8XHJcbiAgICAgICAgICAgIChjb250ZW50Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJyB8fCAnYXBwbGljYXRpb24vanNvbicpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5lbmQoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLnR5cGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllcixcclxuICAgICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEub2JqZWN0LFxyXG4gICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZEludGVyYWN0TGlzdGVuZXIoKSB7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRQYWdlRGV0YWlscygpXHJcbiAgICB0aGlzLnRyaWdnZXJOUFNVcGRhdGUoZGF0YS5wYWdlaWQpXHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5ldmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIChldmVudDogV3NFdmVudHMuV3NFdmVudFRlbGVtZXRyeUludGVyYWN0KSA9PlxyXG4gICAgICAgICAgICBldmVudCAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdCxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmdldFBhZ2VEZXRhaWxzKClcclxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50LmZyb20gPT09ICdzdHJpbmcnICYmIHRoaXMuZXh0ZXJuYWxBcHBzW2V2ZW50LmZyb21dKSB7XHJcbiAgICAgICAgICBjb25zdCBleHRlcm5hbENvbmZpZyA9IHtcclxuICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuZXh0ZXJuYWxBcHBzW2V2ZW50LmZyb21dLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAkdC5pbnRlcmFjdChldmVudC5kYXRhLCBleHRlcm5hbENvbmZpZylcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgaW50ZXJhY3QnLCBlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBsZXQgaW50ZXJhY3RpZFxyXG4gICAgICAgICAgLy8gaWYgKGV2ZW50LmRhdGEuZWRhdGEudHlwZSA9PT0gJ2dvYWwnKSB7XHJcbiAgICAgICAgICAvLyAgIGludGVyYWN0aWQgPSBwYWdlLnBhZ2VVcmxQYXJ0c1s0XVxyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgJHQuaW50ZXJhY3QoXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS5lZGF0YS50eXBlLFxyXG4gICAgICAgICAgICAgICAgc3VidHlwZTogZXZlbnQuZGF0YS5lZGF0YS5zdWJUeXBlLFxyXG4gICAgICAgICAgICAgICAgLy8gb2JqZWN0OiBldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgICAgIGlkOiAoZXZlbnQuZGF0YS5lZGF0YSAmJiBldmVudC5kYXRhLmVkYXRhLmlkKSA/XHJcbiAgICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuZWRhdGEuaWRcclxuICAgICAgICAgICAgICAgICAgOiAnJyxcclxuICAgICAgICAgICAgICAgIHBhZ2VpZDogZXZlbnQuZGF0YS5wYWdlQ29udGV4dCAmJiBldmVudC5kYXRhLnBhZ2VDb250ZXh0LnBhZ2VJZCB8fCBwYWdlLnBhZ2VpZCxcclxuICAgICAgICAgICAgICAgIC8vIHRhcmdldDogeyBwYWdlIH0sXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5wRGF0YS5pZCxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgLi4uKGV2ZW50LnBhZ2VDb250ZXh0ICYmIGV2ZW50LnBhZ2VDb250ZXh0Lm1vZHVsZSA/IHsgZW52OiBldmVudC5wYWdlQ29udGV4dC5tb2R1bGUgfSA6IG51bGwpLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICAgICAgICAuLi5ldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgaW50ZXJhY3QnLCBlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZEZlZWRiYWNrTGlzdGVuZXIoKSB7XHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5ldmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIChldmVudDogV3NFdmVudHMuV3NFdmVudFRlbGVtZXRyeUZlZWRiYWNrKSA9PlxyXG4gICAgICAgICAgICBldmVudCAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5GZWVkYmFjayxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmdldFBhZ2VEZXRhaWxzKClcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgJHQuZmVlZGJhY2soXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICByYXRpbmc6IGV2ZW50LmRhdGEub2JqZWN0LnJhdGluZyB8fCAwLFxyXG4gICAgICAgICAgICAgIGNvbW1lbnRpZDogZXZlbnQuZGF0YS5vYmplY3QuY29tbWVudGlkIHx8ICcnLFxyXG4gICAgICAgICAgICAgIGNvbW1lbnR0eHQ6IGV2ZW50LmRhdGEub2JqZWN0LmNvbW1lbnR0eHQgfHwgJycsXHJcbiAgICAgICAgICAgICAgcGFnZWlkOiBwYWdlLnBhZ2VpZCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICAgICAgaWQ6IGV2ZW50LmRhdGEub2JqZWN0LmNvbnRlbnRJZCB8fCBldmVudC5kYXRhLm9iamVjdC5pZCB8fCAnJyxcclxuICAgICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEuZWRhdGEudHlwZSB8fCAnJyxcclxuICAgICAgICAgICAgICAgIHZlcjogYCR7KGV2ZW50LmRhdGEub2JqZWN0LnZlcnNpb24gfHwgJzEnKX0keycnfWAsXHJcbiAgICAgICAgICAgICAgICByb2xsdXA6IHt9LFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGludGVyYWN0JywgZSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRIZWFyYmVhdExpc3RlbmVyKCkge1xyXG4gICAgdGhpcy5ldmVudHNTdmMuZXZlbnRzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICAoZXZlbnQ6IFdzRXZlbnRzLldzRXZlbnRUZWxlbWV0cnlIZWFydEJlYXQpID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5ldmVudFN1YlR5cGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkhlYXJ0QmVhdCxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQuZnJvbSA9PT0gJ3N0cmluZycgJiYgdGhpcy5leHRlcm5hbEFwcHNbZXZlbnQuZnJvbV0pIHtcclxuICAgICAgICAgIGNvbnN0IGV4dGVybmFsQ29uZmlnID0ge1xyXG4gICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5leHRlcm5hbEFwcHNbZXZlbnQuZnJvbV0sXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICR0LmhlYXJ0YmVhdChldmVudC5kYXRhLCBleHRlcm5hbENvbmZpZylcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgaGVhcnRiZWF0JywgZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgJHQuaGVhcnRiZWF0KFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSxcclxuICAgICAgICAgICAgICAgIC8vIHN1YnR5cGU6IGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlLFxyXG4gICAgICAgICAgICAgICAgaWQ6IGV2ZW50LmRhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICAvLyBtaW1lVHlwZTogZXZlbnQuZGF0YS5taW1lVHlwZSxcclxuICAgICAgICAgICAgICAgIC8vIG1vZGU6IGV2ZW50LmRhdGEubW9kZSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHRlbGVtZXRyeSBoZWFydGJlYXQnLCBlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZFNlYXJjaExpc3RlbmVyKCkge1xyXG4gICAgdGhpcy5ldmVudHNTdmMuZXZlbnRzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICAoZXZlbnQ6IFdzRXZlbnRzLldzRXZlbnRUZWxlbWV0cnlTZWFyY2gpID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5ldmVudFN1YlR5cGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlNlYXJjaCxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAkdC5zZWFyY2goXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBxdWVyeTogZXZlbnQuZGF0YS5xdWVyeSxcclxuICAgICAgICAgICAgICBmaWx0ZXJzOiBldmVudC5kYXRhLmZpbHRlcnMsXHJcbiAgICAgICAgICAgICAgc2l6ZTogZXZlbnQuZGF0YS5zaXplLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IHNlYXJjaCcsIGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0UGFnZURldGFpbHMoKSB7XHJcbiAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoJy8nLCAnJylcclxuICAgIGNvbnN0IHVybCA9IHBhdGggKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoXHJcbiAgICBsZXQgbW9kdWxlVmFsdWUgPSAnJ1xyXG4gICAgaWYgKHBhdGguaW5jbHVkZXMoJ2Rpc2N1c3Npb24tZm9ydW0nKSkge1xyXG4gICAgICBtb2R1bGVWYWx1ZSA9ICdEaXNjdXNzJ1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcGFnZWlkOiBwYXRoLFxyXG4gICAgICBwYWdlVXJsOiB1cmwsXHJcbiAgICAgIHBhZ2VVcmxQYXJ0czogcGF0aC5zcGxpdCgnLycpLFxyXG4gICAgICByZWZmZXJVcmw6IHRoaXMucHJldmlvdXNVcmwsXHJcbiAgICAgIG9iamVjdElkOiB0aGlzLmV4dHJhY3RDb250ZW50SWRGcm9tVXJsUGFydHMocGF0aC5zcGxpdCgnLycpKSxcclxuICAgICAgbW9kdWxlOiBtb2R1bGVWYWx1ZSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4dHJhY3RDb250ZW50SWRGcm9tVXJsUGFydHModXJsUGFydHM6IHN0cmluZ1tdKSB7XHJcbiAgICAvLyBUT0RPOiBwaWNrIHRvYyBhbmQgdmlld2VyIHVybCBmcm9tIHNvbWUgY29uZmlndXJhdGlvblxyXG4gICAgY29uc3QgdG9jSWR4ID0gdXJsUGFydHMuaW5kZXhPZigndG9jJylcclxuICAgIGNvbnN0IHZpZXdlcklkeCA9IHVybFBhcnRzLmluZGV4T2YoJ3ZpZXdlcicpXHJcblxyXG4gICAgaWYgKHRvY0lkeCA9PT0gLTEgJiYgdmlld2VySWR4ID09PSAtMSkge1xyXG4gICAgICByZXR1cm4gbnVsbFxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0b2NJZHggIT09IC0xICYmIHRvY0lkeCA8IHVybFBhcnRzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgcmV0dXJuIHVybFBhcnRzW3RvY0lkeCArIDFdIC8vIGUuZy4gdXJsIC9hcHAvdG9jLzxjb250ZW50X2lkPlxyXG4gICAgfVxyXG5cclxuICAgIGlmICh2aWV3ZXJJZHggIT09IC0xICYmIHZpZXdlcklkeCA8IHVybFBhcnRzLmxlbmd0aCAtIDIpIHtcclxuICAgICAgcmV0dXJuIHVybFBhcnRzW3ZpZXdlcklkeCArIDJdIC8vIGUuZy4gdXJsIC9hcHAvdmlld2VyLzxjb250ZW50X3R5cGU+Lzxjb250ZW50X2lkPlxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG59XHJcbiJdfQ==