@sunbird-cb/toc 0.0.1-mauritius

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 (346) hide show
  1. package/esm2022/lib/_collection/_common/ai-tutor/ai-tutor.component.mjs +1169 -0
  2. package/esm2022/lib/_collection/_common/ai-tutor/socket.service.mjs +121 -0
  3. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.component.mjs +55 -0
  4. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.module.mjs +126 -0
  5. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.component.mjs +32 -0
  6. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.module.mjs +85 -0
  7. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.component.mjs +100 -0
  8. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.module.mjs +48 -0
  9. package/esm2022/lib/_collection/_common/card-competency/card-competency.component.mjs +58 -0
  10. package/esm2022/lib/_collection/_common/card-competency/card-competency.module.mjs +22 -0
  11. package/esm2022/lib/_collection/_common/card-content-v2/card-content-v2.model.mjs +23 -0
  12. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +221 -0
  13. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +96 -0
  14. package/esm2022/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.mjs +48 -0
  15. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.component.mjs +25 -0
  16. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.module.mjs +41 -0
  17. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover-card.component.mjs +89 -0
  18. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.module.mjs +42 -0
  19. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.servive.mjs +41 -0
  20. package/esm2022/lib/_collection/_common/connection-name/connection-name.component.mjs +78 -0
  21. package/esm2022/lib/_collection/_common/connection-name/connection-name.module.mjs +45 -0
  22. package/esm2022/lib/_collection/_common/connection-name/profile-v2.model.mjs +2 -0
  23. package/esm2022/lib/_collection/_common/content-progress/content-progress.component.mjs +70 -0
  24. package/esm2022/lib/_collection/_common/content-progress/content-progress.module.mjs +28 -0
  25. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.mjs +187 -0
  26. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.mjs +86 -0
  27. package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +31 -0
  28. package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +961 -0
  29. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.mjs +183 -0
  30. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.mjs +327 -0
  31. package/esm2022/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.mjs +297 -0
  32. package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +304 -0
  33. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +1229 -0
  34. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.mjs +16 -0
  35. package/esm2022/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.mjs +43 -0
  36. package/esm2022/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.mjs +133 -0
  37. package/esm2022/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.mjs +66 -0
  38. package/esm2022/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.mjs +278 -0
  39. package/esm2022/lib/_collection/_common/content-toc/content-services/handle-claim.service.mjs +21 -0
  40. package/esm2022/lib/_collection/_common/content-toc/content-services/review-component-data.service.mjs +21 -0
  41. package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +833 -0
  42. package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +224 -0
  43. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +212 -0
  44. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.module.mjs +26 -0
  45. package/esm2022/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.mjs +19 -0
  46. package/esm2022/lib/_collection/_common/content-toc/pipes/truncate.pipe.mjs +23 -0
  47. package/esm2022/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.mjs +113 -0
  48. package/esm2022/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.mjs +110 -0
  49. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.component.mjs +26 -0
  50. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.module.mjs +19 -0
  51. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.mjs +67 -0
  52. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.mjs +28 -0
  53. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.component.mjs +77 -0
  54. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.model.mjs +2 -0
  55. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.module.mjs +61 -0
  56. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.module.mjs +20 -0
  57. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +67 -0
  58. package/esm2022/lib/_collection/_common/player-brief/player-brief.component.mjs +139 -0
  59. package/esm2022/lib/_collection/_common/player-brief/player-brief.module.mjs +71 -0
  60. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.component.mjs +34 -0
  61. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.module.mjs +56 -0
  62. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.component.mjs +25 -0
  63. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.module.mjs +37 -0
  64. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.mjs +32 -0
  65. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner.module.mjs +30 -0
  66. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +38 -0
  67. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.mjs +51 -0
  68. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.component.mjs +115 -0
  69. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.model.mjs +12 -0
  70. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.module.mjs +51 -0
  71. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.service.mjs +61 -0
  72. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.component.mjs +87 -0
  73. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.module.mjs +36 -0
  74. package/esm2022/lib/_collection/_common/user-image/user-image.component.mjs +62 -0
  75. package/esm2022/lib/_collection/_common/user-image/user-image.module.mjs +24 -0
  76. package/esm2022/lib/_collection/btn-page-back/btn-page-back.component.mjs +192 -0
  77. package/esm2022/lib/_collection/btn-page-back/btn-page-back.module.mjs +44 -0
  78. package/esm2022/lib/_collection/btn-page-back/btn-page-back.service.mjs +99 -0
  79. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.component.mjs +58 -0
  80. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.module.mjs +67 -0
  81. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +112 -0
  82. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.model.mjs +2 -0
  83. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.module.mjs +69 -0
  84. package/esm2022/lib/_collection-api.mjs +57 -0
  85. package/esm2022/lib/_constants/widget-content.constants.mjs +19 -0
  86. package/esm2022/lib/_directives/tooltip.directive.mjs +68 -0
  87. package/esm2022/lib/_models/common.model.mjs +2 -0
  88. package/esm2022/lib/_models/error.model.mjs +2 -0
  89. package/esm2022/lib/_pipes/highlight.pipe.mjs +24 -0
  90. package/esm2022/lib/_services/rating.service.mjs +89 -0
  91. package/esm2022/lib/_services/samuhik-charcha.service.mjs +29 -0
  92. package/esm2022/lib/_services/viewer-route-util.mjs +103 -0
  93. package/esm2022/lib/_services/widget-content.model.mjs +254 -0
  94. package/esm2022/lib/_services/widget-content.service.mjs +594 -0
  95. package/esm2022/lib/_shared/translate-loader.factory.mjs +9 -0
  96. package/esm2022/lib/app-toc-lib.module.mjs +503 -0
  97. package/esm2022/lib/collection.config.mjs +161 -0
  98. package/esm2022/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.mjs +37 -0
  99. package/esm2022/lib/components/app-toc-banner/app-toc-banner.component.mjs +1436 -0
  100. package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +505 -0
  101. package/esm2022/lib/components/app-toc-cios-home/consent-dialog.component.mjs +119 -0
  102. package/esm2022/lib/components/app-toc-cohorts/app-toc-cohorts.component.mjs +80 -0
  103. package/esm2022/lib/components/app-toc-content-card/app-toc-content-card.component.mjs +249 -0
  104. package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +39 -0
  105. package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +58 -0
  106. package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +2230 -0
  107. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +3001 -0
  108. package/esm2022/lib/components/app-toc-overview/app-toc-overview.component.mjs +157 -0
  109. package/esm2022/lib/components/app-toc-session-card/app-toc-session-card.component.mjs +48 -0
  110. package/esm2022/lib/components/app-toc-sessions/app-toc-sessions.component.mjs +47 -0
  111. package/esm2022/lib/components/app-toc-single-page/app-toc-single-page.component.mjs +766 -0
  112. package/esm2022/lib/components/completion-survey-form/completion-survey-form.component.mjs +243 -0
  113. package/esm2022/lib/components/create-batch-dialog/create-batch-dialog.component.mjs +116 -0
  114. package/esm2022/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.mjs +44 -0
  115. package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +1838 -0
  116. package/esm2022/lib/components/enroll-questionnaire/enroll-questionnaire.component.mjs +236 -0
  117. package/esm2022/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.mjs +213 -0
  118. package/esm2022/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.mjs +36 -0
  119. package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +258 -0
  120. package/esm2022/lib/components/survey-form-question/survey-form-question.component.mjs +133 -0
  121. package/esm2022/lib/components/survey-form-section/survey-form-section.component.mjs +36 -0
  122. package/esm2022/lib/models/app-toc-analytics.model.mjs +2 -0
  123. package/esm2022/lib/models/app-toc.model.mjs +38 -0
  124. package/esm2022/lib/models/auto-complete.model.mjs +2 -0
  125. package/esm2022/lib/models/card-content.model.mjs +13 -0
  126. package/esm2022/lib/models/content-strip-with-tabs.model.mjs +2 -0
  127. package/esm2022/lib/models/discussion-forum.model.mjs +14 -0
  128. package/esm2022/lib/models/goal.model.mjs +2 -0
  129. package/esm2022/lib/models/meta-tag.model.mjs +8 -0
  130. package/esm2022/lib/models/playlist.model.mjs +2 -0
  131. package/esm2022/lib/models/profile-revamp.model.mjs +2 -0
  132. package/esm2022/lib/models/rating.model.mjs +2 -0
  133. package/esm2022/lib/models/user-profile.model.mjs +21 -0
  134. package/esm2022/lib/registration-toc-lib.config.mjs +14 -0
  135. package/esm2022/lib/resolvers/app-toc-cios-resolver.service.mjs +24 -0
  136. package/esm2022/lib/resolvers/app-toc-cios-user-enroll-resolver.service.mjs +24 -0
  137. package/esm2022/lib/resolvers/app-toc-content-read-resolver.service.mjs +60 -0
  138. package/esm2022/lib/resolvers/app-toc-ext-public-resolver.service.mjs +25 -0
  139. package/esm2022/lib/resolvers/app-toc-resolver.service.mjs +106 -0
  140. package/esm2022/lib/resolvers/config-resolver.service.mjs +25 -0
  141. package/esm2022/lib/resolvers/profile-resolver.service.mjs +25 -0
  142. package/esm2022/lib/resolvers/restricted-features-resolver.service.mjs +25 -0
  143. package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +51 -0
  144. package/esm2022/lib/routes/app-toc-home/app-toc-home.directive.mjs +16 -0
  145. package/esm2022/lib/routes/app-toc-home/app-toc-home.service.mjs +18 -0
  146. package/esm2022/lib/services/access-control.service.mjs +56 -0
  147. package/esm2022/lib/services/action.service.mjs +23 -0
  148. package/esm2022/lib/services/app-toc-v2.service.mjs +368 -0
  149. package/esm2022/lib/services/app-toc.service.mjs +1577 -0
  150. package/esm2022/lib/services/certificate.service.mjs +114 -0
  151. package/esm2022/lib/services/discuss-utils.service.mjs +58 -0
  152. package/esm2022/lib/services/editor.service.mjs +34 -0
  153. package/esm2022/lib/services/load-check.service.mjs +21 -0
  154. package/esm2022/lib/services/loader.service.mjs +33 -0
  155. package/esm2022/lib/services/mobile-apps.service.mjs +67 -0
  156. package/esm2022/lib/services/netcore.service.mjs +56 -0
  157. package/esm2022/lib/services/nps-grid.service.mjs +31 -0
  158. package/esm2022/lib/services/otp.service.mjs +43 -0
  159. package/esm2022/lib/services/profile-v2.service.mjs +43 -0
  160. package/esm2022/lib/services/reset-ratings.service.mjs +19 -0
  161. package/esm2022/lib/services/resource-download-helper.service.mjs +64 -0
  162. package/esm2022/lib/services/root.service.mjs +106 -0
  163. package/esm2022/lib/services/timer.service.mjs +23 -0
  164. package/esm2022/lib/services/title-tag.service.mjs +71 -0
  165. package/esm2022/lib/services/user-profile.service.mjs +55 -0
  166. package/esm2022/lib/services/viewer-data.service.mjs +64 -0
  167. package/esm2022/lib/services/viewer-util.service.mjs +627 -0
  168. package/esm2022/lib/share-toc/share-toc/share-toc.component.mjs +291 -0
  169. package/esm2022/lib/share-toc/share-toc.module.mjs +119 -0
  170. package/esm2022/public-api.mjs +80 -0
  171. package/esm2022/sunbird-cb-toc.mjs +5 -0
  172. package/fesm2022/sunbird-cb-toc.mjs +27111 -0
  173. package/fesm2022/sunbird-cb-toc.mjs.map +1 -0
  174. package/index.d.ts +5 -0
  175. package/lib/_collection/_common/ai-tutor/ai-tutor.component.d.ts +139 -0
  176. package/lib/_collection/_common/ai-tutor/socket.service.d.ts +19 -0
  177. package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +16 -0
  178. package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +31 -0
  179. package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +15 -0
  180. package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +20 -0
  181. package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +22 -0
  182. package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +15 -0
  183. package/lib/_collection/_common/card-competency/card-competency.component.d.ts +14 -0
  184. package/lib/_collection/_common/card-competency/card-competency.module.d.ts +8 -0
  185. package/lib/_collection/_common/card-content-v2/card-content-v2.model.d.ts +44 -0
  186. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +30 -0
  187. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +23 -0
  188. package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +9 -0
  189. package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +11 -0
  190. package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +12 -0
  191. package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +18 -0
  192. package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +14 -0
  193. package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +11 -0
  194. package/lib/_collection/_common/connection-name/connection-name.component.d.ts +17 -0
  195. package/lib/_collection/_common/connection-name/connection-name.module.d.ts +14 -0
  196. package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +199 -0
  197. package/lib/_collection/_common/content-progress/content-progress.component.d.ts +16 -0
  198. package/lib/_collection/_common/content-progress/content-progress.module.d.ts +10 -0
  199. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +38 -0
  200. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +19 -0
  201. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +11 -0
  202. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +187 -0
  203. package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +41 -0
  204. package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +54 -0
  205. package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +47 -0
  206. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +56 -0
  207. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +195 -0
  208. package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +8 -0
  209. package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +16 -0
  210. package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +40 -0
  211. package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +21 -0
  212. package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +45 -0
  213. package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +10 -0
  214. package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +10 -0
  215. package/lib/_collection/_common/content-toc/content-toc.component.d.ts +131 -0
  216. package/lib/_collection/_common/content-toc/content-toc.module.d.ts +52 -0
  217. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +29 -0
  218. package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +9 -0
  219. package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +7 -0
  220. package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +7 -0
  221. package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +28 -0
  222. package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +24 -0
  223. package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +14 -0
  224. package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +9 -0
  225. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +12 -0
  226. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +10 -0
  227. package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +22 -0
  228. package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +8 -0
  229. package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +18 -0
  230. package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +8 -0
  231. package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +15 -0
  232. package/lib/_collection/_common/player-brief/player-brief.component.d.ts +35 -0
  233. package/lib/_collection/_common/player-brief/player-brief.module.d.ts +19 -0
  234. package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +14 -0
  235. package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +13 -0
  236. package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +11 -0
  237. package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +11 -0
  238. package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +15 -0
  239. package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +10 -0
  240. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +16 -0
  241. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +11 -0
  242. package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +34 -0
  243. package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +17 -0
  244. package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +15 -0
  245. package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +15 -0
  246. package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +21 -0
  247. package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +12 -0
  248. package/lib/_collection/_common/user-image/user-image.component.d.ts +21 -0
  249. package/lib/_collection/_common/user-image/user-image.module.d.ts +9 -0
  250. package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +47 -0
  251. package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +14 -0
  252. package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +22 -0
  253. package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +19 -0
  254. package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +15 -0
  255. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +25 -0
  256. package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +21 -0
  257. package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +18 -0
  258. package/lib/_collection-api.d.ts +34 -0
  259. package/lib/_constants/widget-content.constants.d.ts +7 -0
  260. package/lib/_directives/tooltip.directive.d.ts +17 -0
  261. package/lib/_models/common.model.d.ts +3 -0
  262. package/lib/_models/error.model.d.ts +5 -0
  263. package/lib/_pipes/highlight.pipe.d.ts +10 -0
  264. package/lib/_services/rating.service.d.ts +18 -0
  265. package/lib/_services/samuhik-charcha.service.d.ts +13 -0
  266. package/lib/_services/viewer-route-util.d.ts +8 -0
  267. package/lib/_services/widget-content.model.d.ts +521 -0
  268. package/lib/_services/widget-content.service.d.ts +101 -0
  269. package/lib/_shared/translate-loader.factory.d.ts +7 -0
  270. package/lib/app-toc-lib.module.d.ts +89 -0
  271. package/lib/collection.config.d.ts +159 -0
  272. package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +17 -0
  273. package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +225 -0
  274. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +82 -0
  275. package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +22 -0
  276. package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +31 -0
  277. package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +47 -0
  278. package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +14 -0
  279. package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +21 -0
  280. package/lib/components/app-toc-home/app-toc-home.component.d.ts +315 -0
  281. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +417 -0
  282. package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +47 -0
  283. package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +22 -0
  284. package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +14 -0
  285. package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +149 -0
  286. package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +42 -0
  287. package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +27 -0
  288. package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +15 -0
  289. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +195 -0
  290. package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +44 -0
  291. package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +54 -0
  292. package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +18 -0
  293. package/lib/components/public-survey-form/public-survey-form.component.d.ts +44 -0
  294. package/lib/components/survey-form-question/survey-form-question.component.d.ts +20 -0
  295. package/lib/components/survey-form-section/survey-form-section.component.d.ts +13 -0
  296. package/lib/models/app-toc-analytics.model.d.ts +152 -0
  297. package/lib/models/app-toc.model.d.ts +84 -0
  298. package/lib/models/auto-complete.model.d.ts +27 -0
  299. package/lib/models/card-content.model.d.ts +19 -0
  300. package/lib/models/content-strip-with-tabs.model.d.ts +44 -0
  301. package/lib/models/discussion-forum.model.d.ts +40 -0
  302. package/lib/models/goal.model.d.ts +22 -0
  303. package/lib/models/meta-tag.model.d.ts +6 -0
  304. package/lib/models/playlist.model.d.ts +23 -0
  305. package/lib/models/profile-revamp.model.d.ts +14 -0
  306. package/lib/models/rating.model.d.ts +17 -0
  307. package/lib/models/user-profile.model.d.ts +37 -0
  308. package/lib/registration-toc-lib.config.d.ts +4 -0
  309. package/lib/resolvers/app-toc-cios-resolver.service.d.ts +12 -0
  310. package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +12 -0
  311. package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +16 -0
  312. package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +12 -0
  313. package/lib/resolvers/app-toc-resolver.service.d.ts +16 -0
  314. package/lib/resolvers/config-resolver.service.d.ts +11 -0
  315. package/lib/resolvers/profile-resolver.service.d.ts +11 -0
  316. package/lib/resolvers/restricted-features-resolver.service.d.ts +11 -0
  317. package/lib/routes/app-toc-home/app-toc-home.component.d.ts +19 -0
  318. package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +8 -0
  319. package/lib/routes/app-toc-home/app-toc-home.service.d.ts +8 -0
  320. package/lib/services/access-control.service.d.ts +29 -0
  321. package/lib/services/action.service.d.ts +9 -0
  322. package/lib/services/app-toc-v2.service.d.ts +17 -0
  323. package/lib/services/app-toc.service.d.ts +190 -0
  324. package/lib/services/certificate.service.d.ts +41 -0
  325. package/lib/services/discuss-utils.service.d.ts +33 -0
  326. package/lib/services/editor.service.d.ts +17 -0
  327. package/lib/services/load-check.service.d.ts +8 -0
  328. package/lib/services/loader.service.d.ts +16 -0
  329. package/lib/services/mobile-apps.service.d.ts +38 -0
  330. package/lib/services/netcore.service.d.ts +33 -0
  331. package/lib/services/nps-grid.service.d.ts +15 -0
  332. package/lib/services/otp.service.d.ts +20 -0
  333. package/lib/services/profile-v2.service.d.ts +20 -0
  334. package/lib/services/reset-ratings.service.d.ts +8 -0
  335. package/lib/services/resource-download-helper.service.d.ts +29 -0
  336. package/lib/services/root.service.d.ts +26 -0
  337. package/lib/services/timer.service.d.ts +9 -0
  338. package/lib/services/title-tag.service.d.ts +21 -0
  339. package/lib/services/user-profile.service.d.ts +24 -0
  340. package/lib/services/viewer-data.service.d.ts +62 -0
  341. package/lib/services/viewer-util.service.d.ts +76 -0
  342. package/lib/share-toc/share-toc/share-toc.component.d.ts +56 -0
  343. package/lib/share-toc/share-toc.module.d.ts +32 -0
  344. package/package.json +34 -0
  345. package/public-api.d.ts +64 -0
  346. package/sunbird-cb-toc-0.0.1-mauritius.tgz +0 -0
@@ -0,0 +1,627 @@
1
+ import { NsContent } from '../_services/widget-content.model';
2
+ import { Inject, Injectable } from '@angular/core';
3
+ import { noop, Subject } from 'rxjs';
4
+ import dayjs from 'dayjs';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common/http";
7
+ import * as i2 from "@sunbird-cb/utils-v2";
8
+ import * as i3 from "../_collection-api";
9
+ import * as i4 from "./app-toc.service";
10
+ import * as i5 from "@sunbird-cb/consumption";
11
+ export class ViewerUtilService {
12
+ constructor(http, configservice, contentSvc, tocSvc, userSvc, contentLangSvc, domainConfSvc, environment) {
13
+ this.http = http;
14
+ this.configservice = configservice;
15
+ this.contentSvc = contentSvc;
16
+ this.tocSvc = tocSvc;
17
+ this.userSvc = userSvc;
18
+ this.contentLangSvc = contentLangSvc;
19
+ this.domainConfSvc = domainConfSvc;
20
+ this.environment = environment;
21
+ this.API_ENDPOINTS = {
22
+ setS3Cookie: `/apis/v8/protected/content/setCookie`,
23
+ // PROGRESS_UPDATE: `/apis/protected/v8/user/realTimeProgress/update`,
24
+ PROGRESS_UPDATE: `/apis/proxies/v8/content-progres`,
25
+ ASSESSMENT_SECTION: `/apis/proxies/v8/assessment/v5/read`,
26
+ GET_FORM_BYID: (formId) => `apis/proxies/v8/forms/v2/getFormById?formId=${formId}`,
27
+ SUBMIT_FORM: `/apis/proxies/v8/forms/v2/saveFormSubmit`,
28
+ // GET_FORM_BYID: (formId: string) => `apis/proxies/v8/forms/getFormById?id=${formId}`,
29
+ // SUBMIT_FORM: `/apis/proxies/v8/forms/v1/saveFormSubmit`,
30
+ PRE_ASSESSMENT_STATE_UPDATE: `/apis/proxies/v8/content/v2/state/update`
31
+ };
32
+ this.downloadRegex = new RegExp(`(/content-store/.*?)(\\\)?\\\\?['"])`, 'gm');
33
+ this.authoringBase = '/apis/authContent/';
34
+ this.markAsCompleteSubject = new Subject();
35
+ this.autoPlayNextVideo = new Subject();
36
+ this.autoPlayNextAudio = new Subject();
37
+ this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
38
+ this.publicUserDetails = {};
39
+ this.regexDownloadReplace = (_str = '', group1, group2) => {
40
+ return `${this.authoringBase}${encodeURIComponent(group1)}${group2}`;
41
+ };
42
+ }
43
+ async fetchManifestFile(url) {
44
+ this.setS3Cookie(url);
45
+ const manifestFile = await this.http
46
+ .get(url)
47
+ .toPromise()
48
+ .catch((_err) => { });
49
+ return manifestFile;
50
+ }
51
+ async setS3Cookie(_contentId) {
52
+ // await this.http
53
+ // .post(this.API_ENDPOINTS.setS3Cookie, { contentId })
54
+ // .toPromise()
55
+ // .catch((_err: any) => { })
56
+ return;
57
+ }
58
+ calculatePercent(current, max, mimeType) {
59
+ try {
60
+ const temp = [...current];
61
+ if (temp && temp.length && max) {
62
+ const latest = parseFloat(temp.pop() || '0');
63
+ const percentMilis = (latest / max) * 100;
64
+ let percent = parseFloat(percentMilis.toFixed(2));
65
+ if (mimeType === NsContent.EMimeTypes.MP4 ||
66
+ mimeType === NsContent.EMimeTypes.M3U8 ||
67
+ mimeType === NsContent.EMimeTypes.MP3 ||
68
+ mimeType === NsContent.EMimeTypes.M4A ||
69
+ mimeType === NsContent.EMimeTypes.YOUTUBE ||
70
+ mimeType === NsContent.EMimeTypes.SURVEY) {
71
+ if (percent <= 5) {
72
+ // if percentage is less than 5% make it 0
73
+ percent = 0;
74
+ }
75
+ else if (percent >= 95) {
76
+ // if percentage is greater than 95% make it 100
77
+ percent = 100;
78
+ }
79
+ }
80
+ return percent;
81
+ }
82
+ return 0;
83
+ }
84
+ catch (e) {
85
+ // tslint:disable-next-line: no-console
86
+ console.log('Error in calculating percentage', e);
87
+ return 0;
88
+ }
89
+ }
90
+ getStatus(current, max, mimeType) {
91
+ try {
92
+ const percentage = this.calculatePercent(current, max, mimeType);
93
+ // for videos and audios
94
+ if (mimeType === NsContent.EMimeTypes.MP4 ||
95
+ mimeType === NsContent.EMimeTypes.M3U8 ||
96
+ mimeType === NsContent.EMimeTypes.MP3 ||
97
+ mimeType === NsContent.EMimeTypes.M4A ||
98
+ mimeType === NsContent.EMimeTypes.SURVEY ||
99
+ mimeType === NsContent.EMimeTypes.PDF) {
100
+ // if percentage is less than 5% then make status started
101
+ if (Math.ceil(percentage) <= 5) {
102
+ return 1;
103
+ }
104
+ // if percentage is greater than 95% then make status complete
105
+ if (Math.ceil(percentage) >= 95) {
106
+ return 2;
107
+ }
108
+ }
109
+ else {
110
+ if (Math.ceil(percentage) >= 100) {
111
+ return 2;
112
+ }
113
+ }
114
+ return 1;
115
+ }
116
+ catch (e) {
117
+ // tslint:disable-next-line: no-console
118
+ console.log('Error in getting completion status', e);
119
+ return 1;
120
+ }
121
+ }
122
+ realTimeProgressUpdate(contentId, request, collectionId, batchId) {
123
+ let req;
124
+ if (this.configservice.userProfile) {
125
+ const language = this.getResourceContentLanguage(contentId);
126
+ req = {
127
+ request: {
128
+ userId: this.configservice.userProfile.userId || '',
129
+ contents: [
130
+ {
131
+ contentId,
132
+ batchId,
133
+ language,
134
+ status: this.getStatus(request.current, request.max_size, request.mime_type),
135
+ courseId: collectionId,
136
+ lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
137
+ progressdetails: {
138
+ max_size: request.max_size,
139
+ current: request.current,
140
+ mimeType: request.mime_type,
141
+ },
142
+ completionPercentage: this.calculatePercent(request.current, request.max_size, request.mime_type),
143
+ },
144
+ ],
145
+ },
146
+ };
147
+ // if (this.configservice.cstoken !== '') {
148
+ // const headers = new HttpHeaders()
149
+ // .set('cstoken', this.configservice.cstoken)
150
+ // this.http
151
+ // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, { headers } , req)
152
+ // .subscribe(noop, noop)
153
+ // } else {
154
+ // this.http
155
+ // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
156
+ // .subscribe(noop, noop)
157
+ // }
158
+ this.http
159
+ .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
160
+ .subscribe(noop, noop);
161
+ if (this.tocSvc.hashmap[contentId]) {
162
+ const currentStatus = this.tocSvc.hashmap[contentId]['completionStatus'];
163
+ if (!currentStatus || currentStatus < 2) {
164
+ this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
165
+ this.tocSvc.hashmap[contentId]['completionStatus'] = Number(req.request.contents[0].status) || 0;
166
+ this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
167
+ // Trigger milestone lock recomputation - it will emit hashmapUpdated with both progress and lock changes
168
+ this.tocSvc.triggerMilestoneLockUpdate();
169
+ // Emit to trigger viewer component refresh for Learning Pathways
170
+ this.markAsCompleteSubject.next(true);
171
+ }
172
+ }
173
+ }
174
+ else {
175
+ req = {};
176
+ // do nothing
177
+ }
178
+ }
179
+ getBatchIdAndCourseId(courseId, batchId, resourceId) {
180
+ const tempData = {
181
+ courseId,
182
+ batchId,
183
+ };
184
+ const tempContentData = this.contentSvc.currentMetaData;
185
+ const tempContentReadData = this.contentSvc.currentContentReadMetaData;
186
+ const enrollmentList = this.contentSvc.currentBatchEnrollmentList;
187
+ if (!this.forPreview) {
188
+ if (tempContentData.courseCategory === 'Learning Pathway') {
189
+ // Find the course that contains the given resource ID
190
+ const foundCourse = this.findCourseContainingResource(tempContentData, resourceId);
191
+ if (foundCourse) {
192
+ // Always update courseId if course is found
193
+ tempData.courseId = foundCourse.identifier;
194
+ // Try to find batch ID from enrollment data for the found course
195
+ if (foundCourse.identifier) {
196
+ const enrollment = enrollmentList.find((course) => course.collectionId === foundCourse.identifier);
197
+ if (enrollment && enrollment.batchId) {
198
+ tempData.batchId = enrollment.batchId;
199
+ }
200
+ }
201
+ }
202
+ }
203
+ else if (tempContentData && tempContentReadData.cumulativeTracking &&
204
+ (tempContentData.primaryCategory === NsContent.EPrimaryCategory.PROGRAM ||
205
+ tempContentData.primaryCategory === NsContent.EPrimaryCategory.CURATED_PROGRAM
206
+ || tempContentData.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM)) {
207
+ tempContentData.children.forEach(async (childList) => {
208
+ if (childList.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
209
+ // tslint:disable-next-line: max-line-length
210
+ const courseEnrollmentList = enrollmentList && enrollmentList.filter((v) => v.contentId === childList.identifier);
211
+ if (childList.childNodes && childList.childNodes.indexOf(resourceId) !== -1) {
212
+ if (courseEnrollmentList && courseEnrollmentList.length > 0) {
213
+ tempData.batchId = courseEnrollmentList[courseEnrollmentList.length - 1].batch.batchId;
214
+ tempData.courseId = childList.identifier;
215
+ }
216
+ else {
217
+ const data = await this.checkForCourseEnrollment(childList, resourceId, enrollmentList, tempData);
218
+ tempData.courseId = data.courseId;
219
+ tempData.batchId = data.batchId;
220
+ }
221
+ }
222
+ }
223
+ else if (tempContentData.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM) {
224
+ if (tempData.courseId === courseId) {
225
+ const bPEnrollmentList = enrollmentList.filter((v) => v.contentId === tempContentData.identifier);
226
+ if (tempContentData.childNodes && tempContentData.childNodes.indexOf(resourceId) !== -1) {
227
+ if (bPEnrollmentList.length > 0) {
228
+ tempData.batchId = bPEnrollmentList[bPEnrollmentList.length - 1].batch.batchId;
229
+ tempData.courseId = tempContentData.identifier;
230
+ }
231
+ }
232
+ }
233
+ }
234
+ });
235
+ }
236
+ }
237
+ return tempData;
238
+ }
239
+ /**
240
+ * Recursively searches for a resource ID in a content's children hierarchy
241
+ * @param content The content object to search in
242
+ * @param resourceId The resource ID to find
243
+ * @returns true if resource is found, false otherwise
244
+ */
245
+ findResourceInContent(content, resourceId) {
246
+ // Check if this content has the resource in its leafNodes
247
+ if (content.leafNodes && Array.isArray(content.leafNodes)) {
248
+ if (content.leafNodes.indexOf(resourceId) !== -1) {
249
+ return true;
250
+ }
251
+ }
252
+ // Check if this content's identifier matches the resource ID
253
+ if (content.identifier === resourceId) {
254
+ return true;
255
+ }
256
+ // Recursively search in children
257
+ if (content.children && Array.isArray(content.children)) {
258
+ for (const child of content.children) {
259
+ if (this.findResourceInContent(child, resourceId)) {
260
+ return true;
261
+ }
262
+ }
263
+ }
264
+ return false;
265
+ }
266
+ /**
267
+ * Finds the course that contains a given resource ID in a Learning Pathway
268
+ * @param learningPathwayContent The Learning Pathway content data
269
+ * @param resourceId The resource ID to find
270
+ * @returns The course object containing the resource, or null if not found
271
+ */
272
+ findCourseContainingResource(learningPathwayContent, resourceId) {
273
+ // Check if milestones_v1 exists
274
+ if (!learningPathwayContent.milestones_v1 || !Array.isArray(learningPathwayContent.milestones_v1)) {
275
+ return null;
276
+ }
277
+ // Loop through each milestone
278
+ for (const milestone of learningPathwayContent.milestones_v1) {
279
+ // Check if milestone has courses
280
+ if (milestone.courses && Array.isArray(milestone.courses)) {
281
+ // Loop through each course in the milestone
282
+ for (const course of milestone.courses) {
283
+ // Check if this course contains the resource
284
+ if (this.findResourceInContent(course, resourceId)) {
285
+ return course;
286
+ }
287
+ }
288
+ }
289
+ }
290
+ return null;
291
+ }
292
+ getResourceContentLanguage(resourceId) {
293
+ let tempLanguage = 'english';
294
+ let languageFound = false;
295
+ const tempContentData = this.contentSvc.currentMetaData;
296
+ if (!this.forPreview) {
297
+ tempContentData.children?.forEach(async (childList) => {
298
+ if (childList.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
299
+ // tslint:disable-next-line: max-line-length
300
+ if (childList.leafNodes && childList.leafNodes.indexOf(resourceId) !== -1) {
301
+ tempLanguage = this.contentLangSvc.getContentLanguage(childList);
302
+ languageFound = true;
303
+ }
304
+ }
305
+ else if (childList?.primaryCategory === 'Milestone') {
306
+ childList.children?.forEach(async (child) => {
307
+ if (child.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
308
+ // tslint:disable-next-line: max-line-length
309
+ if (child.leafNodes && child.leafNodes.indexOf(resourceId) !== -1) {
310
+ tempLanguage = this.contentLangSvc.getContentLanguage(child);
311
+ languageFound = true;
312
+ }
313
+ }
314
+ });
315
+ }
316
+ });
317
+ if (!languageFound) {
318
+ if (tempContentData.leafNodes && tempContentData.leafNodes.indexOf(resourceId) !== -1) {
319
+ tempLanguage = this.contentLangSvc.getContentLanguage(tempContentData);
320
+ }
321
+ }
322
+ }
323
+ return tempLanguage;
324
+ }
325
+ async checkForCourseEnrollment(childList, _resourceId, _enrollmentList, _tempData) {
326
+ // tslint:disable-next-line: max-line-length
327
+ const courseData = await this.contentSvc.autoAssignBatchApi(childList.identifier).toPromise().then(async (data) => {
328
+ if (data) {
329
+ // tslint:disable-next-line: max-line-length
330
+ const responseData = await this.userSvc.fetchEnrollmentDataByContentId(this.configservice.userProfile?.userId, childList.identifier).toPromise().then(async (res) => {
331
+ if (res && res.courses && res.courses.length) {
332
+ return res.courses;
333
+ }
334
+ return [{ courseId: childList.identifier, batchId: '' }];
335
+ }).catch((_err) => {
336
+ return [{ courseId: childList.identifier, batchId: '' }];
337
+ });
338
+ this.contentSvc.currentBatchEnrollmentList = [...this.contentSvc.currentBatchEnrollmentList, ...responseData];
339
+ return { courseId: childList.identifier, batchId: responseData[0].batchId };
340
+ }
341
+ }).catch((_err) => {
342
+ return [{ courseId: childList.identifier, batchId: '' }];
343
+ });
344
+ return courseData;
345
+ }
346
+ realTimeProgressUpdateQuiz(contentId, collectionId, batchId, status) {
347
+ let req;
348
+ if (this.configservice.userProfile) {
349
+ const language = this.getResourceContentLanguage(contentId);
350
+ req = {
351
+ request: {
352
+ userId: this.configservice.userProfile.userId || '',
353
+ contents: [
354
+ {
355
+ contentId,
356
+ batchId,
357
+ language,
358
+ status: status || 2,
359
+ courseId: collectionId,
360
+ lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
361
+ completionPercentage: status === 2 ? 100 : 0,
362
+ },
363
+ ],
364
+ },
365
+ };
366
+ this.http
367
+ .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
368
+ .subscribe(noop, noop);
369
+ if (this.tocSvc.hashmap && this.tocSvc.hashmap[contentId] && req.request.contents[0]) {
370
+ const currentStatus = this.tocSvc.hashmap[contentId]['completionStatus'];
371
+ if (!currentStatus || currentStatus < 2) {
372
+ this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
373
+ this.tocSvc.hashmap[contentId]['completionStatus'] = Number(req.request.contents[0].status) || 0;
374
+ this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
375
+ // Trigger milestone lock recomputation - it will emit hashmapUpdated with both progress and lock changes
376
+ if (this.tocSvc.triggerMilestoneLockUpdate) {
377
+ this.tocSvc.triggerMilestoneLockUpdate();
378
+ }
379
+ // Emit to trigger viewer component refresh for Learning Pathways
380
+ this.markAsCompleteSubject.next(true);
381
+ }
382
+ }
383
+ }
384
+ else {
385
+ req = {};
386
+ // do nothing
387
+ }
388
+ }
389
+ getContent(contentId) {
390
+ const forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
391
+ let url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
392
+ if (!forPreview) {
393
+ url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
394
+ }
395
+ else {
396
+ if (window.location.href.includes('editMode=true') && window.location.href.includes('_rc')) {
397
+ url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
398
+ }
399
+ else {
400
+ url = `/api/content/v1/read/${contentId}`;
401
+ }
402
+ }
403
+ return this.http.get(
404
+ // tslint:disable-next-line:max-line-length
405
+ // `/apis/authApi/action/content/hierarchy/${contentId}?rootOrg=${this.configservice.rootOrg || 'igot'}&org=${this.configservice.activeOrg || 'dopt'}`,
406
+ url);
407
+ }
408
+ getAuthoringUrl(url) {
409
+ return url
410
+ // tslint:disable-next-line:max-line-length
411
+ ? `/apis/authContent/${url.includes('/content-store/') ? new URL(url).pathname.slice(1) : encodeURIComponent(url)}`
412
+ : '';
413
+ }
414
+ replaceToAuthUrl(data) {
415
+ return JSON.parse(JSON.stringify(data).replace(this.downloadRegex, this.regexDownloadReplace));
416
+ }
417
+ readSections(assessmentId) {
418
+ return `${this.API_ENDPOINTS}/${assessmentId}`;
419
+ }
420
+ getPublicUrl(url) {
421
+ const mainUrl = url.split('/content').pop() || '';
422
+ return `${this.environment.contentHost}/${this.environment.contentBucket}/content${mainUrl}`;
423
+ }
424
+ getCdnUrl(url) {
425
+ const mainUrl = url.split('/content').pop() || '';
426
+ return `${this.domainConfSvc.getDomainCDNHost()}/${this.environment.cdnContentBucket}/content${mainUrl}`;
427
+ }
428
+ // fetchContent(
429
+ // contentId: string,
430
+ // hierarchyType: 'all' | 'minimal' | 'detail' = 'detail'
431
+ // ): Observable<NsContent.IContent> {
432
+ // let url = ''
433
+ // const forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true')
434
+ // if (!forPreview) {
435
+ // url = `/apis/proxies/v8/action/content/v3/hierarchy/${contentId}?hierarchyType=${hierarchyType}`
436
+ // } else {
437
+ // url = `/api/course/v1/hierarchy/${contentId}?hierarchyType=${hierarchyType}`
438
+ // }
439
+ // return this.http.get<NsContent.IContent>(url)
440
+ // }
441
+ fetchContent(id, type) {
442
+ return this.http.get(`/apis/proxies/v8/action/content/v3/hierarchy/${id}?mode=${type}`);
443
+ }
444
+ updateContentHashMapForAssesstent(contentId, contentProgress) {
445
+ if (this.tocSvc.hashmap[contentId]) {
446
+ const currentStatus = this.tocSvc.hashmap[contentId]['completionStatus'] || 0;
447
+ const newStatus = Number(contentProgress.status) || 0;
448
+ // Update if not complete or if new status is higher
449
+ if (currentStatus < 2 || newStatus >= currentStatus) {
450
+ this.tocSvc.hashmap[contentId]['completionPercentage'] = contentProgress.completionPercentage;
451
+ this.tocSvc.hashmap[contentId]['completionStatus'] = newStatus;
452
+ this.tocSvc.hashmap[contentId]['status'] = newStatus;
453
+ // Create new hashmap reference for Angular change detection
454
+ this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
455
+ // Trigger milestone lock recomputation - it will emit hashmapUpdated with both progress and lock changes
456
+ if (this.tocSvc.triggerMilestoneLockUpdate) {
457
+ this.tocSvc.triggerMilestoneLockUpdate();
458
+ }
459
+ // Emit to trigger viewer component refresh for Learning Pathways
460
+ this.markAsCompleteSubject.next(true);
461
+ }
462
+ }
463
+ }
464
+ getFormById(formId) {
465
+ return this.http.get(this.API_ENDPOINTS.GET_FORM_BYID(formId));
466
+ }
467
+ submitForm(formData) {
468
+ return this.http.post(this.API_ENDPOINTS.SUBMIT_FORM, formData);
469
+ }
470
+ realTimeProgressUpdateForPreAssessment(contentId, request) {
471
+ let req;
472
+ if (this.configservice.userProfile) {
473
+ req = {
474
+ request: {
475
+ userId: this.configservice.userProfile.userId || '',
476
+ contents: [
477
+ {
478
+ contentId,
479
+ // batchId,
480
+ status: this.getStatus(request.current, request.max_size, request.mime_type),
481
+ // courseId: collectionId,
482
+ lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
483
+ progressdetails: {
484
+ max_size: request.max_size,
485
+ current: request.current,
486
+ mimeType: request.mime_type,
487
+ },
488
+ completionPercentage: this.calculatePercent(request.current, request.max_size, request.mime_type),
489
+ },
490
+ ],
491
+ },
492
+ };
493
+ // if (this.configservice.cstoken !== '') {
494
+ // const headers = new HttpHeaders()
495
+ // .set('cstoken', this.configservice.cstoken)
496
+ // this.http
497
+ // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, { headers } , req)
498
+ // .subscribe(noop, noop)
499
+ // } else {
500
+ // this.http
501
+ // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
502
+ // .subscribe(noop, noop)
503
+ // }
504
+ // this.http
505
+ // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
506
+ // .subscribe(noop, noop)
507
+ //const contentIdNew= req.request.contents[0].contentId
508
+ // const updatedCompletionPercentage = req.request.contents[0].completionPercentage
509
+ // const updatedStatus = req.request.contents[0].status
510
+ // // Clone the inner object and update
511
+ // const existingContent = this.tocSvc.hashmap[contentIdNew] || {}
512
+ // this.tocSvc.hashmap = {
513
+ // ...this.tocSvc.hashmap,
514
+ // [contentIdNew]: {
515
+ // ...existingContent,
516
+ // completionPercentage: updatedCompletionPercentage,
517
+ // completionStatus: updatedStatus
518
+ // }
519
+ // }
520
+ // console.log('req', JSON.stringify(req))
521
+ // console.log('req', req)
522
+ const resourceStatus = this.getPreAssessmentResourceStatus(contentId);
523
+ if (resourceStatus < 2) {
524
+ this.http
525
+ .patch(`${this.API_ENDPOINTS.PRE_ASSESSMENT_STATE_UPDATE}`, req)
526
+ .subscribe(noop, noop);
527
+ }
528
+ if (this.tocSvc.hashmap[contentId] &&
529
+ (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
530
+ this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
531
+ this.tocSvc.hashmap[contentId]['completionStatus'] = Number(req.request.contents[0].status) || 0;
532
+ this.tocSvc.hashmap[contentId]['parent'] = req.request.contents[0].courseId;
533
+ this.tocSvc.hashmap[contentId]['progress'] = req.request.contents[0].progressdetails;
534
+ this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
535
+ // Trigger milestone lock recomputation - it will emit hashmapUpdated with both progress and lock changes
536
+ if (this.tocSvc.triggerMilestoneLockUpdate) {
537
+ this.tocSvc.triggerMilestoneLockUpdate();
538
+ }
539
+ // Emit to trigger viewer component refresh for Learning Pathways
540
+ this.markAsCompleteSubject.next(true);
541
+ }
542
+ }
543
+ else {
544
+ req = {};
545
+ // do nothing
546
+ }
547
+ }
548
+ realTimeProgressUpdateForPreAssessmentQuiz(contentId, status, mimeType) {
549
+ let req;
550
+ if (this.configservice.userProfile) {
551
+ req = {
552
+ request: {
553
+ //userId: this.configservice.userProfile.userId || '',
554
+ contents: [
555
+ {
556
+ contentId,
557
+ // batchId,
558
+ status: status || 2,
559
+ // courseId: collectionId,
560
+ lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
561
+ completionPercentage: status === 2 ? 100.0 : 0,
562
+ progressdetails: {
563
+ "mimeType": mimeType || "application/vnd.sunbird.questionset"
564
+ },
565
+ },
566
+ ],
567
+ },
568
+ };
569
+ const resourceStatus = this.getPreAssessmentResourceStatus(contentId);
570
+ if (resourceStatus < 2) {
571
+ this.http
572
+ .patch(`${this.API_ENDPOINTS.PRE_ASSESSMENT_STATE_UPDATE}`, req)
573
+ .subscribe(noop, noop);
574
+ }
575
+ // Update hashmap - create entry if it doesn't exist
576
+ if (this.tocSvc.hashmap) {
577
+ if (!this.tocSvc.hashmap[contentId]) {
578
+ // Create new entry for pre-assessment if it doesn't exist
579
+ this.tocSvc.hashmap[contentId] = {
580
+ identifier: contentId,
581
+ completionPercentage: req.request.contents[0].completionPercentage,
582
+ completionStatus: Number(req.request.contents[0].status) || 0,
583
+ status: Number(req.request.contents[0].status) || 0,
584
+ isPreAssessment: true
585
+ };
586
+ }
587
+ else {
588
+ // Update existing entry
589
+ this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
590
+ this.tocSvc.hashmap[contentId]['completionStatus'] = Number(req.request.contents[0].status) || 0;
591
+ this.tocSvc.hashmap[contentId]['status'] = Number(req.request.contents[0].status) || 0;
592
+ }
593
+ this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
594
+ // ALWAYS trigger milestone lock recomputation when pre-assessment completes
595
+ // This ensures milestone 1 unlocks immediately after pre-assessment completion
596
+ if (this.tocSvc.triggerMilestoneLockUpdate) {
597
+ this.tocSvc.triggerMilestoneLockUpdate();
598
+ }
599
+ // Emit markAsCompleteSubject to trigger viewer component to refresh enrollment and progress
600
+ // This is critical for Learning Pathways to unlock milestones immediately
601
+ this.markAsCompleteSubject.next(true);
602
+ }
603
+ }
604
+ else {
605
+ req = {};
606
+ // do nothing
607
+ }
608
+ }
609
+ getPreAssessmentResourceStatus(resourceId) {
610
+ if (this.tocSvc && this.tocSvc.hashmap && this.tocSvc.hashmap[resourceId]) {
611
+ return this.tocSvc.hashmap[resourceId]['completionStatus'] || 1;
612
+ }
613
+ return 1;
614
+ }
615
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, deps: [{ token: i1.HttpClient }, { token: i2.ConfigurationsService }, { token: i3.WidgetContentService }, { token: i4.AppTocService }, { token: i5.WidgetUserServiceLib }, { token: i5.ContentLanguageService }, { token: i2.DomainConfService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Injectable }); }
616
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, providedIn: 'root' }); }
617
+ }
618
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, decorators: [{
619
+ type: Injectable,
620
+ args: [{
621
+ providedIn: 'root',
622
+ }]
623
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ConfigurationsService }, { type: i3.WidgetContentService }, { type: i4.AppTocService }, { type: i5.WidgetUserServiceLib }, { type: i5.ContentLanguageService }, { type: i2.DomainConfService }, { type: undefined, decorators: [{
624
+ type: Inject,
625
+ args: ['environment']
626
+ }] }]; } });
627
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLXV0aWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9zZXJ2aWNlcy92aWV3ZXItdXRpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVsRCxPQUFPLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNoRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7Ozs7Ozs7QUFRekIsTUFBTSxPQUFPLGlCQUFpQjtJQW9CNUIsWUFDVSxJQUFnQixFQUNoQixhQUFvQyxFQUNwQyxVQUFnQyxFQUNoQyxNQUFxQixFQUNyQixPQUE2QixFQUM3QixjQUFzQyxFQUN0QyxhQUFnQyxFQUNULFdBQWdCO1FBUHZDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsa0JBQWEsR0FBYixhQUFhLENBQXVCO1FBQ3BDLGVBQVUsR0FBVixVQUFVLENBQXNCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFDN0IsbUJBQWMsR0FBZCxjQUFjLENBQXdCO1FBQ3RDLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUNULGdCQUFXLEdBQVgsV0FBVyxDQUFLO1FBM0JqRCxrQkFBYSxHQUFHO1lBQ2QsV0FBVyxFQUFFLHNDQUFzQztZQUNuRCxzRUFBc0U7WUFDdEUsZUFBZSxFQUFFLGtDQUFrQztZQUNuRCxrQkFBa0IsRUFBRSxxQ0FBcUM7WUFDekQsYUFBYSxFQUFFLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQywrQ0FBK0MsTUFBTSxFQUFFO1lBQzFGLFdBQVcsRUFBRSwwQ0FBMEM7WUFDdkQsdUZBQXVGO1lBQ3ZG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QUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO2FBQ3RDO1NBQ0Y7YUFBTTtZQUNMLEdBQUcsR0FBRyxFQUFFLENBQUE7WUFDUixhQUFhO1NBQ2Q7SUFDSCxDQUFDO0lBRUQsOEJBQThCLENBQUMsVUFBa0I7UUFDL0MsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3pFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUE7U0FDaEU7UUFDRCxPQUFPLENBQUMsQ0FBQTtJQUNWLENBQUM7K0dBeHBCVSxpQkFBaUIsNlBBNEJsQixhQUFhO21IQTVCWixpQkFBaUIsY0FGaEIsTUFBTTs7NEZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBNkJJLE1BQU07MkJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmZpZ3VyYXRpb25zU2VydmljZSwgRG9tYWluQ29uZlNlcnZpY2UgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12MidcbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5tb2RlbCdcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXG5pbXBvcnQgeyBub29wLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcydcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuL2FwcC10b2Muc2VydmljZSdcbmltcG9ydCB7IENvbnRlbnRMYW5ndWFnZVNlcnZpY2UsIFdpZGdldFVzZXJTZXJ2aWNlTGliIH0gZnJvbSAnQHN1bmJpcmQtY2IvY29uc3VtcHRpb24nXG5pbXBvcnQgeyBXaWRnZXRDb250ZW50U2VydmljZSB9IGZyb20gJy4uL19jb2xsZWN0aW9uLWFwaSdcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFZpZXdlclV0aWxTZXJ2aWNlIHtcbiAgQVBJX0VORFBPSU5UUyA9IHtcbiAgICBzZXRTM0Nvb2tpZTogYC9hcGlzL3Y4L3Byb3RlY3RlZC9jb250ZW50L3NldENvb2tpZWAsXG4gICAgLy8gUFJPR1JFU1NfVVBEQVRFOiBgL2FwaXMvcHJvdGVjdGVkL3Y4L3VzZXIvcmVhbFRpbWVQcm9ncmVzcy91cGRhdGVgLFxuICAgIFBST0dSRVNTX1VQREFURTogYC9hcGlzL3Byb3hpZXMvdjgvY29udGVudC1wcm9ncmVzYCxcbiAgICBBU1NFU1NNRU5UX1NFQ1RJT046IGAvYXBpcy9wcm94aWVzL3Y4L2Fzc2Vzc21lbnQvdjUvcmVhZGAsXG4gICAgR0VUX0ZPUk1fQllJRDogKGZvcm1JZDogc3RyaW5nKSA9PiBgYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YyL2dldEZvcm1CeUlkP2Zvcm1JZD0ke2Zvcm1JZH1gLFxuICAgIFNVQk1JVF9GT1JNOiBgL2FwaXMvcHJveGllcy92OC9mb3Jtcy92Mi9zYXZlRm9ybVN1Ym1pdGAsXG4gICAgLy8gR0VUX0ZPUk1fQllJRDogKGZvcm1JZDogc3RyaW5nKSA9PiBgYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL2dldEZvcm1CeUlkP2lkPSR7Zm9ybUlkfWAsXG4gICAgLy8gU1VCTUlUX0ZPUk06IGAvYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YxL3NhdmVGb3JtU3VibWl0YCxcbiAgICBQUkVfQVNTRVNTTUVOVF9TVEFURV9VUERBVEU6IGAvYXBpcy9wcm94aWVzL3Y4L2NvbnRlbnQvdjIvc3RhdGUvdXBkYXRlYFxuXG4gIH1cbiAgZG93bmxvYWRSZWdleCA9IG5ldyBSZWdFeHAoYCgvY29udGVudC1zdG9yZS8uKj8pKFxcXFxcXCk/XFxcXFxcXFw/WydcIl0pYCwgJ2dtJylcbiAgYXV0aG9yaW5nQmFzZSA9ICcvYXBpcy9hdXRoQ29udGVudC8nXG4gIG1hcmtBc0NvbXBsZXRlU3ViamVjdCA9IG5ldyBTdWJqZWN0KClcbiAgYXV0b1BsYXlOZXh0VmlkZW8gPSBuZXcgU3ViamVjdCgpXG4gIGF1dG9QbGF5TmV4dEF1ZGlvID0gbmV3IFN1YmplY3QoKVxuICBmb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9wdWJsaWMvJykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJyZwcmV2aWV3PXRydWUnKVxuICBwdWJsaWNVc2VyRGV0YWlsczogYW55ID0ge31cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgY29uZmlnc2VydmljZTogQ29uZmlndXJhdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29udGVudFN2YzogV2lkZ2V0Q29udGVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyU3ZjOiBXaWRnZXRVc2VyU2VydmljZUxpYixcbiAgICBwcml2YXRlIGNvbnRlbnRMYW5nU3ZjOiBDb250ZW50TGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgZG9tYWluQ29uZlN2YzogRG9tYWluQ29uZlNlcnZpY2UsXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBwcml2YXRlIGVudmlyb25tZW50OiBhbnlcbiAgKSB7IH1cblxuICBhc3luYyBmZXRjaE1hbmlmZXN0RmlsZSh1cmw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UzNDb29raWUodXJsKVxuICAgIGNvbnN0IG1hbmlmZXN0RmlsZSA9IGF3YWl0IHRoaXMuaHR0cFxuICAgICAgLmdldDxhbnk+KHVybClcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLmNhdGNoKChfZXJyOiBhbnkpID0+IHsgfSlcbiAgICByZXR1cm4gbWFuaWZlc3RGaWxlXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldFMzQ29va2llKF9jb250ZW50SWQ6IHN0cmluZykge1xuICAgIC8vIGF3YWl0IHRoaXMuaHR0cFxuICAgIC8vICAgLnBvc3QodGhpcy5BUElfRU5EUE9JTlRTLnNldFMzQ29va2llLCB7IGNvbnRlbnRJZCB9KVxuICAgIC8vICAgLnRvUHJvbWlzZSgpXG4gICAgLy8gICAuY2F0Y2goKF9lcnI6IGFueSkgPT4geyB9KVxuICAgIHJldHVyblxuICB9XG5cbiAgY2FsY3VsYXRlUGVyY2VudChjdXJyZW50OiBzdHJpbmdbXSwgbWF4OiBudW1iZXIsIG1pbWVUeXBlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGVtcCA9IFsuLi5jdXJyZW50XVxuICAgICAgaWYgKHRlbXAgJiYgdGVtcC5sZW5ndGggJiYgbWF4KSB7XG4gICAgICAgIGNvbnN0IGxhdGVzdCA9IHBhcnNlRmxvYXQodGVtcC5wb3AoKSB8fCAnMCcpXG4gICAgICAgIGNvbnN0IHBlcmNlbnRNaWxpcyA9IChsYXRlc3QgLyBtYXgpICogMTAwXG4gICAgICAgIGxldCBwZXJjZW50ID0gcGFyc2VGbG9hdChwZXJjZW50TWlsaXMudG9GaXhlZCgyKSlcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NUDQgfHxcbiAgICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTTNVOCB8fFxuICAgICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NUDMgfHxcbiAgICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTTRBIHx8XG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLllPVVRVQkUgfHxcbiAgICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuU1VSVkVZXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChwZXJjZW50IDw9IDUpIHtcbiAgICAgICAgICAgIC8vIGlmIHBlcmNlbnRhZ2UgaXMgbGVzcyB0aGFuIDUlIG1ha2UgaXQgMFxuICAgICAgICAgICAgcGVyY2VudCA9IDBcbiAgICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPj0gOTUpIHtcbiAgICAgICAgICAgIC8vIGlmIHBlcmNlbnRhZ2UgaXMgZ3JlYXRlciB0aGFuIDk1JSBtYWtlIGl0IDEwMFxuICAgICAgICAgICAgcGVyY2VudCA9IDEwMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGVyY2VudFxuICAgICAgfVxuICAgICAgcmV0dXJuIDBcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiBjYWxjdWxhdGluZyBwZXJjZW50YWdlJywgZSlcbiAgICAgIHJldHVybiAwXG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdHVzKGN1cnJlbnQ6IHN0cmluZ1tdLCBtYXg6IG51bWJlciwgbWltZVR5cGU/OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRoaXMuY2FsY3VsYXRlUGVyY2VudChjdXJyZW50LCBtYXgsIG1pbWVUeXBlKVxuICAgICAgLy8gZm9yIHZpZGVvcyBhbmQgYXVkaW9zXG4gICAgICBpZiAoXG4gICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NUDQgfHxcbiAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk0zVTggfHxcbiAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk1QMyB8fFxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTTRBIHx8XG4gICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5TVVJWRVkgfHxcbiAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLlBERlxuICAgICAgKSB7XG4gICAgICAgIC8vIGlmIHBlcmNlbnRhZ2UgaXMgbGVzcyB0aGFuIDUlIHRoZW4gbWFrZSBzdGF0dXMgc3RhcnRlZFxuICAgICAgICBpZiAoTWF0aC5jZWlsKHBlcmNlbnRhZ2UpIDw9IDUpIHtcbiAgICAgICAgICByZXR1cm4gMVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHBlcmNlbnRhZ2UgaXMgZ3JlYXRlciB0aGFuIDk1JSB0aGVuIG1ha2Ugc3RhdHVzIGNvbXBsZXRlXG4gICAgICAgIGlmIChNYXRoLmNlaWwocGVyY2VudGFnZSkgPj0gOTUpIHtcbiAgICAgICAgICByZXR1cm4gMlxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoTWF0aC5jZWlsKHBlcmNlbnRhZ2UpID49IDEwMCkge1xuICAgICAgICAgIHJldHVybiAyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAxXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gZ2V0dGluZyBjb21wbGV0aW9uIHN0YXR1cycsIGUpXG4gICAgICByZXR1cm4gMVxuICAgIH1cbiAgfVxuXG4gIHJlYWxUaW1lUHJvZ3Jlc3NVcGRhdGUoY29udGVudElkOiBzdHJpbmcsIHJlcXVlc3Q6IGFueSwgY29sbGVjdGlvbklkPzogc3RyaW5nLCBiYXRjaElkPzogc3RyaW5nKSB7XG4gICAgbGV0IHJlcTogYW55XG4gICAgaWYgKHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZSkge1xuICAgICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmdldFJlc291cmNlQ29udGVudExhbmd1YWdlKGNvbnRlbnRJZClcbiAgICAgIHJlcSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHVzZXJJZDogdGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJyxcbiAgICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb250ZW50SWQsXG4gICAgICAgICAgICAgIGJhdGNoSWQsXG4gICAgICAgICAgICAgIGxhbmd1YWdlLFxuICAgICAgICAgICAgICBzdGF0dXM6IHRoaXMuZ2V0U3RhdHVzKHJlcXVlc3QuY3VycmVudCwgcmVxdWVzdC5tYXhfc2l6ZSwgcmVxdWVzdC5taW1lX3R5cGUpLFxuICAgICAgICAgICAgICBjb3Vyc2VJZDogY29sbGVjdGlvbklkLFxuICAgICAgICAgICAgICBsYXN0QWNjZXNzVGltZTogZGF5anMobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzOlNTU1paJyksXG4gICAgICAgICAgICAgIHByb2dyZXNzZGV0YWlsczoge1xuICAgICAgICAgICAgICAgIG1heF9zaXplOiByZXF1ZXN0Lm1heF9zaXplLFxuICAgICAgICAgICAgICAgIGN1cnJlbnQ6IHJlcXVlc3QuY3VycmVudCxcbiAgICAgICAgICAgICAgICBtaW1lVHlwZTogcmVxdWVzdC5taW1lX3R5cGUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiB0aGlzLmNhbGN1bGF0ZVBlcmNlbnQocmVxdWVzdC5jdXJyZW50LCByZXF1ZXN0Lm1heF9zaXplLCByZXF1ZXN0Lm1pbWVfdHlwZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgICAvLyBpZiAodGhpcy5jb25maWdzZXJ2aWNlLmNzdG9rZW4gIT09ICcnKSB7XG4gICAgICAvLyAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKVxuICAgICAgLy8gICAuc2V0KCdjc3Rva2VuJywgdGhpcy5jb25maWdzZXJ2aWNlLmNzdG9rZW4pXG5cbiAgICAgIC8vICAgdGhpcy5odHRwXG4gICAgICAvLyAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCB7IGhlYWRlcnMgfSAsIHJlcSlcbiAgICAgIC8vICAgLnN1YnNjcmliZShub29wLCBub29wKVxuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgdGhpcy5odHRwXG4gICAgICAvLyAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCByZXEpXG4gICAgICAvLyAgIC5zdWJzY3JpYmUobm9vcCwgbm9vcClcbiAgICAgIC8vIH1cbiAgICAgIHRoaXMuaHR0cFxuICAgICAgICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBST0dSRVNTX1VQREFURX0vJHtjb250ZW50SWR9YCwgcmVxKVxuICAgICAgICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXG4gICAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0dXMgPSB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXVxuICAgICAgICBcbiAgICAgICAgaWYgKCFjdXJyZW50U3RhdHVzIHx8IGN1cnJlbnRTdGF0dXMgPCAyKSB7XG4gICAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSA9IE51bWJlcihyZXEucmVxdWVzdC5jb250ZW50c1swXS5zdGF0dXMpIHx8IDBcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBUcmlnZ2VyIG1pbGVzdG9uZSBsb2NrIHJlY29tcHV0YXRpb24gLSBpdCB3aWxsIGVtaXQgaGFzaG1hcFVwZGF0ZWQgd2l0aCBib3RoIHByb2dyZXNzIGFuZCBsb2NrIGNoYW5nZXNcbiAgICAgICAgICB0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSgpXG4gICAgICAgICAgLy8gRW1pdCB0byB0cmlnZ2VyIHZpZXdlciBjb21wb25lbnQgcmVmcmVzaCBmb3IgTGVhcm5pbmcgUGF0aHdheXNcbiAgICAgICAgICB0aGlzLm1hcmtBc0NvbXBsZXRlU3ViamVjdC5uZXh0KHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVxID0ge31cbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cblxuICBnZXRCYXRjaElkQW5kQ291cnNlSWQoY291cnNlSWQ6IHN0cmluZywgYmF0Y2hJZDogc3RyaW5nLCByZXNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0ZW1wRGF0YSA9IHtcbiAgICAgIGNvdXJzZUlkLFxuICAgICAgYmF0Y2hJZCxcbiAgICB9XG4gICAgXG4gICAgY29uc3QgdGVtcENvbnRlbnREYXRhID0gdGhpcy5jb250ZW50U3ZjLmN1cnJlbnRNZXRhRGF0YVxuICAgIGNvbnN0IHRlbXBDb250ZW50UmVhZERhdGEgPSB0aGlzLmNvbnRlbnRTdmMuY3VycmVudENvbnRlbnRSZWFkTWV0YURhdGFcbiAgICBjb25zdCBlbnJvbGxtZW50TGlzdCA9IHRoaXMuY29udGVudFN2Yy5jdXJyZW50QmF0Y2hFbnJvbGxtZW50TGlzdFxuICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICBpZiAodGVtcENvbnRlbnREYXRhLmNvdXJzZUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUGF0aHdheScpIHtcbiAgICAgICAgLy8gRmluZCB0aGUgY291cnNlIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIHJlc291cmNlIElEXG4gICAgICAgIGNvbnN0IGZvdW5kQ291cnNlID0gdGhpcy5maW5kQ291cnNlQ29udGFpbmluZ1Jlc291cmNlKHRlbXBDb250ZW50RGF0YSwgcmVzb3VyY2VJZClcblxuICAgICAgICBpZiAoZm91bmRDb3Vyc2UpIHtcbiAgICAgICAgICAvLyBBbHdheXMgdXBkYXRlIGNvdXJzZUlkIGlmIGNvdXJzZSBpcyBmb3VuZFxuICAgICAgICAgIHRlbXBEYXRhLmNvdXJzZUlkID0gZm91bmRDb3Vyc2UuaWRlbnRpZmllclxuXG4gICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYmF0Y2ggSUQgZnJvbSBlbnJvbGxtZW50IGRhdGEgZm9yIHRoZSBmb3VuZCBjb3Vyc2VcbiAgICAgICAgICBpZiAoZm91bmRDb3Vyc2UuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgY29uc3QgZW5yb2xsbWVudCA9IGVucm9sbG1lbnRMaXN0LmZpbmQoXG4gICAgICAgICAgICAgIChjb3Vyc2U6IGFueSkgPT4gY291cnNlLmNvbGxlY3Rpb25JZCA9PT0gZm91bmRDb3Vyc2UuaWRlbnRpZmllclxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBpZiAoZW5yb2xsbWVudCAmJiBlbnJvbGxtZW50LmJhdGNoSWQpIHtcbiAgICAgICAgICAgICAgdGVtcERhdGEuYmF0Y2hJZCA9IGVucm9sbG1lbnQuYmF0Y2hJZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0ZW1wQ29udGVudERhdGEgJiYgdGVtcENvbnRlbnRSZWFkRGF0YS5jdW11bGF0aXZlVHJhY2tpbmcgJiZcbiAgICAgICAgKHRlbXBDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gfHxcbiAgICAgICAgICB0ZW1wQ29udGVudERhdGEucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU1cbiAgICAgICAgICB8fCB0ZW1wQ29udGVudERhdGEucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU1cbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRlbXBDb250ZW50RGF0YS5jaGlsZHJlbi5mb3JFYWNoKGFzeW5jIChjaGlsZExpc3Q6IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZExpc3QucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICBjb25zdCBjb3Vyc2VFbnJvbGxtZW50TGlzdCA9IGVucm9sbG1lbnRMaXN0ICYmIGVucm9sbG1lbnRMaXN0LmZpbHRlcigodjogTnNDb250ZW50LklDb3Vyc2UpID0+IHYuY29udGVudElkID09PSBjaGlsZExpc3QuaWRlbnRpZmllcilcbiAgICAgICAgICAgIGlmIChjaGlsZExpc3QuY2hpbGROb2RlcyAmJiBjaGlsZExpc3QuY2hpbGROb2Rlcy5pbmRleE9mKHJlc291cmNlSWQpICE9PSAtMSkge1xuICAgICAgICAgICAgICBpZiAoY291cnNlRW5yb2xsbWVudExpc3QgJiYgY291cnNlRW5yb2xsbWVudExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRlbXBEYXRhLmJhdGNoSWQgPSBjb3Vyc2VFbnJvbGxtZW50TGlzdFtjb3Vyc2VFbnJvbGxtZW50TGlzdC5sZW5ndGggLSAxXS5iYXRjaC5iYXRjaElkXG4gICAgICAgICAgICAgICAgdGVtcERhdGEuY291cnNlSWQgPSBjaGlsZExpc3QuaWRlbnRpZmllclxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IGF3YWl0IHRoaXMuY2hlY2tGb3JDb3Vyc2VFbnJvbGxtZW50KGNoaWxkTGlzdCwgcmVzb3VyY2VJZCwgZW5yb2xsbWVudExpc3QsIHRlbXBEYXRhKVxuICAgICAgICAgICAgICAgIHRlbXBEYXRhLmNvdXJzZUlkID0gZGF0YS5jb3Vyc2VJZFxuICAgICAgICAgICAgICAgIHRlbXBEYXRhLmJhdGNoSWQgPSBkYXRhLmJhdGNoSWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGVtcENvbnRlbnREYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKSB7XG4gICAgICAgICAgICBpZiAodGVtcERhdGEuY291cnNlSWQgPT09IGNvdXJzZUlkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGJQRW5yb2xsbWVudExpc3QgPSBlbnJvbGxtZW50TGlzdC5maWx0ZXIoKHY6IE5zQ29udGVudC5JQ291cnNlKSA9PiB2LmNvbnRlbnRJZCA9PT0gdGVtcENvbnRlbnREYXRhLmlkZW50aWZpZXIpXG4gICAgICAgICAgICAgIGlmICh0ZW1wQ29udGVudERhdGEuY2hpbGROb2RlcyAmJiB0ZW1wQ29udGVudERhdGEuY2hpbGROb2Rlcy5pbmRleE9mKHJlc291cmNlSWQpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChiUEVucm9sbG1lbnRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHRlbXBEYXRhLmJhdGNoSWQgPSBiUEVucm9sbG1lbnRMaXN0W2JQRW5yb2xsbWVudExpc3QubGVuZ3RoIC0gMV0uYmF0Y2guYmF0Y2hJZFxuICAgICAgICAgICAgICAgICAgdGVtcERhdGEuY291cnNlSWQgPSB0ZW1wQ29udGVudERhdGEuaWRlbnRpZmllclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRlbXBEYXRhXG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgc2VhcmNoZXMgZm9yIGEgcmVzb3VyY2UgSUQgaW4gYSBjb250ZW50J3MgY2hpbGRyZW4gaGllcmFyY2h5XG4gICAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IG9iamVjdCB0byBzZWFyY2ggaW5cbiAgICogQHBhcmFtIHJlc291cmNlSWQgVGhlIHJlc291cmNlIElEIHRvIGZpbmRcbiAgICogQHJldHVybnMgdHJ1ZSBpZiByZXNvdXJjZSBpcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIGZpbmRSZXNvdXJjZUluQ29udGVudChjb250ZW50OiBhbnksIHJlc291cmNlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgY29udGVudCBoYXMgdGhlIHJlc291cmNlIGluIGl0cyBsZWFmTm9kZXNcbiAgICBpZiAoY29udGVudC5sZWFmTm9kZXMgJiYgQXJyYXkuaXNBcnJheShjb250ZW50LmxlYWZOb2RlcykpIHtcbiAgICAgIGlmIChjb250ZW50LmxlYWZOb2Rlcy5pbmRleE9mKHJlc291cmNlSWQpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoaXMgY29udGVudCdzIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUgcmVzb3VyY2UgSURcbiAgICBpZiAoY29udGVudC5pZGVudGlmaWVyID09PSByZXNvdXJjZUlkKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIFJlY3Vyc2l2ZWx5IHNlYXJjaCBpbiBjaGlsZHJlblxuICAgIGlmIChjb250ZW50LmNoaWxkcmVuICYmIEFycmF5LmlzQXJyYXkoY29udGVudC5jaGlsZHJlbikpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY29udGVudC5jaGlsZHJlbikge1xuICAgICAgICBpZiAodGhpcy5maW5kUmVzb3VyY2VJbkNvbnRlbnQoY2hpbGQsIHJlc291cmNlSWQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjb3Vyc2UgdGhhdCBjb250YWlucyBhIGdpdmVuIHJlc291cmNlIElEIGluIGEgTGVhcm5pbmcgUGF0aHdheVxuICAgKiBAcGFyYW0gbGVhcm5pbmdQYXRod2F5Q29udGVudCBUaGUgTGVhcm5pbmcgUGF0aHdheSBjb250ZW50IGRhdGFcbiAgICogQHBhcmFtIHJlc291cmNlSWQgVGhlIHJlc291cmNlIElEIHRvIGZpbmRcbiAgICogQHJldHVybnMgVGhlIGNvdXJzZSBvYmplY3QgY29udGFpbmluZyB0aGUgcmVzb3VyY2UsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICBmaW5kQ291cnNlQ29udGFpbmluZ1Jlc291cmNlKGxlYXJuaW5nUGF0aHdheUNvbnRlbnQ6IGFueSwgcmVzb3VyY2VJZDogc3RyaW5nKTogYW55IHtcbiAgICAvLyBDaGVjayBpZiBtaWxlc3RvbmVzX3YxIGV4aXN0c1xuICAgIGlmICghbGVhcm5pbmdQYXRod2F5Q29udGVudC5taWxlc3RvbmVzX3YxIHx8ICFBcnJheS5pc0FycmF5KGxlYXJuaW5nUGF0aHdheUNvbnRlbnQubWlsZXN0b25lc192MSkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggbWlsZXN0b25lXG4gICAgZm9yIChjb25zdCBtaWxlc3RvbmUgb2YgbGVhcm5pbmdQYXRod2F5Q29udGVudC5taWxlc3RvbmVzX3YxKSB7XG4gICAgICAvLyBDaGVjayBpZiBtaWxlc3RvbmUgaGFzIGNvdXJzZXNcbiAgICAgIGlmIChtaWxlc3RvbmUuY291cnNlcyAmJiBBcnJheS5pc0FycmF5KG1pbGVzdG9uZS5jb3Vyc2VzKSkge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBjb3Vyc2UgaW4gdGhlIG1pbGVzdG9uZVxuICAgICAgICBmb3IgKGNvbnN0IGNvdXJzZSBvZiBtaWxlc3RvbmUuY291cnNlcykge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgY291cnNlIGNvbnRhaW5zIHRoZSByZXNvdXJjZVxuICAgICAgICAgIGlmICh0aGlzLmZpbmRSZXNvdXJjZUluQ29udGVudChjb3Vyc2UsIHJlc291cmNlSWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gY291cnNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGdldFJlc291cmNlQ29udGVudExhbmd1YWdlKHJlc291cmNlSWQ6IHN0cmluZykge1xuXG4gICAgbGV0IHRlbXBMYW5ndWFnZTogYW55ID0gJ2VuZ2xpc2gnXG4gICAgbGV0IGxhbmd1YWdlRm91bmQgPSBmYWxzZVxuICAgIGNvbnN0IHRlbXBDb250ZW50RGF0YSA9IHRoaXMuY29udGVudFN2Yy5jdXJyZW50TWV0YURhdGFcbiAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgdGVtcENvbnRlbnREYXRhLmNoaWxkcmVuPy5mb3JFYWNoKGFzeW5jIChjaGlsZExpc3Q6YW55KSA9PiB7XG4gICAgICAgIGlmIChjaGlsZExpc3QucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICAgIGlmIChjaGlsZExpc3QubGVhZk5vZGVzICYmIGNoaWxkTGlzdC5sZWFmTm9kZXMuaW5kZXhPZihyZXNvdXJjZUlkKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRlbXBMYW5ndWFnZSA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0Q29udGVudExhbmd1YWdlKGNoaWxkTGlzdClcbiAgICAgICAgICAgIGxhbmd1YWdlRm91bmQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkTGlzdD8ucHJpbWFyeUNhdGVnb3J5ID09PSAnTWlsZXN0b25lJykge1xuICAgICAgICAgIGNoaWxkTGlzdC5jaGlsZHJlbj8uZm9yRWFjaChhc3luYyAoY2hpbGQ6YW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgaWYgKGNoaWxkLmxlYWZOb2RlcyAmJiBjaGlsZC5sZWFmTm9kZXMuaW5kZXhPZihyZXNvdXJjZUlkKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0ZW1wTGFuZ3VhZ2UgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldENvbnRlbnRMYW5ndWFnZShjaGlsZClcbiAgICAgICAgICAgICAgICBsYW5ndWFnZUZvdW5kID0gdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIClcbiAgICAgIGlmICghbGFuZ3VhZ2VGb3VuZCkge1xuICAgICAgICBpZiAodGVtcENvbnRlbnREYXRhLmxlYWZOb2RlcyAmJiB0ZW1wQ29udGVudERhdGEubGVhZk5vZGVzLmluZGV4T2YocmVzb3VyY2VJZCkgIT09IC0xKSB7XG4gICAgICAgICAgdGVtcExhbmd1YWdlID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRDb250ZW50TGFuZ3VhZ2UodGVtcENvbnRlbnREYXRhKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZW1wTGFuZ3VhZ2VcbiAgfVxuXG4gIGFzeW5jIGNoZWNrRm9yQ291cnNlRW5yb2xsbWVudChjaGlsZExpc3Q6IE5zQ29udGVudC5JQ29udGVudCwgX3Jlc291cmNlSWQ6IHN0cmluZywgX2Vucm9sbG1lbnRMaXN0OiBhbnksIF90ZW1wRGF0YTogYW55KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICBjb25zdCBjb3Vyc2VEYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmNvbnRlbnRTdmMuYXV0b0Fzc2lnbkJhdGNoQXBpKGNoaWxkTGlzdC5pZGVudGlmaWVyKS50b1Byb21pc2UoKS50aGVuKGFzeW5jIChkYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLnVzZXJTdmMuZmV0Y2hFbnJvbGxtZW50RGF0YUJ5Q29udGVudElkKHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZT8udXNlcklkLCBjaGlsZExpc3QuaWRlbnRpZmllcikudG9Qcm9taXNlKCkudGhlbihhc3luYyAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb3Vyc2VzICYmIHJlcy5jb3Vyc2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcy5jb3Vyc2VzXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbeyBjb3Vyc2VJZDogY2hpbGRMaXN0LmlkZW50aWZpZXIsIGJhdGNoSWQ6ICcnIH1dXG5cbiAgICAgICAgfSkuY2F0Y2goKF9lcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBbeyBjb3Vyc2VJZDogY2hpbGRMaXN0LmlkZW50aWZpZXIsIGJhdGNoSWQ6ICcnIH1dXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuY29udGVudFN2Yy5jdXJyZW50QmF0Y2hFbnJvbGxtZW50TGlzdCA9IFsuLi50aGlzLmNvbnRlbnRTdmMuY3VycmVudEJhdGNoRW5yb2xsbWVudExpc3QsIC4uLnJlc3BvbnNlRGF0YV1cbiAgICAgICAgcmV0dXJuIHsgY291cnNlSWQ6IGNoaWxkTGlzdC5pZGVudGlmaWVyLCBiYXRjaElkOiByZXNwb25zZURhdGFbMF0uYmF0Y2hJZCB9XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKF9lcnI6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIFt7IGNvdXJzZUlkOiBjaGlsZExpc3QuaWRlbnRpZmllciwgYmF0Y2hJZDogJycgfV1cbiAgICB9KVxuICAgIHJldHVybiBjb3Vyc2VEYXRhXG4gIH1cblxuICByZWFsVGltZVByb2dyZXNzVXBkYXRlUXVpeihjb250ZW50SWQ6IHN0cmluZywgY29sbGVjdGlvbklkPzogc3RyaW5nLCBiYXRjaElkPzogc3RyaW5nLCBzdGF0dXM/OiBudW1iZXIpIHtcbiAgICBsZXQgcmVxOiBhbnlcbiAgICBpZiAodGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlKSB7XG4gICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuZ2V0UmVzb3VyY2VDb250ZW50TGFuZ3VhZ2UoY29udGVudElkKVxuICAgICAgcmVxID0ge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgdXNlcklkOiB0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUudXNlcklkIHx8ICcnLFxuICAgICAgICAgIGNvbnRlbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnRlbnRJZCxcbiAgICAgICAgICAgICAgYmF0Y2hJZCxcbiAgICAgICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzIHx8IDIsXG4gICAgICAgICAgICAgIGNvdXJzZUlkOiBjb2xsZWN0aW9uSWQsXG4gICAgICAgICAgICAgIGxhc3RBY2Nlc3NUaW1lOiBkYXlqcyhuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3M6U1NTWlonKSxcbiAgICAgICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IHN0YXR1cyA9PT0gMiA/IDEwMCA6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9XG5cbiAgICAgIHRoaXMuaHR0cFxuICAgICAgICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBST0dSRVNTX1VQREFURX0vJHtjb250ZW50SWR9YCwgcmVxKVxuICAgICAgICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXG4gICAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcCAmJiB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF0gJiYgcmVxLnJlcXVlc3QuY29udGVudHNbMF0pIHtcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXR1cyA9IHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddXG4gICAgICAgIFxuICAgICAgICBpZiAoIWN1cnJlbnRTdGF0dXMgfHwgY3VycmVudFN0YXR1cyA8IDIpIHtcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAgICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddID0gTnVtYmVyKHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLnN0YXR1cykgfHwgMFxuICAgICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXAgPSB7IC4uLnRoaXMudG9jU3ZjLmhhc2htYXAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIFRyaWdnZXIgbWlsZXN0b25lIGxvY2sgcmVjb21wdXRhdGlvbiAtIGl0IHdpbGwgZW1pdCBoYXNobWFwVXBkYXRlZCB3aXRoIGJvdGggcHJvZ3Jlc3MgYW5kIGxvY2sgY2hhbmdlc1xuICAgICAgICAgIGlmICh0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy50b2NTdmMudHJpZ2dlck1pbGVzdG9uZUxvY2tVcGRhdGUoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBFbWl0IHRvIHRyaWdnZXIgdmlld2VyIGNvbXBvbmVudCByZWZyZXNoIGZvciBMZWFybmluZyBQYXRod2F5c1xuICAgICAgICAgIHRoaXMubWFya0FzQ29tcGxldGVTdWJqZWN0Lm5leHQodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXEgPSB7fVxuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxuXG4gIGdldENvbnRlbnQoY29udGVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE5zQ29udGVudC5JQ29udGVudD4ge1xuICAgIGNvbnN0IGZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnJnByZXZpZXc9dHJ1ZScpXG4gICAgbGV0IHVybCA9IGAvYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL3JlYWQvJHtjb250ZW50SWR9YFxuICAgIGlmICghZm9yUHJldmlldykge1xuICAgICAgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvcmVhZC8ke2NvbnRlbnRJZH1gXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnZWRpdE1vZGU9dHJ1ZScpICYmIHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCdfcmMnKSkge1xuICAgICAgICB1cmwgPSBgL2FwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9yZWFkLyR7Y29udGVudElkfWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVybCA9IGAvYXBpL2NvbnRlbnQvdjEvcmVhZC8ke2NvbnRlbnRJZH1gXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudD4oXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAvLyBgL2FwaXMvYXV0aEFwaS9hY3Rpb24vY29udGVudC9oaWVyYXJjaHkvJHtjb250ZW50SWR9P3Jvb3RPcmc9JHt0aGlzLmNvbmZpZ3NlcnZpY2Uucm9vdE9yZyB8fCAnaWdvdCd9Jm9yZz0ke3RoaXMuY29uZmlnc2VydmljZS5hY3RpdmVPcmcgfHwgJ2RvcHQnfWAsXG4gICAgICB1cmxcbiAgICApXG4gIH1cblxuICBnZXRBdXRob3JpbmdVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1cmxcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgID8gYC9hcGlzL2F1dGhDb250ZW50LyR7dXJsLmluY2x1ZGVzKCcvY29udGVudC1zdG9yZS8nKSA/IG5ldyBVUkwodXJsKS5wYXRobmFtZS5zbGljZSgxKSA6IGVuY29kZVVSSUNvbXBvbmVudCh1cmwpfWBcbiAgICAgIDogJydcbiAgfVxuXG4gIHJlZ2V4RG93bmxvYWRSZXBsYWNlID0gKF9zdHIgPSAnJywgZ3JvdXAxOiBzdHJpbmcsIGdyb3VwMjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gYCR7dGhpcy5hdXRob3JpbmdCYXNlfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGdyb3VwMSl9JHtncm91cDJ9YFxuICB9XG5cbiAgcmVwbGFjZVRvQXV0aFVybChkYXRhOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoZGF0YSkucmVwbGFjZShcbiAgICAgICAgdGhpcy5kb3dubG9hZFJlZ2V4LFxuICAgICAgICB0aGlzLnJlZ2V4RG93bmxvYWRSZXBsYWNlLFxuICAgICAgKSxcbiAgICApXG4gIH1cbiAgcmVhZFNlY3Rpb25zKGFzc2Vzc21lbnRJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuQVBJX0VORFBPSU5UU30vJHthc3Nlc3NtZW50SWR9YFxuICB9XG5cbiAgZ2V0UHVibGljVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYWluVXJsID0gdXJsLnNwbGl0KCcvY29udGVudCcpLnBvcCgpIHx8ICcnXG4gICAgcmV0dXJuIGAke3RoaXMuZW52aXJvbm1lbnQuY29udGVudEhvc3R9LyR7dGhpcy5lbnZpcm9ubWVudC5jb250ZW50QnVja2V0fS9jb250ZW50JHttYWluVXJsfWBcbiAgfVxuXG4gIGdldENkblVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbWFpblVybCA9IHVybC5zcGxpdCgnL2NvbnRlbnQnKS5wb3AoKSB8fCAnJ1xuICAgIHJldHVybiBgJHt0aGlzLmRvbWFpbkNvbmZTdmMuZ2V0RG9tYWluQ0ROSG9zdCgpfS8ke3RoaXMuZW52aXJvbm1lbnQuY2RuQ29udGVudEJ1Y2tldH0vY29udGVudCR7bWFpblVybH1gXG4gIH1cblxuICAvLyAgZmV0Y2hDb250ZW50KFxuICAvLyAgIGNvbnRlbnRJZDogc3RyaW5nLFxuICAvLyAgIGhpZXJhcmNoeVR5cGU6ICdhbGwnIHwgJ21pbmltYWwnIHwgJ2RldGFpbCcgPSAnZGV0YWlsJ1xuICAvLyAgICk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50PiB7XG4gIC8vICAgICBsZXQgdXJsID0gJydcbiAgLy8gICAgIGNvbnN0IGZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnJnByZXZpZXc9dHJ1ZScpXG4gIC8vICAgICAgIGlmICghZm9yUHJldmlldykge1xuICAvLyAgICAgICAgIHVybCA9IGAvYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL2hpZXJhcmNoeS8ke2NvbnRlbnRJZH0/aGllcmFyY2h5VHlwZT0ke2hpZXJhcmNoeVR5cGV9YFxuICAvLyAgICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAgIHVybCA9IGAvYXBpL2NvdXJzZS92MS9oaWVyYXJjaHkvJHtjb250ZW50SWR9P2hpZXJhcmNoeVR5cGU9JHtoaWVyYXJjaHlUeXBlfWBcbiAgLy8gICAgICAgfVxuICAvLyAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnQ+KHVybClcbiAgLy8gICB9XG5cbiAgZmV0Y2hDb250ZW50KGlkOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudD4oYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvaGllcmFyY2h5LyR7aWR9P21vZGU9JHt0eXBlfWApXG4gIH1cblxuICB1cGRhdGVDb250ZW50SGFzaE1hcEZvckFzc2Vzc3RlbnQoY29udGVudElkOiBzdHJpbmcsIGNvbnRlbnRQcm9ncmVzczogYW55KSB7XG4gICAgXG4gICAgXG4gICAgaWYgKHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSkge1xuICAgICAgY29uc3QgY3VycmVudFN0YXR1cyA9IHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIHx8IDBcbiAgICAgIGNvbnN0IG5ld1N0YXR1cyA9IE51bWJlcihjb250ZW50UHJvZ3Jlc3Muc3RhdHVzKSB8fCAwXG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBpZiBub3QgY29tcGxldGUgb3IgaWYgbmV3IHN0YXR1cyBpcyBoaWdoZXJcbiAgICAgIGlmIChjdXJyZW50U3RhdHVzIDwgMiB8fCBuZXdTdGF0dXMgPj0gY3VycmVudFN0YXR1cykge1xuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSBjb250ZW50UHJvZ3Jlc3MuY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSBuZXdTdGF0dXNcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydzdGF0dXMnXSA9IG5ld1N0YXR1c1xuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIC8vIENyZWF0ZSBuZXcgaGFzaG1hcCByZWZlcmVuY2UgZm9yIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFRyaWdnZXIgbWlsZXN0b25lIGxvY2sgcmVjb21wdXRhdGlvbiAtIGl0IHdpbGwgZW1pdCBoYXNobWFwVXBkYXRlZCB3aXRoIGJvdGggcHJvZ3Jlc3MgYW5kIGxvY2sgY2hhbmdlc1xuICAgICAgICBpZiAodGhpcy50b2NTdmMudHJpZ2dlck1pbGVzdG9uZUxvY2tVcGRhdGUpIHtcbiAgICAgICAgICB0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSgpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEVtaXQgdG8gdHJpZ2dlciB2aWV3ZXIgY29tcG9uZW50IHJlZnJlc2ggZm9yIExlYXJuaW5nIFBhdGh3YXlzXG4gICAgICAgIHRoaXMubWFya0FzQ29tcGxldGVTdWJqZWN0Lm5leHQodHJ1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRGb3JtQnlJZChmb3JtSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuQVBJX0VORFBPSU5UUy5HRVRfRk9STV9CWUlEKGZvcm1JZCkpXG4gIH1cblxuICBzdWJtaXRGb3JtKGZvcm1EYXRhOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55Pih0aGlzLkFQSV9FTkRQT0lOVFMuU1VCTUlUX0ZPUk0sIGZvcm1EYXRhKVxuICB9XG5cbiAgcmVhbFRpbWVQcm9ncmVzc1VwZGF0ZUZvclByZUFzc2Vzc21lbnQoY29udGVudElkOiBzdHJpbmcsIHJlcXVlc3Q6IGFueSkge1xuICAgIGxldCByZXE6IGFueVxuICAgIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUpIHtcbiAgICAgIHJlcSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHVzZXJJZDogdGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJyxcbiAgICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb250ZW50SWQsXG4gICAgICAgICAgICAgIC8vIGJhdGNoSWQsXG4gICAgICAgICAgICAgIHN0YXR1czogdGhpcy5nZXRTdGF0dXMocmVxdWVzdC5jdXJyZW50LCByZXF1ZXN0Lm1heF9zaXplLCByZXF1ZXN0Lm1pbWVfdHlwZSksXG4gICAgICAgICAgICAgIC8vIGNvdXJzZUlkOiBjb2xsZWN0aW9uSWQsXG4gICAgICAgICAgICAgIGxhc3RBY2Nlc3NUaW1lOiBkYXlqcyhuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3M6U1NTWlonKSxcbiAgICAgICAgICAgICAgcHJvZ3Jlc3NkZXRhaWxzOiB7XG4gICAgICAgICAgICAgICAgbWF4X3NpemU6IHJlcXVlc3QubWF4X3NpemUsXG4gICAgICAgICAgICAgICAgY3VycmVudDogcmVxdWVzdC5jdXJyZW50LFxuICAgICAgICAgICAgICAgIG1pbWVUeXBlOiByZXF1ZXN0Lm1pbWVfdHlwZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IHRoaXMuY2FsY3VsYXRlUGVyY2VudChyZXF1ZXN0LmN1cnJlbnQsIHJlcXVlc3QubWF4X3NpemUsIHJlcXVlc3QubWltZV90eXBlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICAgIC8vIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UuY3N0b2tlbiAhPT0gJycpIHtcbiAgICAgIC8vICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpXG4gICAgICAvLyAgIC5zZXQoJ2NzdG9rZW4nLCB0aGlzLmNvbmZpZ3NlcnZpY2UuY3N0b2tlbilcblxuICAgICAgLy8gICB0aGlzLmh0dHBcbiAgICAgIC8vICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHsgaGVhZGVycyB9ICwgcmVxKVxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICB0aGlzLmh0dHBcbiAgICAgIC8vICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcbiAgICAgIC8vICAgLnN1YnNjcmliZShub29wLCBub29wKVxuICAgICAgLy8gfVxuICAgICAgLy8gdGhpcy5odHRwXG4gICAgICAvLyAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCByZXEpXG4gICAgICAvLyAgIC5zdWJzY3JpYmUobm9vcCwgbm9vcClcbiAgICAgIC8vY29uc3QgY29udGVudElkTmV3PSByZXEucmVxdWVzdC5jb250ZW50c1swXS5jb250ZW50SWRcbiAgICAgIC8vIGNvbnN0IHVwZGF0ZWRDb21wbGV0aW9uUGVyY2VudGFnZSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLmNvbXBsZXRpb25QZXJjZW50YWdlXG4gICAgICAvLyBjb25zdCB1cGRhdGVkU3RhdHVzID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uc3RhdHVzXG5cbiAgICAgIC8vIC8vIENsb25lIHRoZSBpbm5lciBvYmplY3QgYW5kIHVwZGF0ZVxuICAgICAgLy8gY29uc3QgZXhpc3RpbmdDb250ZW50ID0gdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWROZXddIHx8IHt9XG5cbiAgICAgIC8vIHRoaXMudG9jU3ZjLmhhc2htYXAgPSB7XG4gICAgICAvLyAgIC4uLnRoaXMudG9jU3ZjLmhhc2htYXAsXG4gICAgICAvLyAgIFtjb250ZW50SWROZXddOiB7XG4gICAgICAvLyAgICAgLi4uZXhpc3RpbmdDb250ZW50LFxuICAgICAgLy8gICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiB1cGRhdGVkQ29tcGxldGlvblBlcmNlbnRhZ2UsXG4gICAgICAvLyAgICAgY29tcGxldGlvblN0YXR1czogdXBkYXRlZFN0YXR1c1xuICAgICAgLy8gICB9XG4gICAgICAvLyB9XG4gICAgICAvLyBjb25zb2xlLmxvZygncmVxJywgSlNPTi5zdHJpbmdpZnkocmVxKSlcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdyZXEnLCByZXEpXG5cbiAgICAgIGNvbnN0IHJlc291cmNlU3RhdHVzID0gdGhpcy5nZXRQcmVBc3Nlc3NtZW50UmVzb3VyY2VTdGF0dXMoY29udGVudElkKVxuICAgICAgaWYgKHJlc291cmNlU3RhdHVzIDwgMikge1xuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBSRV9BU1NFU1NNRU5UX1NUQVRFX1VQREFURX1gLCByZXEpXG4gICAgICAgICAgLnN1YnNjcmliZShub29wLCBub29wKVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdICYmXG4gICAgICAgICghdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPCAyKSkge1xuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSA9IE51bWJlcihyZXEucmVxdWVzdC5jb250ZW50c1swXS5zdGF0dXMpIHx8IDBcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydwYXJlbnQnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLmNvdXJzZUlkXG4gICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsncHJvZ3Jlc3MnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLnByb2dyZXNzZGV0YWlsc1xuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFRyaWdnZXIgbWlsZXN0b25lIGxvY2sgcmVjb21wdXRhdGlvbiAtIGl0IHdpbGwgZW1pdCBoYXNobWFwVXBkYXRlZCB3aXRoIGJvdGggcHJvZ3Jlc3MgYW5kIGxvY2sgY2hhbmdlc1xuICAgICAgICBpZiAodGhpcy50b2NTdmMudHJpZ2dlck1pbGVzdG9uZUxvY2tVcGRhdGUpIHtcbiAgICAgICAgICB0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSgpXG4gICAgICAgIH1cbiAgICAgICAgICAvLyBFbWl0IHRvIHRyaWdnZXIgdmlld2VyIGNvbXBvbmVudCByZWZyZXNoIGZvciBMZWFybmluZyBQYXRod2F5c1xuICAgICAgICAgIHRoaXMubWFya0FzQ29tcGxldGVTdWJqZWN0Lm5leHQodHJ1ZSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVxID0ge31cbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cblxuICByZWFsVGltZVByb2dyZXNzVXBkYXRlRm9yUHJlQXNzZXNzbWVudFF1aXooY29udGVudElkOiBzdHJpbmcsIHN0YXR1cz86IG51bWJlciwgbWltZVR5cGU/OiBzdHJpbmcpIHtcbiAgICBsZXQgcmVxOiBhbnlcbiAgICBpZiAodGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlKSB7XG4gICAgICByZXEgPSB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAvL3VzZXJJZDogdGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJyxcbiAgICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb250ZW50SWQsXG4gICAgICAgICAgICAgIC8vIGJhdGNoSWQsXG4gICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzIHx8IDIsXG4gICAgICAgICAgICAgIC8vIGNvdXJzZUlkOiBjb2xsZWN0aW9uSWQsXG4gICAgICAgICAgICAgIGxhc3RBY2Nlc3NUaW1lOiBkYXlqcyhuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3M6U1NTWlonKSxcbiAgICAgICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IHN0YXR1cyA9PT0gMiA/IDEwMC4wIDogMCxcbiAgICAgICAgICAgICAgcHJvZ3Jlc3NkZXRhaWxzOiB7XG4gICAgICAgICAgICAgICAgXCJtaW1lVHlwZVwiOiBtaW1lVHlwZSB8fCBcImFwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uc2V0XCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc291cmNlU3RhdHVzID0gdGhpcy5nZXRQcmVBc3Nlc3NtZW50UmVzb3VyY2VTdGF0dXMoY29udGVudElkKVxuICAgICAgaWYgKHJlc291cmNlU3RhdHVzIDwgMikge1xuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBSRV9BU1NFU1NNRU5UX1NUQVRFX1VQREFURX1gLCByZXEpXG4gICAgICAgICAgLnN1YnNjcmliZShub29wLCBub29wKVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUgaGFzaG1hcCAtIGNyZWF0ZSBlbnRyeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcCkge1xuICAgICAgICBpZiAoIXRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSkge1xuICAgICAgICAgIC8vIENyZWF0ZSBuZXcgZW50cnkgZm9yIHByZS1hc3Nlc3NtZW50IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF0gPSB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiBjb250ZW50SWQsXG4gICAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2UsXG4gICAgICAgICAgICBjb21wbGV0aW9uU3RhdHVzOiBOdW1iZXIocmVxLnJlcXVlc3QuY29udGVudHNbMF0uc3RhdHVzKSB8fCAwLFxuICAgICAgICAgICAgc3RhdHVzOiBOdW1iZXIocmVxLnJlcXVlc3QuY29udGVudHNbMF0uc3RhdHVzKSB8fCAwLFxuICAgICAgICAgICAgaXNQcmVBc3Nlc3NtZW50OiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLmNvbXBsZXRpb25QZXJjZW50YWdlXG4gICAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSBOdW1iZXIocmVxLnJlcXVlc3QuY29udGVudHNbMF0uc3RhdHVzKSB8fCAwXG4gICAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydzdGF0dXMnXSA9IE51bWJlcihyZXEucmVxdWVzdC5jb250ZW50c1swXS5zdGF0dXMpIHx8IDBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcCA9IHsgLi4udGhpcy50b2NTdmMuaGFzaG1hcCB9XG4gICAgICAgIFxuICAgICAgICAvLyBBTFdBWVMgdHJpZ2dlciBtaWxlc3RvbmUgbG9jayByZWNvbXB1dGF0aW9uIHdoZW4gcHJlLWFzc2Vzc21lbnQgY29tcGxldGVzXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBtaWxlc3RvbmUgMSB1bmxvY2tzIGltbWVkaWF0ZWx5IGFmdGVyIHByZS1hc3Nlc3NtZW50IGNvbXBsZXRpb25cbiAgICAgICAgaWYgKHRoaXMudG9jU3ZjLnRyaWdnZXJNaWxlc3RvbmVMb2NrVXBkYXRlKSB7XG4gICAgICAgICAgdGhpcy50b2NTdmMudHJpZ2dlck1pbGVzdG9uZUxvY2tVcGRhdGUoKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBFbWl0IG1hcmtBc0NvbXBsZXRlU3ViamVjdCB0byB0cmlnZ2VyIHZpZXdlciBjb21wb25lbnQgdG8gcmVmcmVzaCBlbnJvbGxtZW50IGFuZCBwcm9ncmVzc1xuICAgICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsIGZvciBMZWFybmluZyBQYXRod2F5cyB0byB1bmxvY2sgbWlsZXN0b25lcyBpbW1lZGlhdGVseVxuICAgICAgICB0aGlzLm1hcmtBc0NvbXBsZXRlU3ViamVjdC5uZXh0KHRydWUpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcSA9IHt9XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgZ2V0UHJlQXNzZXNzbWVudFJlc291cmNlU3RhdHVzKHJlc291cmNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnRvY1N2YyAmJiB0aGlzLnRvY1N2Yy5oYXNobWFwICYmIHRoaXMudG9jU3ZjLmhhc2htYXBbcmVzb3VyY2VJZF0pIHtcbiAgICAgIHJldHVybiB0aGlzLnRvY1N2Yy5oYXNobWFwW3Jlc291cmNlSWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgMVxuICAgIH1cbiAgICByZXR1cm4gMVxuICB9XG5cblxufVxuIl19