@sunbird-cb/utils-v2 0.0.1

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